Випуск сертифіката для клієнта Kubernetes API за допомогою CertificateSigningRequest
Kubernetes дозволяє використовувати інфраструктуру відкритих ключів (PKI) для автентифікації у кластері в якості клієнта.
Для того, щоб звичайний користувач міг автентифікуватися і викликати API, потрібно виконати кілька кроків. По-перше, цей користувач повинен мати сертифікат X.509, виданий органом, якому довіряє ваш кластер Kubernetes. Потім клієнт повинен предʼявити цей сертифікат API Kubernetes.
Ви використовуєте запит CertificateSigningRequest як частину цього процесу, і ви або інша довірена особа маєте схвалити запит.
Ви створите приватний ключ, а потім отримаєте виданий сертифікат і, нарешті, налаштуєте цей приватний ключ для клієнта.
Перш ніж ви розпочнете
Вам треба мати кластер Kubernetes, а також інструмент командного рядка kubectl має бути налаштований для роботи з вашим кластером. Рекомендується виконувати ці настанови у кластері, що має щонайменше два вузли, які не виконують роль вузлів управління. Якщо у вас немає кластера, ви можете створити його, за допомогою minikube або використовувати одну з цих пісочниць:
Вам знадобляться утиліти
kubectl
,openssl
таbase64
.
Ця сторінка передбачає, що ви використовуєте Kubernetes контроль доступу на основі ролей (RBAC). Якщо ви використовуєте альтернативні або додаткові механізми безпеки для авторизації, вам також потрібно врахувати їх.
Створення приватного ключа
На цьому кроці ви створюєте приватний ключ. Ви повинні тримати його в таємниці; будь-хто, хто його має, може видавати себе за користувача.
# Створіть приватний ключ
openssl genrsa -out myuser.key 3072
Створіть запит на підписання сертифіката X.509
Примітка:
Це не те саме, що API CertificateSigningRequest з подібною назвою; файл, який ви генеруєте тут, входить до CertificateSigningRequest.Важливо встановити атрибути CN та O для CSR. CN — це імʼя користувача, а O — група, до якої цей користувач буде належати. Ви можете ознайомитися з RBAC для отримання інформації про стандартні групи.
# Змініть загальне ім’я "myuser" на фактичне ім’я користувача, яке ви хочете використовувати
openssl req -new -key myuser.key -out myuser.csr -subj "/CN=myuser"
Створіть CertificateSigningRequest Kubernetes
Закодуйте документ CSR, використовуючи цю команду:
cat myuser.csr | base64 | tr -d "\n"
Створіть CertificateSigningRequest та надішліть його до кластера Kubernetes через kubectl. Нижче наведено уривок коду оболонки, який ви можете використати для генерації CertificateSigningRequest.
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: myuser # example
spec:
# Це закодований CSR. Змініть його на вміст myuser.csr у кодуванні base64
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZqQ0NBVDRDQVFBd0VURVBNQTBHQTFVRUF3d0dZVzVuWld4aE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTByczhJTHRHdTYxakx2dHhWTTJSVlRWMDNHWlJTWWw0dWluVWo4RElaWjBOCnR2MUZtRVFSd3VoaUZsOFEzcWl0Qm0wMUFSMkNJVXBGd2ZzSjZ4MXF3ckJzVkhZbGlBNVhwRVpZM3ExcGswSDQKM3Z3aGJlK1o2MVNrVHF5SVBYUUwrTWM5T1Nsbm0xb0R2N0NtSkZNMUlMRVI3QTVGZnZKOEdFRjJ6dHBoaUlFMwpub1dtdHNZb3JuT2wzc2lHQ2ZGZzR4Zmd4eW8ybmlneFNVekl1bXNnVm9PM2ttT0x1RVF6cXpkakJ3TFJXbWlECklmMXBMWnoyalVnald4UkhCM1gyWnVVV1d1T09PZnpXM01LaE8ybHEvZi9DdS8wYk83c0x0MCt3U2ZMSU91TFcKcW90blZtRmxMMytqTy82WDNDKzBERHk5aUtwbXJjVDBnWGZLemE1dHJRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBR05WdmVIOGR4ZzNvK21VeVRkbmFjVmQ1N24zSkExdnZEU1JWREkyQTZ1eXN3ZFp1L1BVCkkwZXpZWFV0RVNnSk1IRmQycVVNMjNuNVJsSXJ3R0xuUXFISUh5VStWWHhsdnZsRnpNOVpEWllSTmU3QlJvYXgKQVlEdUI5STZXT3FYbkFvczFqRmxNUG5NbFpqdU5kSGxpT1BjTU1oNndLaTZzZFhpVStHYTJ2RUVLY01jSVUyRgpvU2djUWdMYTk0aEpacGk3ZnNMdm1OQUxoT045UHdNMGM1dVJVejV4T0dGMUtCbWRSeEgvbUNOS2JKYjFRQm1HCkkwYitEUEdaTktXTU0xMzhIQXdoV0tkNjVoVHdYOWl4V3ZHMkh4TG1WQzg0L1BHT0tWQW9FNkpsYWFHdTlQVmkKdjlOSjVaZlZrcXdCd0hKbzZXdk9xVlA3SVFjZmg3d0drWm89Ci0tLS0tRU5EIENFUlRJRklDQVRFIFJFUVVFU1QtLS0tLQo=
signerName: kubernetes.io/kube-apiserver-client
expirationSeconds: 86400 # one day
usages:
- client auth
EOF
Деякі моменти, на які слід звернути увагу:
usages
має бутиclient auth
(від імені клієнта)expirationSeconds
можна зробити довшим (наприклад,864000
для десяти днів) або коротшим (наприклад,3600
для однієї години). Ви не можете подати запит тривалістю менше ніж 10 хвилин.request
— це закодоване в base64 значення вмісту файлу CSR.
Схваліть CertificateSigningRequest
Використовуйте kubectl, щоб знайти CSR, який ви створили, і вручну схвалити його.
Отримайте список CSR:
kubectl get csr
Схваліть CSR:
kubectl certificate approve myuser
Отримайте сертифікат
Отримайте сертифікат із CSR, щоб перевірити, чи виглядає він правильно.
kubectl get csr/myuser -o yaml
Значення сертифікату знаходиться в Base64-кодованому форматі в розділі .status.certificate
.
Експортуйте виданий сертифікат з CertificateSigningRequest.
kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
Налаштуйте сертифікат у kubeconfig
Наступним кроком буде додавання цього користувача до файлу kubeconfig.
Спочатку потрібно додати нові облікові дані:
kubectl config set-credentials myuser --client-key=myuser.key --client-certificate=myuser.crt --embed-certs=true
Потім потрібно додати контекст:
kubectl config set-context myuser --cluster=kubernetes --user=myuser
Перевірте:
kubectl --context myuser auth whoami
Ви повинні побачити вивід, який підтверджує, що ви є «myuser».
Створіть Role та RoleBinding
Примітка:
Якщо ви не використовуєте Kubernetes RBAC, пропустіть цей крок і внесіть відповідні зміни до механізму авторизації який використовується у вашому кластері.Після створення сертифіката настав час визначити Role і RoleBinding для цього користувача для доступу до ресурсів кластера Kubernetes.
Це приклад команди для створення Role для цього нового користувача:
kubectl create role developer --verb=create --verb=get --verb=list --verb=update --verb=delete --resource=pods
Це приклад команди для створення RoleBinding для цього нового користувача:
kubectl create rolebinding developer-binding-myuser --role=developer --user=myuser
Що далі
- Прочитайте Керування сертифікатами TLS у кластері
- Для отримання детальної інформації про сам X.509 зверніться до RFC 5280, розділ 3.1
- Інформацію про синтаксис запитів на підписання сертифікатів PKCS#10 наведено в RFC 2986
- Прочитайте про ClusterTrustBundles