Skip to main content

Proteja sua aplicação do Argo CD ao Kubernetes

Escrito por

JJ Ng

Pas Apicella

Kubernetes Blog

12 de outubro de 2022

0 minutos de leitura

GitOps é uma abordagem popular para gerenciar e proteger o pipeline de desenvolvimento de aplicações. Para muitas pessoas que estão começando a adotar GitOps, surge uma dúvida comum: “como proteger meu pipeline quando tudo é automatizado?”

O framework GitOps é um conceito em que todas as alterações e commits de código são feitos pelo Git, que então aciona um pipeline automatizado para criar e implantar aplicações no Kubernetes. Como há poucos pontos de contato entre as equipes de desenvolvimento e segurança ao longo do pipeline, é preciso tornar a segurança obrigatória para garantir que as aplicações implantadas tenham o mínimo possível de vulnerabilidades.

Este artigo mostra como a Snyk pode oferecer segurança de aplicações em GitOps, com foco em uma ferramenta popular: o Argo CD. Nesse cenário, a Snyk executa uma análise de IaC para garantir que a aplicação esteja segura antes da implantação e interrompe o build caso não esteja. A Snyk também pode monitorar automaticamente as aplicações implantadas em diferentes namespaces do Kubernetes.

O que é o Argo CD?

O Argo CD é uma ferramenta de entrega contínua (CD) declarativa e nativa do Kubernetes que acompanha um repositório e detecta alterações ou “drift”. Em seguida, aplica as alterações necessárias à configuração do cluster Kubernetes.

Como configurar o Argo CD para funcionar com a Snyk

Esta demonstração mostra como começar seu processo de GitOps com o Argo CD, usando a Snyk para proteger a aplicação e monitorar workloads do Kubernetes. Você seguirá estas etapas:

  1. Clone seu repositório Git

  2. Configure o Argo CD

  3. Implante a aplicação usando o Argo CD

  4. Crie um objeto Secret do Kubernetes para seu token da Snyk

  5. Crie um hook de recurso PreSync do Argo CD

  6. Aguarde o Argo CD detectar o drift de configuração

  7. Faça a integração com o Kubernetes

Pré-requisitos

  1. Para executar testes da Snyk no Argo CD e importar automaticamente workloads do Kubernetes para a Snyk, é necessário ter uma conta da Snyk com plano Business ou Enterprise. Se você ainda não tem uma conta da Snyk, pode iniciar uma avaliação gratuita do nosso plano Business.

  2. Uma instância do Argo CD em execução no cluster Kubernetes. Confira os detalhes de configuração na documentação do Argo CD.

  3. Um cluster Kubernetes em execução (por exemplo, EKS, AKS, GKE, Red Hat OpenShift ou qualquer distribuição compatível).

Etapa 1: clone seu repositório Git

Esta demonstração usa uma aplicação de enquetes em Flask, cujo código-fonte está hospedado em https://github.com/jiajunngjj/flask-polling-app. Clone o repositório no seu próprio ambiente.

žœ  git clone https://github.com/jiajunngjj/flask-polling-app.git

Etapa 2: configure o Argo CD

Adicione seu cluster Kubernetes ao Argo CD:

žœ argocd cluster add CONTEXTNAME

Nesta demonstração, o Argo CD está dentro deste cluster Kubernetes, então a conexão é estabelecida automaticamente usando o nome de host interno do K8s (kubernetes.default.svc):

Página de configurações de clusters do Argo CD mostrando um cluster Kubernetes no próprio cluster em https://kubernetes.default.svc, na versão 1.21 e com status de conexão bem-sucedida

Em seguida, verifique se o repositório mencionado anteriormente também foi adicionado ao Argo CD:

Formulário “Conectar repositório usando SSH” do Argo CD, com o projeto padrão e o URL de um repositório do GitHub.

Depois que o repositório for adicionado, você verá algo parecido com isto:

Página de configurações de repositórios do Argo CD mostrando dois repositórios do GitHub com conexões bem-sucedidas e opções para conectar repositórios.

Etapa 3: implante a aplicação usando o Argo CD

Crie um namespace do Kubernetes para implantar a aplicação. Neste caso, vamos criar o namespace argocd-demo para executar o flask-polling-app:

žœ kubectl create ns argocd-demo

Use a linha de comando do Argo CD para criar a aplicação (ou faça isso pela interface do Argo CD depois de adicionar o repositório):

žœ argocd app create snyk-demo  \  --repo https://github.com/jiajunngjj/flask-polling-app.git \  --path argocd \  --dest-server https://kubernetes.default.svc \  --dest-namespace argocd-demo

Veja o que cada parte do comando faz:

  • repo — Repositório de gerenciamento de código-fonte (SCM)

  • path — Diretório que contém o manifesto do Kubernetes

  • dest-server — Cluster Kubernetes

  • dest-namespace — Namespace do Kubernetes onde a aplicação será implantada

Depois que a aplicação for criada no Argo CD, ela aparecerá na interface com o status OutOfSync:

Painel de aplicações do Argo CD mostrando o aplicativo snyk-demo marcado como Ausente e Fora de sincronia
Tela de detalhes da aplicação do Argo CD mostrando a aplicação snyk-demo como OutOfSync, com os recursos de serviço e implantação polling-app na árvore da aplicação.

Em seguida, execute o comando sync do Argo CD para implantar a aplicação:

žœ argocd app sync snyk-demo

A aplicação deverá aparecer na interface do Argo CD:

Árvore de detalhes do aplicativo Argo CD exibindo o aplicativo snyk-demo saudável e sincronizado, além dos recursos do Kubernetes da polling-app

