TLS暗号化とロールベースのアクセス制御でElasticsearchを安全に保つ | Elastic Blog
エンジニアリング

Elasticsearch Securityを使いはじめる

Elastic Stackバージョン6.8と7.1より、TLS暗号化、ロールベースのアクセス制御(RBAC)をはじめとするセキュリティ機能が通常の配布パッケージに含まれ、無料で提供されています。このブログ記事では、現在お使いのElasticsearchクラスターで新たにこのセキュリティ機能を使いはじめる方法をご紹介します。

実装済みのElastic Stackにセキュリティ機能を導入する事例を取り上げることができるよう、この記事ではローカルのマシンに2ノードのElasticsearchクラスターを作成して準備します。ますはじめに、2ノード間にTLS通信を設定します。次に、クラスター中のデータの分析・可視化に使うKibanaインスタンスでSecurityを有効化します。その後、Kibanaにロールベースのアクセス制御を設定することにより、各ユーザーが確実に許可されたデータのみ閲覧できるようにします。

Securityには高度な設定や動作も多数ありますが、この記事では新たに導入する方法だけをご紹介します。こちらの記事をご覧いただいた後は、参考事例Elastic Stackを安全に保つためのドキュメントもお役立てください。また、この記事はローカルのクラスターへの導入を想定しています。セキュリティ機能はバージョン6.8と7.1より無料で配布され、同時にElasticsearch Serviceでは標準搭載となります。

ElasticsearchとKibanaをインストールする

こちらのデモンストレーションは、OSがLinuxのノートPCで実施します。以下の手順を実施される際は、ご利用の環境に応じて適宜調整してください。

手順1:ElasticsearchとKibanaをダウンロードする

はじめにElasticsearchとKibanaのバージョン6.8以降、または7.1以降をデフォルトの配布パッケージでダウンロードします。"Security"はバージョン6.8および7.1以降でデフォルトの配布に追加されています。6.8または7.1以前のバージョンをお使いの場合はアップグレードが必要です。

手順2:ElasticsearchとKibanaを抽出する

この事例でダウンロードしたファイルはelasticsearch-7.1.0-linux-x86_64.tar.gzkibana-7.1.0-linux-x86_64.tar.gzです。ダウンロード完了後は、コンテンツを抽出する必要があります。

手順3:Elasticsearchノードを2つ作成する

2本のノードを持つクラスターを作成するには、Elasticsearchディレクトリのコピーを2つ作成し、1つにmaster、もう1つにnodeと名前をつけます。この手順を完了すると、以下のようなファイルとフォルダが存在しています。

elasticsearch-7.1.0                      elasticsearch-7.1.0-node
elasticsearch-7.1.0-linux-x86_64.tar.gz  kibana-7.1.0-linux-x86_64
elasticsearch-7.1.0-master               kibana-7.1.0-linux-x86_64.tar.gz

TLSと認証を設定する

最初に証明書を生成し、ノードが安全に通信できるようにします。エンタープライズ証明機関(CA)で証明書を生成することもできますが、このデモではelasticsearch-certutilというコマンドを使用する手順で進めます。よくある証明書の混乱を招くことなく実施できる手順です。

手順1:ElasticsearchマスターのTLS

cdコマンドでmasterディレクトリに移動してから、次のコマンドを実行します。

bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass ""

次に、お好みのテキストエディターでconfig/elasticsearch.yamlファイルを開きます。ファイルの末尾に、以下の行をコピー&ペーストします。

xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

ファイルを保存すると、マスターノードを使いはじめることができます。コマンドbin/elasticsearchを実行してください。この実行ファイルは引き続き実行させておく必要がありますが、こちらのターミナルはしばらく操作する必要がありません。

手順2:Elasticsearchクラスターパスワード

マスターノードが稼働しはじめたら、クラスターのパスワードを設定します。新しいターミナルにcdコマンドを入力し、マスターノードディレクトリに移動してからコマンドbin/elasticsearch-setup-passwords autoを実行します。この操作で、スタックを使用する各種ユーザー向けにランダムなパスワードが生成されます。またはautoパラメーターを使用せず、interactiveパラメーターを使い手動でパスワードを定義することもできます。生成したパスワードはこの後の手順で使用するので、わかるようにしておきます。

手順3:ElasticsearchノードのTLS

再度新しいターミナルを開き、cdでノードディレクトリに移動します。このデモでは、elasticsearch-7.1.0-nodeという名前がついています。

ここで最も簡単なのが、マスターのconfigディレクトリを全部ノードのconfigディレクトリにコピーするという手順です。

