O blog da AWS

Construindo um pipeline de CI / CD AWS DevSecOps de ponta a ponta com ferramentas de código aberto SCA, SAST e DAST

Por Srinivas Manepalli, Arquiteto de Soluções DevSecops AWS

 

DevOps é uma combinação de filosofias culturais, práticas e ferramentas que combinam o desenvolvimento de software com as operações de tecnologia da informação. Essas práticas combinadas permitem que as empresas forneçam novos recursos de aplicativos e serviços aprimorados aos clientes em uma velocidade mais alta. DevSecOps leva isso um passo adiante, integrando segurança ao DevOps. Com DevSecOps, você pode entregar rapidamente mudanças de aplicativo seguras e compatíveis enquanto executa operações de forma consistente com automação.

Ter um pipeline DevSecOps completo é fundamental para construir uma fábrica de software bem-sucedida, que inclui integração contínua (CI), entrega e implantação contínuas (CD), testes contínuos, registro e monitoramento contínuos, auditoria, governança e operações. Identificar as vulnerabilidades durante os estágios iniciais do processo de desenvolvimento de software pode ajudar significativamente a reduzir o custo geral de desenvolvimento de mudanças no aplicativo, mas fazer isso de forma automatizada pode acelerar a entrega dessas mudanças também.

Para identificar vulnerabilidades de segurança em vários estágios, as organizações podem integrar várias ferramentas e serviços (em nuvem ou de terceiros) em seus pipelines DevSecOps. Integrar várias ferramentas e agregar as descobertas de vulnerabilidade pode ser um desafio se construídas a partir do zero. A AWS tem os serviços e ferramentas necessários para acelerar esse objetivo e fornece a flexibilidade para construir pipelines DevSecOps com integrações fáceis de ferramentas nativas da nuvem da AWS e de terceiros. A AWS também fornece serviços para agregar descobertas de segurança.

Nesta postagem, fornecemos uma arquitetura de referência de pipeline DevSecOps na AWS que cobre as práticas mencionadas acima, incluindo SCA (Software Composite Analysis – Análise composta de software), SAST (Static Application Security Testing – Teste de segurança de aplicativo estático), DAST (Dynamic Application Security Testing – Teste de segurança de aplicativo dinâmico) e agregação de descobertas de vulnerabilidade em um único painel centralizado. Além disso, esta postagem aborda os conceitos de segurança do pipeline e segurança no pipeline.

Você pode implantar esse pipeline na região AWS GovCloud (EUA) ou nas regiões AWS padrão. No momento em que este documento foi escrito, todos os serviços da AWS listados estão disponíveis no AWS GovCloud (EUA) e autorizados pelo FedRAMP para grandes cargas de trabalho na região, com exceção do AWS CodePipeline e do AWS Security Hub, que estão na região e atualmente sob análise do JAB em breve também será autorizado para o FedRAMP High.

 

Serviços e ferramentas

Nesta seção, discutiremos os vários serviços da AWS e ferramentas de terceiros usados nesta solução.

Serviços de CI/CD

Para CI/CD, utilizaremos os serviços AWS a seguir:

  • AWS CodeBuild – Um serviço de integração contínua totalmente gerenciado que compila o código-fonte, executa testes e produz pacotes de software que estão prontos para implantação.
  • AWS CodeCommit – Um serviço totalmente gerenciado de controle de código-fonte que hospeda repositórios seguros baseados em Git .
  • AWS CodeDeploy – é um serviço totalmente gerenciado de implantação que automatiza implantações de software em diversos serviços de computação como Amazon EC2, AWS Fargate, AWS Lambda e servidores locais.
  • AWS CodePipeline – é um serviço gerenciado de entrega contínua que ajuda a automatizar pipelines de liberação para oferecer atualizações rápidas e confiáveis de aplicativos e infraestrutura.
  • AWS Lambda – é um serviço de computação sem servidor que permite executar código sem provisionar ou gerenciar servidores, pagando apenas pelo tempo de computação que consome.
  • Amazon SNS – Simple Notification Service – é um serviço de mensagens totalmente gerenciado para a comunicação de aplicação para aplicação (A2A) e de aplicação para pessoa (A2P)
  • Amazon S3 – Simple Storage Service – é um serviço de armazenamento de objetos que oferece escalabilidade, disponibilidade de dados, segurança e performance líderes do setor.
  • AWS Systems Manager Parameter Store – oferece um armazenamento centralizado para gerenciar os dados de configuração em texto simples, como strings de bancos de dados, ou secretos, como senhas

