役割と認証のカスタマイズ
システムからユーザーの役割を取得する必要があるが、標準でサポートされていない場合や、Elasticsearchのセキュリティ機能によって提供される認証システムがニーズに合わない場合、役割の取得や認証システムをカスタマイズするためにSPIロードされたセキュリティ拡張を実装できます。SPIロードされたセキュリティ拡張は、通常のElasticsearchプラグインの一部です。
カスタム役割プロバイダーの実装
カスタム役割プロバイダーを作成するには:
- 1. インターフェース
BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>
を実装します。つまり、実装は解決する役割名のセットである文字列のセットと、解決された役割記述子のセットが応答として渡されるActionListenerを受け取る1つのメソッドで構成されます。 - 2. カスタム役割プロバイダーの実装は、I/O操作でブロックしないように特別な注意を払う必要があります。非同期動作とノンブロッキング呼び出しを保証するのは実装の責任であり、役割が解決され、応答が準備できたときに応答を送信するための
ActionListener
が提供されているため、これが容易になります。
カスタム役割プロバイダーをプラグインとしてパッケージ化するには:
- 1.
org.elasticsearch.xpack.core.security.SecurityExtension
を実装する役割プロバイダーの拡張クラスを実装します。そこで、次のメソッドの1つ以上をオーバーライドする必要があります:
Java
@Override
public List<BiConsumer<Set<String>, ActionListener<Set<RoleDescriptor>>>>
getRolesProviders(Settings settings, ResourceWatcherService resourceWatcherService) {
...
}
## 認証エンジンの実装
認証エンジンを作成するには、次のことを行う必要があります:
- 1*.* 希望する認証動作を持つクラスで`````org.elasticsearch.xpack.core.security.authz.AuthorizationEngine`````インターフェースを実装します。
- 2*.* リクエストを認証するために必要な情報を含むクラスで`````org.elasticsearch.xpack.core.security.authz.Authorization.AuthorizationInfo`````インターフェースを実装します。
認証エンジンをプラグインとしてパッケージ化するには:
- 1*.* `````org.elasticsearch.xpack.core.security.SecurityExtension`````を拡張する認証エンジンの拡張クラスを実装します。そこで、次のメソッドをオーバーライドする必要があります:
#### Java
``````java
@Override
public AuthorizationEngine getAuthorizationEngine(Settings settings) {
...
}
`
カスタム認証エンジンの構造と実装を示すサンプルコードは、GitHubの[elasticsearch](https://github.com/elastic/elasticsearch/tree/master/plugins/examples/security-authorization-engine)リポジトリに提供されています。このコードを使用して、自分自身の認証エンジンを作成するための出発点とすることができます。
## Elasticsearchプラグインの実装
カスタム役割プロバイダーまたは認証エンジンのセキュリティ拡張を登録するには、拡張を含むElasticsearchプラグインも実装する必要があります:
- 1*.* `````org.elasticsearch.plugins.Plugin`````を拡張するプラグインクラスを実装します。
- 2*.* プラグインのビルド構成ファイルを作成します。Gradleを推奨します。
- 3*.* [プラグイン作成者向けのヘルプ](https://www.elastic.co/guide/en/elasticsearch/plugins/8.15/plugin-authors.html)に記載されているように`````plugin-descriptor.properties`````ファイルを作成します。
- 4*.* `````org.elasticsearch.xpack.core.security.SecurityExtension`````実装の完全修飾クラス名を含む拡張の`````META-INF/services/org.elasticsearch.xpack.core.security.SecurityExtension`````記述子ファイルを作成します。
- 5*.* すべてを単一のzipファイルにまとめます。
## セキュリティ拡張の使用
セキュリティ拡張を使用するには:
- 1*.* クラスター内の各ノードに拡張を持つプラグインをインストールします。`````bin/elasticsearch-plugin`````を`````install`````サブコマンドで実行し、拡張を含むzipファイルを指すURLを指定します。たとえば:
#### シェル
``````shell
bin/elasticsearch-plugin install file:///<path>/my-extension-plugin-1.0.zip
`
- 2. 拡張内の実装のための任意の構成パラメータを
elasticsearch.yml
ファイルに追加します。設定は名前空間化されておらず、拡張を構築する際に任意の設定にアクセスできますが、elasticsearch.yml
構成を理解しやすくするために拡張に名前空間の慣習を持つことをお勧めします。
たとえば、AWSのS3バケット内のblobを読み取ることで役割を解決するカスタム役割プロバイダーがある場合、elasticsearch.yml
に次のような設定を指定します:
Js
custom_roles_provider.s3_roles_provider.bucket: roles
custom_roles_provider.s3_roles_provider.region: us-east-1
custom_roles_provider.s3_roles_provider.secret_key: xxx
custom_roles_provider.s3_roles_provider.access_key: xxx
これらの設定は、SecurityExtension
インターフェース内のメソッドへの引数として渡されます。
- 3. Elasticsearchを再起動します。