OPA(Open Policy Agent)와 Rego로 정책 코드 관리
security
개념
- "이 요청을 허용할 것인가?"를 판단해주는 정책 엔진
- 정책을 애플리케이션 코드에서 분리해서 따로 관리
- Rego라는 선언형 언어로 정책 작성
- CNCF 졸업 프로젝트
동작 방식
서비스 → JSON 질의 → OPA → Rego 정책 평가 → allow/deny 반환
- 서비스가 OPA에 JSON으로 질의 (입력: 사용자 정보, 요청 내용)
- OPA가 Rego 정책 + 외부 데이터로 평가
- allow/deny 같은 구조화된 결과 반환
Rego 예시
API 접근 제어
package api.authz
default allow = false
# admin은 전부 허용
allow {
input.user.role == "admin"
}
# 일반 사용자는 자기 데이터만
allow {
input.method == "GET"
input.path == ["users", input.user.id]
}
질의
{
"input": {
"user": { "id": "user123", "role": "member" },
"method": "GET",
"path": ["users", "user123"]
}
}
→ allow: true (자기 데이터 조회)
어디에 쓰나
| 사용처 | 도구 | 하는 일 |
|---|---|---|
| Kubernetes | Gatekeeper | 리소스 배포 정책 검사 (privileged 컨테이너 차단 등) |
| API 인가 | Envoy + OPA | 마이크로서비스 요청 권한 검증 |
| IaC 검증 | Conftest | Terraform/K8s 매니페스트가 보안 정책 지키는지 확인 |
| CI/CD | 파이프라인 게이트 | 배포 전 정책 위반 검사 |
RBAC vs OPA
| RBAC | OPA | |
|---|---|---|
| 정책 표현 | 역할 기반 | 속성/조건 기반 (ABAC/PBAC) |
| 유연성 | 역할 폭발 문제 | 조건 조합 자유로움 |
| 관리 위치 | 보통 앱 안에 | 앱 밖에 분리 |
| 적합한 경우 | 단순한 권한 구조 | 복잡한 조건 조합 필요할 때 |
핵심
- 정책과 코드를 분리하는 게 핵심 가치
- 어떤 서비스든 REST API로 질의 가능
- Rego는 선언형이라 "무엇을 허용할지"만 쓰면 됨