LDAPユーザー認証
Elastic Stackのセキュリティ機能を構成して、ユーザーを認証するためにLightweight Directory Access Protocol (LDAP)サーバーと通信することができます。 LDAPレルムの構成を参照してください。
LDAPは、ユーザーとグループを階層的に保存します。これは、ファイルシステム内のフォルダーがグループ化される方法に似ています。LDAPディレクトリの階層は、組織単位(ou
)、組織(o
)、およびドメインコンポーネント(dc
)などのコンテナから構築されます。
エントリへのパスは、ユーザーまたはグループを一意に識別する識別名 (DN)です。ユーザー名とグループ名には、通常、共通名(cn
)や一意のID(uid
)などの属性があります。DNは文字列として指定されます。たとえば、"cn=admin,dc=example,dc=com"
(空白は無視されます)。
## LDAPグループをロールにマッピング
レルム認証プロセスの重要な部分は、認証されたユーザーに関連付けられたロールを解決することです。ロールは、ユーザーがクラスター内で持つ特権を定義します。
`````ldap`````レルムでは、ユーザーはLDAPサーバーで外部的に管理されるため、彼らのロールもそこで管理されることが期待されます。実際、LDAPはグループの概念をサポートしており、これらはしばしば組織内の異なるシステムのユーザーロールを表します。
`````ldap`````レルムでは、LDAPユーザーをそのLDAPグループまたは他のメタデータを介してロールにマッピングできます。このロールマッピングは、[ロールマッピングAPIを追加する](/read/elasticsearch-8-15/2e6f16fee973f843.md)を介して構成するか、各ノードに保存されたファイルを使用して構成できます。ユーザーがLDAPで認証されると、そのユーザーの特権は、ユーザーがマッピングされているロールによって定義されたすべての特権の和になります。
## LDAPレルムの構成
LDAPと統合するには、`````ldap`````レルムを構成し、LDAPグループをユーザーロールにマッピングします。
- 1*.* 使用したいモードを決定します。`````ldap`````レルムは、ユーザー検索モードとユーザーDNの特定のテンプレートを使用するモードの2つの動作モードをサポートしています。
LDAPユーザー検索は最も一般的な動作モードです。このモードでは、LDAPディレクトリを検索する権限を持つ特定のユーザーが、提供されたユーザー名とLDAP属性に基づいて認証ユーザーのDNを検索するために使用されます。見つかった場合、ユーザーは見つかったDNと提供されたパスワードを使用してLDAPサーバーにバインドしようとすることで認証されます。
LDAP環境がユーザーに対して特定の標準命名条件を使用している場合、ユーザーDNテンプレートを使用してレルムを構成できます。この方法の利点は、ユーザーDNを見つけるために検索を実行する必要がないことです。ただし、正しいユーザーDNを見つけるために複数のバインド操作が必要になる場合があります。
- 2*.* ユーザー検索を使用して`````ldap`````レルムを構成するには:
- 2*.*1*.* `````elasticsearch.yml`````の下の`````xpack.security.authc.realms.ldap`````名前空間にレルム構成を追加します。最低限、LDAPサーバーの`````url`````と`````order`````を指定し、ユーザーが検索されるコンテナDNに`````user_search.base_dn`````を設定する必要があります。`````ldap`````レルムに設定できるすべてのオプションについては、[LDAPレルム設定](d1e2d0944ccc2737.md#ref-ldap-settings)を参照してください。
たとえば、次のスニペットは、ユーザー検索で構成されたLDAPレルムを示しています:
#### Yaml
``````yaml
xpack:
security:
authc:
realms:
ldap:
ldap1:
order: 0
url: "ldaps://ldap.example.com:636"
bind_dn: "cn=ldapuser, ou=users, o=services, dc=example, dc=com"
user_search:
base_dn: "dc=example,dc=com"
filter: "(cn={0})"
group_search:
base_dn: "dc=example,dc=com"
files:
role_mapping: "ES_PATH_CONF/role_mapping.yml"
unmapped_groups_as_roles: false
`
#### Shell
``````shell
bin/elasticsearch-keystore add \
xpack.security.authc.realms.ldap.ldap1.secure_bind_password
`
- 3*.* ユーザーDNテンプレートを使用して`````ldap`````レルムを構成するには:
- 3*.*1*.* `````elasticsearch.yml`````の`````xpack.security.authc.realms.ldap`````名前空間にレルム構成を追加します。最低限、LDAPサーバーの`````url`````と`````order`````を指定し、`````user_dn_templates`````オプションで少なくとも1つのテンプレートを指定する必要があります。`````ldap`````レルムに設定できるすべてのオプションについては、[LDAPレルム設定](d1e2d0944ccc2737.md#ref-ldap-settings)を参照してください。
たとえば、次のスニペットは、ユーザーDNテンプレートで構成されたLDAPレルムを示しています:
#### Yaml
``````yaml
xpack:
security:
authc:
realms:
ldap:
ldap1:
order: 0
url: "ldaps://ldap.example.com:636"
user_dn_templates:
- "cn={0}, ou=users, o=marketing, dc=example, dc=com"
- "cn={0}, ou=users, o=engineering, dc=example, dc=com"
group_search:
base_dn: "dc=example,dc=com"
files:
role_mapping: "/mnt/elasticsearch/group_to_role_mapping.yml"
unmapped_groups_as_roles: false
`
- 4*.* (オプション) 複数のLDAPサーバーとのセキュリティ機能の相互作用を構成します。
`````load_balance.type`````設定はレルムレベルで使用できます。Elasticsearchのセキュリティ機能は、フェイルオーバーと負荷分散の両方の動作モードをサポートしています。 [LDAPレルム設定](d1e2d0944ccc2737.md#ref-ldap-settings)を参照してください。
- 5*.* (オプション) パスワードを保護するために、[ElasticsearchとLDAPサーバー間の通信を暗号化します](fe27aa266a189863.md#tls-ldap)。
- 6*.* Elasticsearchを再起動します。
- 7*.* LDAPグループをロールにマッピングします。
`````ldap`````レルムでは、LDAPユーザーをそのLDAPグループまたは他のメタデータを介してロールにマッピングできます。このロールマッピングは、[ロールマッピングAPIを追加する](/read/elasticsearch-8-15/2e6f16fee973f843.md)を介して構成するか、各ノードに保存されたファイルを使用して構成できます。ユーザーがLDAPで認証されると、そのユーザーの特権は、ユーザーがマッピングされているロールによって定義されたすべての特権の和になります。
マッピング定義内では、グループをその識別名を使用して指定します。たとえば、次のマッピング構成は、LDAP `````admins`````グループを`````monitoring`````および`````user`````ロールの両方にマッピングし、`````users`````グループを`````user`````ロールにマッピングします。
ロールマッピングAPIを介して構成されます:
#### Python
``````python
resp = client.security.put_role_mapping(
name="admins",
roles=[
"monitoring",
"user"
],
rules={
"field": {
"groups": "cn=admins,dc=example,dc=com"
}
},
enabled=True,
)
print(resp)
`
Js
const response = await client.security.putRoleMapping({
name: "admins",
roles: ["monitoring", "user"],
rules: {
field: {
groups: "cn=admins,dc=example,dc=com",
},
},
enabled: true,
});
console.log(response);
Console
PUT /_security/role_mapping/admins
{
"roles" : [ "monitoring" , "user" ],
"rules" : { "field" : {
"groups" : "cn=admins,dc=example,dc=com"
} },
"enabled": true
}
admins グループのLDAP識別名(DN)。 |
Python
resp = client.security.put_role_mapping(
name="basic_users",
roles=[
"user"
],
rules={
"field": {
"groups": "cn=users,dc=example,dc=com"
}
},
enabled=True,
)
print(resp)
Js
const response = await client.security.putRoleMapping({
name: "basic_users",
roles: ["user"],
rules: {
field: {
groups: "cn=users,dc=example,dc=com",
},
},
enabled: true,
});
console.log(response);
Console
PUT /_security/role_mapping/basic_users
{
"roles" : [ "user" ],
"rules" : { "field" : {
"groups" : "cn=users,dc=example,dc=com"
} },
"enabled": true
}
users グループのLDAP識別名(DN)。 |
または、代わりにロールマッピングファイルを介して構成されます:
Yaml
monitoring:
- "cn=admins,dc=example,dc=com"
user:
- "cn=users,dc=example,dc=com"
- "cn=admins,dc=example,dc=com"
マッピングされたロールの名前。 | |
admins グループのLDAP識別名(DN)。 |
|
users グループのLDAP識別名(DN)。 |
詳細については、LDAPグループをロールにマッピングおよびユーザーとグループをロールにマッピングを参照してください。
LDAPレルムは、ロールマッピングの代替として認可レルムをサポートしています。
- 8. (オプション) ユーザーのメタデータに追加フィールドを含めるために、LDAPレルムの
metadata
設定を構成します。
デフォルトでは、ldap_dn
およびldap_groups
がユーザーのメタデータに入力されます。詳細については、LDAPレルムのユーザーメタデータを参照してください。
以下の例では、ユーザーの共通名(cn
)をメタデータの追加フィールドとして含めています。
Yaml
xpack:
security:
authc:
realms:
ldap:
ldap1:
order: 0
metadata: cn
- 9. ElasticsearchとLDAP間の通信を暗号化するためにSSLを設定します。 ElasticsearchとLDAP間の通信を暗号化するを参照してください。
LDAPレルムにおけるユーザーメタデータ
ユーザーがLDAPレルムを介して認証されると、次のプロパティがユーザーのメタデータに入力されます:
フィールド | 説明 |
ldap_dn |
ユーザーの識別名。 |
ldap_groups |
ユーザーのために解決された各グループの識別名(DN)。これらのグループがロールにマッピングされているかどうかに関係なく。 |
このメタデータは、認証APIで返され、ロールでテンプレート化されたクエリと共に使用できます。
追加のフィールドは、LDAPレルムのmetadata
設定を構成することによってユーザーのメタデータに含めることができます。このメタデータは、ロールマッピングAPIやテンプレート化されたロールクエリで使用できます。
負荷分散とフェイルオーバー
[負荷分散とフェイルオーバー](d1e2d0944ccc2737.md#load-balancing)を参照してください。
## ElasticsearchとLDAP間の通信の暗号化
LDAPレルムで認証のために送信されるユーザー資格情報を保護するために、ElasticsearchとLDAPサーバー間の通信を暗号化することを強く推奨します。SSL/TLSを介して接続することで、Elasticsearchがユーザー資格情報を送信する前にLDAPサーバーのアイデンティティが認証され、接続の内容が暗号化されます。TLSを介してLDAPサーバーに接続するクライアントとノードは、LDAPサーバーの証明書またはサーバーのルートCA証明書をキーストアまたはトラストストアにインストールする必要があります。
詳細については、[LDAPユーザー認証](/read/elasticsearch-8-15/fe27aa266a189863.md)を参照してください。
- 1*.* 各ノードでレルムのTLS設定を構成して、LDAPサーバー証明書に署名したCAの署名された証明書を信頼します。次の例は、Elasticsearchの[構成ディレクトリ](cbd51842921e98c1.md#config-files-location)内にあるCA証明書`````cacert.pem`````を信頼する方法を示しています:
#### Shell
``````shell
xpack:
security:
authc:
realms:
ldap:
ldap1:
order: 0
url: "ldaps://ldap.example.com:636"
ssl:
certificate_authorities: [ "cacert.pem" ]
`
上記の例では、CA証明書はPEMエンコードされている必要があります。
PKCS#12およびJKSファイルもサポートされています - LDAPレルム設定のssl.truststore.path
の説明を参照してください。
CA証明書の代わりに個々のサーバー証明書を指定することもできますが、これは単一のLDAPサーバーがある場合や証明書が自己署名されている場合にのみ推奨されます。
- 2. レルム構成で
url
属性を設定して、LDAPSプロトコルとセキュアポート番号を指定します。たとえば、url: ldaps://ldap.example.com:636
。 - 3. Elasticsearchを再起動します。
デフォルトでは、Elasticsearchを使用してLDAPサーバーに接続するように構成すると、レルム構成でurl
属性で指定されたホスト名またはIPアドレスを証明書内の値と照合しようとします。証明書内の値とレルム構成の値が一致しない場合、ElasticsearchはLDAPサーバーへの接続を許可しません。これは、中間者攻撃から保護するために行われます。必要に応じて、ssl.verification_mode
プロパティをcertificate
に設定することで、この動作を無効にすることができます。