ElasticSearch 集群安装完成后,默认不提供任何安全防护,为了集群的数据安装,需要对集群配置安全认证。
数据安全的基本要求
- 身份认证
- 鉴定用户身份是否合法
- 用户鉴权
- 设置哪个用户可以访问哪些索引,具有哪些权限
- 传输加密
- 日志审计
- 所有的操作记录需要有审计
对于安全方面,ElasticStack官方提供了 x-pack 组件,用于集群间的安全认证,不过这个组件的一些高级功能是收费的,只开放了一部分基本安全认证免费使用。
一些免费的解决方案:
- 社区中有些免费的 Security 插件
- Search Guard
- Readonly REST
- 设置nginx反向代理
- 通过nginx的 auth_basic 模块做一些基本的认证
- X-Pack 的 Basic 版
- 重 ES 6.8 & ES 7.0 开始,Security 纳入 x-pack 的Basic版本中,免费使用一些基本的功能
X-Pack 中的认证服务称为 Realms, Realms 有两种类型
- 内置 Realms(免费)
- File/Native 用户名密码保存在 ElasticSearch
- 外置 Realms (收费)
- 连接 LDAP / Active Directroy / PKI / SAML / Kerberos 进行统一认证
X-PACK 使用 RBAC的方式进行用户授权
什么是RABC?
RABC 是将一组的权限,定义为一个角色,然后将这个角色分配给某个用户,这个用户就具备了这些权限。
分配的这些权限,包括 索引级 字段级 集群级
X-PACK 中内置了一些用户和角色
当打开Security 功能后,可以通过Security api 进行创建用户 和 角色
开启X-PACK 的认证与鉴权
修改es配置文件,打开认证与授权
docker exec -it es01 bash # 为集群创建一个ca机构, 这里创建的ca证书用于后面部分的 《集群间安全通信使用》 elasticsearch-certutil ca 依次输入回车(文件使用默认名),密码 # 通过这个ca颁发证书 elasticsearch-certutil cert --ca elastic-stack-ca.p12 回车(文件使用默认名),密码上一步密码相同 elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 输入第一步输入的密码 elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 输入第一步输入的密码
# 可以看到生成了 两个证书文件
# 将生成的证书文件,移动到 config 目录下
cd /usr/share/elasticsearch/ chown elasticsearch elastic-certificates.p12 chown elasticsearch elastic-stack-ca.p12 mv elastic-certificates.p12 elastic-stack-ca.p12 ./config/
# 将证书文件连同elasticsearch.keystore 发送到其他节点的 config目录中
cd /data/docker/volumes/elkstack_es_conf01/_data/ cp elastic-certificates.p12 elastic-stack-ca.p12 elasticsearch.keystore /data/docker/volumes/elkstack_es_conf0{2,3}/_data/
修改 ElasticSearch.yml 配置文件
# 所有节点都要配置 # 开启 X-PACK 认证 xpack.security.enabled: true # 下面的这几项 用于 集群间 加密通信 xpack.security.transport.ssl.enabled: true # 开启加密通信 xpack.security.transport.ssl.verification_mode: certificate # 设置认证方式,- 所有节点使用相同证书 xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 # 证书文件 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12 # 证书文件
然后重启es
设置访问密码
这里设置的就是 X-PACK 中内置的一些账户的密码
访问es 集群进行下测试
配置完成后,在打开 cerebro 连接 es 就需要输入密码了
同时 cerebro 本身也可配置认证,认证方式有基本认证,和 ldap 认证
设置kibana 安全认证
编辑kibana 的配置文件,设置ElasticSearch 的账户密码,这里的kibana账户在x-pack 中默认存在的,上面也已经设置了密码,把密码写到这里就可以了
这个账户是专门用作kibana 和 es 连接使用的
然后重启kibana,访问测试,此时kibana 登录已经需要输入密码了
创建自读账户,并添加角色
首先创建一个 具有自读权限的角色
设置最movies 索引具有 自读 权限
还可以定制 kibana 的权限
已经可以搜索到创建的角色了,接下来要创建用户,并赋予 这个角色
创建用户,关联角色
然后注销elastic 测试movies_read
账户登录后的工作台,就是前面 创建角色 定制的
尝试删除时,便提示 拒绝
集群内部安全通信
ElasticSearch 集群间可设置通过ssl 加密通信,关于 证书认证有几个不同级别
- Certificate --- 节点加入集群,需要使用相同CA 签发的证书
- Full Verification --- 节点加入集群需要使用相同CA 签发的证书,同时需要验证 host name 或 IP 地址
- No Verification --- 任何节点都可以加入
生成节点证书--- 这一部分前面已经操作过了
# 为集群创建一个ca机构, 这里创建的ca证书用于后面部分的 《集群间安全通信使用》 elasticsearch-certutil ca 依次输入回车(文件使用默认名),密码 # 通过这个ca颁发证书 elasticsearch-certutil cert --ca elastic-stack-ca.p12 回车(文件使用默认名),密码上一步密码相同 elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password 输入第一步输入的密码 elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password 输入第一步输入的密码 # 将证书拷贝到config 目录中 elastic-certificates.p12 elastic-stack-ca.p12 然后同elasticsearch.keystore 一同发送到集群内的其他节点,其中需要注意 \ 文件的权限及属主
在ElasticSearch 中配置节点间通讯 修改 elasticsearch.yml --- 这部分前面也操作过了
# 下面的这几项 用于 集群间 加密通信 xpack.security.transport.ssl.enabled: true # 开启加密通信 xpack.security.transport.ssl.verification_mode: certificate # 设置认证方式,- 所有节点使用相同证书 xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 # 证书文件 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12 # 证书文件
然后重启节点即可。
集群与外部间的安全通信
ElasticSearch 配置 HTTPS
es 7.6.1 版本中集群配置https, 需要重新生成证书,如果选择pkcs模式,就可以使用前面TransportClient 的证书
已pkcs模式为例,需要做些设置
docker exec -it es01 bash
将 解压的elasticsearch目录中的http.p12 复制到config 目录下,并在elasticsearch.yml 中添加
unzip elasticsearch-ssl-http.zip cd elasticsearch cp http.p12 ../config/ echo "xpack.security.http.ssl.enabled: true" >>../config/elasticsearch.yml echo 'xpack.security.http.ssl.keystore.path: "http.p12"' >>../config/elasticsearch.yml 每个都需要添加,然后重启集群即可
这时候http 已经无法访问了,需要使用https
配置kibana 连接 ES HTTPS
kibana 必须使用.pem 格式的证书才能正常工作,因此需要先通过openssl 命令转换一个 .pem 的证书
将生产的http.pem 证书拷贝到 kibana 的config目录
然后修改kibana.yml , 设置以下内容
elasticsearch.hosts: [ "https://172.21.0.1:9200" ] # 修改原来的es的http 连接方式为https elasticsearch.ssl.certificateAuthorities: [ "/usr/share/kibana/config/http.pem" ] # 指定证书位置 elasticsearch.ssl.verificationMode: certificate # 设置认证方式
然后重启kibana,登录kibana 进行查询测试
配置 HTTPS 连接 kibana
先为kibana 生成一个pem 的证书
将生成的文件解压,并拷贝到 kibana 的config 目录下
修改kibana.yml 文件, 添加以下配置,然后重启kibana
server.ssl.enabled: true server.ssl.certificate: config/ca.crt server.ssl.key: config/ca.key
通过kibana 日志可以发现,kibana 已经监听在了https上
通过浏览器访问测试下
此时通过http 已经无法访问,https 可以正常访问
https://www.hugbg.com/archives/2107.html
2020-08-24 4:33 下午 1F
logstash怎么连接ES https呢
2021-01-18 11:35 上午 2F
nice不错