본문 바로가기
카테고리 없음

Supply Chain Security as Code

by frontier12 2025. 5. 29.

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