如题所示,本文旨在盘点ECK创建自定义证书和创建自定义用户的方式。关于这方面的知识,网上相关的资料比较少,恰好业务中又遇到了,便总结一下。
创建自定义用户
elasticsearch在集群创建的同时会创建一个名为“elastic”的超级用户(superuser),可通过如下方式获得密码:
PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
1. 通过API的方式创建自定义用户
# 获取elastic用户的密码
PASSWORD=$(kubectl get secret es-main-es-elastic-user -n kube-system -o go-template='{{.data.elastic | base64decode}}')
# 通过API的方式创建用户
curl -X POST -u "elastic:$PASSWORD" -k "https://172.17.31.8:9200/_security/user/test?pretty" -H 'Content-Type: application/json' -d'
{
"password" : "test123",
"roles" : [ "admin", "other_role1" ],
"full_name" : "Jack Nicholson",
"email" : "jacknich@example.com",
"metadata" : {
"intelligence" : 7
}
}
'
# 创建成功后会返回
{
"created" : true
}
2. 通过basic-auth的方式创建自定义用户
新建baisc-auth.yaml,存放自定义用户的用户名和密码等信息,同时可以指定用户的角色(即权限)。
apiVersion: v1
kind: Secret
metadata:
labels:
elasticsearch.k8s.elastic.co/cluster-name: es-main
name: es-main-basic-auth
namespace: kube-system
type: kubernetes.io/basic-auth
stringData:
username: es-main-test # required field for kubernetes.io/basic-auth
password: test123 # required field for kubernetes.io/basic-auth
roles: superuser # optional, not part of kubernetes.io/basic-auth
注:basic-auth的方式是ECK2.3版本才支持。
在这里真的是踩了一个坑。产品使用的eck版本是1.6,然后支持basic-auth的eck版本是2.3,因为版本的问题我一直试验不成功,后来经过多方排查,才排查出来是版本不适配的问题。
只能说自己没有这方面的意识,一直以来都没有关注到版本的差异,今后的工作中要多多注意!!
3. 通过filerealm的方式来创建自定义用户
新建filerealm-secret.yaml,存放自定义用户的用户名和加密过后的密码等信息,同时指定用户的角色。
存储的密码为经过加密之后的密码。加密算法为bcrypt。
kind: Secret
apiVersion: v1
metadata:
labels:
elasticsearch.k8s.elastic.co/cluster-name: es-main
name: es-main-filerealm-secret
namespace: kube-system
stringData:
users: |-
es-main-test:$2a$10$uXcb7ItMYIxB8kW2CVRyp.jKNNh4jsZwr6wh.t73Ow30Z0euSX7Ji
users_roles: |-
superuser:es-main-test
用户名和加密之后的密码可以通过以下方式生成:
# create a folder with the 2 files
mkdir filerealm
touch filerealm/users filerealm/users_roles
# create user 'myuser' with role 'monitoring_user'
docker run \
-v $(pwd)/filerealm:/usr/share/elasticsearch/config \
docker.elastic.co/elasticsearch/elasticsearch:8.3.3 \
bin/elasticsearch-users useradd es-main-test -p test123 -r superuser
# create a Kubernetes secret with the file realm content
kubectl create secret generic my-file-realm-secret --from-file filerealm
这里我看了许多遍文档,似乎密码真的只能通过这种方式获取,也没有其他的方式来生成加密之后的密码???
创建自定义角色
创建自定义角色与创建自定义用户类似
kind: Secret
apiVersion: v1
metadata:
name: my-roles-secret
stringData:
roles.yml: |-
click_admins:
run_as: [ 'clicks_watcher_1' ]
cluster: [ 'monitor' ]
indices:
- names: [ 'events-*' ]
privileges: [ 'read' ]
field_security:
grant: ['category', '@timestamp', 'message' ]
query: '{"match": {"category": "click"}}'
创建自定义证书
-
通过OpenSSL来创建自定义证书
openssl req -x509 -sha256 -nodes -newkey rsa:4096 -days 365 -subj "/CN=es-main-es-http" -keyout tls.key -out tls.crt
$ kubectl create secret generic es-main-es-cert --from-file=ca.crt=tls.crt --from-file=tls.crt=tls.crt --from-file=tls.key=tls.key
-
通过cert-manager来创建自定义证书
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: {{ .Values.esMain.name }}-selfsigned-issuer
spec:
selfSigned: {}
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: {{ .Values.esMain.name }}-selfsigned-ca
spec:
isCA: true
commonName: {{ .Values.esMain.name }}-selfsigned-ca
secretName: {{ .Values.esMain.name }}-ca-secret
privateKey:
algorithm: ECDSA
size: 256
issuerRef:
kind: ClusterIssuer
name: {{ .Values.esMain.name }}-selfsigned-issuer
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
name: {{ .Values.esMain.name }}-ca-issuer
spec:
ca:
secretName: {{ .Values.esMain.name }}-ca-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: {{ .Values.esMain.name }}-es-cert
spec:
isCA: false
dnsNames:
- {{ .Values.esMain.name }}-es-http
- {{ .Values.esMain.name }}-es-http.default.svc
- {{ .Values.esMain.name }}-es-http.default.svc.cluster.local
subject:
organizations:
- {{ .Values.esMain.name }}
privateKey:
algorithm: RSA
encoding: PKCS1
size: 2048
issuerRef:
kind: Issuer
name: {{ .Values.esMain.name }}-ca-issuer
secretName: {{ .Values.esMain.name }}-es-cert