Ferramentas de teste continuo

A seguir estão as ferramentas de varredura de código aberto que estão integradas no pipeline para os propósitos desta postagem, mas você pode integrar outras ferramentas que atendam aos seus requisitos específicos. Você pode usar a ferramenta de revisão de código estático Amazon CodeGuru para análise estática, mas no momento da redação deste artigo, ela ainda não está disponível no GovCloud e atualmente oferece suporte a Java e Python.

  • OWASP Dependency-Check – Uma ferramenta de Análise de composição de software (Software Composition Analysis – SCA) que tenta detectar vulnerabilidades divulgadas publicamente contidas nas dependências de um projeto.
  • SonarQube (SAST) – Captura bugs e vulnerabilidades em seu aplicativo, com milhares de regras automatizadas de análise de código estático.
  • PHPStan (SAST) – Concentra-se em encontrar erros em seu código sem realmente executá-lo. Ele detecta classes inteiras de bugs antes mesmo de você escrever testes para o código.
  • OWASP Zap (DAST) – Ajuda a encontrar automaticamente vulnerabilidades de segurança em seus aplicativos da web enquanto você desenvolve e testa seus aplicativos.

Serviços de Logs e monitoramento contínuos

A seguir estão os serviços da AWS para logs e monitoramento contínuos:

Serviços de auditoria e governança

A seguir estão os serviços de auditoria e governança da AWS:

  • AWS CloudTrail – Permite governança, conformidade, auditoria operacional e auditoria de risco de sua conta AWS.
  • AWS IAM – Identity and Access Management – Permite que você gerencie o acesso aos serviços e recursos da AWS com segurança. Com o IAM, você pode criar e gerenciar usuários e grupos da AWS e usar permissões para permitir e negar seu acesso aos recursos da AWS.
  • AWS Config – Permite acessar, auditar e avaliar as configurações de seus recursos AWS.

 Serviços de operações

A seguir estão os serviços de operações da AWS:

  • AWS Security Hub– Oferece uma visão abrangente de seus alertas de segurança e postura de segurança em suas contas AWS. Esta postagem usa o Security Hub para agregar todas as descobertas de vulnerabilidade como um único painel centralizado.
  • AWS CloudFormation – Oferece uma maneira fácil de modelar uma coleção de recursos relacionados da AWS e de terceiros, provisioná-los de forma rápida e consistente e gerenciá-los ao longo de seus ciclos de vida, tratando a infraestrutura como código.
  • AWS Systems Manager Parameter Store – Fornece armazenamento hierárquico seguro para gerenciamento de dados de configuração e gerenciamento de segredos. Você pode armazenar dados como senhas, strings de banco de dados, IDs de Amazon Machine Image (AMI) e códigos de licença como valores de parâmetro.
  • AWS Elastic Beanstalk – Um serviço fácil de usar para implantar e escalonar aplicativos e serviços da web desenvolvidos com Java, .NET, PHP, Node.js, Python, Ruby, Go e Docker em servidores familiares, como Apache, Nginx, Passenger e IIS. Esta postagem usa Elastic Beanstalk para implantar a pilha LAMP com WordPress e Amazon Aurora MySQL. Embora usemos o Elastic Beanstalk para esta postagem, você pode configurar o pipeline para implantar em vários outros ambientes na AWS ou em outro lugar, conforme necessário.

 

Arquitetura de pipeline

O diagrama a seguir mostra a arquitetura da solução.

 

AWS DevSecOps CICD pipeline architecture

 

