[小ネタ]Amazon Elasticsearch Service/Kibanaにユーザ認証でアクセスしてみる

Elasticsearch Service

まいど、大阪の市田です。
今回は、Amazon Elasticsearch Service(以下、Elasticsearch Serviceと表記)のKibanaに対して、ユーザ単位でアクセス制御する方法をご紹介します。

3行まとめ

  • Kibanaにブラウザでアクセスする場合、IPアドレスではなくIAM Userで制御したい
  • 追加でEC2とか立てたくない
  • 「aws-es-kibana」というプロキシツールを使うと簡単

概要

Elasticsearch Serviceでは、IPアドレスの他にIAM Userやドメインによるアクセス制限を行えます。
IPアドレスによる制限の場合、そのIPを利用する人なら全員アクセスできてしまうので、要件によっては特定のユーザだけにアクセスを絞りたいと思うことがないでしょうか?

そこで今回は、KibanaへのブラウザアクセスをIAM User単位で制限 する方法をご紹介しようと思います。

Elasticsearch Serviceの設定

IAM Userでアクセス制限

Elasticsearch Serviceは、アクセスポリシーを適用する形でアクセス制限することが出来ます。利用したいアクセス制限の種類に応じてテンプレートを選択する形です。
例えば、IAM Userで制限するテンプレートを選択すると、下記のようなポリシーが適用されて、ARNの箇所には適用時に入力したARNが自動的に挿入されます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[AWSアカウントID]:user/[IAM User名]"
        ]
      },
      "Action": [
        "es:*"
      ],
      "Resource": "arn:aws:es:[リージョン名]:[AWSアカウントID]:domain/[ドメイン名]/*"
    }
  ]
}

テンプレートはどれか1つしか選択できないので、複数のIAM Userを適用したい場合や、IP制限と組み合わせたい場合は、それぞれのテンプレートを合わせたポリシーを作る必要があります。

例えば、2つのIAM Userと2つのIP制限を組み合わせると下記のようになります。要件に応じた形でアクセスポリシーを作成して適用して下さい。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::[AWSアカウントID]:user/[IAM User-Aの名前]",
          "arn:aws:iam::[AWSアカウントID]:user/[IAM User-Bの名前]"
        ]
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:[リージョン名]:[AWSアカウントID]:domain/[ドメイン名]/*"
    },
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "es:*",
      "Resource": "arn:aws:es:[リージョン名]:[AWSアカウントID]:domain/[ドメイン名]/*",
      "Condition": {
        "IpAddress": {
          "aws:SourceIp": [
            "xxx.xxx.xxx.xxx",
            "yyy.yyy.yyy.yyy"
          ]
        }
      }
    }
  ]
}

プロキシツール「aws-es-kibana」

次は、上記で指定したIAM Userの情報でブラウザアクセスする方法についてです。

基本的にブラウザはIAMの認証を利用する仕組みを持っていないため、このままではKibanaにアクセスすることがで来ません。 そこで「aws-es-Kibana」 というプロキシツールを使ってみたいと思います。これはnpmで利用できるCLIツールです。

これを使うと、ローカルでExpressサーバが起動してKibanaへのリクエストをプロキシすることができます。そして、IAM UserののCredentialで各リクエストに署名するので、IPアドレスだけでなくユーザーごとにアクセスを許可できるようになる、という仕組みです。

たまたま見つけたものですが、Node.jsの環境があれば簡単にIAM Userでアクセス制限を行うことが出来たので、是非お試しください。

santthosh/aws-es-kibana: AWS ElasticSearch Kibana Proxy

インストール

READMEの通りにコマンドを実行するだけです。簡単ですね。

Macの場合

$ npm install -g aws-es-Kibana

Windowsの場合

node.jsがインストールされていなければ、事前に公式サイトからインストールしておきます。msi形式のインストーラがあるので簡単です。

Node.js

インストールできたらコマンドプロンプトを「管理者として実行」 して開きます。コマンド自体はMacの場合と同じです。

C:> npm install -g aws-es-Kibana

次に、IAM UserのCredential情報を環境変数に設定します。

Macの場合

$ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
$ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Windowsの場合

C:> set AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx
C:> set AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

最後に、エンドポイントを指定してプロキシツールを起動します。httpやhttpsといった記載は不要で、マネジメントコンソールに表示されたエンドポイントをそのまま記載して下さい。

$ aws-es-Kibana <cluster-endpoint>

コマンドを実行するとExpressサーバが起動して下記のようなアスキーアートが表れます。表示はMac、windowsで同じです。

01-esproxy

アスキーアートの下側に表示されたhttp://127.0.0.1:9200/_plugin/Kibana/にアクセスしてみましょう。Kibanaの画面が表示されれば成功です。

03-Kibana

補足

今回利用したIAM UserにはElasticsearch Serviceへの読取り権限のみ付与しています。必要に応じて適当な権限を付与して下さい。

02-iames

最後に

いかがだったでしょうか?
ユーザ単位でブラウザでのアクセスを制限したい場合、IAM Userをそのまま利用することは難しいです。 しかし「aws-es-kibana」を使うととても簡単に実現することが出来ました。

ローカルPCへインストールが必要なので、職場のポリシー上の理由でツールのインストールが難しい場合は、Kibanaの前段にEC2でWebサーバを立てて、Basic認証などを利用するという方法もあります。

要件に応じてベストな方法を選択していきましょう。

以上です。

  • Naoki Sugahara

    npm install -g aws-es-Kibana
    ですが、Kが大文字だとできないので
    npm install -g aws-es-kibana
    で実行ですね。