1、概述
search-guard是Elasticsearch的一个安全权限plugin,特性包括:
权限控制粒度可以到indices,types,甚至可以到过滤field层次。同时也可以限制用户行为CRUD, admin权限等。

search-guard可以实现用户访问es中日志需要登陆授权,不同用户访问不同索引,不授权的索引无法查看,分组控制不同user查看各自的业务。

search-guard插件包含两部分,search-guard-ssl和search-guard-2两个插件。

2、安装
2.1 先安装search-guard-ssl插件。按照以下步骤安装。

2.1.1 切换到elasticsearch/plugins/的目录,命令安装插件:

sudo bin/plugin install com.floragunn/search-guard-ssl/2.3.4.16

注意版本,这里elasticsearch的版本就是2.3.4,它是要跟search-guard的版本进行对应的。克隆search-guard-ssl项目,生成相关证书。克隆项目命令:

sudo git clone https://github.com/floragunncom/search-guard-ssl.git

2.1.2 创建数字证书
一般来说创建数字证书流程如下:
(1)创建ROOT CA(根证书/CA认证机构)
(2)应用服务器创建CSR(证书签名请求文件),同时会创建好自己的密钥对(公钥和私钥)
(3)将CSR发送到CA认证机构
(4)CA机构将返回一个数字签名证书

切换到刚刚克隆的search-guard-ssl的项目目录下,修改etc目录下的配置文件:

example-pki-scripts/etc/root-ca.conf 
example-pki-scripts/etc/signing-ca.conf

根据自己情况修改相关信息等 ,利用脚本,写入密码,生成根证书。

sudo ./gen_root_ca.sh paswd paswd

search-guard-ssl还提供了以下脚本:

gen_node_cert.sh :可以修改成自己的信息,生成相应服务器证书,里面包含了上述生成数字证书的过程。

gen_client_node_cert.sh :同理生成客户端数字证书。这里记住-dname参数后面的信息,后面认证客户端,就靠这个。

修改完脚本,就可以执行脚本,生成相关证书。 配置ssl。将生成的证书,keystore.jks 和 truststore.jks复制到/etc/elasticsearch/conf目录下,然后增加如下配置到elasticsearch.yml中:

searchguard.ssl.transport.enabled: true 
searchguard.ssl.transport.keystore_filepath: example-keystore.jks 
searchguard.ssl.transport.keystore_password: paswd 
searchguard.ssl.transport.truststore_filepath: truststore.jks 
searchguard.ssl.transport.truststore_password: paswd 
searchguard.ssl.transport.enforce_hostname_verification: false 
searchguard.ssl.transport.resolve_hostname: false

//http配置,这里我只是为了测试方便,配置完,应该设置为true
searchguard.ssl.http.enabled: false 
searchguard.ssl.http.keystore_filepath: example-keystore.jks 
searchguard.ssl.http.keystore_password: paswd 
searchguard.ssl.http.truststore_filepath: truststore.jks 
searchguard.ssl.http.truststore_password: paswd

searchguard.allow_all_from_loopback: true

//这里注意,下面的配置一定要和签的客户端证书一致,否则不能插入配置
searchguard.authcz.admin_dn: 
- CN=example, OU=client, O=client, L=Test, C=DE

2.2 安装search-guard-2插件
2.2.1 安装插件

sudo bin/plugin install -b com.floragunn/search-guard-2/2.3.4.4

这里同样注意与elasticsearch版本对应。修改配置并插入。切换目录到../elasticsearch/plugins/search-guard-2/ 修改该目录下的sgconfig目下的配置文件。修改用户,角色,角色映射几个配置文件即可。

2.2.2 配置文件介绍
search-guard-2主要有5个配置文件,在 plugins/search-guard-2/sgconfig 下:

(1)sg_config.yml
Configure authenticators and authorization backends。主配置文件不需要做改动。
(2)sg_internal_users.yml
本地用户文件,定义用户密码以及对应的权限。例如:对于 ELK 我们需要一个 kibana 登录用户和一个 logstash 用户:

kibana4:
  hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
  #password is: kirk
  roles:
    - kibana4
logstash:
  hash: $2a$12$xZOcnwYPYQ3zIadnlQIJ0eNhX1ngwMkTN.oMwkKxoGvDVPn4/6XtO
  #password is: kirk
  roles:
    - logstash

密码可用plugins/search-guard-2/tools/hash.sh生成。

(3)sg_roles.yml
权限配置文件,这里提供 kibana4 和 logstash 的权限样例。

#<sg_role_name>:
#  cluster:
#    - '<permission>'
#  indices:
#    '<indexname or alias>':
#      '<type>':  
#        - '<permission>'
#      _dls_: '<querydsl query>'
#      _fls_:
#        - '<field>'
#        - '<field>'
sg_kibana4:
  cluster:
      - cluster:monitor/nodes/info
      - cluster:monitor/health
  indices:
    '*':
      '*':
        - indices:admin/mappings/fields/get
        - indices:admin/validate/query
        - indices:data/read/search
        - indices:data/read/msearch
        - indices:admin/get
        - indices:data/read/field_stats
    '?kibana':
      '*':
        - indices:admin/exists
        - indices:admin/mapping/put
        - indices:admin/mappings/fields/get
        - indices:admin/refresh
        - indices:admin/validate/query
        - indices:data/read/get
sg_logstash:
  cluster:
    - indices:admin/template/get
    - indices:admin/template/put
  indices:
    'logstash-*':
      '*':
        - WRITE
        - indices:data/write/bulk
        - indices:data/write/delete
        - indices:data/write/update
        - indices:data/read/search
        - indices:data/read/scroll
        - CREATE_INDEX

(4)sg_roles_mapping.yml
定义用户的映射关系,添加 kibana 及 logstash 用户对应的映射:

sg_logstash:
  users:
    - logstash
sg_kibana4:
  backendroles:
    - kibana
  users:
    - kibana4

(5)sg_action_groups.yml
定义权限

3、启动
(1)到Elasticsearch的bin目录下,重启Elasticsearch。
(2)通过下面命令启动search-guard。

sudo tools/sgadmin.sh -cd sgconfig/ -ks sgconfig/example-keystore.jks  -kspass paswd -ts sgconfig/truststore.jks -tspass paswd -nhnv

(3)访问Elasticsearch的页面,用不同的用户登录。

4、Java 客户端访问

//Java客户端访问配置
Settings tsettings = ImmutableSettings
  .settingsBuilder()
  .put("searchguard.key_path", "/home/es2/bin")
  .put("client.transport.sniff", true)
  .put("searchguard.ssl.transport.node.enabled", true)
  .put("searchguard.ssl.transport.node.keystore_type", "JKS")
  .put("searchguard.ssl.transport.node.keystore_password", "kspass")
  .put("searchguard.ssl.transport.node.keystore_filepath", kf)
  .put("searchguard.ssl.transport.node.truststore_type", "JKS")
  .put("searchguard.ssl.transport.node.truststore_password", "tspass")
  .put("searchguard.ssl.transport.node.truststore_filepath", tf)
  .build();