← Notes

OPA(Open Policy Agent)와 Rego로 정책 코드 관리

security

개념

  • "이 요청을 허용할 것인가?"를 판단해주는 정책 엔진
  • 정책을 애플리케이션 코드에서 분리해서 따로 관리
  • Rego라는 선언형 언어로 정책 작성
  • CNCF 졸업 프로젝트

동작 방식

서비스 → JSON 질의 → OPA → Rego 정책 평가 → allow/deny 반환
  1. 서비스가 OPA에 JSON으로 질의 (입력: 사용자 정보, 요청 내용)
  2. OPA가 Rego 정책 + 외부 데이터로 평가
  3. 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는 선언형이라 "무엇을 허용할지"만 쓰면 됨
sunshinemoon · 2026