es安全认证-search-guard

 

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 securityDLS)和Field level securityFLS)级别的权限控制,或者Audit logging审计功能,或者需要支持如LDAPKerberos等第三方用户认证系统的话,那就购买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 clienttransport 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 keytoolvalidity有效期,单位是

    注:keytooljdk自带工具。

    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.jkstruststore.jks

    例如:

    3. 初始化客户端transportclient配置信息

    4. transportclient调用执行时添加认证

    使用用户名/密码验证

    传输级别上的凭据与通过HTTP基本身份验证提供的凭据非常相似。您使用的格式和机制完全相同,这意味着您

  • 为每个请求添加“Authenticate”标头
  • 其中包含由冒号分隔的Base64编码用户名和密码
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值