美文网首页系统运维专家
ELK6.x—SearchGuard安全加固

ELK6.x—SearchGuard安全加固

作者: 托瓦斯克一 | 来源:发表于2020-07-21 15:15 被阅读0次

    概念

    SearchGuard使用基于角色的访问控制(RBAC)在您的集群、索引、字段和文档上保护您最敏感的数据;它涵盖了所有的内容,增加了加密、认证、授权、审计记录、多租户和扩展功能,以满足您的合规性需求;它还可以让你完全控制整个Elastisearch环境,保护Elastic堆栈的所有组件,包括Kibana、Logstash和Beats。

    其实ELK本身也有一个安全加固的插件包叫xpack,之前它是需要付费的,后来官方从6.87.1版本开始默认免费提供了,但还是会有公司继续用着其他6.x的旧版本,这时候就可以使用searchguard社区版来代替它做安全加固,防止ELK服务裸奔在互联网上。


    环境说明

    设备IP 系统版本
    192.168.199.66 CentOS 7+
    192.168.199.67 CentOS 7+
    192.168.199.68 CentOS 7+

    笔者已经在这三台设备上搭建好了ELK v6.6.1版本!

    笔者在本文中所用到的searchguard插件包都在链接中,有需要的小伙伴可以自行下载!
    链接:https://pan.baidu.com/s/1FrbbY8ma9-UO66Bl59Dp1Q
    提取码:i03d


    安装Elasticsearch安全模块

    可以参考官网 https://docs.search-guard.com/6.x-24/search-guard-versions ,需要在每台节点上都下载对应es版本的search-guard插件包!

    [root@localhost ~]# cd /home/elkuser/elasticsearch-6.6.1/
    [root@localhost elasticsearch-6.6.1]# chown elkuser:elkuser search-guard-6-6.6.1-24.1.zip
    [root@localhost elasticsearch-6.6.1]# su elkuser
    [elkuser@localhost elasticsearch-6.6.1]$ ./bin/elasticsearch-plugin install -b file:///home/elkuser/elasticsearch-6.6.1/search-guard-6-6.6.1-24.1.zip
    

    安装Kibana安全模块

    请自行下载对应kibana版本的search-guard-kibana-plugin插件包!

    [root@localhost ~]# cd /home/elkuser/kibana-6.6.1-linux-x86_64
    [root@localhost kibana-6.6.1-linux-x86_64]# ./bin/kibana-plugin install file:///home/elkuser/kibana-6.6.1-linux-x86_64/search-guard-kibana-plugin-6.6.1-18.1.zip
    

    生成证书

    笔者在这里推荐使用离线的SearchGuard TLS工具 https://releases.floragunn.com/search-guard-tlstool/1.8/search-guard-tlstool-1.8.zip 生成SearchGuard所需的所有证书!
    解压后主要看tools目录:

    searchguard-tools.png

    只需要修改my.yml文件,修改nodes下的name和ip地址,其他无需改动,注意缩进!
    下图则是笔者修改后的样子,简单明了!

    image

    执行生成证书的命令后,会输出下方的一些信息:

    [root@localhost tools]# ./sgtlstool.sh -c my.yml -crt
    WARNING: JAVA_HOME not set, will use /usr/bin/java
    Using signing certificate: /home/certtools/tools/out/root-ca.pem
    Created 6 node certificates.
    Passwords for the private keys of the node certificates have been auto-generated. The passwords are stored in the config snippet files.
    Created 2 client certificates.
    Passwords for the private keys of the client certificates have been auto-generated. The passwords are stored in the file "client-certificates.readme"
    

    此时生成的证书会在out目录下:

    image

    将这些文件全部cp到elasticsearch的config目录下:

    [root@localhost tools]# cd out/
    [root@localhost out]# cp *.* /home/elkuser/elasticsearch-6.6.1/config/
    

    Elasticsearch TLS配置

    每台节点使用自己的证书配置文件内容,例如笔者在修改my.yml文件时,写了name: es1的是ip: 192.168.199.66这台节点,所以修改es配置文件时,使用的就是es1_elasticsearch_config_snippet.yml这份文件的内容,以此类推!

    下图是66节点上的配置,首先查看es1_elasticsearch_config_snippet内容,然后复制到elasticsearch.yml中,然后再加一些配置参数和修改searchguard.nodes_dn,直接配置为CN带*号,可以在后续扩容时不再需要每台es重启,实现无缝扩容!

    修改后,配置文件的部分内容如下(其他节点操作雷同):

    [root@localhost config]# cat elasticsearch.yml
    ......
    searchguard.enterprise_modules_enabled: false
    searchguard.audit.type: internal_elasticsearch
    searchguard.enable_snapshot_restore_privilege: true
    searchguard.check_snapshot_restore_write_privileges: true
    searchguard.restapi.roles_enabled: ["sg_all_access"]
    cluster.routing.allocation.disk.threshold_enabled: false
    xpack.security.enabled: false
    
    searchguard.ssl.transport.pemcert_filepath: es1.pem
    searchguard.ssl.transport.pemkey_filepath: es1.key
    searchguard.ssl.transport.pemkey_password: WekKRmly4J473ZFaYW24
    searchguard.ssl.transport.pemtrustedcas_filepath: root-ca.pem
    searchguard.ssl.transport.enforce_hostname_verification: false
    searchguard.ssl.transport.resolve_hostname: false
    searchguard.ssl.http.enabled: true
    searchguard.ssl.http.pemcert_filepath: es1_http.pem
    searchguard.ssl.http.pemkey_filepath: es1_http.key
    searchguard.ssl.http.pemkey_password: 2O3XxjYJiNxKmWGah4Se
    searchguard.ssl.http.pemtrustedcas_filepath: root-ca.pem
    searchguard.nodes_dn:
    - CN=*,OU=gx,O=gx
    searchguard.authcz.admin_dn:
    - CN=sgadmin
    

    当全部节点都修改完毕后,就可以重启elasticsearch服务了,然后使用浏览器去访问es,会弹出授权窗口;至于用户名和密码,继续往下看吧!


    searchguard-login.png

    修改超级用户密码

    searchguard主要有5个配置文件,在plugins/search-guard-版本号/sgconfig目录下:
    sg_action_groups.yml:定义权限,建议熟悉后修改
    sg_config.yml:主配置文件,不建议修改
    sg_internal_users.yml:用户密码以及对应的权限,需要修改
    sg_roles_mapping.yml:定义用户的映射关系,不建议修改
    sg_roles.yml:权限配置文件,建议熟悉后修改

    默认有几个帐号需要修改密码:
    一个是es的超级密码,这个用来登陆Kibana的,用户名:admin
    一个是给Kibana连接ES的密码 (内部互联) 用户名:kibanaserver
    一个是给logstash到ES的密码(内部互联)用户名:logstash

    查看sg_internal_users.yml文件中的默认用户名和密码:

    [root@localhost sgconfig]# pwd
    /home/elkuser/elasticsearch-6.6.1/plugins/search-guard-6/sgconfig
    [root@localhost sgconfig]# cat sg_internal_users.yml 
    # This is the internal user database
    # The hash value is a bcrypt hash and can be generated with plugin/tools/hash.sh
    
    #password is: admin
    admin:
      readonly: true
      hash: $2y$12$xsUoXMgO8PicUJYj0htFjeQv.PLWlCnDiHbZC/7c/b6FkYznv6hBO
      roles:
        - admin
      attributes:
        #no dots allowed in attribute names
        attribute1: value1
        attribute2: value2
        attribute3: value3
    
    #password is: logstash
    logstash:
      hash: $2y$12$xsUoXMgO8PicUJYj0htFjeQv.PLWlCnDiHbZC/7c/b6FkYznv6hBO
      roles:
        - logstash
    
    #password is: kibanaserver
    kibanaserver:
      readonly: true
      hash: $2y$12$xsUoXMgO8PicUJYj0htFjeQv.PLWlCnDiHbZC/7c/b6FkYznv6hBO
    
    #password is: kibanaro
    kibanaro:  
      hash: $2a$12$JJSXNfTowz7Uu5ttXfeYpeYE0arACvcwlPBStB1F.MI7f0U9Z4DGC
      roles:
        - kibanauser
        - readall
    
    #password is: readall
    readall:
      hash: $2a$12$ae4ycwzwvLtZxwZ82RmiEunBbIPiAmGZduBAjKN0TXdwQFtCwARz2
      #password is: readall
      roles:
        - readall
    
    #password is: snapshotrestore
    snapshotrestore:
      hash: $2y$12$DpwmetHKwgYnorbgdvORCenv4NAK8cPUg8AI6pxLCuWf/ALc0.v7W
      roles:
        - snapshotrestore
    

    默认情况下,用户名与密码都是一样的,为了安全起见需要修改,其中内部互联的用户密码可以看情况修改,但是admin的账号密码必须修改,可以使用自带的hash.sh工具来修改,假设我要修改密码为123qweAAA,会输出一串字符串,操作如下:

    [root@localhost tools]# pwd
    /home/elkuser/elasticsearch-6.6.1/plugins/search-guard-6/tools
    [root@localhost tools]# ./hash.sh -p 123qweAAA
    $2y$12$FEORHsvp0JkqFVXrkbsrpugBL9UrC1p6ogYrGujWMIX0t8.tNv8w2
    

    然后我们将这个字符串替换在sg_internal_users.yml文件中,用于admin的密码:

    searchguard-admin.png

    另外,由于笔者的es索引名是自定义的,所以默认情况下logstash用户对非logstash或beat开头的索引只有只读权限,需要将logstash-*改为*;而且如果需要监控logstash,还得为此添加监控的权限,因此sg_roles.yml的部分配置如下:

    [root@localhost sgconfig]# pwd
    /home/elkuser/elasticsearch-6.6.1/plugins/search-guard-6/sgconfig
    [root@localhost tools]# cat sg_roles.yml
    ......
    sg_logstash:
      cluster:
        - CLUSTER_MONITOR
        - CLUSTER_COMPOSITE_OPS
        - indices:admin/template/get
        - indices:admin/template/put
        - cluster:monitor/xpack/info
        - cluster:monitor/main
        - cluster:admin/xpack/monitoring/bulk
      indices:
        '*':
          '*':
            - CRUD
            - CREATE_INDEX
        '*beat*':
          '*':
            - CRUD
            - CREATE_INDEX
        '?monitor*':
          '*':
            - INDICES_ALL
    

    写入配置

    SearchGuard插件至此已全部配置完成,用户密码也修改了,但是此时是不生效的,因为我们还没有把配置写入到Elasticsearch中去,需要将之前的几个证书cp到plugins/search-guard-6/tools/目录下,涉及到的证书有:
    root-ca.pem #CA公钥
    sgadmin.key #管理员私钥
    sgadmin.pem #管理员公钥

    写入配置需用到sgadmin.sh,而该命令的-keypass参数的值是client-certificates.readme文件里CN=sgadmin Password的值:

    [root@localhost config]# pwd
    /home/elkuser/elasticsearch-6.6.1/config
    [root@localhost config]# cp root-ca.pem sgadmin.key sgadmin.pem ../plugins/search-guard-6/tools/
    [root@localhost config]# cd ../plugins/search-guard-6/tools/
    [root@localhost tools]# chmod +x sgadmin.sh
    [root@localhost tools]# cat /home/elkuser/elasticsearch-6.6.1/config/client-certificates.readme 
    ......
    CN=sgadmin Password: sEqVJAbjsnTWXo5WXval
    CN=intrauser Password: aIJiUOjuLM6oZttLVJ61
    [root@localhost tools]# ./sgadmin.sh -cacert root-ca.pem -cert sgadmin.pem -key sgadmin.key -keypass sEqVJAbjsnTWXo5WXval -nhnv -icl -h 192.168.199.66 -p 9300 -cd ../sgconfig/
    

    以上的写入配置操作,只需要在es主节点上运行一次即可,不需要在每台节点上都运行,因为插件的密码权限等配置信息其实是存储在Elasticsearch上的,运行命令后会在Elasticsearch上建立一个searchguard的索引。
    说明:如果修改了用户名密码等信息,每一次修改都要重复使用这个写入命令让配置生效!

    searchguard-index.png

    Kibana TLS配置

    主要就是修改kibana的配置文件,修改的内容有连接es的账号密码,还有就是es做了加密,因此url得写成https,还有一些ssl证书的内容,修改完毕后重启kibana服务即可。

    [root@localhost kibana-6.6.1-linux-x86_64]# cat config/kibana.yml
    server.port: 5601
    server.host: "192.168.199.66"
    elasticsearch.url: "https://192.168.199.66:9200"
    elasticsearch.username: "admin"
    elasticsearch.password: "123qweAAA"
    elasticsearch.ssl.certificateAuthorities: [ "/home/elkuser/elasticsearch-6.6.1/config/root-ca.pem" ]
    elasticsearch.ssl.verificationMode: certificate
    xpack.security.enabled: false
    xpack.reporting.encryptionKey: "122333444455555666666777777788888888"
    xpack.reporting.capture.browser.chromium.disableSandbox: false
    

    Logstash TLS配置

    logstash的output配置就是添加TLS证书认证,而user选择内部互联的logstash,默认密码与用户名一致,还要带上ca公钥,以下只展示输出插件这块的内容。

    [root@localhost logstash-6.6.1]# cat config/chilu.cfg
    ......
    output {
       elasticsearch {
          hosts => ["192.168.199.66:9200","192.168.199.67:9200","192.168.199.68:9200"]
          user => "logstash"
          password => "logstash"
          ssl => true
          cacert => "/home/elkuser/elasticsearch-6.6.1/config/root-ca.pem"
          index => "chilu%{index_day}"
       }
    }
    

    如果需要监控logstash,需要将ca公钥证书拷贝到logstash的目录下,而且还需要修改logstash.yml配置文件,操作即配置内容如下。

    [root@localhost logstash-6.6.1]# cp /home/elkuser/elasticsearch-6.6.1/config/root-ca.pem ./
    [root@localhost logstash-6.6.1]# cat config/logstash.yml
    xpack.monitoring.enabled: true
    xpack.monitoring.elasticsearch.username: "logstash"
    xpack.monitoring.elasticsearch.password: "logstash"
    xpack.monitoring.elasticsearch.url: ["https://192.168.199.66:9200"]
    xpack.monitoring.elasticsearch.ssl.ca: root-ca.pem
    xpack.monitoring.elasticsearch.sniffing: true
    xpack.monitoring.collection.interval: 30s
    xpack.monitoring.collection.pipeline.details.enabled: true
    

    Curl写法

    大家都知道elasticsearch是支持RESTful API的,因此我们可以直接通过curl命令来操作elasticsearch,但是当使用searchguard加密后,curl请求它则需要带上ca公钥证书和用户名密码信息。

    例如我们查看下es集群的健康状态,输出如下内容中可以看出状态为green

    [root@localhost ~]# curl --tlsv1 -XGET 'https://192.168.199.66:9200/_cluster/health?pretty' --cacert '/home/elkuser/elasticsearch-6.6.1/config/root-ca.pem' --user admin:123qweAAA
    {
      "cluster_name" : "gzes",
      "status" : "green",
      "timed_out" : false,
      "number_of_nodes" : 3,
      "number_of_data_nodes" : 3,
      "active_primary_shards" : 36,
      "active_shards" : 73,
      "relocating_shards" : 0,
      "initializing_shards" : 0,
      "unassigned_shards" : 0,
      "delayed_unassigned_shards" : 0,
      "number_of_pending_tasks" : 0,
      "number_of_in_flight_fetch" : 0,
      "task_max_waiting_in_queue_millis" : 0,
      "active_shards_percent_as_number" : 100.0
    }
    

    SearchGuard加密ELK的内容到此为止咯,有疑问的小伙伴欢迎留言评论,觉得实用的小伙伴也欢迎点赞👍!

    相关文章

      网友评论

        本文标题:ELK6.x—SearchGuard安全加固

        本文链接:https://www.haomeiwen.com/subject/zyvikktx.html