Esse repositório contém um conjunto de workflows reusáveis que podem ser usados para criar uma pipeline CI/CD DevSecOps que gera uma imagem Docker, e atestados infalsificáveis para a imagem Docker que podem ser usados por um consumidor para verificar a integridade da imagem, o processo de build, e se a imagem obedece aos requisitos de segurança.
Os atestados assinados estão no formato in-toto, e são gerados por geradores SLSA3, ou pela ferramenta cosign.
A pipeline também faz o deploy da imagem em um cluster k8s usando o arquivo de manifesto fornecido, juntamente com um arquivo kubeconfig que deve ser armazenado como um segredo no repositório do workflow chamador.
O workflow principal desse repositório é acionado por uma chamada de outro workflow, e faz os seguintes jobs:
- SAST Scan do repositório usando Semgrep
- Teste unitário do código fonte usando go test
- Construção da imagem Docker junto com o atestado SLSA, e armazenamento da imagem em um registry temporário.
- Geração do SBOM da imagem usando a ferramenta trivy
- Análise de vulnerabilidades da imagem usando a ferramenta trivy
- Release da imagem no registry do projeto que chamou o workflow
- Criação e assinatura dos atestados in-toto, usando a ferramenta cosign. Os seguintes atestados são gerados:
- Atestado SBOM (cyclonedx)
- Atestado de Análise de Vulnerabilidades (vuln)
- Atestado de SAST Scan (predicado genérico)
- Atestado de Teste Unitário (predicado genérico)
- Atestado SLSA (slsaprovenance)
- Deploy da imagem no cluster k8s usando o arquivo de manifesto fornecido e o arquivo kubeconfig armazenado como um segredo no repositório.
-
Ter um repositório com um projeto em Golang, que contenha arquivos de teste, e um Dockerfile para a construção da imagem Docker.
-
Ter um cluster Kubernetes configurado e acessível. O arquivo de configuração do cluster deve estar configurado como um segredo no repositório.
-
Um arquivo de manifesto de deploy do Kubernetes, que será utilizado para fazer o deploy da imagem Docker no cluster.
-
Um registry de imagens Docker privado que será utilizado para armazenar temporariamente a imagem Docker gerada, antes de ser feito o release da imagem.
Em seu repositório, crie um arquivo de workflow que chame workflow principal em um dos jobs.
-
working-directory
: Diretório onde o Dockerfile está localizado. Se omitido o workflow vai buscar o Dockerfile na raiz do repositório. -
package-test-path
: Diretório onde os arquivos de teste estão localizados. Se omitido o workflow vai buscar os arquivos de teste na raiz do repositório. -
temp-registry
: URL do registry de imagens Docker privado que será utilizado para armazenar temporariamente a imagem Docker gerada, antes de ser feito o release da imagem. -
deployment
: Caminho para o manifesto de deployment.
-
intermediary-registry-username
: Usuário do registry de imagens Docker privado que será utilizado para armazenar temporariamente a imagem Docker gerada, antes de ser feito o release da imagem. -
intermediary-registry-password
: Senha do registry de imagens Docker privado que será utilizado para armazenar temporariamente a imagem Docker gerada, antes de ser feito o release da imagem.
O repositório ssip-demo-project contém um exemplo de uso do workflow.
O cliente pode verificar a integridade da imagem final usando a ferramenta cosign verify-attestation
.
Exemplo:
cosign verify-attestation \
--certificate-identity "https://github.com/Laerson/ssip-trusted-pipeline/.github/workflows/trusted-pipeline.yml@refs/tags/v1.0.0" \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
--certificate-github-workflow-ref "https://github.com/laerson/ssip-demo-project/.github/workflows/untrusted-pipeline.yml@refs/tags/v1.0.0" \
ghcr.io/laerson/ssip-demo-project:v1.0.0
Para mais detalhes sobre a verificação dos atestados, consulte a documentação do cosign.
Para detalhes sobre o modelo de segurança, consulte a especificação técnica do SLSA
Esse repositório foi criado como parte do projeto de pesquisa "SSIP: Software Supply Chain Security" do Laboratório de Sistemas Distribuídos da UFCG.