As principais etapas são as seguintes:

  1. Quando um usuário faz o commit do código em um repositório CodeCommit, um evento CloudWatch é gerado e aciona CodePipeline.
  2. CodeBuild faz o build do pacote e carrega os artefatos para um bucket S3. CodeBuild recupera as informações de autenticação (por exemplo, tokens de ferramenta de varredura) do Parameter Store para iniciar a varredura. Como prática recomendada, é recomendado utilizar como repositórios de artefatos o AWS CodeArtifact para armazenar os artefatos, em vez do S3. Para simplificar o workshop, continuaremos usando o S3.
  3. CodeBuild verifica o código com uma ferramenta SCA (OWASP Dependency-Check) e uma ferramenta SAST (SonarQube ou PHPStan; no template de CloudFormation fornecido, você pode escolher uma dessas ferramentas durante a implantação, mas o CodeBuild está totalmente habilitado para trazer suas próprias ferramentas)
  4. Se houver alguma vulnerabilidade da análise SCA ou da análise SAST, o CodeBuild invoca a função Lambda. A função analisa os resultados no AWS Security Finding Format (ASFF) e os publica no Security Hub. O Security Hub ajuda a agregar e visualizar todas as descobertas de vulnerabilidade em um único lugar centralizado. A função Lambda também carrega os resultados da verificação em um bucket S3.
  5. Se não houver vulnerabilidades, CodeDeploy realiza o deploy do código no ambiente de staging do Elastic Beanstalk.
  6. Depois que realizado de forma bem-sucedida o deploy, o CodeBuild aciona a varredura DAST com a ferramenta OWASP ZAP (novamente, é totalmente possível uma abordagem para utilizar suas próprias ferramentas).
  7. Se houver alguma vulnerabilidade, CodeBuild invoca a função Lambda, que analisa os resultados no ASFF e os envia para o Security Hub. A função também carrega os resultados da varredura para um bucket S3 (semelhante à etapa 4).
  8. Se não houver vulnerabilidades, o estágio de aprovação é acionado e um e-mail é enviado ao aprovador para uma ação.
  9. Após a aprovação, o CodeDeploy realiza o deploy do código no ambiente de produção do Elastic Beanstalk.
  10. Durante a execução do pipeline, o CloudWatch Events captura as mudanças de estado de construção e envia notificações por e-mail para os usuários inscritos por meio de notificações SNS.
  11. O CloudTrail rastreia todas as chamadas de API e envia notificações sobre eventos críticos no pipeline e projetos do CodeBuild, como UpdatePipeline, DeletePipeline, CreateProject e DeleteProject, para fins de auditoria.
  12. O AWS Config rastreia todas as alterações de configuração dos serviços da AWS. As seguintes regras de configuração da AWS são adicionadas neste pipeline como práticas recomendadas de segurança:
    • CODEBUILD_PROJECT_ENVVAR_AWSCRED_CHECK – Verifica se o projeto contém as variáveis ​​de ambiente AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY. A regra é NON_COMPLIANT quando as variáveis ​​de ambiente do projeto contêm credenciais de texto simples.
    • CLOUD_TRAIL_LOG_FILE_VALIDATION_ENABLED – Verifica se o CloudTrail cria um arquivo de compilação assinado com logs. A AWS recomenda que a validação do arquivo seja habilitada em todas as trilhas. A regra NON_COMPLIANT se a validação não estiver habilitada.

A segurança do pipeline é implementada usando funções IAM e políticas de bucket do S3 para restringir o acesso aos recursos do pipeline. Os dados do pipeline em repouso e em trânsito são protegidos por criptografia e transporte seguro SSL. Usamos o Parameter Store para armazenar informações confidenciais, como tokens de API e senhas. Para ser totalmente compatível com estruturas como FedRAMP, outras coisas podem ser necessárias, como MFA.

A segurança no pipeline é implementada executando as verificações de segurança SCA, SAST e DAST. Como alternativa, o pipeline pode utilizar técnicas IAST (Interactive Application Security Testing) que combinariam os estágios SAST e DAST.

Como boas práticas recomendada, a criptografia deve ser ativada para o código e artefatos, seja em repouso ou em trânsito..

Na próxima seção, explicamos como implantar e executar o modelo de pipeline CloudFormation usado neste exemplo. Consulte os links fornecidos para saber mais sobre cada um dos serviços no pipeline. Se estiver utilizando modelos do CloudFormation para implantar infraestrutura usando pipelines, recomendamos o uso de ferramentas de linting como cfn-nag para verificar os modelos do CloudFormation em busca de vulnerabilidades de segurança.

 

