用Search Guard来加固你的ELK(一)

用Search Guard来加固你的ELK(一)


继Mongodb被比特币勒索之后,黑客的目标盯上了ELK,目前ELK在国内有广大的用户基础,很多ELKStack都处于裸奔之中.而在ELK的安全方面除了官方的X-Pack(30天试用)之外,其他用的比较多的还有 elasticsearch-http-basic ,search guard等,其中search guard的功能更强大且社区更为活跃,本文概述下在elasticsearch 5.2环境下的search guard的安装以及http basic auth的配置 不涉及详细权限配置

环境概述

节点 用途 软件版本
itnode-1 ELK集群节点 ES 5.2,CentOS 7.2
itnode-2 ELK集群节点 ES 5.2,CentOS 7.2

软件安装

ElasticSearch 推荐使用yum方式安装 关于elasticSearch的安装和集群这里不做阐述,安装完成后 ES的路径为: /usr/share/elasticsearch

  1. 安装
cd /usr/share/elasticsearch
bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.2.0-10

当出现
Installed search-guard-5 时安装成功

plugins下的目录结构如下

.
└── search-guard-5
    ├── commons-cli-1.3.1.jar
    ├── guava-19.0.jar
    ├── netty-buffer-4.1.7.Final.jar
    ├── netty-codec-4.1.7.Final.jar
    ├── netty-codec-http-4.1.7.Final.jar
    ├── netty-common-4.1.7.Final.jar
    ├── netty-handler-4.1.7.Final.jar
    ├── netty-resolver-4.1.7.Final.jar
    ├── netty-transport-4.1.7.Final.jar
    ├── plugin-descriptor.properties
    ├── plugin-security.policy
    ├── search-guard-5-5.2.0-10.jar
    ├── search-guard-ssl-5.2.0-19.jar
    ├── sgconfig #配置模板目录
    │   ├── elasticsearch.yml.example
    │   ├── sg_action_groups.yml
    │   ├── sg_config.yml
    │   ├── sg_internal_users.yml
    │   ├── sg_roles_mapping.yml
    │   └── sg_roles.yml
    ├── tools
    │   ├── hash.bat
    │   ├── hash.sh # 密码生成工具
    │   ├── sgadmin.bat
    │   └── sgadmin.sh
    └── transport-netty4-client-5.2.0.jar

其中 sgconfig 目录下为动态配置文件 可以通过 tools目录下的sgadmin.sh导入到es中

  1. 配置

下载证书生成脚本
search-guard提供了证书生成脚本 可以通过脚本一键生成所需要的证书,脚本下载地址为:证书生成脚本
下载完成后修改下example.sh 因为我有两个节点,并准备生成一个sgadmin的客户端证书用来管理search-guard的配置 我的内容如下

#!/bin/bash
set -e
./clean.sh
./gen_root_ca.sh changeme changeme
./gen_node_cert.sh 1 changeme changeme && ./gen_node_cert.sh 2 changeme changeme
./gen_client_node_cert.sh sgadmin changeme changeme

将生成的节点名称的jks文件和truststore.jks 拷贝到ES配置目录

cp itnode-1-keystore.jks  truststore.jks /etc/elasticsearch
vi /etc/elasticsearch/elasticsearch.yml 添加以下内容

searchguard.ssl.transport.keystore_filepath: itnode-1-keystore.jks
searchguard.ssl.transport.keystore_password: changeme
searchguard.ssl.transport.truststore_filepath: truststore.jks
searchguard.ssl.transport.truststore_password: changeme
searchguard.ssl.transport.enforce_hostname_verification: false
#只使用http basic auth 未强制使用ssl 
#searchguard.ssl.http.enabled: true
#searchguard.ssl.http.keystore_filepath: itnode-1-keystore.jks
#searchguard.ssl.http.keystore_password: changeme
#searchguard.ssl.http.truststore_filepath: truststore.jks
#searchguard.ssl.http.truststore_password: changeme
#管理员证书标示 sgadmin
searchguard.authcz.admin_dn:
 - CN=sgadmin,OU=client,O=client,L=test,C=DE

启动 elasticsearch

systemctl start elasticsearch

启动完成后 进入插件所在目录:

cd /usr/share/elasticsearch/plugins/search-guard-5/sgconfig
#拷贝对应证书到该目录
cp sgadmin-keystore.jks  truststore.jks .
#使用工具生成密码密文 用以替换admin用户的密码
sh ../tools/hash.sh -p 新密码
> $2a$12$.Ghprt5q.pbQspOqi6vaQ.Oc91ilACVC9KM1YWoUInGh8F8BsE1wK
#vi sg_internal_users.yml #保留以下内容

admin:
  hash: $2a$12$.Ghprt5q.pbQspOqi6vaQ.Oc91ilACVC9KM1YWoUInGh8F8BsE1wK

以上配置完成之后 执行

cd /usr/share/elasticsearch/

plugins/search-guard-5/tools/sgadmin.sh -cd plugins/search-guard-5/sgconfig/ -ks plugins/search-guard-5/sgconfig/sgadmin-keystore.jks -ts plugins/search-guard-5/sgconfig/truststore.jks  -kspass changeme -tspass changeme -nhnv --diagnose -cn itlogcluster
#导入配置成功

kibana配置

vi /etc/kibana/kibana.yml
#添加
elasticsearch.username: "admin" # sg_internal_users.yml的用户名
elasticsearch.password: "changeme" # sg_internal_users.yml的密码的明文

重启kibana

systemctl restart kibana

关于节点 itnode-2

拷贝对应节点名称的jks证书以及truststone.jks 到itnode-2的elasticsearch 的配置文件 并添加对应的证书配置 重启elasticsearch即可

END

做完以上操作以后 cURL访问elasticSearch均需要带上账号密码

curl -u changeme:changeme http://127.0.0.1:9200
否则会输出
Unauthorized

kibana 会弹出http basic auth 对话框 要求输入账号密码

如果需要对各索引权限进行详细的控制 可以看下sgconfig下的具体的配置。