====== Kubernetes: RBAC доступ по сертификату пользователя ======
==== Создание SSL ключа и сертификата пользователя ====
Создаём временную директорию:
# mkdir tmp
# cd tmp
Генерируем SSL ключ пользователя:
# openssl genrsa -out user.key 4096
Создаём конфигурационный файл для openssl — csr.cnf следующего содержания:
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
CN = user
O = dev
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
Генерируем запрос на сертификат:
# openssl req -config csr.cnf -new -key user.key -nodes -out user.csr
Формируем запрос на сертификат в формате base64 и помещаем его в переменную среды окружения:
# export BASE64_CSR=$(cat user.csr | base64 | tr -d '\n')
Создаём yaml файл csr.yaml с запросом на подпись следующего содержания:
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
name: user_csr
spec:
groups:
- system:authenticated
request: ${BASE64_CSR}
usages:
- digital signature
- key encipherment
- server auth
- client auth
Помещаем запрос в кубернетес:
# cat csr.yaml | envsubst | kubectl apply -f -
Контролируем наличие запроса:
# kubectl get csr
Подписываем и генерируем сертификат:
# kubectl certificate approve user_csr
Копируем во временную директорию файл ~/.kube/config и в разделе users удаляем из него строки client-certificate-data и client-key-data.
Добавляем в config строку с сертификатом клиента в формате base64:
# echo "client-certificate-data: $(kubectl get csr user_csr -o jsonpath={.status.certificate})">> config
В редакторе делаем правильное выравнивание строки. Также везде меняем пользователя на user.
Добавляем в config файл ключ пользователя в формате base64:
# kubectl --kubeconfig ./config config set-credentials user --client-key=user.key --embed-certs=true
Смотрим получившийся конфигурационный файл:
# kubectl --kubeconfig ./config config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.0.45:6443
name: cluster.local
contexts:
- context:
cluster: cluster.local
user: user
name: user@cluster.local
current-context: user@cluster.local
kind: Config
preferences: {}
users:
- name: user
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
Передаём файл config пользователю user или копируем его в директорию ~/.kube пользователя.