AWS OpenSearch Security Model (SigV4 & FGAC)
Referenced by
정의 (Definition)
AWS OpenSearch의 보안은 “누가 클러스터에 도달할 수 있는가(Gateway)” 를 검증하는 SigV4 (IAM) 계층과, “도달한 주체가 어떤 데이터에 접근할 수 있는가(Internal)” 를 제어하는 FGAC (Fine-Grained Access Control) 계층이 직렬로 연결된 이중 인가(Dual-Layer Authorization) 모델입니다. 이는 단일 진입점으로 모든 권한을 처리하는 일반적인 데이터베이스 인증 모델과 다릅니다.
문제가 되는 배경 (Problem Context)
OpenSearch 도입 시 가장 빈번한 장애는 “IAM Role에 es:* 권한을 부여했는데 인덱스 쓰기가 거부됨” 또는 “Basic Auth(ID/PW)를 사용하는데 User: anonymous is not authorized 오류가 발생함”과 같은 상황입니다. 이는 두 보안 계층이 독립적으로, 순차적으로 동작한다는 사실을 간과했을 때 발생합니다. 하나만 통과해서는 데이터에 접근할 수 없습니다.
핵심 메커니즘 (How it Works)
1. Layer 1: Domain Access Policy (SigV4)
- 역할: AWS 인프라 레벨의 방화벽. HTTP 요청 자체가 OpenSearch 엔드포인트에 도달할 자격이 있는지 검사합니다.
- 검증 방식:
Authorization헤더의 SigV4 서명을 AWS IAM 서비스와 대조하여Principal(User/Role)을 식별합니다. - 판정: Access Policy에 명시된
Principal과Source IP조건이 맞지 않으면 즉시 차단됩니다.
2. Layer 2: Fine-Grained Access Control (FGAC)
- 역할: OpenSearch 어플리케이션 레벨의 권한 제어. (구 Opendistro Security Plugin)
- 검증 방식:
- 식별: SigV4로 넘어온
IAM Role ARN또는 Basic Auth의Username을 확인합니다. - 매핑: 해당 식별자를 OpenSearch 내부의
Backend Role에 매핑합니다. - 인가: 매핑된 Role이 요청한 인덱스/Action(예:
indices:data/write/index)을 허용하는지 확인합니다.
- 식별: SigV4로 넘어온
요청 처리 흐름 (Flow)
graph LR Client[Client Request] -->|"(1) Network"| SG["Security Group"] SG -->|Pass| Layer1["(2) Domain Access Policy (SigV4)"] Layer1 -->|Allow Principal| Layer2["(3) FGAC (Security Plugin)"] Layer2 -->|Allow Action| Data[Data/Index] Layer1 --"No SigV4 / Policy Deny"--> Drop1["403 Forbidden (AWS)"] Layer2 --"No Internal Role Mapping"--> Drop2["403 Unauthorized (OpenSearch)"]
불변 조건과 보장 범위 (Invariants & Guarantees)
- 순차적 차단 (Sequential Denial): Access Policy(Layer 1)가 허용하지 않은 요청은 FGAC(Layer 2)에 도달조차 하지 못합니다. 로그 또한 남지 않을 수 있습니다.
- SigV4 우선 원칙: Access Policy가
Principal: AWS: "*"(전체 허용)으로 설정되지 않은 한, SigV4 서명이 없는 요청(Basic Auth 포함)은 Anonymous로 간주되어 Layer 1에서 거부됩니다. - 최소 권한의 교집합: 최종적으로 수행 가능한 작업은 Layer 1(IAM Policy)과 Layer 2(FGAC Role)가 모두 허용하는 범위로 제한됩니다.
비유 (Analogy)
- OpenSearch 도메인: “국가 기밀 문서 보관소 (건물)”
- SigV4 (IAM Policy): “건물 정문 출입증”. (사원증). 이것이 없거나 유효하지 않으면 건물 로비조차 밟을 수 없습니다.
- FGAC: “자료실 열람 등급”. (2급 비밀 취급 인가). 정문을 통과해 로비에 있더라도, 내 등급에 맞지 않는 문서를 열려고 하면 사서(Security Plugin)가 제지합니다.
- Basic Auth: “방문증”. 사원증(SigV4) 대신 신분증(ID/PW)을 맡기고 들어오는 방식입니다. 단, 정문 경비원(Access Policy)에게 “방문증 소지자도 출입 가능(Anonymous 허용)” 지침이 있어야만 들어올 수 있습니다.
비유의 한계
현실의 방문증은 사원증과 별개로 취급되지만, OpenSearch의 Basic Auth는 Access Policy 관점에서는 “신원 미상(Anonymous)“으로 처리될 수 있다는 점에서 기술적 차이가 있습니다.
실무적 함의 (Operational Implications)
- 장애 식별 (Troubleshooting):
User: anonymous is not authorized: Layer 1 문제. SigV4 서명이 누락되었거나, Access Policy가 이 요청을 거부했습니다.security_exception: no permissions for [indices:data/read/search]: Layer 2 문제. 정문은 통과했으나, 해당 IAM Role이나 User가 OpenSearch 내부 Role에 매핑되지 않았습니다.
- 보안 구성 전략:
- Prod:
Access Policy를 타이트하게(특정 IAM Role만 허용) +FGAC로 세부 권한 제어. - Access Pattern: 어플리케이션은 SigV4(IAM)를 사용하고, 사람(운영자)은 Basic Auth(ID/PW)를 사용하는 경우가 많습니다. 이 경우 Access Policy는 “특정 IAM Role” OR “특정 IP(VPN)에서의 Anonymous 접근”을 허용해야 합니다.
- Prod:
주의사항 / 오해 (Pitfalls & Misconceptions)
- “Master User는 무적이다?”: 생성 시 설정한 Master User(Basic Auth)라도, Access Policy에서 해당 IP나 요청을 차단하면 접속할 수 없습니다. Access Policy가 상위 계층입니다.
- “IAM Policy에 Admin 권한이 있으면 끝?”: AWS IAM Policy에서
opensearch:*를 줘도, FGAC 내부 매핑(all_access role)이 없으면 데이터 조회는 불가능합니다. - Security Group vs Access Policy: Security Group은 네트워크(Port/IP) 레벨의 차단이고, Access Policy는 HTTP 요청의 인증 정보(SigV4) 레벨의 차단입니다. 둘 다 통과해야 합니다.
References
- AWS Docs: Fine-grained access control in Amazon OpenSearch Service
- AWS Docs: Signing AWS API requests
- Related Note: AWS OpenSearch Access Policy Principal