Shield在ELK Stack中的权限保护实例

  1. 云栖社区>
  2. 博客>
  3. 正文

Shield在ELK Stack中的权限保护实例

thinkgamer.cn 2016-10-23 19:00:00 浏览1295
展开阅读全文

这里写图片描述
打开微信扫一扫,关注微信公众号【数据与算法联盟】
转载请注明出处: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权限

这里写图片描述

提示错误,没有权限

这里写图片描述


over !

网友评论

登录后评论
0/500
评论
thinkgamer.cn
+ 关注