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