ES 引入基础鉴权

背景

主搜几个集群发生过删库,继而引发大规模的数据修复重建,浪费了开发、运维同学的大量时间精力。为了能从访问上对人员的操作进行限制和记录,需要引入对ES集群进行权限校验的机制。

思路

  1. 开启ES本身的权限校验及相关配置
  2. 接入Ldap的权限校验体系
  3. migrate所有应用中的ES链接创建方式
  4. 通过公用的cerebro和kibana对ES集群进行访问

实施路径

ES集群

  1. 在配置文件中开启包括集群SSL、安全性认证等在内的配置
    1. 需要通过统一的认证中心生成证书
  2. 根据需要设置不同权限的用户组
  3. 为每个既存应用创建对应的账号密码
  4. 接入Ldap权限体系,对个人的访问进行验证
  5. 给ES集群的Master节点添加SLB对所有流量进行监控和记录

应用

  1. 创建时注册应用专用的账号密码
  2. 修改原有ES链接代码,添加安全认证部分
  3. 新应用构建时通过配置中心 + 安全认证的方式进行链接建立

个人

  1. 从直接使用变成通过Ldap认证的方式进行登入
  2. 通过统一的客户端对ES集群进行使用

主要milestone

  1. ES权限部分使用的调研
    1. 开启和接入方式
    2. 不同权限组的使用范围
    3. client连接方式的修改sample
  2. Ldap的接入
  3. 既存系统的改造
    1. 配置的引入
    2. client的修改
  4. 服务的迁移和测试

实际操作

  1. 修改ES配置文件$ES_HOME/config/elasticsearch.yml,添加以下配置并重启
    1. xpack.monitoring.collection.enabled=true
    2. xpack.security.enabled=true
    3. xpack.security.transport.ssl.enabled=true
  2. 创建证书(参考)
    1. 登陆任意一个节点,找到 ESbin 目录
    2. 运行命令 /bin/elasticsearch-certutil ca
      1. 一路 y
      2. 生成文件 elastic-stack-ca.p12
    3. 运行命令 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
      1. 一路 y
      2. 生成文件 elastic-certificates.p12
      3. 把这个文件拷贝到所有节点的 config 目录里
  3. 创建账号密码
    1. 登陆任意一个节点,找到 ESbin 目录
    2. 运行命令 ./bin/elasticsearch-setup-passwords auto 自动生成密码,或者 ./bin/elasticsearch-setup-passwords interactive 手动填写密码
    3. 主要记得两个账户的密码,kibanaelastic,一个用来连接和认证 kibana,一个是整个集群的 superuser 超级管理员
  4. 修改ES配置文件$ES_HOME/config/elasticsearch.yml,添加以下配置并重启
    1. xpack.security.transport.ssl.keystore.type=PKCS12
    2. xpack.security.transport.ssl.verification_mode=certificate
    3. xpack.security.transport.ssl.keystore.path=elastic-certificates.p12
    4. xpack.security.transport.ssl.truststore.path=elastic-certificates.p12
    5. xpack.security.transport.ssl.truststore.type=PKCS12
  5. (可选)修改 Kibana 配置文件 $KIBANA_HOME/config/kibana.yml并重启。主要修改 password 字段,改成上面生成的密码
    1. elasticsearch.username: kibana
    2. elasticsearch.password: changeme
  6. 通过 elastic 账号密码登陆ES进行后续配置
  7. 禁用无用的账户
    1. PUT /_security/user/$USER_NAME/_disable
    2. curl -XPUT http://elastic@$elastic_pwd:$ES_URL:9200/_security/user/$USER_NAME/_disable
  8. 创建需要的账户
    1. Kibana
      POST /_security/user/ccy_test_1
      {
          "password" : "ccy_test_1",
          "roles" : [ "ccy_test_1" ],
          "metadata" : {
              "description":"ccy service account"
          }
      }
      
    2. 命令行
      curl -XPOST 'http://elastic@$ELASTIC_PWD:$ES_URL:9200/_security/user/$SERVICE_USER' \
      -H 'Content-Type: application/json' \
      -d '{·
          "password" : "$SERVICE_USER",
          "roles" : [ "$SERVICE_ROLE" ],
          "metadata" : {
              "description":"ccy service account"
          }
      }'
      
  9. 创建需要的权限
    1. Kibana
      POST /_security/role/ccy_test_1
      {
          "indices": [
              {
              "names": [
                  "ms_ccy_*"
              ],
              "privileges": [
                  "read",
                  "write",
                  "create",
                  "delete",
                  "create_index",
                  "index"
              ]
              }
          ],
          "metadata": {
              "description":"ccy service account role"
          }
      }
      
    2. 命令行
      curl -XPOST 'http://elastic@$ELASTIC_PWD:$ES_URL:9200/_security/role/$SERVICE_ROLE' \
      -H 'Content-Type: application/json' \
      -d '{
          "indices": [
              {
                  "names": [
                      "$INDEX_PATTERN"
                  ],
                  "privileges": [
                      "read",
                      "write",
                      "create",
                      "delete",
                      "create_index",
                      "index"
                  ]
              }
          ],
          "metadata": {
              "description":"ccy service account role"
          }
      }'
      
  10. 给账号指定

服务端升级

  1. 用服务的appid注册账号密码(运维维护)
  2. JavaClient 构建的时候添加以下代码
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;

...


final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(ES_USER, ES_PWD));

RestClientBuilder builder = RestClient.builder(httpHosts)
        
        .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                .setDefaultCredentialsProvider(credentialsProvider))
        ;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值