目录
配置一个文件域
您可以使用内置的file内部域管理和验证用户。关于file领域用户的所有数据存储在集群中每个节点上的两个文件中:users和users_roles。这两个文件都位于ES_PATH_CONF中,并在启动时读取。
重要:
users
和users_roles
文件由节点本地管理,而不是由集群全局管理。这意味着对于一个典型的多节点集群,需要对集群中的每个节点应用完全相同的更改。更安全的方法是将更改应用于其中一个节点,并将文件分发或复制到集群中的所有其他节点(手动或使用配置管理系统(如Puppet或Chef)。
默认情况下,file域被添加到域链中。您不需要显式地配置file域。
更多关于文件域的信息,参见 File-based user authentication。
1、(可选)在elasticsearch.yml文件中在xpack.security.authc.realms命名空间下增加一个域配置其类型是file。在最低限度上,你必须设置域的type属性为file。如果要配置多个领域,还应该显式设置order属性。
例如, 下面的代码片段显示了一个文件领域配置,该配置将顺序设置为0,以便首先检查领域:
xpack:
security:
authc:
realms:
file1:
type: file
order: 0
2、重启Elasticsearch
3、将用户信息添加到集群中每个节点上的ES_PATH_CONF/users文件中。
users文件存储所有用户及其密码。文件中的每一行表示一个用户条目,该条目由用户名和散列和加盐的密码组成。
rdeniro:$2a$10$BBJ/ILiyJ1eBTYoRKxkqbuDEdYECplvxnqQ47uiowE7yGqvCEgj9W
alpacino:$2a$10$cNwHnElYiMYZ/T3K4PvzGeJ1KbpXZp2PfoQD.gfaVdImnHOwIuBKS
jacknich:{PBKDF2}50000$z1CLJt0MEFjkIK5iEfgvfnA6xq7lF25uasspsTKSo5Q=$XxCVLbaKDimOdyWgLCLJiyoiWpA/XDMe/xtVgn1r5Sg=
注意:为了限制凭证被盗的风险,减少凭证被盗的危害,文件域根据安全最佳实践存储密码和缓存用户凭据。默认情况下,散列版本的用户凭证存储在内存中,使用一个加盐的sha-256哈希算法和一个散列版本的密码存储在磁盘上,使用bcrypt哈希算法进行加盐和散列。使用不同的哈希算法,参见 User cache and password hash algorithmsedit.
虽然可以使用任何标准文本编辑器直接修改用户文件,我们强烈建议使用elasticsearch-users工具应用所需的更改。
重要:作为集群的管理员,您有责任确保在集群中的每个节点上定义相同的用户。Elasticsearch的安全特性没有提供任何机制来保证这一点。
4、将角色信息添加到集群中每个节点上的ES_PATH_CONF/users_roles文件中。users_roles文件存储与用户关联的角色。例如:
admin:rdeniro
power_user:alpacino,jacknich
user:jacknich
每一行将一个角色映射到与该角色关联的所有用户的逗号分隔列表。
您可以使用elasticsearch-users工具更新该文件。您必须确保对集群中的每个节点进行相同的更改。
5、(可选)修改users文件和users_roles文件的检查频次。
默认情况下,Elasticsearch每5秒检查这些文件的更改。您可以通过更改elasticsearch.yml文件中的resource.reload.interval.high设置来更改此默认行为(由于这是弹性搜索中的常见设置,更改其值可能会影响系统中的其他调度)。
配置一个LDAP域
您可以通过与轻量级目录访问协议(LDAP)服务器通信来配置Elasticsearch来验证用户。要与LDAP集成,需要配置ldap域并将LDAP组映射到用户角色。
更多关于LDAP域的信息,参见LDAP User Authentication
1、确定要使用哪种模式。ldap域支持两种操作方式,用户搜索模式和带有用户DNs特定模板的模式。
LDAP用户搜索是最常见的操作模式。在这个模式中,具有搜索LDAP目录权限的特定用户用于根据提供的用户名和LDAP属性搜索身份验证用户的DN。一旦找到,将通过使用找到的DN和提供的密码尝试绑定到LDAP服务器来验证用户。
如果LDAP环境为用户使用一些特定的标准命名条件,则可以使用用户DN模板来配置域。这种方法的优点是,不需要执行搜索就可以找到用户DN。但是,可能需要多个绑定操作来找到正确的用户DN。
2、使用用户搜索配置一个ldap域:
a.在elasticsearch.yml文件中在xpack.security.authc.realms命名空间下增加一个类型为ldap的域配置。至少,你必须设置域的type为ldap,指定LDAP服务的url,并且设置user_search.base_dn到用户搜索容器DN。如果你正在配置多个领域,您还应该显式地设置order属性,以控制在身份验证期间查询领域的顺序。有关可以为LDAP领域设置的所有选项,请参见LDAP领域设置。
例如,下面的代码片段显示了配置了用户搜索的LDAP域:
xpack:
security:
authc:
realms:
ldap1:
type: ldap
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
bind_dn用户的密码应该通过向Elasticsearch密钥存储区添加适当的secure_bind_password设置来配置。例如,下面的命令为上面的示例域添加密码:
bin/elasticsearch-keystore add
xpack.security.authc.realms.ldap1.secure_bind_password
重要:当你在elasticsearch.yml文件中配置域时,只有您指定的领域用于身份验证。如果你也想使用native和file域,你必须在域链里包含它们。
3、使用用户DN模板配置ldap域:
a.在elasticsearch.yml文件中在xpack.security.authc.realms命名空间下增加一个类型为ldap的域配置。至少,你必须设置域的type为ldap,并使用user_dn_templates选项指定至少一个模板。如果你正在配置多个领域,您还应该显式地设置order属性,以控制在身份验证期间查询领域的顺序。有关可以为LDAP领域设置的所有选项,请参见LDAP领域设置。
例如,下面的代码片段显示了使用用户DN模板配置的LDAP域:
xpack:
security:
authc:
realms:
ldap1:
type: ldap
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
重要:
bind_dn
设置在模板模式中不被使用。所有LDAP操作都作为身份验证用户运行。
4、(可选)配置安全特性如何与多个LDAP服务器交互。load_balance.type设置可以在领域级别使用。Elasticsearch安全特性支持故障转移和负载平衡操作模式。参见 LDAP realm settingsedit。
5、(可选)为了保护密码,加密Elasticsearch和LDAP服务器之间的通信(encrypt communications between Elasticsearch and the LDAP server)
6、重启elasticsearch
7、将LDAP组映射到角色。
ldap域允许您通过ldap组或其他元数据将ldap用户映射到角色。可以通过添加角色映射API或使用存储在每个节点上的文件来配置此角色映射。当用户使用LDAP进行身份验证时,该用户的特权是由用户映射到的角色定义的所有特权的联合。
在映射定义中,可以使用组的专有名称指定组。例如,下面的映射配置将LDAPadmins组映射到monitoring和users角色,并将users组映射到user角色。
通过权限映射API配置:
curl -X PUT "localhost:9200/_xpack/security/role_mapping/admins" -H 'Content-Type: application/json' -d'
{
"roles" : [ "monitoring" , "user" ],
"rules" : { "field" : {
"groups" : "cn=admins,dc=example,dc=com"#1
} },
"enabled": true
}
'
#1
:admins组的LDAP专有名称(DN)
curl -X PUT "localhost:9200/_xpack/security/role_mapping/basic_users" -H 'Content-Type: application/json' -d'
{
"roles" : [ "user" ],
"rules" : { "field" : {
"groups" : "cn=users,dc=example,dc=com"#1
} },
"enabled": true
}
'
>#1
:users组的LDAP专有名称(DN)
或者,也可以通过角色映射文件配置:
monitoring:
#1
- "cn=admins,dc=example,dc=com"#2
user:
- "cn=users,dc=example,dc=com"#3
- "cn=admins,dc=example,dc=com"
#1
:映射角色的名称。
#2
:admins组的LDAP专有名称(DN)。
#3
:users组的LDAP专有名称(DN)。
更多信息,参见 Mapping LDAP Groups to Roles和Mapping Users and Groups to Roles
注意:LDAP领域支持授权领域作为角色映射的替代
8、(可选)在LDAP域中配置metadata设置,以便在用户的元数据中包含额外的字段。
默认情况下,ldap_dn和ldap_groups在用户的元数据中填充了。更多信息, 参见 User Metadata in LDAP Realms
下面的示例将用户的公共名称(cn)作为元数据中的附加字段。
xpack:
security:
authc:
realms:
ldap1:
type: ldap
metadata: cn
配置一个本地域
管理和验证用户的最简单方法是使用内部的native领域。
默认情况下,当没有配置其他领域时,本地领域是可用的。如果已经在elasticsearch.yml文件中配置了其他领域设置。您必须将本机领域添加到领域链。
你可以在elasticsearch.yml文件中在xpack.security.authc.realms命名空间下为native域配置其他选项。显式配置本地领域使您能够设置它在领域链中出现的顺序,暂时禁用该领域,并控制其缓存选项。
1、增加一个类型为native的域配置到elasticsearch.yml文件下的xpack.security.authc.realms命名空间下。至少,你必须设置域的type为native。如果你配置了多个域,你还应该显示地设置order属性。
参见 Native realm settings查看你可以为native域设置的所有选项。例如,例如,下面的代码片段显示了一个native领域配置,它将order设置为0,以便首先检查该领域:
xpack:
security:
authc:
realms:
native1:
type: native
order: 0
注意:为了限制凭证盗窃的暴露并减轻凭证的危害,本机领域根据安全最佳实践存储密码并缓存用户凭证。默认情况下,散列版本的用户凭证存储在内存中,使用一个加盐的sha-256哈希算法和一个哈希版本的密码存储在用bcrypt哈希算法加盐和散列的磁盘上。要使用不同的哈希算法,参见 User cache and password hash algorithms。
2、重启elasticsearch
3、在Kibana中在Management/Security/Users页面管理你的用户。或者,使用User Management APIs
配置一个PKI域
你可以配置Elasticsearch使用公钥设置(PKI)证书来验证用户。这要求客户端提供X.509证书。
注意:不能再Kibana中使用PKI证书来认证用户。
要在ELasticsearch中使用PKI,你要配置一个PKI域,以使客户端在所需的网络层(运输层或者网络层)上身份验证,并将用户证书中的专有名称(DNs)映射到role-mapping API或角色映射文件中的角色。
您还可以使用PKI和用户名/密码身份验证的组合。例如,你可以在运输层启用SSL/TLS,并定义一个KPI域来要求运输客户端使用X.509证书认证,同时仍然使用用户名和密码凭证验证HTTP流量。你还可以设置xpack.security.transport.ssl.client_authentication为optional来允许没有证书的客户端使用其他凭证进行身份验证。
重要:你必须启用SSL/TLS并且启用客户端认证以便使用PKI。
更多信息,参见 PKI User Authentication
1、在elasticsearch.yml文件的xpack.security.authc.realms命名空间下增加一个类型为pki的域设置。至少,你必须设置域的type为pki。如果你正在配置多个域,你还应该显示地设置order属性。参见PKI realm settings查看所有你可以为一个pki域设置的所有选项。
例如, 下面的代码片段显示了最基本的pki领域配置:
xpack:
security:
authc:
realms:
pki1:
type: pki
>使用此配置,SSL/TLS层信任的任何证书都可以接受身份验证。用户名是从证书的DN中提取的公共名称(CN)。
重要:当你在elasticsearch.yml文件中配置域时,只有你指定的域被用来认证。如果你还想使用native和file域,你必须在域链中包含它们。
如果希望使用DN的CN以外的其他东西作为用户名,可以指定regex提取所需的用户名。例如,下面配置中的regex从DN提取电子邮件地址:
xpack:
security:
authc:
realms:
pki1:
type: pki
username_pattern: "EMAILADDRESS=(.*?)(?:,|$)"
2、重启Elasticsearch
3、启用SSL/TLS
4、在所需的网络层上启用客户机身份验证(传输或http)。
PKI领域依赖于节点网络接口的TLS设置。可以将领域配置为比底层网络连接更具限制性——这也就是说,可以对节点进行配置,使某些连接被网络接口接受,但随后无法通过PKI领域的身份验证。然而,反过来是不可能的。PKI域无法验证被网络接口拒绝的连接。
特别是这意味着:
- 传输或http接口必须通过将client_authentication设置为optional或required来请求客户机证书。
- 接口必须信任通过配置truststore或者certificate_authorities路径,或者通过设置verification_mode为none的客户端提供的证书。参见
xpack.ssl.verification_mode
查看关于这个设置的解释。 - 接口支持的协议必须与客户机使用的协议兼容。
必须将相关的网络接口(传输或http)配置为信任将在PKI领域内使用的任何证书。但是,可以配置PKI领域,只信任网络接口接受的证书的子集。当SSL/TLS层信任带有由一个不同CA签名而不是某个你自己的签名的客户机提供的证书时,这一点非常有用。
要使用自己的信任存储区配置PKI领域,请指定truststore.path选项。例如:
xpack:
security:
authc:
realms:
pki1:
type: pki
truststore:
path: "/path/to/pki_truststore.jks"
password: "x-pack-test-password"
certificate_authorities选项用作为truststore.path设置的一种替代。
5、映射pki用户权限
你可以通过role mapping APIs或者使用一个存储在每个节点上的文件映射PKI用户的权限。当一个用户对PKI域进行身份验证时,该用户的特权是由用户映射到的角色定义的所有特权的联合。
您通过用户证书中的专有名称来标识用户。例如,下面的映射配置映射John Does到user权限:
使用role-mappingAPI:
curl -X PUT "localhost:9200/_xpack/security/role_mapping/users" -H 'Content-Type: application/json' -d'
{
"roles" : [ "user" ],
"rules" : { "field" : {
"dn" : "cn=John Doe,ou=example,o=com" #1
} },
"enabled": true
}
'
#1
:PKI用户的专有名称(DN)
或者,二选一地,在一个role-mapping文件中配置:
user:
#1
- "cn=John Doe,ou=example,o=com"#2
#1
:权限的名称
#2
:PKI用户的专有名称(DN)。
PKI用户的分离名称遵循X.500命名约定,其中将最特定的字段(如cn或uid)放在名称的开头,将最一般的字段(如o或dc)放在名称的末尾。一些工具,例如openssl,可能会以不同的格式打印出主题名。
确定证书正确DN的一种方法是使用authenticate API(使用相关的PKI证书作为身份验证的手段)并检查结果中的元数据字段。用户的专有名称将在pki_dn键下填充。您还可以使用authenticate API来验证角色映射。
更多信息,参见Mapping Users and Groups to Roles
注意:PKI领域支持授权领域作为角色映射的替代。