Elasticsearch ドメインの IAM アクセス制御の確認

Elasticsearch ドメインのポリシー、認証、ネットワーク制限を併せて確認し、必要なデータアクセスだけを許可してください。

説明

ドメインアクセスポリシーは、Elasticsearch/OpenSearch のインデックスと API に対して許可する操作とプリンシパルを定めます。IAM プリンシパルにアクセスを限定する場合、クライアントは SigV4 でリクエストに署名する必要があります。

Principal: "*" でも、IP 条件、VPC セキュリティグループ、きめ細かなアクセス制御によってアクセスが制限される場合があり、無制限の公開アクセスを意味するとは限りません。ドメインポリシーと併せて、実際の認証・権限・ネットワーク構成を確認する必要があります。

想定される影響

  • アクセス制限が不十分だと、未承認のクライアントがドキュメントを読み取ったり、変更・削除したりできるおそれがあります。
  • 承認済みのクライアントに必要以上の操作を許可すると、アカウントの侵害や操作ミスによる被害が広がる可能性があります。

対処方法

  • IAM 認証が必要な環境では、Principal を承認済みのロールやユーザーに限定し、リクエスト署名を構成してください。
  • 操作とインデックスの範囲を絞り、必要な接続経路だけを許可してください。VPC ドメインの IP 制限にはセキュリティグループを使用してください。
  • 適用されるポリシーときめ細かなアクセス制御を併せて見直し、正規のリクエストと未承認リクエストの処理結果を確認してください。

例

公開エンドポイントを持つドメインのポリシーを比較する抜粋です。allowed_client_cidr には、クライアントの実際の外部送信元 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": "*",
      "Effect": "Allow",
      "Condition": {
        "IpAddress": {"aws:SourceIp": "${var.allowed_client_cidr}"}
      },
      "Resource": "${aws_elasticsearch_domain.example.arn}/*"
    }
  ]
}
POLICIES
}

プリンシパルは限定していませんが、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 操作権限を残しています。

参考資料