はじめに
AWSのElasticSearchは便利ですね。サーバを管理せずにkibanaまで使えちゃうとか、個人ユースなら無償利用枠で完璧ですね!
でも、基本的にIPアドレスベースの制御しかやりようがないので、どうしたものかなーと思っていたので、nginxでリバプロを立ててそこでBasic認証をかけられないかを検討するに至りました。
その記録です。
やりたいこと/やったこと
一番はIAMとかでkibanaのGUI画面ログイン前にAWSのログイン画面が出てくれば完璧なんですが、それはできそうにないので、仕方なくリバプロを立ててそこでBasic認証をかけることを考えました。
まずは、こんなコンフィグを書きました。
/etc/nginx/conf.d/reverse.conf
server {
server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
location / {
proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
それでアクセスするとこんな感じのエラーが出ます。
{"message":"Authorization header requires 'Credential' parameter. Authorization header requires 'Signature' parameter. Authorization header requires 'SignedHeaders' parameter. Authorization header requires existence of either a 'X-Amz-Date' or a 'Date' header. Authorization=Basic XXXXXXXX"}
Basic認証のリクエストヘッダがそのままelastic search側に飛んで、IAMでの認証をしようとしてコケてるんですかね。
そのため、Authorizationヘッダを削除してやる必要があります。
/etc/nginx/conf.d/reverse.conf
server {
server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
location / {
proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_set_header Authorization "";
}
}
最後の1行ですね。
これを追加してやるとAuthorizationヘッダが消えて正しく動作します。
おまけ
ElasticSearch Serviceで提供されるkibanaのパスは正確には
なんですが、僕は横着なので、下記のようにできないか試しましたが、出来ないのでご注意ください。
server {
server_name XXXXXX.ap-northeast-1.compute.amazonaws.com;
location / {
proxy_pass http://XXXXXXX.ap-northeast-1.es.amazonaws.com/_plugin/kibana/;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_set_header Authorization "";
}
}