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

2017.07.01

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

まいど、大阪の市田です。 今回は、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

コマンドを実行すると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認証などを利用するという方法もあります。

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

以上です。