====== Kubernetes: RBAC теория ====== {{ :devops:k8s:picture.png?nolink&810x364 }} ===== Доступ по сертификату. ===== В Kubernetes пользователей как таковых нет. Но можно эмулировать доступ пользователя используя ssl сертификаты. Для этого имя пользователя добавляют в dn сертификата. Например: cn=user,dc=cluster,dc=local Генерируем ключ пользователя. # openssl genrsa -out user.key 4096 Создадим временную директорию. # mkdir users # cd users/ Создадим конфигурационный файл opessl csr.cnf. [ req ] default_bits = 2048 prompt = no default_md = sha256 distinguished_name = dn [ dn ] CN = user DC = cluster DC = local [ 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 Поместим содержимое файла csr в формате base64 в переменную среды окружения BASE64_CSR: # export BASE64_CSR=$(cat user.csr | base64 | tr -d '\n') Создаём файл 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 Поместим сертификат пользователя в файл. # kubectl get csr user_csr -o jsonpath={.status.certificate} | base64 --decode> user.crt Создание файла config\\ Получаем информацию о подключении к кластеру. # kubectl cluster-info Нас интересует строка Kubernetes master is running at https://192.168.218.49:6443 Начинаем создавать файл конфигурации.\ Сначала добавим информацию о кластере. # kubectl config --kubeconfig=./config set-cluster k8s --server=https://192.168.218.49:6443 \ --certificate-authority=/etc/kubernetes/pki/ca.crt --embed-certs=true Добавляем пользователя. # kubectl config --kubeconfig=./config set-credentials user --client-key=user.key --client-certificate=user.crt --embed-certs=true Определяем контекст. # kubectl config --kubeconfig=./config set-context default --cluster=k8s --user=user --namespace kubetest Устанавливаем контекст по умолчанию. # kubectl config --kubeconfig=./config use-context default Проверяем доступ к серверу # kubectl --kubeconfig=./config -n kubetest get pods Мы должны получить сообщение об ошибке доступа пользователя artur к ресурсу. Это нормально. На данном этапе мы сконфигурировали доступ к кластеру для пользователя – конфигурационный файл для программы kubectl. Доступ к элементам API кластера мы будем описывать отдельно. Скопируйте полученный config файл в домашнюю директорию пользователя artur: # mkdir /home/user/.kube # cp config /home/user/.kube # chown -R user:user /home/user/.kube ===== ServiceAccount ===== ServiveAccount используют для доступа к API Kubernetes из приложений.\\ Когда в системе создаётся pod, ему по умолчанию присваивается default ServiceAccount текущего namespace.\\ Посмотреть ServiceAccount в namespace можно следующим образом: # kubectl -n kubetest get serviceaccounts Создавать ServiceAccount можно прямо в командной строке: # kubectl -n kubetest create serviceaccount testaccount Или при помощи yaml файла: apiVersion: v1 kind: ServiceAccount metadata: name: testaccount namespace: kubetest # kubectl apply -f file.yaml Если приложение (pod) запускается без явного указания ServiceAccount, ему присваивается ServiceAccount default. Для определения ServiceAccount, при описании пода используйте serviceAccountName. При запуске приложения ему автоматически подключается директория /var/run/secrets/kubernetes.io/serviceaccount в которой находятся файлы: * ca.crt – сертификат CA кластера. * Namespace – содержит имя namespace, в котором находится pod. * token – содержит токен, используемый для доступа к API кластера. Если вы хотите получать доступ к API кластера не из приложения, а, например из командной строки при помощи curl. Необходимо получить токен соответствующего ServiceAccount: # kubectl -n kubetest get secret $(kubectl -n kubetest get serviceaccount kubetest-account \ -o jsonpath="{.secrets[0].name}") -o jsonpath="{.data.token}" | base64 –decode