Skip to main content

Instalando vários controladores do Snyk em um único cluster Kubernetes

Escrito por

Pas Apicella

feature multispace k8s

15 de agosto de 2022

0 minutos de leitura

O Kubernetes oferece uma interface para executar sistemas distribuídos com facilidade. Ele cuida do escalonamento e da recuperação de falhas dos seus aplicativos, oferece padrões de implantação e muito mais. Em relação à segurança, cabe às equipes que implantam workloads no cluster Kubernetes decidir quais deles devem ser monitorados para atender aos requisitos de segurança dos aplicativos.

Mas e se cada equipe pudesse controlar quais imagens de contêiner são verificadas e quais workloads específicos são monitorados? Várias equipes podem implantar workloads no Kubernetes, cada uma com requisitos próprios sobre o que deve ser monitorado. A melhor maneira de atender a esse caso de uso é permitir que cada equipe configure sua própria integração do Snyk com o Kubernetes e monitore os workloads necessários. Veja como isso funciona.

Visão geral da integração do Snyk com o Kubernetes

O Snyk se integra ao Kubernetes, permitindo que você importe e teste continuamente seus workloads em execução para identificar vulnerabilidades nas imagens subjacentes e configurações que possam reduzir a segurança desses workloads. Depois da implantação, o Snyk continua monitorando os workloads para identificar exposição a vulnerabilidades recém-descobertas e outros problemas de segurança quando novos contêineres são implantados ou a configuração do workload muda.

Diagrama de contexto do sistema mostrando um cliente com integração ao Kubernetes conectando o Kubernetes, o Snyk Controller e a Snyk Platform.

Diagrama da arquitetura da integração com o Kubernetes

Como instalar vários controladores do Snyk em um único cluster Kubernetes

Agora vem a parte divertida! Vamos explicar passo a passo como configurar vários controladores do Snyk em um único cluster Kubernetes. Estas são as etapas:

  1. Configure namespaces separados

  2. Crie uma organização do Snyk para cada namespace

  3. Instale e configure snyk monitor para o primeiro namespace (apples)

  4. Instale e configure snyk monitor para o segundo namespace (bananas)

  5. Verifique se os workloads implantados são importados automaticamente pela política

  6. Implante workloads em bananas para importá-los automaticamente por meio de um arquivo de política Rego

Pré-requisitos

  1. Para usar a integração com o Kubernetes, você precisa ter uma conta Business ou Enterprise do Snyk. Se ainda não tiver uma dessas contas, você pode iniciar uma avaliação gratuita do nosso plano Business. Mesmo que não queira testar por conta própria, recomendo que continue lendo (pulando os blocos de código) para aprender a instalar e gerenciar vários controladores do Snyk em um único cluster Kubernetes.

  2. Um cluster Kubernetes, como AKS, EKS, GKE, Red Hat OpenShift ou qualquer outra distribuição compatível.

Etapa 1: configure namespaces separados

Nesta demonstração, estou usando um serviço Azure AKS como cluster Kubernetes. Nesse cluster, vamos instalar dois controladores do Snyk, cada um em seu próprio namespace: um no namespace apples e outro no namespace bananas, como mostra o diagrama abaixo.

Diagrama de um cluster Kubernetes dividido nos namespaces Apples e Bananas, cada um contendo componentes Node.js, Python e Snyk Controller.

Crie os namespaces conforme mostrado abaixo:

➜  kubectl create namespace apples
namespace/apples created
➜  kubectl create namespace bananas
namespace/bananas created

Etapa 2: crie uma organização do Snyk para cada namespace

Usar organizações do Snyk separadas nos permite separar a verificação de workloads. Assim, as equipes de produto podem usar suas próprias organizações para ter mais controle sobre a verificação de seus workloads e imagens. Você também pode usar a mesma organização com cada um dos controladores do Snyk que vamos implantar, mas, neste caso, vamos mantê-las separadas. Em ambos os casos, os workloads aparecerão com um rótulo definido durante a instalação dos controladores do Snyk.

Menu de seleção de organização exibindo as organizações listadas e a opção “Criar uma nova organização” circulada

Nossas novas organizações

Uma para o namespace apples:

Banner roxo da Snyk com uma miniatura de carro vermelho e o rótulo “aks-apples-kubernetes”

Uma para o namespace bananas:

Banner roxo da Snyk com a imagem de um pequeno carro vermelho e o texto “aks-bananas-kubernetes”, acompanhado de uma seta para baixo

