ElasticSearch的安全配置
安全需求
根据安全的3A要求,ES的安全需求分为以下几点:
-
认证
一个账号是否合法账号
-
鉴权
每个账号能够做哪些操作,能够访问哪些索引。
-
审计
日志审计
此外ES是一款在网络上提供服务的产品,其通讯流量同样需要进行加密。
账号认证
ES的x-pack套件提供了基础的账号认证功能,其功能称为Realm。根据付费情况不同,Realm模块提供不同的认证能力。
-
免费
只提供本地的账号服务,可通过在
elasticsearch.yml
进行本地配置。也可以通过ES的security api进行设置。 -
收费
提供基于LDAP/kerbors/SAML/AD等认证方式。
此外还有一些开源的解决方案,此处不做赘述。
Realm的开启方式:
在ES启动或者配置文件中进行配置:
bin/elasticsearch -E xxx -E xpack.security.enabled=true
设置默认的用户和组:
bin/elasticsearch-password interactice
为kibana设置用户和密码,修改kibana.yml:
elasticsearch.username: "kibana"
elasticsearch.password: "xxxxxx"
ES会提供一些默认账号供使用,使用者也可以自己创建账号,并为其赋予相应的权限。
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/built-in-users.html
账号鉴权
ES的鉴权能力采用的是基于角色的访问控制的方法(RBAC)。下图是ES官方文档上的一张图,可以说明这种关系:
authorization.pngES 提供了两种类型级别的权限,在这两种类别下又有更加细粒度的权限划分:
-
集群操作权限
提供了各种集群管理能力
-
索引/字段操作
提供到某个字段级别的访问控制,以及索引级别的操作。
具体提供的权限列表可以从官方文档获取:
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/security-privileges.html
在ES中,用户可以创建角色,并将各种类型的权限赋予角色。
定义角色的官方文档在:
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/defining-roles.html
{
"run_as": [ ... ],
"cluster": [ ... ],
"global": { ... },
"indices": [ ... ],
"applications": [ ... ]
}
需要定义的内容分为5个部分:
-
run_as
可作为该角色可以以之名义运行的用户名列表。
只有本地、文件、LDAP、AD支持这种功能。
-
cluster
该角色支持的集群级别的权限列表,如果不进行设置,则默认该角色不具备集群级别的权限。
-
global
同样是集群级别的权限,与标准的集群权限的区别在于,标准的集群权限判断只单独基于某一个集群动作是否被执行,而global还需要考虑这个动作的参数。该对象目前只限于application
-
indices
提供索引/文档/字段级别的权限
{ "names": [ ... ], "privileges": [ ... ], "field_security" : { ... }, "query": "..." "allow_restricted_indices": false }
可以指定:
name
:索引的名称privileges
:name
中指定的索引索引级别的权限field_security
:-
字段级别权限
比如,可以设置一个文档中某些字段的可访问性,需要注意的是,有一些字段默认是可访问的。(
_id
、_type
、_parent
、_routing
、_timestamp
、_ttl
、_size
以及_index
)POST /_security/role/test_role1 { "indices": [ { "names": [ "events-*" ], "privileges": [ "read" ], "field_security" : { "grant" : [ "category", "@timestamp", "message" ] } } ] }
参考文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.x/field-level-security.html
query
:文档级别权限
参考文档 https://www.elastic.co/guide/en/elasticsearch/reference/7.x/document-level-security.html
allow_restricted_indices
:默认不建议开启,因为这样会导致该角色获取到内部限制级索引的权限进而获得一些superuser权限。 -
-
application
提供自定义APP的相关权限。具体见https://www.elastic.co/guide/en/elasticsearch/reference/7.x/defining-roles.html#roles-application-priv
通讯加密
通讯流量加密包括集群内部的通讯流量加密以及集群与集群外的通讯流量加密。
集群内部通讯
集群内部通讯的流量加密需要通过对ES进行配置来完成。通过配置证书,使用ssl进行加密。
主要的目的是:1. 防止非法的ES节点加入集群,2. 防止通讯流量被监听。
首先需要制作一个证书:
bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
然后需要对ElasticSearch进行设置,修改elasticsearch.yml文件
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-certificates.p12
其中verification_mode
会有3种模式:
certificate
: 需要使用同样的证书才能加入集群
full
: 除了验证证书以外,还需要检测hostname和ip
none
: 不需要验证证书即可加入集群,一般在调试情况下使用。
参考文档:https://www.elastic.co/guide/en/elasticsearch/reference/7.x/configuring-tls.html#node-certificates
集群对外通讯
ES本身对外提供基于http的rest接口,需要对这个接口的通信进行加密,需要在elasticsearch.yml中配置
xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: certs/elastic-certificates.p12
xpack.security.http.ssl.truststore.path: certs/elastic-certificates.p12
使用kibana
和ES进行通讯,需要修改kibana
的配置文件kibana.yml
elasticsearch.username: "kibana"
elasticsearch.password: "kibanapassword"
同时kibana
也需要设置自己的http服务为https:
server.ssl.enabled: true
server.ssl.certificate: "/path/to/kibana-server.crt"
server.ssl.key: "/path/to/kibana-server.key"
参考文档:
https://www.elastic.co/guide/en/elasticsearch/reference/7.x/configuring-tls.html#tls-http
https://www.elastic.co/guide/en/kibana/7.x/using-kibana-with-security.html
https://www.elastic.co/guide/en/kibana/7.x/configuring-tls.html
网友评论