설명
Elasticsearch/OpenSearch 도메인 접근 정책이 지나치게 넓으면 로그·문서·색인 데이터를 불필요한 주체가 조회하거나 변경할 수 있습니다. 도메인 정책은 색인과 데이터 API 같은 하위 리소스를 제어하며, 도메인 구성 API의 관리 권한과는 구분됩니다.
와일드카드 주체는 VPC나 세분화된 접근 제어와 함께 사용될 수 있습니다. 실제 노출은 이 통제들과 정책 권한을 함께 확인해야 판단할 수 있습니다.
잠재적 영향
- 불필요한 조회 권한은 로그나 문서 내용의 유출로 이어질 수 있습니다.
- 쓰기·삭제 권한의 오용은 색인 손상과 검색 서비스 중단을 일으킬 수 있습니다.
해결 방법
- 필요한 주체, es:ESHttpGet 같은 HTTP 작업과 실제 색인·API 경로로 권한을 제한하세요.
- VPC 도메인은 보안 그룹을 확인하고, 세분화된 접근 제어를 사용하는 경우 실제 사용자와 역할 매핑을 검토하세요.
- 기존 인증 방식을 유지하면서 정상 검색은 성공하고 불필요한 조회·변경은 거부되는지 시험하세요.
예시
같은 도메인의 정책 발췌입니다. 참조 도메인과 색인을 별도로 준비하고 사용자 ARN을 실제 값으로 바꾸세요.
변경 전
hcl
resource "aws_elasticsearch_domain_policy" "example" {
domain_name = aws_elasticsearch_domain.example2.domain_name
access_policies = <<POLICIES
{
"Version": "2012-10-17",
"Statement": [
{
"Action": "es:*",
"Resource": "${aws_elasticsearch_domain.example2.arn}/*",
"Principal": "*",
"Effect": "Allow"
}
]
}
POLICIES
}
모든 주체에 도메인 하위 리소스의 HTTP 작업을 허용합니다. es:*가 이 도메인의 구성 API 관리 권한까지 부여하는 것은 아닙니다.
변경 후
hcl
resource "aws_elasticsearch_domain_policy" "example" {
domain_name = aws_elasticsearch_domain.example2.domain_name
access_policies = <<POLICIES
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::123456789012:user/test-user"
]
},
"Action": [
"es:ESHttpGet"
],
"Resource": "${aws_elasticsearch_domain.example2.arn}/test-index/_search"
}
]
}
POLICIES
}
이 허용문은 지정한 사용자의 test-index 검색 GET 요청으로 범위를 좁힙니다. 다른 정책과 세분화된 접근 제어도 함께 적용됩니다.