Shield是Elastic公司推出的商业权限管理插件,它可以保护Elasticsearch中的数据,采用加密的通讯密码,基于角色的访问控制,IP过滤和审计等。
安装
Shield是以Elasticsearch插件的形式存在的。安装过程如下:
1) 在Elasticsearch中安装Shield插件。
bin/plugin install license
bin/plugin install shield
2) 启动Elasticsearch。
bin/elasticsearch
3) 添加管理员账号
bin/shield/esusers useradd es_admin -r admin
4) 测试是否生效
在页面访问数据的时候,会显示如图9.4所示的界面:
图9.4 Shield登录页面
当输入正确的账户和密码的时候,才可以访问数据。
1.1.1 工作原理
Shield是Elasticsearch的一个插件,一旦安装完成,插件将会拦截所有API请求,然后对请求进行认证和授权的校验。该插件同时提供SSL安全协议来传输网络数据,该插件提供了审计日志记录的能力,用来进行验证和审计。
用户认证
Shield定义了一组已知的用户,以便对请求的用户进行身份验证。这些用户的集合被定义为一个抽象的领域。这个抽象的领域可以是数据库,本地文件,LDAP,活动目录或者KPI。
授权
Shield的访问授权的数据模型由以下几个因素构成:
l 资源,包括集群,索引,别名等。
l 权限,对资源的一个或者多个操作。
l 许可,对应安全资源的一个或者多个权限。有2种类型的许可:集群和索引。
l 角色,权限的集合。
l 用户,准许访问资源的对象。
节点认证和信道加密
Shield可以使用SSL / TLS包进行内部通信。当SSL / TLS启用,节点相互验证的证书,建立节点之间的信任,验证防止未经身份验证的节点加入集群,通过验证后,内部通信是经过加密的。
IP过滤
Shield提供基于IP的针对节点的访问控制。通过IP控制可以限制其他机器访问Elasticsearch服务器,可以设置白名单或者黑名单进行过滤,可以设置IP或者网段。
审计
安全审计功能提供了访问Elasticsearch特定事件或者活动的记录,包括登录,授权,拒绝访问等。
1.1.2 用户认证
用户认证方式
系统支持以下几种方式的用户认证:
Native:一个内置的本地认证系统,默认可用。
File:一种内置的基于文件的认证系统,默认可用。
LDAP:通过外部轻量级目录协议进行身份验证。
AD:通过外部活动目录服务的身份验证。
PKI:通过使用可信的X.509证书的认证。
native, file, LDAP, AD这四种方式是用用户密码进行认证的。系统也支持自定义用户认证方式,可以多种认证方式同时存在,它本质上是一个配置的认证方式的优先列表。列表的顺序决定了将要认证的顺序。在认证过程中,系统将尝试一次验证一个认证方式的请求。一旦一种认证方式认证成功,通过身份认证的用户将与请求相关联的(下一步继续授权阶段)。如果一个认证方式无法对请求进行身份验证,则将认证链中的下一个认证方式。如果链中所有服务器无法验证的要求,认证就失败了,将返回错误(HTTP状态代码401)。
例如下面的代码片段配置认证链包含文件认证和本地服务器认证,以及两个LDAP和Active Directory域服务器认证。
shield.authc:
realms:
native:
type: native
order: 0
file:
type: file
order: 1
ldap1:
type: ldap
order: 2
enabled: false
url: 'url_to_ldap1'
...
ldap2:
type: ldap
order: 3
url: 'url_to_ldap2'
...
ad1:
type: active_directory
order: 4
url: 'url_to_ad'
匿名用户访问
认证过程可以分为两个阶段:令牌提取和用户认证。在第一阶段(令牌提取阶段),配置的服务器将请求尝试从传入的请求中提取/解析身份验证令牌。找到身份验证的令牌,然后将令牌用于认证。在没有任何身份验证令牌的情况下,传入的请求被认为是匿名的。
默认情况下,匿名请求被拒绝,并返回一个身份验证错误码(状态代码401)。可以通过配置改变这种行为,可以通过在elasticsearch.yml文件中配置下面的内容:
shield.authc:
anonymous:
username: anonymous_user
roles: role1, role2
authz_exception: true
本地认证
本地认证配置如下:
shield:
authc:
realms:
native1:
type: native
order: 0
可以通过 Users API来完成本地认证用户的管理。
l 增加本地用户
POST /_shield/user/ironman
{
"password" : "j@rV1s",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Tony Stark",
"email" : "tony@starkcorp.co",
"metadata" : {
"intelligence" : 7
}
}
l 查询本地用户列表
GET /_shield/user
返回的值:
{
"found" : true,
"users" : [
{
"username" : "ironman",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Tony Stark",
"email" : "tony@starkcorp.co",
"metadata" : {
"intelligence" : 7
}
}
}
]
}
l 删除本地用户
DELETE /_shield/user/ironman
本文由赛克 蓝德(secisland)原创,转载请标明作者和出处。
LDAP认证
可以通过配置使用目录访问协议(LDAP)进行用户认证。需要配置LDAP域和指定LDAP的角色在角色映射文件中。为了保护密码,和LDAP服务器之间的通信必须使用SSL / TLS加密。客户节点通过SSL / TLS连接到LDAP服务器需要LDAP服务器的证书或服务器的根CA证书安装在自己的密钥库和信任存储区中。在elasticsearch.yml中添加shield.authc.realms命名空间来进行配置,例如,下面的代码片段显示了在LDAP中配置用户认证:
shield:
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"
bind_password: changeme
user_search:
base_dn: "dc=example,dc=com"
attribute: cn
group_search:
base_dn: "dc=example,dc=com"
files:
role_mapping: "CONFIG_DIR/shield/role_mapping.yml"
unmapped_groups_as_roles: false
配置用户DN模板来进行LDAP认证
如果你的LDAP环境使用一些特定的标准命名条件的用户,可以使用用户DN模板来配置。这种方法的优点是搜索不一定是要找出用户的DN。但多个绑定操作可能需要找到正确的用户DN。例如:
shield:
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
配置LDAP组
存储在每个节点的角色映射文件指定了LDAP组。当一个用户使用LDAP认证时,用户所属的组的角色定义了用户的权限。例如,下面的映射配置指定了LDAP管理员组和普通用户组:
monitoring:
- "cn=admins,dc=example,dc=com"
user:
- "cn=users,dc=example,dc=com"
- "cn=admins,dc=example,dc=com"
SSL / TLS加密配置
1、首先要生成证书:
cd CONFIG_DIR/shield
keytool -importcert -keystore node01.jks -file cacert.pem -alias ldap_ca
2、在elasticsearch.yml配置文件中配置SSL / TLS加密:
shield.ssl.keystore.path: /home/es/config/shield/node01.jks
shield.ssl.keystore.password: myPass
shield.ssl.keystore.key_password: myKeyPass
3、配置LDAPS协议指定的URL属性和端口号。例如,url: ldaps://ldap.example.com:636。
4、重启Elasticsearch使elasticsearch.yml生效。
AD认证
可以通过配置使用活动目录(LDAP)进行用户认证。需要配置LDAP域和指定LDAP的角色在角色映射文件中。为了保护密码,和LDAP服务器之间的通信必须使用SSL / TLS加密。客户节点通过SSL / TLS连接到LDAP服务器需要LDAP服务器的证书或服务器的根CA证书安装在自己的密钥库和信任存储区中。在elasticsearch.yml中添加shield.authc.realms命名空间来进行配置,例如,下面的代码片段显示了在AD中配置用户认证
shield:
authc:
realms:
active_directory:
type: active_directory
order: 0
domain_name: ad.example.com
url: ldaps://ad.example.com:636
unmapped_groups_as_roles: true
AD认证的很多内容和上一节的LDAP基本一样,其他内容请参考上一节。
PKI身份认证
您以配置使用公共密钥基础设施(PKI)证书对用户进行身份验证。这要求客户提供X.509证书。可以结合使用PKI认证和用户名/密码认证。例如,可以启用SSL / TLS在传输层上使用一个PKI验证的X.509证书,同时还验证HTTP协议使用的用户名和密码。还可以设置shield.transport.ssl.client.auth允许客户无证书认证等。在elasticsearch.yml中添加shield.authc.realms命名空间来进行配置,例如:
shield:
authc:
realms:
pki1:
type: pki
为PKI用户分配角色
分配给PKI用户的角色映射文件存储在每个节点。在证书中可以区分不同的用户。例如,下面的映射配置指定John Doe的用户角色:
user:
- "cn=John Doe,ou=example,o=com"
基于文件的授权
可以管理和认证基于文件的认证,它是系统内容的认证方式,可以通过esusers控制台命令来增加和删除用户,分配用户角色,管理用户密码。在elasticsearch.yml中添加shield.authc.realms命名空间来进行配置,例如:
shield:
authc:
realms:
file1:
type: file
order: 0
用户管理命令在ES_HOME/bin/shield目录下:
l 增加用户
增加用户:esusers useradd <username>
增加用户同时设置密码:esusers useradd <username> -p <secret>
增加用户同时设置角色:esusers useradd <username> -r <comma-separated list of role names>
l 查询用户
esusers list
l 管理密码
esusers passwd <username> -p <password>
l 用户分配角色
用-a增加角色,-r删除角色。
esusers roles <username> -a <commma-separate list of roles> -r <commma-separate list of roles>
l 删除用户
userdel <username>
赛克蓝德(secisland)后续会逐步对Elasticsearch的最新版本的各项功能进行分析,近请期待。也欢迎加入secisland公众号进行关注。