Depois de criadas, você verá duas organizações vazias no aplicativo do Snyk. Vamos usá-las em breve.

Interface de pesquisa de organizações mostrando a Apples Inc. com grupos chamados “aks-apples-kubernetes” e “aks-bananas-kubernetes”, destacados por uma elipse vermelha.
Cabeçalho do painel do Snyk mostrando o seletor de projeto “aks-bananas-kubernetes” e o ícone de configurações em destaque

Em cada organização, habilite a integração com o Kubernetes: selecione a guia Integrações, escolha Kubernetes e clique em Conectar. Em seguida, consulte a documentação do Snyk para Kubernetes para concluir a configuração.

Anote os IDs de integração da integração do Kubernetes de cada organização do Snyk: você precisará deles em breve. Para encontrar o ID de integração do Kubernetes, clique no ícone de configurações da organização na barra de navegação superior do Snyk, acesse Integrações na barra lateral e selecione a integração com o Kubernetes, como mostrado abaixo.

Configurações da integração do Snyk com o Kubernetes mostrando um cluster conectado, o ID da integração, o botão de copiar, a documentação e a versão do controlador.

Etapa 3: instale e configure snyk monitor para o namespace apples

Agora que configuramos nossas organizações e integrações e as conectamos ao cluster, podemos configurar o Snyk Monitor em uma janela do terminal.

Vamos criar um arquivo para assinar eventos de workload, definir os critérios das assinaturas, instalar o gráfico Helm do Snyk para monitoramento do Kubernetes e configurar/iniciar o monitor.

Crie o arquivo do registro

No terminal, crie um diretório para a organização apples e acesse-o:

➜  mkdir apples
➜  cd apples

Crie um arquivo chamado workload-events.rego com o conteúdo abaixo, substituindo <APPLES_INTEGRATION_ID> pelo ID de integração da integração do Kubernetes da organização apples.

Com a política Rego abaixo, estamos instruindo o controlador do Snyk a importar/excluir workloads somente do namespace apples, desde que o tipo de workload do Kubernetes não seja CronJob nem Service. Para saber mais sobre os diferentes tipos de workload, consulte a documentação do Snyk.

workload-events.rego
package snyk
orgs := ["<APPLES_INTEGRATION_ID>"]
default workload_events = false
workload_events {
  input.metadata.namespace == "apples"
  input.kind != "CronJob"
  input.kind != "Service"
}

Adicione os gráficos Helm do Snyk ao seu repositório

Acesse seu ambiente Kubernetes e execute o comando a seguir para adicionar o repositório Snyk Charts ao Helm. Vamos precisar dele em breve, ao instalar este gráfico Helm.

➜  helm repo add snyk-charts https://snyk.github.io/kubernetes-monitor --force-update
"snyk-charts" has been added to your repositories

Crie a configuração do Snyk Monitor e implante o gráfico Helm

Com um secret do Kubernetes, podemos executar o processo sem expor credenciais em texto simples. Nestas etapas, vamos criar e usar o secret para implantar a configuração da organização apples.

Crie o secret snyk-monitor para o namespace apples, substituindo <APPLES_INTEGRATION_ID> pelo ID da integração do Kubernetes da organização apples no aplicativo do Snyk. Nesta demonstração, usamos o Docker Hub público como registro de contêineres, que não exige credenciais para acessar imagens públicas. Para saber mais sobre como usar registros privados de contêineres, consulte a documentação do controlador do Snyk.

➜ kubectl create secret generic snyk-monitor -n apples \
    --from-literal=dockercfg.json={} \
    --from-literal=integrationId=<APPLES_INTEGRATION_ID>
secret/snyk-monitor created

Agora, crie um configmap para armazenar o arquivo de política Rego que o snyk-monitor usará para determinar o que importar ou excluir automaticamente do namespace apples:

➜ kubectl create configmap snyk-monitor-custom-policies -n apples \       --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

Em seguida, instale o snyk-monitor no namespace apples, substituindo <APPLES_INTEGRATION_ID> pelo ID de integração do Snyk da organização apples no comando:

➜ helm upgrade --install snyk-monitor-apples snyk-charts/snyk-monitor \
        --namespace apples \
        --set clusterName="AKS K8s - Apples" \
        --set policyOrgs=<APPLES_INTEGRATION_ID> \
        --set workloadPoliciesMap=snyk-monitor-custom-policies

Release "snyk-monitor-apples" does not exist. Installing it now.
LAST DEPLOYED: Thu Jul 14 19:29:28 2022
NAMESPACE: apples
STATUS: deployed
REVISION: 1
TEST SUITE: None

