Kubernetes: RBAC доступ по сертификату пользователя

Создаём временную директорию:

# 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 пользователя.