Este documento descreve as práticas recomendadas para proteger as suas compilações. O código de construção pode referir-se a diferentes tipos de operações, como:
- Otimizar ou ocultar código: por exemplo, a ferramenta de código aberto da Google Closure Compiler analisa o JavaScript, remove o código inativo e reescreve e minimiza o que resta. Também verifica o código quanto a erros comuns de JavaScript.
- Compilar código em código intermédio: por exemplo, pode compilar código Java num ficheiro de classe Java (
.class
) ou código C++ num ficheiro de objeto (.obj
). - Compilar código e criar links, criar uma biblioteca ou um ficheiro executável: por exemplo, compilar código C++ numa biblioteca partilhada (
.so
) ou num ficheiro executável do Windows (.exe
). - Empacotar código num formato distribuível ou implementável: os exemplos incluem a criação de ficheiros WAR (
.war
) Java a partir de ficheiros de classe Java, a criação de uma imagem Docker ou a criação de uma distribuição criada em Python (.whl
).
Consoante a linguagem de programação que usa e o ambiente para o qual faz a implementação, a sua compilação pode conter diferentes combinações destas operações. Por exemplo, uma compilação pode agrupar código Python numa distribuição criada e carregá-lo para um repositório de artefactos, como o Artifact Registry ou o PyPI, para que o possa usar como uma dependência nas funções do Cloud Run. Também pode colocar o código Python num contentor e implementar a imagem do contentor no Cloud Run ou no Google Kubernetes Engine.
As práticas neste documento focam-se na criação de código para embalagem ou implementação em ambientes de tempo de execução, em vez de compilar código.
Use compilações automáticas
Uma compilação automatizada ou uma compilação com script define todos os passos de compilação no script de compilação ou na configuração de compilação, incluindo os passos para obter o código-fonte e os passos para compilar o código. O único comando manual, se existir, é o comando para executar a compilação.
Por exemplo, um script de compilação pode ser:
- Um Cloud Build
cloudbuild.yaml
. - Um ficheiro Makefile que executa com a ferramenta
make
. - Um ficheiro de fluxo de trabalho do GitHub Actions no formato YAML armazenado no diretório
.github/workflows/
.
As compilações automatizadas oferecem consistência nos passos de compilação. No entanto, também é importante executar compilações num ambiente consistente e fidedigno.
Embora as compilações locais possam ser úteis para fins de depuração, a publicação de software a partir de compilações locais pode introduzir muitas preocupações de segurança, inconsistências e ineficiências no processo de compilação.
- Permitir compilações locais dá aos atacantes com intenções maliciosas uma forma de modificar o processo de compilação.
- As inconsistências nos ambientes locais dos programadores e nas práticas dos programadores dificultam a reprodução de compilações e o diagnóstico de problemas de compilação.
As compilações manuais tornam o processo ineficiente ao tirar partido de mais recursos de infraestrutura, como computação, armazenamento e redes. Nos requisitos para a framework SLSA, as compilações automatizadas são um requisito para o nível 1 da SLSA, e a utilização de um serviço de compilação em vez de ambientes de programadores para compilações é um requisito para o nível 2 da SLSA.
O Cloud Build é o serviço de compilação gerido no Google Cloud. Usa um ficheiro de configuração de compilação para fornecer passos de compilação ao Cloud Build. Pode configurar compilações para obter dependências, executar testes unitários, análises estáticas e testes de integração, bem como criar artefactos com ferramentas de compilação como Docker, Gradle, Maven, Go e Python. O Cloud Build está totalmente integrado com outros serviços de CI/CD, como o Artifact Registry e o Cloud Deploy, bem como com ambientes de tempo de execução, como o GKE e o Cloud Run. Também oferece integração com os principais sistemas de gestão de código fonte, como o GitHub e o Bitbucket.Google Cloud
Gere a proveniência da compilação
A criação de proveniência é uma coleção de dados validáveis sobre uma compilação.
Os metadados de proveniência incluem detalhes como os resumos das imagens criadas, as localizações de origem de entrada, a cadeia de ferramentas de compilação e a duração da compilação.
A geração da proveniência da compilação ajuda a:
- Verificar se um artefacto criado foi criado a partir de uma localização de origem fidedigna e por um sistema de compilação fidedigno.
- Identificar código injetado a partir de uma localização de origem ou um sistema de compilação não fidedigno.
Pode usar mecanismos de alertas e políticas para usar proativamente dados de proveniência da compilação. Por exemplo, pode criar políticas que apenas permitam implementações de código criadas a partir de origens validadas.
Para o nível 1 da SLSA, a proveniência da compilação tem de estar disponível para os consumidores dos artefactos criados. Para o nível 2 da SLSA, os dados de proveniência da compilação também têm de:
- Gerado pelo serviço de compilação ou legível diretamente a partir do serviço de compilação.
- Verificável por um consumidor quanto à autenticidade e integridade. Isto deve ser feito com uma assinatura digital gerada pelo serviço que cria os dados de proveniência da compilação.
Para o nível 3 da SLSA, o conteúdo de proveniência também tem de incluir:
- O ponto de entrada da definição de compilação.
- Todos os parâmetros de compilação sob o controlo de um utilizador.
O Cloud Build pode gerar a proveniência da compilação para imagens de contentores que oferecem garantia de compilação SLSA de nível 3. Para mais informações, consulte o artigo Ver a proveniência da compilação.
Use um ambiente de compilação efémero
Os ambientes efémeros são ambientes temporários destinados a durar apenas uma invocação de compilação. Após a compilação, o ambiente é limpo ou eliminado. As compilações efémeras garantem que o serviço de compilação e os passos de compilação são executados num ambiente efémero, como um contentor ou uma VM. Em vez de reutilizar um ambiente de compilação existente, o serviço de compilação aprovisiona um novo ambiente para cada compilação e, em seguida, destrói-o após a conclusão do processo de compilação.
Os ambientes efémeros garantem compilações limpas, uma vez que não existem ficheiros residuais nem definições de ambiente de compilações anteriores que possam interferir com o processo de compilação. Um ambiente não efémero oferece aos atacantes a oportunidade de injetar ficheiros e conteúdo maliciosos. Um ambiente efémero também reduz a sobrecarga de manutenção e as inconsistências no ambiente de compilação.
O Cloud Build configura um novo ambiente de máquina virtual para cada compilação e destrói-o após a compilação.
Restrinja o acesso ao serviço de compilação
Siga o princípio de segurança do menor privilégio concedendo o mínimo de autorizações necessárias ao serviço de compilação e aos recursos de compilação. Também deve usar uma identidade não humana para executar compilações e interagir com outros serviços em nome da compilação.
Se usar o Cloud Build:
- Conceda as autorizações mínimas necessárias aos membros da sua organização.
- Personalize as autorizações da conta de serviço que atua em nome do Cloud Build para que só tenha as autorizações necessárias para a sua utilização. Edite as autorizações da conta de serviço do Cloud Build predefinida ou considere usar uma conta de serviço personalizada.
- Use a política da organização Integrações permitidas do Cloud Build para controlar os serviços externos que têm autorização para invocar acionadores de compilação.
Coloque o Cloud Build num perímetro de serviço através dos VPC Service Controls. O perímetro permite a comunicação livre entre os serviços dentro do perímetro, mas limita a comunicação através do perímetro com base nas regras que especificar. Google Cloud O perímetro também mitiga o risco de exfiltração de dados.
O Cloud Build só suporta VPC Service Controls para compilações que executa num pool privado.
Proteja as credenciais
As compilações incluem frequentemente ligações a outros sistemas, como o controlo de versões, os repositórios de artefactos e os ambientes de implementação. A proteção das credenciais que usa nas suas compilações ajuda a evitar o acesso não autorizado a sistemas na sua cadeia de abastecimento de software e a exfiltração de dados.
Evite armazenar credenciais codificadas diretamente no controlo de versões ou na configuração de compilação. Em alternativa, armazene as credenciais num arquivo de chaves seguro.
No Google Cloud, o Secret Manager armazena em segurança chaves da API, palavras-passe e outros dados confidenciais. Pode configurar o Cloud Build para usar segredos armazenados no Secret Manager.
Faça a gestão das suas dependências
A integridade das suas aplicações depende da integridade do código que desenvolve e de todas as dependências que usa. Também tem de considerar onde publica as suas dependências, quem tem acesso de leitura e escrita aos seus repositórios de artefactos e as políticas para origens fidedignas de artefactos de compilação que implementa nos seus ambientes de tempo de execução.
Para saber mais sobre a gestão de dependências, consulte o artigo Gerir dependências.
No Cloud Build, usa criadores de nuvem para executar comandos. Os criadores são imagens de contentores com linguagens e ferramentas comuns instaladas. Pode usar imagens de contentores públicos de registos públicos, como o Docker Hub, criadores fornecidos pelo Cloud Build, criadores contribuídos pela comunidade e criadores personalizados que criar. Também pode usar buildpacks como criadores, incluindo os buildpacks do Google Cloud.
Reveja os criadores que usa nas suas compilações do Cloud Build, descubra quem os fornece e decida se confia neles na sua cadeia de fornecimento de software. Para manter um maior controlo sobre o código num criador, pode criar criadores personalizados em vez de usar criadores de uma origem pública.
Reduza as oportunidades de alterar a compilação
Existem vários outros fatores que podem influenciar uma compilação, incluindo:
- Compilações executadas em simultâneo e capazes de se influenciarem mutuamente ou uma compilação que persiste e afeta uma compilação subsequente.
- Compilações que aceitam parâmetros do utilizador que não sejam o ponto de entrada da compilação e a localização de origem de nível superior.
- Compilações que especificam dependências com intervalos ou dependências que são mutáveis (por exemplo, usar uma imagem com a etiqueta
latest
). Estas abordagens criam um risco de as compilações usarem versões incorretas ou indesejáveis de dependências.
As seguintes práticas ajudam a mitigar estes riscos:
- Execute cada compilação num ambiente efémero.
- Evite executar compilações com parâmetros adicionais para que os utilizadores não possam influenciar as variáveis definidas nos scripts de compilação.
- Restrinja o acesso ao serviço de compilação e aos recursos de compilação.
- Faça referência a versões imutáveis de dependências em vez de identificadores, como etiquetas, que podem apontar para uma versão diferente do artefacto no futuro. Para mais informações acerca das dependências, consulte o artigo Gestão de dependências.
Segurança da cadeia de abastecimento de software
Google Cloud oferece um conjunto de capacidades e ferramentas modulares que pode usar para melhorar a postura de segurança das suas cadeias de abastecimento de software. Apresenta estatísticas de segurança para aplicações criadas pelo Cloud Build. Isto inclui:
- O nível SLSA, que identifica o nível de maturidade da segurança da sua cadeia de abastecimento de software.
- Vulnerabilidades, lista de materiais de software (SBOM) e declarações de Vulnerability Exploitability eXchange (VEX) para artefactos de compilação.
- Crie a proveniência, que é uma coleção de metadados validáveis sobre uma compilação. Inclui detalhes como os resumos das imagens criadas, as localizações das fontes de entrada, a cadeia de ferramentas de compilação, os passos de compilação e a duração da compilação.
Para ver instruções sobre como ver estatísticas de segurança para aplicações criadas, consulte o artigo Crie uma aplicação e veja estatísticas de segurança.
O que se segue?
- Conheça as práticas recomendadas para proteger o código fonte.
- Conheça as práticas recomendadas para proteger as dependências.
- Conheça as práticas recomendadas para proteger as implementações.