k8s上的elastic开启rbac

从elastic 6.8和7.1开始,xpack里的安全功能,现在已经在基础版里免费了。这篇文章记录了,如何在k8s集群中,部署的es,开启security模块,以及fluentd和kibana的接入配置。当然如果你用的是开源版,可以参考我前面的博客,部署基础版。xpack的其他功能还是有收费的,各个版本的具体情况,可以参考官网链接。请注意,本文提供的是停服升级的方法。

官方docker部署方案的问题

官方文档中,有如何在docker中配置tls的文档,这个文档我个人感觉还是不够自动化,后期如果扩节点,应该还是需要人工介入,也缺少其他组件的接入配置。因此本文利用k8s的secret来分发密钥。本文还参考了es官方如何在集群中配置tls的文档

部署过程

生成私钥和证书

首先创建一个docker容器用于执行es命令。执行密钥生成以后,通过docker cp把密钥取出来。

1
2
3
4
5
6

docker run -d --name gen_cert 10.168.136.193:5000/elasticsearch/elasticsearch:6.8.1 sleep 3600

docker exec gen_cert /usr/share/elasticsearch/bin/elasticsearch-certutil cert -out /elastic-certificates.p12 -pass ""

docker cp gen_cert:/elastic-certificates.p12 ./

验证

1
openssl pkcs12 -nocerts -nodes -in  ./elastic-certificates.p12 -info

清理

1
2
3
docker stop gen_cert

docker rm gen_cert

配置elastic节点

将生成的密钥,存成k8s的的secret

1
kubectl -n kube-system create secret generic es-keystore --from-file=./elastic-certificates.p12

将密钥挂载到pod中,并修改es配置,开启tls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
         volumeMounts:
- name: es-persistent-storage
mountPath: /data
+ - mountPath: /usr/share/elasticsearch/config/elastic-certificates.p12
+ name: keystore
+ readOnly: true
+ subPath: elastic-certificates.p12
#- name: jvm-options-volume
# mountPath: /usr/share/elasticsearch/config/jvm.options
# subPath: jvm.options
@@ -90,20 +94,26 @@ spec:
containerName: elasticsearch-logging
resource: limits.cpu
- name: "xpack.security.enabled"
- value: "false"
+ value: "true"
+ - name: xpack.security.transport.ssl.enabled
+ value: "true"
+ - name: xpack.security.transport.ssl.verification_mode
+ value: "certificate"
+ - name: xpack.security.transport.ssl.keystore.path
+ value: "/usr/share/elasticsearch/config/elastic-certificates.p12"
+ - name: xpack.security.transport.ssl.truststore.path
+ value: "/usr/share/elasticsearch/config/elastic-certificates.p12"
- name: "xpack.ml.enabled"
value: "false"
- name: "xpack.monitoring.collection.enabled"
value: "true"
- name: "xpack.license.self_generated.type"
value: "basic"
+ volumes:
+ - name: keystore
+ secret:
+ secretName: es-keystore
+ defaultMode: 0444

然后用kubectl apply生效

配置内部应用的密码

等待es启动完毕,index都green以后,直接用一下命令生成内置用户的密码

1
kubectl -n kube-system exec -ti es-master-0 bin/elasticsearch-setup-passwords auto

屏幕输出类似下面,记得把输出结果保存了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Changed password for user apm_system
PASSWORD apm_system = *****

Changed password for user kibana
PASSWORD kibana = *****

Changed password for user logstash_system
PASSWORD logstash_system = *****

Changed password for user beats_system
PASSWORD beats_system = *****

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = *****

Changed password for user elastic
PASSWORD elastic = *****

配置kibana

在kabana的yaml配置中,设置相关的环境变量,以设置用户名和密码,其中密码内容来自上一部的输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@@ -31,15 +31,14 @@ spec:
requests:
cpu: 100m
env:
- name: ELASTICSEARCH_HOSTS
value: http://es-master:9200
- name: XPACK_SECURITY_ENABLED
- value: "false"
+ value: "true"
+ - name: ELASTICSEARCH_PASSWORD
+ value: ******
+ - name: ELASTICSEARCH_USERNAME
+ value: kibana
- name: XPACK_ML_ENABLED
value: "false"
- name: XPACK_MONITORING_ENABLED

配置fluentd

创建fluentd角色和用户

kibana启动成功后,打开网页,会看到有登录界面了。输入之前生成的elastic和其密码。
进入主页后,点左下角的management,再点role,创建角色
角色创建的时候,除了logstash前缀的index以外,还需要cluster moniter的权限
角色
创建fluentd的用户,选刚刚创建的角色,输入密码即可
用户

配置config修改

修改fluentd配置的configmap,其中加入刚刚创建的用户名和密码

1
2
3
4
5
6
7
8
@id elasticsearch
@type elasticsearch
@log_level info
type_name fluentd
include_tag_key true
host es-master
user k8sfluentd
password 12345678+

修改configmap后,需要重启才能生效,直接把pod都干掉就行了

1
kubectl -n kube-system delete pods -l k8s-app=fluentd-es

注意点

在配置es的时候有一个大坑。就是pkcs的密钥,位置必须放在usr/share/elasticsearch/config/ ,否则会莫名的报,permission denied。 改owner,改mode都没卵用。