[小ネタ]Amazon Elasticsearch Service/Kibanaにユーザ認証でアクセスしてみる
まいど、大阪の市田です。 今回は、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形式のインストーラがあるので簡単です。
インストールできたらコマンドプロンプトを「管理者として実行」 して開きます。コマンド自体は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で同じです。
アスキーアートの下側に表示されたhttp://127.0.0.1:9200/_plugin/Kibana/
にアクセスしてみましょう。Kibanaの画面が表示されれば成功です。
補足
今回利用したIAM UserにはElasticsearch Serviceへの読取り権限のみ付与しています。必要に応じて適当な権限を付与して下さい。
最後に
いかがだったでしょうか? ユーザ単位でブラウザでのアクセスを制限したい場合、IAM Userをそのまま利用することは難しいです。 しかし「aws-es-kibana」を使うととても簡単に実現することが出来ました。
ローカルPCへインストールが必要なので、職場のポリシー上の理由でツールのインストールが難しい場合は、Kibanaの前段にEC2でWebサーバを立てて、Basic認証などを利用するという方法もあります。
要件に応じてベストな方法を選択していきましょう。
以上です。