Pré-requisitos

Antes de começar, certifique-se de que você atende aos seguintes pré-requisitos:

  • Ambientes Elastic Beanstalk com um aplicativo implantado. Neste post, usamos o WordPress, mas você pode usar qualquer outro aplicativo. Para obter mais informações, consulte Implementando um site WordPress de alta disponibilidade com um banco de dados Amazon RDS externo para Elastic Beanstalk.
  • Um repositório CodeCommit com o código do seu aplicativo. Para obter mais informações, consulte Criar um repositório AWS CodeCommit.
  • Os arquivos buildspec – *. Yml fornecidos, o arquivo sonar-project.properties, o arquivo json e o arquivo phpstan.neon carregados na raiz do repositório de código do aplicativo.
  • Uma função Lambda carregada em um bucket S3. Usamos essa função para analisar os relatórios de varredura e postar os resultados no Security Hub.
  • Uma URL do SonarQube URL e um API token para varredura de código.
  • Uma URL do OWASP ZAP API key para uma varredura WEB dinâmica.
  • Uma URL de aplicativo da web para executar o teste DAST.
  • Um endereço de e-mail para receber notificações de aprovação para implantação, notificações de mudança de pipeline e eventos CloudTrail.
  • AWS Config e Security Hub habilitados. Para maiores instruções, consulte Gerenciando o Configuration Recorder e Habilitando o Security Hub manualmente, respectivamente.

 

Implementando o pipeline

Para implantar o pipeline, conclua as seguintes etapas: Baixe o template de CloudFormation e o código do pipeline no repositório do GitHub.

  1. Faça login em sua conta da AWS, caso ainda não tenha feito isso..
  2. No console do CloudFormation, escolha Create Stack.
  3. Escolha o template de pipeline do CloudFormation.
  4. Escolha avançar.
  5. Forneca os parâmetros para a stack do CloudFormation:
    • Em Code, forneça detalhes do código, como o nome do repositório e o branch para acionar o pipeline.
    • Em SAST, escolha a ferramenta SAST (SonarQube ou PHPStan) para análise de código, insira o token API e o URL da ferramenta SAST. Você pode pular os detalhes do SonarQube se estiver usando PHPStan como ferramenta SAST.
    • Em DAST, escolha a ferramenta DAST (OWASP Zap) para teste dinâmico e insira o token de API, a URL da ferramenta DAST e a URL do aplicativo para executar a varredura
    • Em Lambda functions, insira o nome do bucket S3 da função Lambda, o nome do arquivo e o HandlerName.
    • Em STG Elastic Beanstalk Environment e PRD Elastic Beanstalk Environment, insira o ambiente Elastic Beanstalk e os detalhes da aplicação para para que o pipeline possa fazer o deploy nos ambientes de Staging.
    • Em General, insira os endereços de e-mail para receber notificações de alterações de status do pipeline e aprovações.

 

CloudFormation template

 

Depois que o pipeline for implantado, confirme a inscrição da assinatura do SNS acessando o link fornecido no e-mail para receber as notificações.

O template CloudFormation fornecido nesta postagem é formatado para AWS GovCloud. Se você estiver configurando isso em uma região padrão, você deve ajustar o nome da partição no modelo CloudFormation. Por exemplo, altere os valores de ARN de arn: aws-us-gov para arn: aws.

 

Executando o pipeline

Para acionar o pipeline, faça um commit nas alterações dos arquivos do repositório do aplicativo. Isso gera um evento CloudWatch e dispara o pipeline. CodeBuild verifica o código e se houver alguma vulnerabilidade, ele invoca a função Lambda para analisar e postar os resultados no Security Hub.

Ao postar as informações de localização de vulnerabilidade no Security Hub, precisamos fornecer um nível de gravidade da vulnerabilidade. Com base no valor de gravidade fornecido, o Security Hub atribui o rótulo da seguinte maneira. Ajuste os níveis de gravidade em seu código com base nos requisitos de sua organização.

  • 0 – INFORMATIVO
  • 1–39 – BAIXO
  • 40– 69 – MEDIO
  • 70–89 – ALTO
  • 90–100 – CRITICO

A captura de tela a seguir mostra a progressão do seu pipeline.

 

