用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
- 安装
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中
- 配置
下载证书生成脚本
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下的具体的配置。