쿠버네티스에서 공급망 보안(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
'Kubernetes > Kubernetes Best Practices' 카테고리의 다른 글
[Scenario Playbook - 심화편 | Low Level #1] 기본적인 애플리케이션 배포 및 롤백 전략 (0) | 2025.03.16 |
---|---|
[Scenario Playbook - 심화편 ] 전체 글 리스트 (0) | 2025.03.16 |
[Scenario Playbook Ep.43] 🚀 Security 편 #2 | seccomp, AppArmor 및 권한 최소화 적용 (0) | 2025.03.16 |
[Scenario Playbook Ep.42] 🚀 Security 편 #1 | Pod Security Policy 적용 및 사용자 제한 (0) | 2025.03.16 |
[Scenario Playbook Ep.41] 🚀 Multi-Tenancy 편 #4 | 사용자 및 그룹별 리소스 접근 제어 (0) | 2025.03.16 |