読者です 読者をやめる 読者になる 読者になる

ログってなんぼ

日々のメモです

Kibana3+Elasticsearch:リバースプロキシとAliasを使ってDigest認証をかけ若干の安心感を得る

elasticsearch infra

kibana便利ですね〜。 Elasticsearchにも可能性を感じますね〜。という昨今。

スタートアップのチームなんかでEC2のみでシステムを構築している時問題になるのが、監視系のツールにブラウザからアクセスする必要がある時、EIPに対してのアクセスとなるため不正アクセス等が心配になってしまうという。。。

セキュリティグループで特定IP帯(会社内など)を指定したりといった最低限の事は当然行うとして、あまり制限しすぎてもスピードが落ちたりしてアレでして

ということでまあIP制限以外にも最低限のことはやっとこということでメモです。

前提

  • WebサーバーはApacheを使う
  • AWSのセキュリティグループで80番ポートへのアクセスを特定IP帯(会社の回線など)からのみ許可
  • Elasticsearchの9200番ポートは、VPCの同一ローカルネットワークからのみ叩けるようセキュリティグループを設定(つまり外部に対して9200は閉じておく)
  • digest認証をかける

kibana3のconfigを変更

${PATH_TO_KIBANA}/config.js

kibanaのディレクトリにあるconfig.jsを編集します

//elasticsearch: "http://"+window.location.hostname+":9200",
elasticsearch: "http://"+window.location.hostname+"/es/",

/es/ に関するAliasを書く

httpd.conf

Alias /es "/es"

  ProxyPass http://localhost:9200
  ProxyPassReverse http://localhost:9200

これでブラウザから http://GROBAL_IP/es にアクセスするとサーバーがlocalhostの9200番へリクエストを転送します

Digest認証

パスワードファイルの作り方やDigest認証のかけ方そのものについては割愛


  AuthType Digest
  AuthName "Secret Zone"
  AuthDigestDomain /
  AuthUserFile /etc/httpd/.htdigest
  Require user secret
  Satisfy any
  Order deny,allow
  Deny from all
  Allow from 127.0.0.1

通常アクセス?に対してはDigest認証を必要とし、127.0.0.1からのアクセスに対してのみ認証が必要ないカタチにしています。

確認

http://GROBAL_IP/

f:id:Okisanjp:20160712183535p:plain Digest認証を経て、ちゃんとelastisearchのデータを読み込みました

http://GROBAL_IP/es/

{
  "status" : 200,
  "name" : "Apryll",
  "version" : {
    "number" : "1.2.1",
    "build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
    "build_timestamp" : "2014-06-03T15:02:52Z",
    "build_snapshot" : false,
    "lucene_version" : "4.8"
  },
  "tagline" : "You Know, for Search"
}

Elastic HQ

ElasticHQ - ElasticSearch monitoring and management application. はてなブックマーク - ElasticHQ - ElasticSearch monitoring and management application.
私は普段、Elastic HQプラグインでモニタリングしているのでこれもチェック

f:id:Okisanjp:20160712183545p:plain

左上のElasticsearchへのURLは、ブラウザでアクセスするために設定したエイリアスを指定します。

f:id:Okisanjp:20160712183550p:plain

問題なく使えますね。これで9200番を閉じても安心です。

curlなどブラウザ以外からのアクセス

最後に、ブラウザ以外からcurlなどで直接叩けるかどうかチェック

$ curl http://grobal_ip/es

401 Authorization Required

Authorization Required
This server could not verify that you
are authorized to access the document
requested.  Either you supplied the wrong
credentials (e.g., bad password), or your
browser doesn't understand how to supply
the credentials required.

認証が必要だよ〜と出てエラーになりました。

もちろん認証を通せば使えてしまう

$ curl --digest -u USER:PASS http://grobal_ip/es
{
  "status" : 200,
  "name" : "Apryll",
  "version" : {
    "number" : "1.2.1",
    "build_hash" : "6c95b759f9e7ef0f8e17f77d850da43ce8a4b364",
    "build_timestamp" : "2014-06-03T15:02:52Z",
    "build_snapshot" : false,
    "lucene_version" : "4.8"
  },
  "tagline" : "You Know, for Search"
}

けどそんなこと言い出したらそもそもグローバルIPでアクセスできる様になってる事自体を考えなおしたほうがいいのでまあとりあえず良しとします・・・

DirectConnectでデータセンターとAWSがつながっているチームもあるので、そちらの仕事をするときにはあまり気にしたことがなかったので、今回スタートアップのプロジェクトで色々と苦労している最中です・・・

何かの参考になれば幸いです ・