118. + Argo CD 파이프라인
+ OPA Gatekeeper
: Tekton Chains + Sigstore Cosign + Rekor + Grafeas
⸻
🎯 목표
CI/CD 파이프라인 전 구간—소스코드, 의존성, 컨테이너 이미지, Helm 차트—에 대해 SBOM 생성·서명·투명성 로그·정책검증·GitOps 배포를 자동화하여, SLSA 수준의 공급망 보증을 코드로 구현합니다.
⸻
⚙️ 핵심 구성 요소
계층 도구/CRD 역할
빌드 체인 서명 Tekton Pipelines + Chains 빌드 시 SBOM(SBOM) 생성·컨텐츠 해시·서명
이미지 서명·로그 Sigstore Cosign + Rekor OCI 이미지 서명, Rekor 투명성 로그에 기록
메타데이터 저장 Grafeas (GCP Artifact Registry) 아티팩트 메타데이터·SBOM 저장·조회
정책 검증 OPA Gatekeeper 배포 전 이미지 서명, SBOM 포함, 취약점 점검 정책 검증
GitOps 배포 Argo CD 정책검증 통과한 리소스만 자동 Sync + Validate
알림·감사 Slack Notification + Git Commit Logs 서명 실패, 정책 위반, 배포 이력 실시간 알림 및 이력 기록
⸻
🏗️ 파이프라인 워크플로우
flowchart TD
A[Git Push: 앱 코드, Helm 차트]
--> B[Tekton Trigger → PipelineRun]
B --> C[Build Container & Chart]
C --> D[Chains SBOM 생성 & 서명]
D --> E[cosign sign ${IMAGE}; rekor log upload]
E --> F[grafeas store SBOM & metadata]
F --> G[Push Image & Chart to Registry]
G --> H[OPA Gatekeeper Validate (서명·SBOM·취약점)]
H -- 통과 --> I[Argo CD Sync Application]
H -- 실패 --> J[Slack 알림 & GitHub Status 실패]
I --> K[실제 클러스터에 배포]
K --> L[GitOps 이력 커밋 & PR Comment Logs]
⸻
🧪 실전 매니페스트 예시
1) Tekton Pipeline + Chains 설치 및 정의
# chains/install.yaml
apiVersion: tekton.dev/v1beta1
kind: PipelineResource
metadata:
name: chains-install
spec:
type: clusterTask
params:
- name: name
value: chains-install-task
# pipelines/build-and-sign.yaml
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
name: build-and-sign-pipeline
spec:
params:
- name: git-revision
- name: image-url
tasks:
- name: clone
taskRef: { name: git-clone }
params:
- name: url
value: $(resources.git.url)
- name: revision
value: $(params.git-revision)
- name: build
taskRef: { name: buildah }
params:
- name: IMAGE
value: $(params.image-url)
- name: chains-generate
taskRef: { name: chains-generate-sbom }
params:
- name: IMAGE
value: $(params.image-url)
- name: chains-sign
taskRef: { name: chains-sign-task }
params:
- name: IMAGE
value: $(params.image-url)
- name: push
taskRef: { name: buildah-push }
params:
- name: IMAGE
value: $(params.image-url)
2) Sigstore Cosign + Rekor 서명
# chains-sign-task.sh (ContainerOp 내부)
cosign generate-key-pair \
--kms gcpkms://projects/myproj/locations/global/keyRings/mykr/cryptoKeys/cosign \
--output cosign.key
cosign sign --key cosign.key $IMAGE
cosign upload-blob --rekor-url https://rekor.sigstore.dev cosign.pub
3) OPA Gatekeeper ConstraintTemplate / Constraint
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
name: k8srequireimagecosign
spec:
crd:
spec:
names: { kind: RequireCosignSignature }
targets:
- target: admission.k8s.gatekeeper.sh
rego: |
package k8srequireimagecosign
import data.cosign.rekor
violation[{"msg": msg}] {
img := input.review.object.spec.template.spec.containers[_].image
not rekor.hasEntry(img)
msg := sprintf("이미지 %v cosign 서명이 없거나 Rekor에 미등록", [img])
}
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: RequireCosignSignature
metadata:
name: enforce-cosign-signature
spec:
match:
kinds:
- apiGroups: ["apps"]
kinds: ["Deployment"]
4) Argo CD Application (Validate 옵션)
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: secure-app
spec:
source:
repoURL: https://github.com/myorg/secure-app
path: helm-chart
destination:
server: https://kubernetes.default.svc
namespace: secure-namespace
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- Validate=true # Gatekeeper 정책 검증 포함
⸻
✅ 기대 효과
• SBOM부터 이미지 서명, 투명성 로그, 정책검증, GitOps 배포까지 한 번에
• 공급망 무결성 보장: 미서명·취약 이미지 자동 차단
• 투명성 로그: Rekor로 누구나 검증 가능
• 완전한 GitOps: 선언된 리소스만 자동 배포, Drift 즉시 Self-Heal
⸻
카테고리 없음