2018年9月5日 エンジニアリング

Elasticsearchクラスターをケルベロス認証で安全に保つ

著者 Yogesh GaikwadJosh Bressers

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クライアントがあるホストマシンです。

SimpleESKerberosDeployment

ケルベロス認証が適切に実行されるステップは次の通りです。

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台
  • ケルベロスライブラリをインストールしたクライアントノードと、kinitklistのような設定ファイル

ケルベロスのインフラストラクチャーを正しく準備したら、さらに次の情報が必要です。

  • ケルベロスの構成ファイルkrb5.conf — このファイルはデフォルトのレルム、KDCサーバー、ドメインレルムマッピングといったケルベロス環境に関する必要な詳細を含みます。Linuxシステム上では、このファイルは一般的に/etcディレクトリに入っています。JVMシステムプロパティjava.security.krb5.confは、この設定ファイルの完全なパスに設定されている必要があります。JVMはこの設定を読み込み、必要な場合に必要な情報を検索するために使用します。
  • Elasticsearch HTTP servicekeytab — 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.LOCALmonitoring_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

次にcurlnegotiateパラメーターで呼び出し、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コンポーネントでもサポートしていく予定です。続報を楽しみにお待ちください。