본문 바로가기
IT & Tech 정보

정책 as Code 자동화: Open Policy Agent(OPA) & Gatekeeper 연동 끝판왕 가이드

by 지식과 지혜의 나무 2025. 5. 26.
반응형



1. 서론: 정책 as Code의 필요성

클라우드 네이티브·마이크로서비스·GitOps 시대에 보안·컴플라이언스를 GUI로 일일이 관리하는 건 불가능에 가깝습니다. “정책 as Code”는 정책을 코드화하여 버전 관리하고, CI/CD 파이프라인에 통합해 자동 검증·배포하는 패러다임입니다.
• 일관성 보장: 모든 클러스터·네임스페이스에 동일한 규칙 적용
• 감사 추적(Auditability): Git 이력으로 누가, 언제, 어떤 정책을 수정했는지 추적 가능
• 자동 차단: 비준수 리소스는 PR 단계에서 막고, 실시간 차단

이제 **Open Policy Agent(OPA)**와 Gatekeeper를 결합해, 실리콘밸리·심천 IT기업 수준의 정책 자동화 파이프라인을 구축해보겠습니다.



2. 아키텍처 개관

Git Repo (policy-repo)

├─ policies/
│   ├─ library.rego       ← 공용 Rego 라이브러리
│   ├─ constraints.yaml   ← Namespace/Label 제약
│   └─ templates/         ← ConstraintTemplates

└─ infra-repo/            ← 애플리케이션 인프라 코드
    └─ ...

1. OPA + Gatekeeper Controller 설치
2. ConstraintTemplate 으로 정책 템플릿 정의
3. Constraint 로 네임스페이스·리소스별 실제 제약 설정
4. GitOps(CircleCI·ArgoCD 등) 로 policies 디렉터리 모니터링
5. CI Pipeline 에서 opa test → kubectl apply 자동화



3. OPA 심화: Rego 라이브러리 & 테스트

3.1 공용 Rego 모듈 설계

# policies/library.rego
package k8s.allowed

# 공통 유틸: 특정 네임스페이스 허용 여부
isAllowedNamespace[ns] {
  ns == "default"
} else {
  ns == "kube-system"
}

# 유틸: 태그 값이 “team-<team>” 형태인지 확인
isTeamLabelValid[labels] {
  startswith(labels["team"], "team-")
}

• 모듈화: 재사용 가능한 유틸 함수와 규칙 분리
• 테스트: policies/tests/library_test.rego

package k8s.allowed

test_allowed_default {
  isAllowedNamespace["default"]
}
test_invalid_ns {
  not isAllowedNamespace["unknown"]
}



3.2 로컬 OPA 테스트

opa test policies/ -v

• 실패 시 opa fmt·opa lint 적용
• 커밋 전 훅(pre-commit)으로 자동 실행



4. Gatekeeper 설정 심화

4.1 ConstraintTemplate 정의

# policies/templates/hostPathForbidden_template.yaml
apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: k8sdisallowhostpath
spec:
  crd:
    spec:
      names:
        kind: K8sDisallowHostPath
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8s.disallowhostpath

        violation[{"msg": msg, "details": {"path": path}}] {
          input.review.kind.kind == "Pod"
          some i
          path := input.review.object.spec.volumes[i].hostPath
          msg := sprintf("HostPath 볼륨은 금지됩니다 (%v)", [path])
        }

4.2 Constraint 적용

# policies/constraints/hostpath_forbid_constraint.yaml
apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sDisallowHostPath
metadata:
  name: disallow-hostpath-volumes
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]

• dynamic match: namespaces: ["dev-*"] 와일드카드 지원
• exclude: namespaceSelector: {exclude: ["kube-system"]} 로 핵심 시스템 예외 처리



5. CI/CD 파이프라인 자동화

5.1 GitHub Actions 예시

# .github/workflows/policy-ci.yml
name: Policy CI

on:
  push:
    paths:
      - 'policies/**'

jobs:
  test-and-deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: OPA Test
      run: |
        opa test policies/ -v
    - name: Gatekeeper Lint
      run: |
        kubectl krew install gatekeeper && kubectl gatekeeper lint policies/templates
    - name: Deploy Policies via ArgoCD
      env:
        ARGOCD_SERVER: ${{ secrets.ARGOCD_SERVER }}
        ARGOCD_TOKEN: ${{ secrets.ARGOCD_TOKEN }}
      run: |
        argocd app diff policies-app && argocd app sync policies-app

• OPA 테스트: opa test로 Rego 유닛·통합 테스트
• Gatekeeper Lint: kubectl gatekeeper lint로 CRD 스키마 검증
• ArgoCD 동기화: 정책 레포트를 GitOps 방식으로 배포

5.2 Slack 알림 & 자동 롤백
• 실패 시 argocd app rollback policies-app --to-revision=<prev> 호출
• watch 동작으로 감시, Slack Webhook 연동



6. 트러블슈팅 & “아, 이런 방법도” 팁
• ConstraintTemplate CRD 설치 안 됐을 때
• kubectl get crd constraints.gatekeeper.sh 확인 후 crd apply
• 네임스페이스 레이블 기반 필터

match:
  namespaceSelector:
    matchLabels:
      env: prod


• OPA Bundle 배포
• opa bundle policies/ --output bundle.tar.gz
• Gatekeeper Config로 S3 URL 지정하여 자동 업데이트
• 레거시 Helm 차트 정책 주입
• helm template → kustomize → Gatekeeper ConstraintTemplate으로 자동 변환 스크립트 작성



7. 결론: “끝판왕” 정책 as Code

이제 OPA의 강력한 Rego 엔진과 Gatekeeper의 Admission Controller를 결합해, 쿠버네티스 클러스터 전반에 걸친 보안·컴플라이언스 정책을 완전 자동화할 수 있습니다.
• 정책 모듈화: Rego 라이브러리 + 유닛 테스트
• 정책 배포: GitOps(CircleCI/GitHub Actions + ArgoCD)
• 실시간 차단: Gatekeeper Constraint로 비준수 리소스 자동 봉인
• 감사 추적: Git 이력으로 정책 변경·배포 이력 관리

“교과서엔 나오지 않는, 실리콘밸리·심천 IT기업 톱티어 엔지니어 수준의 정책 as Code 파이프라인”을 직접 경험해 보세요! 여러분의 클러스터가 한층 더 안전해집니다.

반응형