Estágios do CodePipeline

 

Varreduras do SCA e SAST

Em nossa arquitetura, o CodeBuild aciona a varredura SCA e SAST em paralelo. Nesta seção, discutimos a digitalização com OWASP Dependency-Check, SonarQube e PHPStan.

Executando varreduras com OWASP Dependency-Check (SCA)

A seguir está o trecho de código da função Lambda, onde os resultados da análise SCA são analisados e postados no Security Hub. Com base nos resultados, o nível de gravidade do Security Hub equivalente (normalized_severity) é atribuído.

 

Trecho do código da função Lambda para OWASP Dependency-check

 

Você pode ver os resultados no Security Hub, como na captura de tela a seguir.

 

Relatório do Security Hub da varredura do OWASP Dependency-check.

 

Realizando varredura com SonarQube (SAST)

A seguir está o trecho de código da função Lambda, onde os resultados da análise de código SonarQube são analisados e postados no Security Hub. Com base nos resultados do SonarQube, o nível de gravidade do Security Hub equivalente (normalized_severity) é atribuído.

 

Trecho do código da função Lambda para SonarQube

 

A captura de tela a seguir mostra os resultados no Security Hub.

 

Relatório do Security Hub da varredura do SonarQube.

 

Realizando a varredura com PHPStan (SAST)

A seguir está o trecho de código da função Lambda, onde os resultados da análise de código PHPStan são analisados e postados no Security Hub.

 

Trecho de código da função Lambda para PHPStan

 

A captura de tela a seguir mostra os resultados em Security Hub.

 

Relatório do Security Hub da varredura do PHPStan.

 

Varredura DAST

Em nossa arquitetura, o CodeBuild aciona a varredura DAST e a ferramenta DAST.

Se não houver vulnerabilidades na varredura SAST, o pipeline segue para o estágio de aprovação manual e um e-mail é enviado ao aprovador. O aprovador pode revisar e aprovar ou rejeitar o deploy. Se aprovado, o pipeline passa para o próximo estágio e realiza o deploy da aplicação no ambiente Elastic Beanstalk fornecido.

Fazendo varredura com OWASP Zap

Após o deploy bem sucedido, CodeBuild inicia a varredura DAST. Quando a varredura é concluída, se houver alguma vulnerabilidade, ele invoca a função Lambda semelhante à análise SAST. A função analisa e publica os resultados no Security Hub. A seguir está o trecho de código da função Lambda.

 

Trecho de código da função Lambda para OWASP-Zap

 

A captura de tela a seguir mostra os resultados em Security Hub.

 

Relatório do SecurityHub da varredura OWASP-Zap

 

A agregação de descobertas de vulnerabilidade no Security Hub oferece oportunidades para automatizar a correção. Por exemplo, com base na descoberta de vulnerabilidade, você pode acionar uma função Lambda para executar a ação de correção necessária. Isso também reduz a carga sobre as equipes de operações e segurança, porque agora elas podem resolver as vulnerabilidades a partir de um único painel centralizado, em vez de fazer monitorar os vários painéis de várias ferramentas.

Conclusão

Neste post, apresentei um pipeline DevSecOps que inclui CI / CD, testes contínuos, logs e monitoramento contínuos, auditoria e governança e operações. Demonstrei como integrar várias ferramentas de digitalização de código aberto, como SonarQube, PHPStan e OWASP Zap para análise SAST e DAST. Expliquei como agregar descobertas de vulnerabilidade no Security Hub como um único painel centralizado. Esta postagem também falou sobre como implementar a segurança do pipeline e no pipeline usando serviços nativos da nuvem AWS. Por fim, forneci o pipeline DevSecOps como código usando AWS CloudFormation. Para obter informações adicionais sobre os serviços AWS DevOps e para começar, consulte AWS DevOps e DevOps Blog.

 


Sobre o autor

Srinivas Manepalli é um arquiteto de soluções DevSecops nos EUA. Equipe do Fed SI SA na Amazon Web Services (AWS). Ele é apaixonado por ajudar os clientes, construir e arquitetar DevSecops e sistemas de software altamente disponíveis. Fora do trabalho, ele gosta de passar tempo com família, natureza e boa comida.