Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.44] 🚀 Security 편 #3 | 공급망 보안(Supply Chain Security) 및 이미지 서명(Trusted Images)

ygtoken 2025. 3. 16. 18:52
728x90

 

쿠버네티스에서 공급망 보안(Supply Chain Security)은 컨테이너 이미지가 안전하게 배포되고, 신뢰할 수 있는 소스로부터 제공되었음을 보장하는 것이 중요합니다.

이번 글에서는 Notary 및 Cosign을 활용한 컨테이너 이미지 서명 및 검증 방법과, 공급망 공격을 방지하기 위한 보안 정책 적용 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ Notary 및 Cosign을 활용한 컨테이너 이미지 서명 및 검증

2️⃣ 공급망 공격 방지를 위한 보안 정책 적용

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Notary 및 Cosign을 활용한 컨테이너 이미지 서명 및 검증

 

❓ 문제 상황

 

운영팀에서 신뢰할 수 없는 컨테이너 이미지가 클러스터에 배포되지 않도록 방지해야 하는 요구사항이 생겼습니다.

특히, 공급망 공격(Supply Chain Attack)을 예방하기 위해, 서명된 컨테이너 이미지만 배포 가능하도록 제한해야 합니다.

컨테이너 이미지를 서명하고, 서명된 이미지만 배포 가능하도록 검증해야 합니다.

Cosign을 사용하여 컨테이너 이미지 서명을 수행해야 합니다.

서명되지 않은 이미지는 쿠버네티스에서 실행되지 않도록 차단해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Cosign을 사용하여 컨테이너 이미지에 서명을 추가합니다.

 

2. 서명된 이미지만 배포 가능하도록 정책을 설정합니다.

 


✅ 정답 (컨테이너 이미지 서명 및 검증)

 

🔹 1단계: Cosign을 사용하여 컨테이너 이미지 서명

cosign generate-key-pair  # 공개 및 개인 키 생성

 

💡 예상 출력 값

Enter password for private key:
Private key written to cosign.key
Public key written to cosign.pub
cosign sign --key cosign.key myregistry.com/myapp:latest

 

💡 예상 출력 값

Pushing signature to: myregistry.com/myapp:latest.sig

 

🔹 2단계: 서명된 이미지 검증

cosign verify --key cosign.pub myregistry.com/myapp:latest

 

💡 예상 출력 값

Verified OK

 

 


2️⃣ 공급망 공격 방지를 위한 보안 정책 적용

 

❓ 문제 상황

 

운영팀에서 서명되지 않은 이미지가 쿠버네티스 클러스터에서 실행되지 않도록 차단해야 하는 요구사항이 생겼습니다.

이를 위해 Admission Controller를 사용하여, 서명된 컨테이너 이미지만 실행 가능하도록 정책을 적용해야 합니다.

Pod이 실행될 때 서명된 이미지인지 검증해야 합니다.

서명되지 않은 컨테이너 이미지는 배포되지 않도록 차단해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. OPA Gatekeeper 또는 Kyverno와 같은 Admission Controller를 사용하여 정책을 적용합니다.

 

2. Policy를 설정하여 서명된 이미지만 실행되도록 제한합니다.

 


✅ 정답 Manifest (서명된 이미지 검증을 위한 Policy 적용)

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredImageSignature
metadata:
  name: require-signed-images
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
  parameters:
    keys:
      - "cosign.pub"  # 서명된 이미지 검증을 위한 공개 키
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-signed-images
spec:
  validationFailureAction: Enforce  # 정책 위반 시 Pod 배포 차단
  background: true
  rules:
  - name: validate-image-signature
    match:
      resources:
        kinds:
        - Pod
    validate:
      message: "이미지가 서명되지 않았습니다."
      pattern:
        spec:
          containers:
          - image: "myregistry.com/myapp:*"
            signed: true

 

 


📌 적용 후 예상 결과 값

 

1. 서명되지 않은 컨테이너 이미지 실행 시도 (차단됨)

kubectl run unsigned-pod --image=myregistry.com/unsigned-app:latest

 

💡 예상 출력 값

Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: 이미지가 서명되지 않았습니다.

 

2. 서명된 컨테이너 이미지 실행 시도 (허용됨)

kubectl run signed-pod --image=myregistry.com/myapp:latest

 

💡 예상 출력 값

pod/signed-pod created

 

728x90