REST级别的典型HTTP Basic标头如下所示:
Authorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l
Basic之后的部分是Base64的表示
Aladdin:OpenSesame
使用传输客户端时,您需要将它们添加到ThreadContext标头,而不是将基本身份验证凭据添加到HTTP请求:
TransportClient client = ...
client.threadPool().getThreadContext().putHeader("Authorization", "Basic " + encode("username:password"));
tc.prepareGet(...).get();
注:可参考官网文档
https://docs.search-guard.com/latest/elasticsearch-transport-clients-search-guard
- 说明
- elasticsearch由于自身没有做登录验证,所以会出现安全问题。Elasticsearch 数据安全可能存在的风险点:
-
- 在公网暴露集群TCP 端口或者 HTTP 端口。
- Elasticsearch 集群节点之间通信是明文的,可以被窃取或者篡改。
- 没有细粒度控制索引的操作权限
- 非必要情况下关闭HTTP端口(只保留Client 节点的HTTP端口)
- 非必要情况下关闭动态脚本,部分脚本语言
- 安全方案
-
2.1. 用官方插件x-pack。优点:和elasticsearch和kibana集成较好,权限、用户比较全面。缺点:不开源。
2.2 通过nginx 指定受信服务器访问。
2.3. Search Guard。(选择searchguard的原因是开源,大部分功能可以满足我的项目需求)
- search-guard使用说明
-
1. search-guard 开源免费, Search Guard支持Transport Layer(Node-to-node)和REST Layer(HTTP/HTTPS)的SSL/TLS加密传输,并且Transport Layer和REST Layer都可以单独配置是否开启SSL/TLS加密.
2. Search Guard提供了一套完整的“用户-角色-权限”控制系统。免费版权限可以控制到indice/type、host级别。
注:如果需要Document level security(DLS)和Field level security(FLS)级别的权限控制,或者Audit logging审计功能,或者需要支持如LDAP、Kerberos等第三方用户认证系统的话,那就购买Enterprise License(每个集群一个License,无所谓集群规模)。
3.Search Guard权限可以动态配置,我们可以把需要的权限添加到对应的文件,这些文件都作为文档存储在Elasticsearch中的searchguard索引中,然后通过sgadmin工具来更新配置(即将文件加载到ES),加载后立即生效,无需重启ES节点。
4. Search Guard 以插件的形式发布,它要提供服务需要依赖Search Guard SSL。在Elasticsearch 5.x之前需要单独安装Search Guard和Search Guard SSL;Elasticsearch 5.x之后,Search Guard默认已经集成了对应版本的Search Guard SSL,无需单独安装了。
- Windows 安装使用search-guard
-
1.切换到es的bin目录安装 search-guard插件执行如下命令
例elasticsearch-plugin install -b com.floragunn:search-guard-6:6.5.4-24.0
注意:版本号一定要对应searchguard 6以后的版本与es版本号做了匹配
2.生成秘钥库文件
下载search-guard-ssl-6.5.4-25.5 (版本号)解压缩合适的地方后,切到example-pki-scripts目录下通过执行example.sh自动生成证书。如果由于任何原因需要重新执行脚本,在同一目录中执行./clean.sh,即可自动删除所有生成的文件,复制密钥库和信任库文件 到 elasticsearch 的 config文件夹下.
search-guard证书分为3类:
客户端证书(Client certificates)
管理员证书(Admin certificates)
节点证书(Node certificates)
可参考:https://github.com/werowe/search-guard-docs/blob/master/tls_overview.md
客户端证书是TLS证书,用在es 客户端,支持rest client和transport client ;
管理员证书也是客户端证书。客户端证书如果在es配置文件elasticsearch.yml中增加了如下配置,就变成了管理员证书,可以配置多个:
searchguard.authcz.admin_dn:
- CN=test, OU=yijiao, O=yijiao, L=Test, C=DE
- CN=ischool, OU=yijiao, O=yijiao, L=Test, C=DE
节点证书用在es节点。保证es节点之间通信安全。节点证书没有权限限制,即每个操作都是允许的。也不能针对节点证书配置权限。
example-pki-scripts目录下有这几个脚本文件:
gen_client_node_cert.sh 创建客户端证书
gen_node_cert.sh 创建节点证书
gen_root_ca.sh 创建根证书
etc/root-ca.conf 根证书配置
etc/signing-ca.conf 签名证书配置
3.自定义证书说明:保证根证书配置和签名证书配置一致 (内容可自定义)
0.domainComponent = "www.test.com” 域名
1.domainComponent = "www.test.com" 域名
organizationName = "Test" 组织名称
organizationalUnitName = "Test Root CA" 组织单位名称
commonName = "Test Root CA" 通用名称
3.1 修改项说明gen_client_node_cert.sh
3.1.1.修改证书发行者信息
if [ -z "$DN" ]; then
DN="CN=$CLIENT_NAME, OU=yijiao, O=yijiao, L=SH, C=DE"
fi
其中:CN=名字与姓氏,OU=组织单位名称,O=组织名称,L=城市或区域名 称,ST=州或省份名称,C=单位的两字母国家代码,
如:CN=basedata,OU=xxx.com,O=xxx,L=CS,C=CN
3.2.2、修改证书有效期:
"$BIN_PATH" -genkey \
-alias $CLIENT_NAME \
-keystore $CLIENT_NAME-keystore.jks \
-keyalg RSA \
-keysize 2048 \
-sigalg SHA256withRSA \
-validity 712 \
-keypass $KS_PASS \
-storepass $KS_PASS \
-dname "$DN"
其中$BIN_PATH 为keytool,validity为有效期,单位是天。
注:keytool为jdk自带工具。
3.2 gen_node_cert.sh修改项说明
3.2.1.修改证书发行者信息 ,步骤同上gen_client_node_cert.sh
3.2.2、修改证书有效期 ,步骤同上gen_client_node_cert.sh
3.3 生成证书
生成的证书说明:
根证书: truststore.jks
客户端证书:sgadmin-keystore.jks该证书将会配置到es配置文件,做为管理员证书
客户端证书:ischool-keystore.jks
节点证书: node-0-keystore.jks,node-1-keystore.jks
Zip包下载链接地址:
https://github.com/floragunncom/search-guard-ssl/archive/v6.5.4-25.5.zip
3.4 配置es elasticsearch.yml
# 配置ssl
searchguard.ssl.transport.enabled: true #必须要设置为true,否则es启动不了
searchguard.ssl.transport.keystore_filepath: node-0-keystore.jks
searchguard.ssl.transport.keystore_password: 12345678
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: pwd123
searchguard.ssl.transport.enforce_hostname_verification: false
searchguard.ssl.transport.resolve_hostname: false
# 配置http
# http配置
#searchguard.ssl.http.enabled 配置为true时 es http不能访问
searchguard.ssl.http.enabled: false
searchguard.ssl.http.keystore_filepath: node-0-keystore.jks
searchguard.ssl.http.keystore_password: admin123
searchguard.ssl.http.truststore_filepath: truststore.jks
searchguard.ssl.http.truststore_password: admin123
#配置管理员证书,这里注意,下面的配置一定要和客户端证书一致,否则不能写入search-guard配置
searchguard.authcz.admin_dn:
- CN=ischool,OU=yijiao.com,O=yijiao,L=SH,C=CN
3.5 使用sgadmin工具配置写入ES
./plugins/search-guard-6/tools/sgadmin.sh -cd plugins/search-guard-6/sgconfig -ks plugins/search-guard-6/sgconfig/basedata-keystore.jks -kspass 12345678 -ts plugins/search-guard-6/sgconfig/truststore.jks -tspass pwd123 -cn test -h 0.0.0.0 -p 9300 -nhnv
-p 9300 对应elasticsearch transport连接的端口号
-cn test 为elasticsearch 集群名称 cluster.name
-h 0.0.0.0 对应elasticsearch配置:network.host
注:Winows 使用sgadmin.bat;以后每次调整searchguard 用户,角色和权限都需要执行一次写入search-guard配置操作;写入search-guard配置不需要重启Elasticsearch.
3.6 plugins/search-guard-2/tools/hash.sh:生成hash字符串,生成密码
hash.bat -p admin123 或 ./hash.sh -p admin123
3.7 elasticsearch.yml
添加禁用xpack安全验证xpack.security.enabled: false
- transportclient 访问使用的是SSL认证
-
1. 添加依赖 (注意版本号否则会引起jar包冲突)
<dependency>
<groupId>com.floragunn</groupId>
<artifactId>search-guard-ssl</artifactId>
<version>6.5.4-25.5</version>
</dependency>
2. 把生成的证书文件拷贝到项目
javaapi-keystore.jks和truststore.jks
例如:
3. 初始化客户端transportclient配置信息
4. transportclient调用执行时添加认证
使用用户名/密码验证
传输级别上的凭据与通过HTTP基本身份验证提供的凭据非常相似。您使用的格式和机制完全相同,这意味着您
- 为每个请求添加“Authenticate”标头
- 其中包含由冒号分隔的Base64编码用户名和密码