Amazon Elasticsearch Service に含まれてる Kibana に対して IP ベースのアクセスポリシーを設定したいと思って検証していたが,うまくできなかった.うまくできなかったけど,試したことを残しておこうと思う.もしかしたら僕の調査不足なだけかもしれないので,もし設定する方法があったら教えて頂きたいなと!!!
設定したかったこと
本番環境で Amazon Elasticsearch Service を運用することを考えたときに「開発端末から誤って更新系のクエリを飛ばしてしまったというような事故は防ぎたいけど,オフィスからは Kibana に対するアクセスだけは許可して分析できるようにする」という設定をしたかった.
Amazon Elasticsearch Service では IP ベースのアクセスポリシーを設定することができるので,オフィスの IP を設定すれば良いのだが,ドキュメントを見ても Kibana に特化した ARN や Action はなく,どうするんだろう?と思った.Fluentd から Amazon Elasticsearch Service にログを流したりする通常のユースケースでは,EC2 に IAM ロールを適用すれば良いから,Kibana のためだけに IP ベースのアクセスポリシーが使えたら嬉しい.
試したこと(結果的にうまくできなかった)
まず,アクセスポリシーを設定せずに Kibana にアクセスすると,以下のエラーが出た.
{"Message":"User: anonymous is not authorized to perform: es:ESHttpGet on resource: xxxxx"}
なるほど,ドメインに対して es:ESHttpGet
の権限を与えれば良いのかな?と思って,以下のアクセスポリシーを設定してみた.IP zzz.zzz.zzz.zzz
に対して,ドメイン全てのリソースに es:ESHttpGet
を許可している.
ちなみに es:ESHttpGet
だと Elasticsearch に対する参照系のリクエストは行えてしまうが,そこは破壊的な操作にならないという前提で,今回は良いかなと考えていた.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/*", "Condition": { "IpAddress": { "aws:SourceIp": "zzz.zzz.zzz.zzz" } } } ] }
すると,今度は Kibana にはアクセスできるようにはなったが,Kibana の設定情報を管理している .kibana-4
インデックスにアクセスできないというエラーが出た.確かに Kibana でダッシュボードを作ったりすると .kibana-4
に書き込むわけだし,es:ESHttpGet
だけじゃダメだなというのは納得感があった.
Error: Unable to check for Kibana index ".kibana-4" Error: Authorization Exception
なるほど,それなら追加で .kibana-4
インデックスに対してフル権限を与えたらどうか?と思って,以下のアクセスポリシーを設定してみた.IP zzz.zzz.zzz.zzz
に対して,ドメイン全てのリソースに es:ESHttpGet
を許可して,.kibana-4
に es:*
を許可している.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/*", "Condition": { "IpAddress": { "aws:SourceIp": "zzz.zzz.zzz.zzz" } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/.kibana-4", "Condition": { "IpAddress": { "aws:SourceIp": "zzz.zzz.zzz.zzz" } } } ] }
すると,さっきとはまた違うエラーが出た.さっきは Unable to check
で今回は Unable to create
だった.
Error: Unable to create Kibana index ".kibana-4" Error: Authorization Exception
あー,これじゃあ .kibana-4
のタイプにアクセスできないなと気付いて,追加で .kibana-4/*
にも es:*
を許可した.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:ESHttpGet", "Resource": "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/*", "Condition": { "IpAddress": { "aws:SourceIp": "zzz.zzz.zzz.zzz" } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "*" }, "Action": "es:*", "Resource": [ "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/.kibana-4", "arn:aws:es:ap-northeast-1:111111111111:domain/xxxxx/.kibana-4/*" ], "Condition": { "IpAddress": { "aws:SourceIp": "zzz.zzz.zzz.zzz" } } } ] }
すると,やっと Kibana の画面は開けるようになったけど,以下のエラーが出ていて,コンソールログを見たら,実際のデータを格納しているインデックスに対する POST 権限が無いというエラーが出ていた.えっ POST 投げるの?なぜ?という感じ.
Discover: An error occurred with your request. Reset your inputs and try again.
ここまで試して,今日のところは諦めた.どうしたら良いんだろ!!!
プロキシを通す案
AWS Blog に "How to Control Access to Your Amazon Elasticsearch Service Domain" という記事が上がっていて,"Proxy-based access to Amazon ES from Kibana" という構成が紹介されていた.ようするに,プロキシサーバの IP に対してフル権限を与えておいて,別途アクセス制御ををした Kibana からプロキシサーバを経由してアクセスするという話だと思うけど,この Kibana って Amazon Elasticsearch Service に含まれてる Kibana ではなく,独自の Kibana だよね?一般的な Kibana なら設定で参照する Elasticsearch のホストを指定できるけど,Amazon Elasticsearch Service だとそういうカスタマイズはできないはずだし,構成図的にも AWS ネットワークの外側にいるし.うーむ.
Amazon Elasticsearch Service で改善されると嬉しいこと
アクセスポリシーを変更すると,ドメインのステータスが Processing
になって,完了すると Active
になる.ダウンタイム無く変更できるのは嬉しいんだけど,待ち時間があまりに長すぎる.結構波があるけど,早くて5分,遅いときは10分以上のときもあった.インスタンスタイプの変更やディスクサイズの変更ならまだしも,アクセスポリシーの変更だしサクッと完了してくれると,ストレス無く運用できる気がした.改善されると良いなぁー.
余談 : 失敗した話を書く理由
今回,最終的にうまくできなくて,誰得な情報になってしまっている気もするけど,nobolycloud Track 7 を聞いていたら,zembutsu さんが「失敗した話をもっと書くべきでは!」みたいな話をしていて,凄く共感できたので,今回書いている.もしかしたらアドバイスをもらえる可能性もあるし,書くことによって客観的に気付く可能性もあるし,書くメリットはあるよね!と思っている.