# Access Control В данном практическом занятии рассмотрим процесс аутентификации с помощью сертификата и разделение прав с [RBAC][]. ## Authn Для того, чтобы получить сертификат, которому будет доверять api kubernetes, необходимо сгенерировать запрос на подпись - [Certificate Signing Request(csr)] и отправить на подтверждение в api. В данном примере для генерации csr и ключа я воспользуюсь утилитой openssl, в Linux и MacOS данная утилита обычно есть по умолчанию, для Windows [список источников для загрузки есть тут][openssl-bin]. ### Generate csr and key Генерацию ключа и [csr][] можно произвести одной командой: ```console $ openssl req -new -newkey rsa:2048 -nodes -subj '/CN=Alex' -keyout key.pem -out csr.pem Generating a 2048 bit RSA private key .................................................+++++ ...............................................+++++ writing new private key to 'key.pem' ----- ``` В данной команде используются опции: * `req -new` - создание нового csr * `-newkey rsa:2048` - генерация нового RSA ключа длиной 2048 бит * `-nodes` - не использовать пароль для ключа * `-subj '/CN='` - указание Subject для сертификата, где `name` - ваше имя * `-keyout ` - путь и имя для сохранения ключа * `-out ` - путь и имя для сохранения csr После выполнения данной команды в директории, в которой вы находитесь, создадутся файлы `key.pem` и `csr.pem`. ### kind: CertificateSigningRequest Для возможности подписать наш csr внутрикластерным сертификатом удостоверяющего центра необходимо создать объект [CertificateSigningRequest][csr-api]. ```bash cat < crt.pem ``` ### kubectl credentials Теперь у нас есть необходимые файлы для аутентификации в кластере - ключ `key.pem` и подписанный сертификат `crt.pem`, осталось внести изменения в конфигурацию kubectl, чтобы воспользоваться ими. Создаем пользовательскую конфигурацию `myuser` указав сертификат и ключ: ```console $ kubectl config set-credentials myuser --client-certificate crt.pem --client-key key.pem --embed-certs User "myuser" set. ``` Модифицируем текущий контекст, указав созданного пользователя, а также можем убедиться, что в конфигурации применились наши изменения: ```console $ kubectl config set-context --current --user myuser Context "kind-kind" modified. $ kubectl config view apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://192.168.56.2:6443 name: kind-kind contexts: - context: cluster: kind-kind user: myuser name: kind-kind current-context: kind-kind kind: Config preferences: {} users: - name: kind-kind user: client-certificate-data: DATA+OMITTED client-key-data: DATA+OMITTED - name: myuser user: client-certificate-data: DATA+OMITTED client-key-data: DATA+OMITTED ``` Как видно в конфигурации добавился новый пользователь - `myuser`, а также он применился к текущему контексту в блоке `contexts`. Можно попробовать сделать любой запрос в кластер: ```console $ kubectl get pods Error from server (Forbidden): pods is forbidden: User "Alex" cannot list resource "pods" in API group "" in the namespace "default" ``` Так как наш новый пользователь не имеет никаких прав, то мы получаем данное сообщение. ## RBAC Authz Для выдачи прав нашему пользователю воспользуемся режимом авторизации [Role-based access control (RBAC)][rbac]. ### Role Набор прав в неймспейсе можно задать с помощью ресурса `Role`: ```bash $ kubectl config set-context --current --user kind-kind # вернем пользователя по-умолчанию Context "kind-kind" modified. $ kubectl apply -f - <