Elasticsearch 도메인의 IAM 접근 제어 점검

Elasticsearch 도메인의 정책, 인증과 네트워크 제한을 함께 확인하고 필요한 데이터 접근만 허용하세요.

설명

도메인 접근 정책은 Elasticsearch/OpenSearch의 인덱스와 API에 허용할 작업과 주체를 정합니다. IAM 주체로 접근을 제한할 때는 클라이언트가 요청에 SigV4 서명을 해야 합니다.

Principal: "*"라도 IP 조건, VPC 보안 그룹이나 세분화된 접근 제어가 접근을 제한할 수 있으므로 곧바로 무제한 공개 접근을 뜻하지는 않습니다. 도메인 정책만이 아니라 실제 인증·권한·네트워크 구성을 함께 확인해야 합니다.

잠재적 영향

  • 접근 제한이 부족하면 승인되지 않은 클라이언트가 문서를 조회하거나 변경·삭제할 수 있습니다.
  • 허용된 클라이언트에도 필요 이상으로 넓은 작업을 부여하면 계정 침해나 실수의 피해가 커질 수 있습니다.

해결 방법

  • IAM 인증이 필요한 환경에서는 승인된 역할이나 사용자로 Principal을 제한하고 요청 서명을 구성하세요.
  • 작업과 인덱스 범위를 최소화하고 필요한 연결 경로만 허용하세요. VPC 도메인의 IP 접근 제한은 보안 그룹으로 구성하세요.
  • 전체 정책과 세분화된 접근 제어를 함께 검토하고 정상 요청과 승인되지 않은 요청의 처리 결과를 확인하세요.

예시

공개 엔드포인트 도메인의 정책을 비교하는 발췌입니다. allowed_client_cidr에는 클라이언트의 실제 외부 송신 주소 범위를 지정하세요. 루프백 주소는 원격 클라이언트의 송신 주소가 아닙니다. 예시 엔진 버전의 지원 여부와 나머지 도메인 설정은 별도로 확인해야 합니다.

변경 전

hcl
resource "aws_elasticsearch_domain" "example" {
  domain_name           = "tf-test"
  elasticsearch_version = "2.3"
}

resource "aws_elasticsearch_domain_policy" "example" {
  domain_name = aws_elasticsearch_domain.example.domain_name

  access_policies = <<POLICIES
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "es:*",
      "Principal": "*",
      "Effect": "Allow",
      "Condition": {
        "IpAddress": {"aws:SourceIp": "${var.allowed_client_cidr}"}
      },
      "Resource": "${aws_elasticsearch_domain.example.arn}/*"
    }
  ]
}
POLICIES
}

주체는 제한하지 않지만 IP 조건은 적용됩니다. 실제 접근 범위는 IP 조건이 허용하는 주소 범위와 함께 확인해야 합니다.

변경 후

hcl
resource "aws_elasticsearch_domain" "example" {
  domain_name           = "tf-test"
  elasticsearch_version = "2.3"
}

resource "aws_elasticsearch_domain_policy" "example" {
  domain_name = aws_elasticsearch_domain.example.domain_name

  access_policies = <<POLICIES
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "es:*",
      "Principal": {
        "AWS": [
          "arn:aws:iam::123456789012:root",
          "arn:aws:iam::555555555555:root"
        ]
      },
      "Effect": "Allow",
      "Condition": {
        "IpAddress": {"aws:SourceIp": "${var.allowed_client_cidr}"}
      },
      "Resource": "${aws_elasticsearch_domain.example.arn}/*"
    }
  ]
}
POLICIES
}

IP 조건에 더해 지정된 AWS 계정으로 주체 범위를 좁힙니다. 계정의 root ARN은 루트 사용자만이 아니라 해당 계정에 권한을 위임합니다. 실제 허용 계정으로 바꾸고 가능하면 역할과 필요한 작업으로 더 제한하세요. 이 정책의 es:*는 도메인 하위 리소스에 대한 넓은 HTTP 작업 권한을 유지합니다.

참조