Observação: O rótulo “AKS K8s - Apples” permite encontrar no Snyk os workloads importados, que você verá em breve.

Por fim, verifique se tudo está funcionando (este comando pressupõe que você tenha instalado o jq; se não tiver, remova o trecho | jq do comando):

➜ helm ls -A -o json | jq
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n apples
NAME                             READY   STATUS RESTARTS   AGE
snyk-monitor-apples-797cd64c-sqvj4   1/1 Running   0      16m

Neste momento, temos um controlador do Snyk instalado no namespace apples com um nome exclusivo. Mais adiante, mostraremos como esse controlador importa automaticamente os workloads de acordo com a configuração, à medida que eles são implantados no namespace apples do cluster Kubernetes. Por enquanto, você pode notar que, ao atualizar a página de projetos da organização apples, ela já verificou o próprio Snyk Monitor. Isso acontece porque pedimos que verificasse os workloads do tipo Deployment no namespace apples.

Painel do Snyk Projects mostrando dois projetos Kubernetes, com contagens de vulnerabilidades por gravidade e opções para adicionar outro projeto.

Etapa 4: instale e configure snyk monitor para o namespace bananas

Crie um diretório chamado bananas e acesse-o:

➜ cd ..
➜ mkdir bananas
➜ cd bananas

Agora, crie um arquivo chamado workload-events.rego com o conteúdo abaixo e substitua <BANANAS_INTEGRATION_ID> pelo ID da integração do Kubernetes da organização bananas no aplicativo do Snyk:

package snyk
orgs := ["<BANANAS_INTEGRATION_ID>"]
default workload_events = false
workload_events {
      input.metadata.namespace == "bananas"
      input.kind != "CronJob"
      input.kind != "Service"
}

Em seguida, crie o secret snyk-monitor para o namespace bananas, substituindo BANANAS_INTEGRATION_ID pelo ID da integração do Kubernetes da organização bananas no aplicativo do Snyk:

➜  ~/snyk/SE/blogs/snyk-multi-namespace-controllers/bananas kubectl create secret generic snyk-monitor -n bananas \
  --from-literal=dockercfg.json={} \
  --from-literal=integrationId=BANANAS_INTEGRATION_ID
secret/snyk-monitor created

Depois, crie um configmap para armazenar o arquivo de política Rego que o snyk-monitor usará para determinar o que importar ou excluir automaticamente do namespace bananas:

➜ kubectl create configmap snyk-monitor-custom-policies -n bananas --from-file=./workload-events.rego
configmap/snyk-monitor-custom-policies created

Instale o snyk-monitor no namespace bananas, substituindo ‰¤BANANAS_INTEGRATION_ID> pelo ID da integração do Kubernetes da organização bananas no aplicativo do Snyk:

➜ helm upgrade --install snyk-monitor-bananas snyk-charts/snyk-monitor \
      --namespace bananas \
      --set clusterName="K8s - Bananas" \
      --set policyOrgs=<BANANAS_INTEGRATION_ID> \
      --set workloadPoliciesMap=snyk-monitor-custom-policies
Release "snyk-monitor-bananas" does not exist. Installing it now.
NAME: snyk-monitor-bananas
LAST DEPLOYED: Thu Jul 14 20:19:36 2022
NAMESPACE: bananas
STATUS: deployed
REVISION: 1
TEST SUITE: None

Por fim, verifique se tudo está funcionando:

