OPA
Open Policy Agent
범용 정책 엔진. Kubernetes, API 게이트웨이 정책 관리.
Open Policy Agent
범용 정책 엔진. Kubernetes, API 게이트웨이 정책 관리.
OPA(Open Policy Agent)는 CNCF 프로젝트로, 클라우드 네이티브 환경에서 정책을 코드로 관리하는 범용 정책 엔진입니다. Rego라는 선언적 언어로 정책을 작성하며, Kubernetes뿐 아니라 API 게이트웨이, CI/CD, 마이크로서비스 등 다양한 곳에 적용됩니다.
OPA의 핵심 원리는 "정책과 데이터의 분리"입니다. 정책(Rego)과 데이터(JSON)를 OPA에 로드하면, 쿼리에 대해 허용/거부 결정을 반환합니다. 이를 통해 중앙 집중식 정책 관리가 가능합니다.
Kubernetes에서는 Gatekeeper를 통해 OPA를 사용합니다. API 게이트웨이에서는 Envoy, Kong과 연동하여 API 접근 제어를 구현합니다. Terraform에서는 conftest로 IaC 정책을 검증합니다.
Rego 언어는 처음에 생소할 수 있지만, 복잡한 조건 로직을 간결하게 표현할 수 있습니다. OPA Playground에서 온라인으로 Rego를 테스트해볼 수 있습니다.
# OPA 설치 (CLI)
brew install opa
# 기본 Rego 정책 예시 (authz.rego)
package authz
default allow = false
# 관리자는 모든 접근 허용
allow {
input.user.role == "admin"
}
# 일반 사용자는 자신의 리소스만 접근 가능
allow {
input.user.role == "user"
input.resource.owner == input.user.id
}
# 읽기 작업은 공개 리소스에 허용
allow {
input.action == "read"
input.resource.public == true
}
# OPA 서버 실행
opa run --server authz.rego
# 정책 쿼리 (curl)
curl -X POST localhost:8181/v1/data/authz/allow \
-H "Content-Type: application/json" \
-d '{"input": {"user": {"role": "admin"}, "action": "delete", "resource": {"id": "123"}}}'
# conftest로 Terraform 정책 검증
# policy/terraform.rego
package terraform
deny[msg] {
resource := input.resource_changes[_]
resource.type == "aws_s3_bucket"
not resource.change.after.versioning[0].enabled
msg := sprintf("S3 bucket %v must have versioning enabled", [resource.address])
}
# 실행
conftest test terraform.plan.json
아키텍트: "API 접근 제어를 OPA로 중앙화하려고요. Envoy 사이드카에서 OPA 쿼리해서 허용/거부 결정하면 서비스 코드 수정 없이 정책 적용 가능해요."
개발자: "Rego 배워야 하나요?"
아키텍트: "기본 문법만 알면 돼요. OPA Playground에서 연습해보세요."
면접관: "Policy as Code를 어떻게 구현하시겠어요?"
지원자: "OPA로 중앙 정책 엔진을 구축합니다. Kubernetes에는 Gatekeeper, API 게이트웨이에는 Envoy+OPA, CI에서는 conftest로 IaC 검증합니다. Rego 정책은 Git으로 버전 관리하고, PR 리뷰를 통해 정책 변경을 승인합니다."
리뷰어: "이 Rego에서 not 없이 조건을 부정하고 있어요. Rego에서는 명시적으로 not을 써야 해요."
작성자: "아, Rego 문법 실수였네요. 수정하겠습니다."