Cosign: Garantindo a confiabilidade das nossas imagens

O Cosign suporta a assinatura, verificação e armazenamento de artefatos de software em um registro OCI (Open Container Initiative). Embora o Cosign tenha sido desenvolvido com contêineres e artefatos relacionados a contêineres em mente, ele também pode ser usado para pacotes de software de código aberto e outros tipos de arquivos. Portanto, o Cosign pode ser usado para assinar blobs (objetos binários grandes), arquivos como READMEs, SBOMs (listas de materiais de software), Kubernetes Helm Charts, pacotes Tekton (um artefato OCI contendo recursos de CI/CD Tekton, como tarefas) e muito mais.

Ao assinar o software, você pode autenticar que você é quem diz ser, o que por sua vez pode habilitar uma raiz de confiança, de modo que os desenvolvedores e consumidores que usam seu software possam verificar que você criou o artefato de software que você disse ter criado. Eles também podem garantir que o artefato não tenha sido adulterado por um terceiro. Como alguém que pode usar bibliotecas de software, contêineres ou outros artefatos como parte do seu ciclo de desenvolvimento, um artefato assinado pode lhe dar maior garantia de que o código ou o contêiner que você está incorporando é proveniente de uma fonte confiável.

Instalando o Cosign

Instalando o Cosign com o binário:

curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign

Gere sua chave privada

Ao gerar sua chave privada, você pode usar o comando abaixo, lembre-se de guardar sua chave privada em um local seguro, pois ela será necessária para assinar suas imagens. O Cosign também solicitará uma senha para proteger sua chave privada:

cosign generate-key-pair

Assinando uma imagem

Para assinar uma imagem, você pode usar o comando abaixo:

cosign sign --key cosign.key nataliagranato/giropops-senhas:v1.0.0

A saída será parecida com a abaixo:

Enter password for private key: 
WARNING: Image reference nataliagranato/giropops-senhas:v1.0.0 uses a tag, not a digest, to identify the image to sign.
    This can lead you to sign a different image than the intended one. Please use a
    digest (example.com/ubuntu@sha256:abc123...) rather than tag
    (example.com/ubuntu:latest) for the input to cosign. The ability to refer to
    images by tag will be removed in a future release.


        The sigstore service, hosted by sigstore a Series of LF Projects, LLC, is provided pursuant to the Hosted Project Tools Terms of Use, available at https://lfprojects.org/policies/hosted-project-tools-terms-of-use/.
        Note that if your submission includes personal data associated with this signed artifact, it will be part of an immutable record.
        This may include the email address associated with the account with which you authenticate your contractual Agreement.
        This information will be used for signing this artifact and will be stored in public transparency logs and cannot be removed later, and is subject to the Immutable Record notice at https://lfprojects.org/policies/hosted-project-tools-immutable-records/.

By typing 'y', you attest that (1) you are not submitting the personal data of any other person; and (2) you understand and agree to the statement and the Agreement terms at the URLs listed above.
Are you sure you would like to continue? [y/N] y
tlog entry created with index: 127194420
Pushing signature to: index.docker.io/nataliagranato/giropops-senhas

Agora é possível verificar no registry da imagem que a assinatura foi feita.

sha256-981fc3ca11cf2426c45b4a0b5c163a44062af3d1aeb7b8933b042f844123b5b0.sig

Last pushed 3 minutes ago by nataliagranato

docker pull nataliagranato/giropops-senhas:sha256-981fc3ca11cf2426c45b4a0b5c163a44062af3d1aeb7b8933b042f844123b5b0.sig

Verificando uma imagem

Para verificar uma imagem, você pode usar o comando abaixo:

cosign verify -key cosign.pub nataliagranato/giropops-senhas:v1.0.0

A saída será parecida com a abaixo:

Verification for index.docker.io/nataliagranato/giropops-senhas:v1.0.0 --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - Existence of the claims in the transparency log was verified offline
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"index.docker.io/nataliagranato/giropops-senhas"},"image":{"docker-manifest-digest":"sha256:981fc3ca11cf2426c45b4a0b5c163a44062af3d1aeb7b8933b042f844123b5b0"},"type":"cosign container image signature"},"optional":{"Bundle":{"SignedEntryTimestamp":"MEYCIQDQ7AIZQM2PeKn5yVR48QJN3lyfvRLYA8jDQCrEDz0PVgIhAOaeVzLQ/8byaxsC05CRtlG0ytv0+QLbJ07T4t01RU9u","Payload":{"body":"eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIzZjljNTQ2Yzg0MmZkZTkzOGRhYWZkZmY1MGQ0ZWY0ZjljMTJmMjk4ZTQxODNkYjUwYzQwZTQ0MDI5MDdhMTE1In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURQZXBiNUtVNFhmY3laeS9KNTY4OGFkYm5hcExvZnNjcDlaVEVBWHNVaTRBSWhBSkdRb1cvQjRoSWRUZEJ2bitjQnFZM0t2dzNCYkdDWFp6dEJhSkpKVWgyZCIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCUVZVSk1TVU1nUzBWWkxTMHRMUzBLVFVacmQwVjNXVWhMYjFwSmVtb3dRMEZSV1VsTGIxcEplbW93UkVGUlkwUlJaMEZGUXpremIzaGFkM2RHZFVGNUwzRjZVbkV6U21waldpODNkVFpIZEFwV1VYZHhjRzQ0ZWpCa1lUQTRjV0V5VjNOM1V6UTBaM1JLWm1kWFV6VlhiVm8zVTNKVWNuTjRhVzB3TmtkV1RtaDFZMlJxY1VoYVEzWkJQVDBLTFMwdExTMUZUa1FnVUZWQ1RFbERJRXRGV1MwdExTMHRDZz09In19fX0=","integratedTime":1725369983,"logIndex":127194420,"logID":"c0d23d6ad406973f9559f3ba2d1ca01f84147d8ffc5b8445c224f98b9591801d"}}}}]

Para o projeto Giropops, o Cosign foi utilizado para assinar a imagem nataliagranato/linuxtips-giropops-senhas através da pipeline de CI/CD do Github Actions giropops-docker.yml, disponível em .github/workflows. Toda vez que uma nova imagem é construída e enviada para o Docker Hub, ela é assinada com o Cosign.A assinatura é feita com a chave privada cosign.key e a verificação é feita com a chave pública cosign.pub, armazenadas como variáveis de ambiente no repositório do Github.

Last updated