➜ helm ls -A -o json | jq .
[
  {
"name": "snyk-monitor-apples",
"namespace": "apples",
"revision": "1",
"updated": "2022-07-14 19:45:56.681028 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  },
  {
"name": "snyk-monitor-bananas",
"namespace": "bananas",
"revision": "1",
"updated": "2022-07-14 20:19:36.563328 +1000 AEST",
"status": "deployed",
"chart": "snyk-monitor-1.92.10",
"app_version": ""
  }
]

➜ kubectl get pods -n bananas
NAME                                  READY   STATUS   RESTARTS  AGE
Snyk-monitor-bananas-54b8c4bf89-r6tf2   1/1 Running   0      3m38s

Etapa 5: verifique se os workloads implantados são importados automaticamente pela política

Em seguida, vamos implantar workloads no namespace apples para confirmar que eles são importados automaticamente. Vamos começar com um aplicativo Spring Boot, que implantaremos no Kubernetes conforme mostrado abaixo.

Crie um arquivo chamado springbootemployee-K8s.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot-employee-api-apples
  namespace: apples
spec:
  selector:
matchLabels:
  app: springboot-employee-api-apples
  replicas: 1
  template:
metadata:
  labels:
    app: springboot-employee-api-apples
spec:
  containers:
    - name: springboot-employee-api-apples
      image: pasapples/springbootemployee:multi-stage-add-layers
      imagePullPolicy: Always
      ports:
        - containerPort: 8080

Depois, implante-o:

➜ kubectl apply -f springbootemployee-K8s.yaml
deployment.apps/springboot-employee-api-apples created

Após alguns minutos, verifique se o workload foi verificado e importado automaticamente para a organização apples no aplicativo do Snyk, conforme instruído pelo controlador do Snyk no namespace apples.

Painel do Snyk Projects mostrando projetos do Kubernetes da organização aks-apples-kubernetes e a quantidade de problemas por nível de gravidade

Etapa 6: implante workloads em bananas — importação automática por meio de um arquivo de política Rego

Crie um arquivo chamado snyk-boot-web-deployment.yaml com o seguinte conteúdo:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: snyk-boot-web
  namespace: bananas
spec:
  selector:
    matchLabels:
      app: snyk-boot-web
  replicas: 1
  template:
    metadata:
      labels:
        app: snyk-boot-web
    spec:
      containers:
        - name: snyk-boot-web
          image: pasapples/snyk-boot-web:v1
          imagePullPolicy: Always
          ports:
            - containerPort: 5000

Implante-o assim:

➜ kubectl apply -f snyk-boot-web-deployment.yaml
deployment.apps/snyk-boot-web created

Após cerca de 3 minutos, verifique se o workload foi verificado e importado automaticamente para a organização bananas no aplicativo do Snyk, conforme instruído pelo controlador do Snyk no namespace bananas.

Painel de projetos do Snyk exibindo projetos do Kubernetes, contagens de vulnerabilidades por gravidade e opções para ver relatórios ou adicionar um projeto.

Bônus: como visualizar os logs dos controladores do Snyk

As configurações e os arquivos YAML do Kubernetes podem ser um pouco complicados. Se você tiver problemas para configurar os monitores, pode ser útil visualizar os logs de cada controlador do Snyk, usando os comandos a seguir:

Controlador do Snyk de Apples

export APPLES_POD=`kubectl get pods --namespace apples -l "app.kubernetes.io/name=snyk-monitor-apples" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n apples $APPLES_POD -f

Controlador do Snyk de Bananas

export BANANAS_POD=`kubectl get pods --namespace bananas -l "app.kubernetes.io/name=snyk-monitor-bananas" -o jsonpath="{.items[0].metadata.name}"`

kubectl logs -n bananas $BANANAS_POD -f

Resumo

Neste blog, mostramos como implantar vários controladores do Snyk em um único cluster Kubernetes, cada um monitorando seu próprio namespace. Os controladores se comunicam com a API do Kubernetes para determinar quais workloads (como Deployment, ReplicationController e CronJob, conforme definidos no arquivo de política Rego) estão em execução no cluster, localizar as imagens associadas e verificá-las diretamente no cluster em busca de vulnerabilidades.

Sinta-se à vontade para testar estas etapas no seu próprio cluster Kubernetes. Para isso, inicie uma avaliação gratuita do plano Snyk Business.

Recursos para saber mais

Agora que você aprendeu como é fácil configurar a integração do Snyk com o Kubernetes, confira alguns links úteis para começar sua jornada de segurança de contêineres.

Proteja a infraestrutura desde a origem

A Snyk automatiza a segurança e a conformidade de IaC nos fluxos de trabalho e detecta recursos com configurações divergentes ou ausentes.

Leia mais

feature insights context
Blog

Os ataques autônomos já chegaram. A defesa precisa acompanhar o ritmo.

Os atacantes autônomos estão reduzindo o tempo disponível para a defesa. Saiba como a descoberta, a correção, a validação e a prevenção contínuas ajudam as equipes de segurança a acompanhar esse ritmo.

Blog

Evo ADS Govern Agent Behavior já está disponível: controle o uso de MCP

Evo ADS Govern Agent Behavior já está disponível, começando por MCP Governance. Descubra, aprove, monitore, registre e bloqueie o uso de servidores MCP nos principais agentes de programação com IA.

illustration hero ai
Blog

O que é Agentic AppSec?

Saiba como Agentic AppSec usa agentes de IA fundamentados, com limites definidos e verificados de forma independente para executar o ciclo de segurança de aplicações.