打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处: http://blog.csdn.net/gamer_gyt
博主微博: http://weibo.com/234654758
Github: https://github.com/thinkgamer
写在前边的话
在上一篇博客中ELK Stack之Shield介绍介绍了Shiel的简单部署和一些工作机制,本篇博客就结合实例演示一下Shield在elk stack中的权限保护
Shield是什么
Shield作为插件安装到elasticsearch中,一旦安装,插件会拦截入栈API调用,以强制执行身份验证和授权,插件还可以使用Secure Sockets Layer/Transport Layer Security (SSL/TLS)为来自网络和elasticsearch的网络流量提供加密,该插件还是用API拦截层,该层使身份验证和授权能够提供审计日志记录功能。
为什么要使用Shield
ELK是一个开源的日志分析平台,可以对各类日志进行分析和研究,但是有一个缺陷就是无法对用户身份进行验证,造成的直接后果就是任何人都可以访问和查看数据,从而我们需要这样一个插件来对elk的访问做一个权限控制,elastic官方给出的是使用shield,当然也有开源的产品替代search-guard,下边我们就先来看下elastic官方给出的shield在elk中的使用。
环境说明
Ubuntu:16.04
Elasticsearch:2.4.0
Logstash:2.4.0
Kibana:4.6.1
Java:1.8.0_101
安装Shield到Elasticsearch
这里我们采用在线安装
bin/plugin install license
bin/plugin install shield
测试安装是否成功
Curl -X GET http://loclahost:9200
如果报错类似于下面这样,说明安装成功
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"shield\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/]","header":{"WWW-Authenticate":"Basic realm=\"shield\" charset=\"UTF-8\""}},"status":401}
创建一个es_admin用户,用来登录elasticsearch,按提示输入密码
bin/shield/esusers useradd es_admin -r admin
用新建的用户名进行测试
curl -u es_admin:your_password -X GET http://localhost:9200
提示如下
{
"name" : "Mauvais",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "2.4.0",
"build_hash" : "ce9f0c7394dee074091dd1bc4e9469251181fc55",
"build_timestamp" : "2016-08-29T09:14:17Z",
"build_snapshot" : false,
"lucene_version" : "5.5.2"
},
"tagline" : "You Know, for Search"
}
OK
Kibana添加用户权限
为了给kibana加用户访问权限,同时为让kibana可以访问elasticsearch的数据,需要给kibana添加kibana server密码
创建一个用户用来访问elasticsearch
master@ubuntu:/opt/elk/elasticsearch-2.4.0$ bin/shield/esusers useradd kibana4-server -r kibana4_server
Enter new password:
Retype new password:
接下来是比较重要的一个环节
1:利用openssl创建 server.key ,server.crt ,serverpem
切换到kibana的目录,创建server_ssl目录,进入该目录创建所需的文件
Key生成:
openssl genrsa -des3 -out server.key 2048
这样是生成rsa私钥,des3算法,openssl格式,2048位强度。server.key是密钥文件名。为了生成这样的密钥,需要一个至少四位的密码。
利用以下命令创建没有密码的key,这里需要用到上边生成的server.key
openssl rsa -in server.key -out server.key
这里会提示你输入密码,密码就是上一条命令你输入的密码
这里的server.key就是没有密码的版本
生成CA的Crt:
openssl req -new -x509 -key server.key -out ca.crt -days 3650
会提示你输入相应的信息,除了Common Name (e.g. server FQDN or YOUR name) []:这条之外,别的都可以使用.代替,common name是用来进行https申请的,我这里写的是kibana的ip地址即本机的ip地址,因为我的elk在同一台机器上
Csr生成:
openssl req -new -key server.key -out server.csr
提示信息如crt的生成
Crt生成:
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
输入key的密钥后,完成证书生成。-CA选项指明用于被签名的csr证书,-CAkey选项指明用于签名的密钥,-CAserial指明序列号文件,而-CAcreateserial指明文件不存在时自动生成。
最后生成了私用密钥:server.key和自己认证的SSL证书:server.crt
证书合并:
cat server.key server.crt > server.pem
最后在server_sll目录下有这些文件
master@ubuntu:/opt/elk/kibana-4.6.1-Linux-x86_64/server_ssl$ ls
ca.crt ca.srl server.crt server.csr server.key server.pem
2:配置Kibana
进入kibana的安装目录,执行:vim config/kibana.yml
(1):指定访问elasticsearch的用户和密码
elasticsearch.username: "kibana4-server"
elasticsearch.password: "kibana"
(2):设置server.ssl.key /server.ssl.crt/serve.pem
server.ssl.cert: /opt/elk/kibana-4.6.1-linux-x86_64/server_ssl/server.crt
server.ssl.key: /opt/elk/kibana-4.6.1-linux-x86_64/server_ssl/server.key
elasticsearch.ssl.ca: /opt/elk/kibana-4.6.1-linux-x86_64/server_ssl/server.pem
(3):设置elasticsearch.url
elasticsearch.url: "http://192.168.10.110:9200"
(4):设置shield.encryptionKey
shield.encryptionKey: "something_at_least_32_characters"
(5):设置shield.sessionTimeout
shield.sessionTimeout: 600000
3:在kibana中安装Shield
bin/kibana plugin –install kibana/shield/latest
Roles.yml文件的配置
roles.yml的位置
/opt/elk/elasticsearch-2.4.0/config/shield/roles.yml
我们拿其中一个举例说一下
#The required permissions for the kibana 4 server
kibana4_server: #用户组
cluster:
- monitor
indices: #权限
- names: '.kibana*' #索引名称
privileges: #用户可对该索引执行的操作
- all #这里是给隶属于kibana4_server的用户所有的执行权限
- names: '.reporting-*'
privileges:
- all
编辑roles.yml,添加用户组 my_kibana_user 用户组,这里只给了read的权限
my_kibana_user:
cluster:
- monitor
indices:
- names: 'logstash-*'
privileges:
- view_index_metadata
- read
- names: '.kibana*'
privileges:
- manage
- read
- index
接下来创建一个kibana属于my_kibana_user用户组
master@ubuntu:/opt/elk/elasticsearch-2.4.0/config/shield$ /opt/elk/elasticsearch-2.4.0/bin/shield/esusers useradd kibana -r my_kibana_user
Enter new password:
Retype new password:
master@ubuntu:/opt/elk/elasticsearch-2.4.0/config/shield$ /opt/elk/elasticsearch-2.4.0/bin/shield/esusers list
logstash : logstash
kibana4-server : kibana4_server
es_admin : admin
kibana : my_kibana_user
logstash配置Shield
创建一个logstash用户,用来连接elasticsearch
master@ubuntu:/opt/elk/elasticsearch-2.4.0$ bin/shield/esusers useradd logstash -r logstash
Enter new password:
Retype new password:
接着我们依旧测试Rsyslog发送日志
在logstash目录下便捷rsyslog.conf,加入
input {
tcp{
port => 5000
type => syslog
}
udp{
port => 5000
type => syslog
}
}
output {
stdout {
codec=> rubydebug
}
elasticsearch {
hosts => ["192.168.10.110:9200"]
user => "logstash" #logstash与elasticsearch交互的用户名
password => "logstash" #这个是logsatsh对应的密码
}
}
配置rsyslog的配置文件
vim /etc/rsyslog.conf
加入以下两行,用于发送日志
*.* @@localhost:5000
*.* @localhost:5000
重启rsyslog服务
sudo /bin/systemctl restart rsyslog.service
启动ELK,进行测试
至此我们的整体环境已经编辑OK,使用es_admin登录,该用户所属用户组为admin,对elk有所有的执行权限
输入 https://192.168.10.110:5601
输入账号和密码,在shell 执行 ssh localhost进行测试
然后我们删除一下索引进行测试
可以删除
然后logout,使用kibana用户登录,该用户隶属于my_kibana_user用户组,该用户组只有read权限
提示错误,没有权限