Você também verá que a aplicação começou a ser implantada no namespace do Kubernetes argocd-demo:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 33spolling-app-6f5978849c-tqpd2 1/1 Running 0 33s

Etapa 4: crie um objeto Secret do Kubernetes para seu token da Snyk

Depois que a aplicação for adicionada ao Argo CD, é hora de incluir o teste Snyk IaC no pipeline do Argo CD. Recupere seu token da Snyk no app da Snyk e crie um objeto Secret no namespace argocd-demo:

➜ kubectl create secret generic snyk-token \ --from-literal=token=<XXXX-XXXXXX-XXXXXXXX> \ -n argocd-demo

Etapa 5: crie um hook de recurso PreSync do Argo CD

Crie um arquivo chamado snyk-scan.yaml no mesmo diretório dos arquivos YAML de implantação (argocd), com o seguinte conteúdo:

apiVersion: batch/v1
kind: Job
metadata:
  name: snyk-iac-scan
  annotations:
    argocd.argoproj.io/hook: PreSync
spec:
  ttlSecondsAfterFinished: 600
  template:
    spec:
      containers:
      - name: snyk-cli
        image: snyk/snyk-cli:npm
        command: ["/bin/sh","-c"]
        args:
          - git clone https://github.com/jiajunngjj/flask-polling-app.git;
            snyk auth $SNYK_TOKEN;
            snyk iac test flask-polling-app/argocd/polling-app.yaml || true;
        env:
          - name: SNYK_TOKEN
            valueFrom:
              secretKeyRef:
                name: snyk-token
                key: token
      restartPolicy: Never
  backoffLimit: 0

Edite o arquivo polling-app.yaml para acionar a detecção de drift de configuração (neste exemplo, o número de réplicas é alterado para “1”):

---
apiVersion: v1
kind: Service
metadata:
  name: polling-app
spec:
  ports:
  - name: 8080-tcp
    port: 8080
    protocol: TCP
    targetPort: 8080
  selector:
    app: polling-app
  type: LoadBalancer

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: polling-app
spec:
  replicas: 1
  selector:
  matchLabels:
    app: polling-app
  template:
    metadata:
      labels:
        app: polling-app
    spec:
      containers:
      - image: jiajunngjj/polling-app
        name: polling-app
        ports:
        - containerPort: 8080
      restartPolicy: "Always"

Execute comandos do Git para enviar o arquivo ao repositório:

➜ git add argocd/snyk-scan.yaml argocd/polling-app.yaml➜ git commit -m "added snyk-scan.yaml and edited polling-app.yaml"➜ git push

Etapa 6: aguarde o Argo CD detectar o drift de configuração

Quando o Argo CD detecta o drift de configuração, ele começa a sincronizar para alcançar o novo estado desejado. Você verá a análise do Snyk IaC ser acionada antes da implantação da aplicação:

Árvore de detalhes da aplicação Argo CD mostrando a aplicação snyk-demo saudável e sincronizada, com o job snyk-iac-scan destacado em vermelho.

Você também verá snyk-iac-scan em execução como pod:

➜ kubectl get pods -n argocd-demoNAME READY STATUS RESTARTS AGEpolling-app-6f5978849c-pp8f4 1/1 Running 0 16msnyk-iac-scan-9x8gz 0/1 Completed 0 2m32s

Por fim, na interface do Argo CD, você verá uma tarefa snyk-iac-scan:

Os logs do Argo CD para a tarefa snyk-iac-scan mostram que os testes do Snyk Infrastructure as Code foram concluídos com cinco problemas de baixa gravidade.

Etapa 7: faça a integração com o Kubernetes

A Snyk se integra ao Kubernetes, permitindo importar e testar seus workloads em execução para identificar vulnerabilidades nas imagens associadas e configurações que possam reduzir a segurança desses workloads. Depois da importação, a Snyk monitora continuamente os workloads, identificando e priorizando problemas de segurança à medida que novas imagens são implantadas e as configurações dos workloads mudam.

Uma vantagem é que você não precisa atualizar os arquivos YAML de implantação: tudo é feito automaticamente pelo Snyk Controller se você o configurar para importar workloads automaticamente (conforme explicado na documentação da Snyk). A Snyk é compatível com os seguintes workloads:

  • Deployments

  • ReplicaSets

  • DaemonSets

  • StatefulSets

  • Jobs

  • CronJobs

  • ReplicationControllers

  • Pods

Outros artigos da Snyk mostram como instalar vários clusters Kubernetes da Snyk em um único cluster e usar o Pulumi para automatizar a integração da Snyk com o Kubernetes.

Depois que o Argo CD implanta sua aplicação, a integração da Snyk com o Kubernetes importa a análise desse workload para a plataforma, sem nenhuma intervenção manual:

Painel de projetos do Snyk que lista cargas de trabalho do Kubernetes e a quantidade de problemas de segurança, com o projeto polling-app destacado por um oval vermelho.
Painel de projetos do Snyk para um aplicativo de votação no Kubernetes, mostrando detalhes da imagem e recomendações para atualizar a imagem base do Python.

Resumo

Esta demonstração usa o hook de recurso do Argo CD para acionar uma análise do Snyk IaC sempre que uma alteração de configuração é detectada. Assim, é possível exigir segurança em um fluxo de trabalho GitOps, usando a Snyk para detectar vulnerabilidades e interromper o fluxo sempre que uma vulnerabilidade detectada ultrapassar o limite de severidade definido. Isso garante que código vulnerável nunca chegue ao ambiente de produção.

Saiba mais

Agora que você aprendeu a configurar um teste Snyk IaC com o Argo CD e monitorar workloads no Kubernetes, confira estes recursos para saber como proteger ainda mais o ciclo de vida do desenvolvimento de software:

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.