Elasticsearchクラスターをケルベロス認証で安全に保つ
3つ頭の獰猛な番犬にデータを保護させる
Elasticsearch 6.4より、プラチナサブスクリプションでケルベロス認証のサポートが開始されました。ケルベロスは分散システムで安全な認証を実現する成熟したテクノロジーです。ケルベロスは、異なるサービスにわたるシングルサインオンアクセスを提供します。つまり、ユーザー名とパスワードを繰り返し入力する必要がありません。本ブログ記事では、Elasticsearchを設定し、HTTPトラフィックでケルベロス認証をサポートする方法をご紹介します。
デプロイの概要
シンプルなシナリオで考えてみましょう。"Alice"というユーザーがシングルノードのElasticsearchクラスターを使用しているとします。Aliceはすでにdemo.local
というケルベロスレルム持っており、ケルベロス認証を使用してElasticsearchクラスターを安全に保ちたいと考えています。ケルベロス認証のサーバーは、レルム内でユーザーを認証したり、ホスト、またはサービスを実行することができます。本記事では、MITケルベロス実装のコマンドを使用します。詳しくはMITケルベロスのドキュメントをご覧ください。
このシンプルなシナリオでは、3つのホストマシンが存在します。
- Host-1(
kdc.demo.local
):ケルベロスのKDC(Key Distribution Center)で、通常AS(Authentication Server)とTGS(Ticket Granting Server)の役割を果たします。 - Host-2(
es.demo.local
**):**Elasticsearchのシングルノードクラスターがあるホストマシンです。 - Host-3(
client.demo.local
**):**Elasticsearchクライアントがあるホストマシンです。
ケルベロス認証が適切に実行されるステップは次の通りです。
1.Alice(alice@DEMO.LOCAL
)が自身の資格情報を使用してクライアントマシン(client.demo.local
)にログオンします。
2.クライアントマシンがKDCサーバー(kdc.demo.local
)にTGT(Ticket Granting Ticket)をリクエストします。
3.クライアントはElasticsearch Servicehttps://es.demo.local:9200
にアクセスします。es.demo.localはUnauthorized(401)
というHTTPステータスコードと、WWW-Authenticate: Negotiate
というヘッダーを含むレスポンスを返します。
4.クライアントはTGS(Ticket Granting Server)にElasticsearch Service principalHTTP/es.demo.local@DEMO.LOCAL
のセッションチケットをリクエストします。Elasticsearch Service principalの名前は、サービスへのアクセスに使用されたURLによって決定されます。
5.クライアントはElasticsearch Serviceの認証時にこのチケットを提示します。
6.Elasticsearch Serviceはケルベロスチケットを検証し、アクセスを付与します(チケットが有効な場合)。
ケルベロスレルムを設定する
Elasticsearchのケルベロスレルムを有効化するには、ケルベロスのインフラストラクチャーを適切に設定する必要があります。
- ドメインに参加するすべてのマシンの時計を同期させる
- 参加するすべてのマシンに動作するDNSドメイン1つ
- KDCサーバー1台
- ケルベロスライブラリをインストールしたクライアントノードと、
kinit
、klist
のような設定ファイル
ケルベロスのインフラストラクチャーを正しく準備したら、さらに次の情報が必要です。
- ケルベロスの構成ファイル
krb5.conf
--- このファイルはデフォルトのレルム、KDCサーバー、ドメインレルムマッピングといったケルベロス環境に関する必要な詳細を含みます。Linuxシステム上では、このファイルは一般的に/etc
ディレクトリに入っています。JVMシステムプロパティjava.security.krb5.conf
は、この設定ファイルの完全なパスに設定されている必要があります。JVMはこの設定を読み込み、必要な場合に必要な情報を検索するために使用します。 - Elasticsearch HTTP service
keytab
--- keytabは、principalと暗号化キーのペアを格納するファイルです。Elasticsearch HTTP serviceがクライアントから受け取るチケットを検証するために使用されるkeytabとなります。通常、service principalの名前はHTTP/es.demo.local@DEMO.LOCAL
という形式です。service classがHTTP
で、es.demo.local
がElasticsearchホストの完全修飾ドメイン名、DEMO.LOCAL
がケルベロスレルムです。このファイルはElasticsearchのconfigディレクトリに入れる必要があります。このファイルは資格情報を含むため、Elasticsearchを実行するユーザーにファイルに対するread onlyの許可を設定することにより、ファイルを確実に保護してください。ケルベロスシステム管理者は、ユーザーのサービスにkeytabファイルを提供することができます。
このようにして2つのファイルで保護を講じました。これで、Elasticsearchのケルベロスレルムの設定に進むことができます。
1.JVMオプションの設定
はじめにJVMオプションファイル(jvm.options
)を編集して、JVMシステムプロパティをケルベロス設定ファイル用に設定する必要があります。
# Kerberos configuration
-Djava.security.krb5.conf=/etc/krb5.conf
2.Elasticsearchをケルベロス向けに設定する
次に、elasticsearch.yml
ファイルにケルベロスレルムを追加します。
# Kerberos realm
xpack.security.authc.realms.kerb1:
type: kerberos
order: 1
keytab.path: es.keytab
これで、typekerberos
、レルムオーダー1
のケルベロスレルム(kerb1
)を設定し、またkeytab.path
がconfigurationディレクトリのElasticsearch service keytabファイル(es.keytab
)を指すよう設定できました。さらに詳しくは、ドキュメント「ケルベロスレルムを設定する」をご覧ください。
3.Elasticsearchを再起動する
設定が完了したら、Elasticsearchノードの再起動が必要です。
4.ケルベロスユーザーにロールをマップする
ケルベロスは認証プロトコルであり、許可の詳細を提供しません。認証用にロールマッピングAPIを使用して、ユーザーにロールをマップすることができます。以下は、kerbrolemapping
という名前でロールマッピングを作成し、ユーザーalice@DEMO.LOCAL
にmonitoring_user
ロールをアサインしています。
$ curl -u elastic -H "Content-Type: application/json" -XPOST http://es.demo.local:9200/_xpack/security/role_mapping/kerbrolemapping -d
{
"roles" : [ "monitoring_user" ],
"enabled": true,
"rules" : {
"field" : { "username" : "alice@DEMO.LOCAL" }
}
}
ロールマッピングについてさらに詳しくは、ドキュメント「ユーザーとグループをロールにマッピングする」をご覧ください。
動作を確認しましょう!
クライアントマシンで認証が動作するか検証するには、kinit
コマンドを発行してTicket Granting Ticketを取得する必要があります。
$ kinit alice@DEMO.LOCAL
Password for alice@DEMO.LOCAL:
$ klist
Ticket cache: KEYRING:persistent:1000:krb_ccache_NvNtNgS
Default principal: alice@DEMO.LOCAL
Valid starting Expires Service principal
31/08/18 02:20:07 01/09/18 02:20:04 krbtgt/DEMO.LOCAL@DEMO.LOCAL
次にcurl
をnegotiate
パラメーターで呼び出し、HTTPに対するケルベロス認証を実行できるようにします。
$ curl --negotiate -u : -XGET http://es.demo.local:9200/
これでOK!
{
"name" : "Lw7K29R",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "qd3iafXORLy0VCfVD_Hp9w",
"version" : {
"number" : "6.4.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "595516e",
"build_date" : "2018-08-17T23:18:47.308994Z",
"build_snapshot" : true,
"lucene_version" : "7.4.0",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
まとめ
サービスのprincipal keytabとケルベロスの設定ファイルにアクセスした後は、簡単にケルベロスレルムを設定できます。ほんの数行記述すれば、Elasticsearchにケルベロスレルムを設定することができます。ケルベロスのサポートはElasticsearchで開始したばかりです。今後は他のElastic Stackコンポーネントでもサポートしていく予定です。続報を楽しみにお待ちください。