Kubernetes 이야기

Cosign 으로 Container 이미지 서명하기 본문

Kubernetes/보안

Cosign 으로 Container 이미지 서명하기

kmaster 2022. 2. 22. 18:17
반응형

Cosign

사용자가 만든 Container가 운영서버에 배포될때 변조 되지 않았음을 확인하는 것은 보안상 매우 중요한 일이다. Cosign 프로젝트는 OCI 레지스트리에서 컨테이너 서명, 확인 및 저장을 지원한다. 

(https://github.com/sigstore/cosign)

 

원래 컨테이너 이미지에 서명하는 것으로 잘 알려진 솔루션은 Docker Content Trust/Notary이다. 하지만 필자가 여러 자료를 찾고 있을 당시에는 Docker enginge없이 DCT/Notary를 사용하여 컨테이너 이미지를 서명하고 서명한 이미지를 Kubernetes에서 로딩할 때 검사하는 구성이 지원되지 않기(?) 때문이다. ( 지원이 안되는 것인지 못 찾은 것인지는 잘 모르겠다. )

현재 Kubernetes는 Container runtime으로 Docker를 더 이상 지원하지 않기 때문에 보통 Container runtime으로 containerd 또는 CRI-O를 사용한다. 그렇게 때문에 Kubernetes 운영서버에서도 Docker engine을 굳이 설치하지 않아도 운영이 가능하기 때문에 DCT/Notary 구조 보다는 다른 방법을 찾아 보았다.

 

Cosign 에서 지원하는 OCI Registry는 다음과 같다.

 

AWS Elastic Container Registry
GCP's Artifact Registry and Container Registry
Docker Hub
Azure Container Registry
JFrog Artifactory Container Registry
The CNCF distribution/distribution Registry
GitLab Container Registry
GitHub Container Registry
The CNCF Harbor Registry
Digital Ocean Container Registry
Sonatype Nexus Container Registry
Alibaba Cloud Container Registry

 

시작하기

 

1. 설치

# wget https://github.com/sigstore/cosign/releases/download/v1.5.2/cosign-linux-amd64
# chmod +x cosign-linux-amd64
# mv cosign-linux-amd64 cosign
# mv cosign /usr/local/bin/.

 

2. 이미지 서명을 위한 Key-pair 생성

 

# cosign generate-key-pair

# ls -al 
-rw-------. 1 root root  178 Feb 22 17:33 cosign.pub
-rw-------. 1 root root  649 Feb 22 17:33 cosign.key

 

key pair를 Kubernetes상에서 CI/CD 용도로 활용할 계획이면 아래와 같이 secret으로 관리가 가능핟.

# kubectl create ns image-sign

# cosign generate-key-pair k8s://image-sign/cosignkey
Enter password for private key:
Enter password for private key again:
Successfully created secret cosignkey in namespace image-sign
Public key written to cosign.pub

# kubectl get secret -n image-sign
NAME                       TYPE                                  DATA   AGE
cosignkey                  Opaque                                3      14s

 

3. Container build

 

# buildah build-using-dockerfile -t ghcr.io/kmaster8/image-sign .

# podman push --tls-verify=false ghcr.io/kmaster8/image-sign

 

4. Container image signing

 

# cosign sign --insecure-skip-verify --allow-insecure-registry  --key k8s://image-sign/cosignkey ghcr.io/kmaster8/image-sign
Pushing signature to: ghcr.io/kmaster8/image-sign

 

# cosign verify --allow-insecure-registry  --key k8s://image-sign/cosignkey ghcr.io/kmaster8/image-sign

Verification for ghcr.io/kmaster8/image-sign:latest --
The following checks were performed on each of these signatures:
  - The cosign claims were validated
  - The signatures were verified against the specified public key

[{"critical":{"identity":{"docker-reference":"ghcr.io/kmaster8/image-sign"},"image":{"docker-manifest-digest":"sha256:989c6bb6eedf1933b459efe50d33250207e768bd12e443ae84bb9c774322210f"},"type":"cosign container image signature"},"optional":null}]

 

만약 signing이 안된 이미지를 검사하면 아래와 같이 나타난다.

 

cosign verify --allow-insecure-registry  --key k8s://image-sign/cosignkey ghcr.io/kmaster8/image-nosign
Error: no matching signatures:

main.go:46: error during command execution: no matching signatures:

 

이미지 서명을 알아봤는데 다음 글에서 이제 서명된 이미지를 Kubernetes에서 pod로 실행 시 어떻게 검증 (verify) 하는지를 테스트해보겠다.

반응형
Comments