Kubernetes. Настраиваем аутентификацию/авторизацию пользователей в кластере

Thank you for reading this post, don't forget to subscribe! 
Настрой­ка аутен­ти­фи­ка­ции поль­зо­ва­те­лей из AD
Все рабо­ты про­во­дим с пер­во­го масте­ра под root'ом
Гене­ра­ция сертификатов
1. Созда­ем кор­не­вой сертификат
mkdir certs
cd certs
openssl genrsa -out ca.key 4096
openssl req -x509 -sha256 -new -key ca.key -days 10000 -out ca.crt
2. Во вто­рой коман­де отве­ча­ем на вопросы
Мож­но про­сто все оста­вить по default'у
openssl genrsa -out dex.key 4096
openssl req -new -key dex.key -out dex.csr
Во вто­рой коман­де отве­ча­ем на вопросы.
Глав­ное — отве­тить на вопрос Common Name (eg, YOUR name) []:
Осталь­ное мож­но оста­вить по default'у
Тут нуж­но впи­сать имя хоста, для кото­ро­го гене­рим сертификат.
Напри­мер:  dex2.prod.test.local
3. И под­пи­сы­ва­ем запрос кор­не­вым сертификатом
openssl x509 -sha256 -req -in dex.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out dex.crt -days 10000
4. После это­го созда­ем сек­рет для ingress'a с полу­чен­ным сертификатом
kubectl create secret tls dex-tls --key dex.key --cert dex.crt --namespace kube-system

Повторяем для Gangway

1. Созда­ем запрос на сертификат
openssl genrsa -out gangway.key 4096
openssl req -new -key gangway.key -out gangway.csr
2. Во вто­рой коман­де отве­ча­ем на вопросы.
Глав­ное — отве­тить на вопрос Common Name (eg, YOUR name) []:
Осталь­ное мож­но оста­вить по default'у
Тут нуж­но впи­сать имя хоста, для кото­ро­го гене­рим сертификат.
Напри­мер:  gangway2.prod.test.local
3. И под­пи­сы­ва­ем запрос кор­не­вым сертификатом
openssl x509 -sha256 -req -in gangway.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out gangway.crt -days 5000
4. После это­го созда­ем сек­рет для ingress'a с полу­чен­ным сертификатом
kubectl create secret tls gangway-tls --key gangway.key --cert gangway.crt --namespace kube-system
пере­име­но­вы­ва­ем кор­не­вой сер­ти­фи­кат чтоб потом его мож­но было отличать:
5. Далее созда­ем сек­рет с кор­не­вым сер­ти­фи­ка­том для Gangway
kubectl create secret generic ca --from-file ca.crt --namespace kube-system
И скла­ды­ва­ем этот же сер­ти­фи­кат в /etc/ssl/certs/ca.crt на всех трех мастерах

Запуск Dex и Gangway

1. Пере­хо­дим в дирек­то­рию с yaml манифестами
cd ../
тут лежат сле­ду­ю­щие манифесты:
[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat dex_configmap.yaml
тут надо попро­сить вин­доых адми­нов создать поль­зо­ва­те­ля из под кото­ро­го мы будем ходить в AD
svc-k8s-ldap-auth
и пароль для него:
zFW4!PxUqd-5JG
и группу:

k8s-access  (в неё в AD будем добав­лять пользователей )

baseDN тоже в AD смотрим


[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat dex_deployment.yaml

 

ТАК КАК У МЕНЯ имя кластера(test.local) и имя домен кон­трол­ле­ра AD(test.local) сов­па­да­ют (я про­ко­ся­чил при уста­нов­ке кла­сте­ра), то исполь­зу­ем сле­ду­ю­щий вариант:

 

 

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat dex_ingress_service.yaml

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat dex_rbac.yaml

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat gangway_configmap.yaml

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat gangway_deployment.yaml

ТАК КАК У МЕНЯ имя кластера(test.local) и имя домен кон­трол­ле­ра AD(test.local) сов­па­да­ют (я про­ко­ся­чил при уста­нов­ке кла­сте­ра), то исполь­зу­ем сле­ду­ю­щий вариант:

 

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat gangway_ingress_service.yaml

 

добав­ля­ем пра­ви­ла на чтение(view) в namespace (terminal-soft ) для поль­зо­ва­те­лей добав­лен­ных в груп­пе AD (k8s-access)

[root@prod-vsrv-kubemaster1 k8s-ad-auth]# cat rbac.yaml

если нуж­ны админ­ские пра­ва для груп­пы, то исполь­зу­ем вот такой rbac:

 

2. Созда­ем сек­рет для Gangway
kubectl -n kube-system create secret generic gangway-key --from-literal=sesssionkey=$(openssl rand -base64 32)
3. И при­ме­ня­ем все манифесты
kubectl apply -f . -n kube-system  (тут руг­нёт­ся на rbac)
kubectl apply -f rbac.yaml
4. Про­ве­ря­ем, что все pod'ы запустились
kubectl get po -n kube-system
5. Обнов­ля­ем кон­фи­гу­ра­цию kube-api
Если кла­стер ста­вил­ся с помо­щью kubeadm:
kubectl edit configmap --namespace=kube-system kubeadm-config
6. И добавляем
7. Далее на каж­дом из трех масте­ров выполняем
kubeadm upgrade apply <k8s version> -y
Если кла­стер ста­вил­ся через kuberspray от SB или любым дру­гим спо­со­бом отлич­ным от kubeadm:
пра­вим
/etc/kubernetes/manifest/kube-apiserver.manifest.
Добав­ля­ем после    - --authorization-mode=Node,RBAC:
8. Про­ве­ря­ем, как все работает.
Откры­ва­ем в бра­у­зе­ре gangway2.prod.test.local
Откры­вай­те при­ло­же­ние в режи­ме "инког­ни­то", т.к. в обыч­ном режи­ме бра­у­зер бло­ки­ру­ет доступ по http. В Google Chrome к при­ме­ру, мож­но запу­стить режим с помо­щью ком­би­на­ции "Ctrl+Shift+N".
попа­да­ем на сле­ду­ю­щую стра­ни­цу, где вво­дим наши login pass от домен­ной учётки:
Авто­ри­зу­ем­ся, полу­ча­ем инструк­ции для настрой­ки досту­па к  кластеру.
Един­ствен­ное огра­ни­че­ние — так как у нас все сер­ти­фи­ка­ты само­под­пи­сан­ные, то в предо­став­лен­ной инструк­ции  нуж­но убрать сер­ти­фи­кат сер­ве­ра и вме­сто него впи­сать insecure-skip-tls-verify: true
т.е. вме­сто строки:
kubectl config set-cluster TestProdCluster --server=https://10.242.146.30:6443 --certificate-authority=ca-TestProdCluster.pem --embed-certs
мне нуж­но использовать:kubectl config set-cluster TestProdCluster --server=https://10.242.146.30:6443 --insecure-skip-tls-verify=true

ну и всё запус­ка­ем с любой тач­ки с кото­рой есть доступ до кла­сте­ра, эту инструк­цию и мож­но про­ве­рять доступы:

kubectl get pods

и полу­ча­ем ошиб­ку так как для это­го поль­зо­ва­те­ля нет прав.

а запус­ка­ем коман­ду для про­смот­ра раз­ре­шён­но­го namespace:
kubectl get pods -n terminal-soft

тут всё ок.