cp ../elasticsearch-7.1.0-master/config/* config/

さらに構成オプションのnode.master: falseconfig/elasticsearch.ymlファイルに追加します。この手順の背景についての説明は省きますが、クラスターのドキュメントで詳細な情報をご覧いただくことができます。configファイルをすべてコピーする方法の他に、証明書ファイルをコピーしてからxpack.security.*キーをマスターノードと同様に設定するというやり方もあります。

その後、bin/elasticsearchを実行してノードを開始すると、クラスターに加わっていることを確認することができます。またマスターノードのターミナルウインドウでも、ノードがクラスターに加わったことを通知するメッセージを確認できます。これでノード2本のクラスターを立ち上げることができました。

手順4:KibanaのSecurity

最後にKibanaを設定します。再び別のターミナルウインドウを開き(これで最後です、頑張って!)、Kibanaユーザー用のパスワードを追加するという手順です。パスワードは、setup-passwordsコマンドで生成したものをそのまま使用できます。

まずcdコマンドでKibanaディレクトリに移動し、テキストエディターでconfig/kibana.ymlファイルを開きます。次のようなリンクを見つけてください。

#elasticsearch.username: "user"
#elasticsearch.password: "pass"

行頭の#を削除して、usernamepasswordフィールドをアンコメントします。"user"を"kibana"に、"pass"をsetup-passwordsコマンドが生成したKibanaパスワードに変更します。ここでファイルを保存し、bin/kibanaを実行してKibanaを立ち上げます。

Kibanaにロールベースのアクセス制御(RBAC)を設定する

Kibanaが立ち上がったら、今度はWebブラウザに切り替えてhttp://localhost:5601を開きます。ログインを促す画面が表示されたら、setup-passwordsで生成したパスワードのスーパーユーザー、elasticを使用します。

Kibanaのログイン画面

新規インストールの場合、Kibanaはサンプルデータを読み込むよう促すメッセージを表示します。

Kibanaにサンプルデータを読み込む

ここでは飛行機のフライトとWebに関するサンプルデータを読み込ませてみます。読み込みを完了したら、設定用の歯車アイコンをクリックしてください。

Kibanaの管理画面

次に、ロールを作成しましょう。ロールのメニューをクリックします。

Kibanaのロールボタン

[ロールを作成]をクリックします。

新規ロールの作成画面

このデモでは、1つ目のロールにread_logsという名前をつけてみます。

read_logsロールを作成する様子

下にスクロールして[インデックス]と[権限]フィールドが表示されたら、ログのインデックスを選択します。今回は読み込み権限を付与します。

ロール権限の設定

Securityのさまざまな機能のうち、特にspaceが気になるという方も多いかもしれません。この記事では都合上割愛しますが、spaceはKibanaで安全にデータを整理する優れた機能です。詳しくは、Kibanaのspaceに関するドキュメントや、Kibanaのspaceを取り上げたブログ記事をご覧ください。

さて次に、read_flightという名称で別のロールを作成しましょう。

read_flightロールを作成する

飛行機のフライトに関するインデックスの読み込み権限を割り当てます。

ロールの設定

それでは2人のユーザーを作成し、これらのロールを割り当ててみましょう。左のメニューで[ユーザー]リンクを選択し、[新規ユーザーの作成]ボタンをクリックします。

新規ユーザーの作成

このユーザーをflight_userと名付け、パスワードを設定ます。フルネームやメールアドレスの設定は必須ではありません。このユーザーがKibanaでデータを表示できるようにするためには、read_flightロールとkibana_userロールの両方を付与する必要があります。

flight userを作成する

作成できたら、log_userでも同様の手順を実施します。こちらにはread_logskibana_userの2つのロールを付与します。

log userを作成する

これで2名のユーザーの設定が完了しました。ここまで来たら、elasticユーザーからログアウトすることができます。

elasticユーザーをログアウト

log_userでログインしてみましょう。ダッシュボードアイコンをクリックすると、フライトとログの2つのダッシュボードがあることがわかります。

ダッシュボード画面

ログダッシュボードをクリックすると、サンプル用のログデータが表示されます。1つ前の画面に戻るとフライトのダッシュボードがあることがわかりますが、こちらはデータが表示されません。Kibanaのspace機能をセキュリティ向けに使用し、一部のダッシュボードを特定のユーザーにしか閲覧できない設定にしたためです。

ここでlog_userアカウントからログアウトし、flight_userアカウントでログインしてみましょう。

ログダッシュボードを開くと、一切のデータが表示されません。Kibanaがログインデックスにアクセスできないことを知らせるエラーも表示されています。

RBACでデータが制限されている

フライトダッシュボードを開くと、今度はフライトデータが表示されました。

RBACでデータへのアクセスが許可された

お疲れさまでした!これで、2本のノードで構成されるクラスターと、インデックスデータへのアクセスを制限された2名のユーザーの設定を完了しました。

まとめ

Elastic StackのSecurityは、今回の記事で紹介しきれないほど幅広い用途に利用することができます。この記事では導入時の設定手順に絞ってお伝えしましたが、今後は導入済みのユーザー向けに、Securityの多様な機能と使い方をご紹介していく予定です。次回の記事更新までの間、以下のコンテンツもご覧いただけます。Elastic Stack Securityの仕組みやSecurityでできることなど、ご活用のヒントとしてお役立てください。

質問やディスカッション用の公開フォーラムもあります。

快適な検索エクスペリエンスをお楽しみください。