Бұл мақала қазірдің өзінде кеңейту үшін жазылған
Бұл мақалада мен сізге қалай орнату және конфигурациялау керектігін айтамын:
- пернетақта ашық бастапқы жоба болып табылады. Бұл қолданбалар үшін бір кіру нүктесін қамтамасыз етеді. Көптеген протоколдармен жұмыс істейді, соның ішінде бізді қызықтыратын LDAP және OpenID.
- қақпашы - Keycloak арқылы авторизацияны біріктіруге мүмкіндік беретін кері прокси қолданбасы.
- Өткізу жолы - OpenID арқылы Kubernetes API интерфейсіне кіруге және қосылуға болатын kubectl конфигурациясын жасайтын қолданба.
Кубернетесте рұқсаттар қалай жұмыс істейді.
Біз RBAC арқылы пайдаланушы/топ құқықтарын басқара аламыз, бұл туралы көптеген мақалалар жасалған, мен бұл туралы егжей-тегжейлі тоқталмаймын. Мәселе мынада, пайдаланушы құқықтарын шектеу үшін RBAC пайдалана аласыз, бірақ Kubernetes пайдаланушылар туралы ештеңе білмейді. Бізге Kubernetes-те пайдаланушыны жеткізу механизмі қажет екені белгілі болды. Мұны істеу үшін біз Kuberntes OpenID-ке провайдерді қосамыз, ол мұндай пайдаланушы шынымен бар екенін айтады және Кубернетес оған құқықтарды береді.
Дайындау
- Сізге Kubernetes кластері немесе миникубе қажет болады
- Active Directory
- Домендер:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Домендерге арналған сертификат немесе өздігінен қол қойылған сертификат
Өздігінен қол қойылған сертификатты қалай жасау керектігі туралы тоқталмаймын, сізге 2 сертификат жасау керек, бұл *.example.org доменіне арналған түбір (Сертификат орталығы) және қойылмалы таңба клиенті.
Сертификаттарды алғаннан/бергеннен кейін клиентті Kubernetes-ке қосу керек, ол үшін біз оған құпия жасаймыз:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Әрі қарай, біз оны Ingress контроллері үшін қолданамыз.
Пернелерді орнату
Мен бұл үшін дайын шешімдерді, атап айтқанда рульдік диаграммаларды пайдаланудың ең оңай жолы деп шештім.
Репозиторийді орнатыңыз және оны жаңартыңыз:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Келесі мазмұны бар keycloak.yml файлын жасаңыз:
keycloak.yml
keycloak:
# Имя администратора
username: "test_admin"
# Пароль администратор
password: "admin"
# Эти флаги нужны что бы позволить загружать в Keycloak скрипты прямо через web морду. Это нам
понадобиться что бы починить один баг, о котором ниже.
extraArgs: "-Dkeycloak.profile.feature.script=enabled -Dkeycloak.profile.feature.upload_scripts=enabled"
# Включаем ingress, указываем имя хоста и сертификат который мы предварительно сохранили в secrets
ingress:
enabled: true
path: /
annotations:
kubernetes.io/ingress.class: nginx
ingress.kubernetes.io/affinity: cookie
hosts:
- keycloak.example.org
tls:
- hosts:
- keycloak.example.org
secretName: tls-keycloak
# Keycloak для своей работы требует базу данных, в тестовых целях я разворачиваю Postgresql прямо в Kuberntes, в продакшене так лучше не делать!
persistence:
deployPostgres: true
dbVendor: postgres
postgresql:
postgresUser: keycloak
postgresPassword: ""
postgresDatabase: keycloak
persistence:
enabled: true
Федерацияны құру
Содан кейін веб-интерфейске өтіңіз
Сол жақ бұрышта басыңыз Аймақ қосыңыз
кілт
құн
Толық аты-жөніңіз
кубернеттер
Көрсетілетін атау
Kubernetes
Пайдаланушының электрондық поштаны растауын өшіру:
Клиент ауқымдары —> Электрондық пошта —> Мапперлер —> Электрондық пошта тексерілді (Жою)
Біз ActiveDirectory-дан пайдаланушыларды импорттау үшін федерацияны орнаттық, мен төменде скриншоттарды қалдырамын, менің ойымша, бұл түсінікті болады.
Пайдаланушы федерациясы —> Провайдерді қосу... —> ldap
Федерацияны құру
Егер бәрі жақсы болса, түймені басқаннан кейін Барлық пайдаланушыларды синхрондаңыз пайдаланушылардың сәтті импорты туралы хабарламаны көресіз.
Әрі қарай топтарымызды картаға түсіруіміз керек
Пайдаланушы федерациясы --> ldap_localhost --> Маперлер --> Жасау
Карташы құру
Клиентті орнату
Клиентті жасау керек, Keycloak тұрғысынан, бұл одан рұқсат алатын қосымша. Скриншоттағы маңызды жерлерді қызыл түспен бөлектеймін.
Клиенттер —> Жасау
Клиентті орнату
Топтар үшін скаупа жасайық:
Клиент аумақтары —> Жасау
Ауқымды құру
Және олар үшін карта жасаушыны орнатыңыз:
Клиент ауқымдары —> топтар —> Карташылар —> Жасау
Карташы
Әдепкі клиент аумақтарына топтарымыздың салыстыруын қосыңыз:
Клиенттер —> kubernetes —> Клиент ауқымдары —> Әдепкі клиент аумақтары
Біз таңдаймыз топтар в Қолжетімді тұтынушы аумақтарыбіз басамыз Таңдалған қосу
Біз құпияны аламыз (және оны ағынға жазамыз), оны Keycloak-те авторизациялау үшін қолданамыз:
Клиенттер —> kubernetes —> Тіркелгі деректері —> Құпия
Бұл орнатуды аяқтайды, бірақ сәтті авторизациядан кейін 403 қатесін алған кезде менде қате болды.
Түзету:
Клиент ауқымдары —> рөлдер —> Мапперлер —> Жасау
Картограф
Сценарий коды
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Kubernetes конфигурациялануда
Сайттағы түбірлік куәлігіміз қай жерде және OIDC провайдері қайда орналасқанын көрсетуіміз керек.
Ол үшін /etc/kubernetes/manifests/kube-apiserver.yaml файлын өңдеңіз.
kube-apiserver.yaml
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/var/lib/minikube/certs/My_Root.crt
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
Кластердегі kubeadm конфигурациясын жаңартыңыз:
kubeadmconfig
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /var/lib/minikube/certs/My_Root.crt
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
Auth-proxy орнату
Веб-бағдарламаны қорғау үшін пернетақта қақпасын пайдалануға болады. Бұл кері прокси-сервер бетті көрсетпес бұрын пайдаланушыға рұқсат беретініне қоса, ол сіз туралы ақпаратты тақырыптардағы соңғы қолданбаға да жібереді. Осылайша, егер сіздің қолданбаңыз OpenID қолдаса, пайдаланушыға бірден рұқсат беріледі. Kubernetes бақылау тақтасының мысалын қарастырыңыз
Kubernetes бақылау тақтасын орнату
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
values_dashboard.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Қол жеткізу құқықтарын орнату:
DataOPS тобындағы пайдаланушылар үшін кластердің әкімші құқықтарын (стандартты ClusterRole кластері-әкімші) беретін ClusterRoleBinding жасайық.
kubectl apply -f rbac.yaml
rbac.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dataops_group
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: DataOPS
Keycloak gatekeeper орнату:
helm repo add gabibbo97 https://gabibbo97.github.io/charts/
helm repo update
helm install gabibbo97/keycloak-gatekeeper --version 2.1.0 --name keycloak-gatekeeper -f values_proxy.yaml
values_proxy.yaml
# Включаем ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
path: /
hosts:
- kubernetes-dashboard.example.org
tls:
- secretName: tls-keycloak
hosts:
- kubernetes-dashboard.example.org
# Говорим где мы будем авторизовываться у OIDC провайдера
discoveryURL: "https://keycloak.example.org/auth/realms/kubernetes"
# Имя клиента которого мы создали в Keycloak
ClientID: "kubernetes"
# Secret который я просил записать
ClientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Куда перенаправить в случае успешной авторизации. Формат <SCHEMA>://<SERVICE_NAME>.><NAMESAPCE>.<CLUSTER_NAME>
upstreamURL: "http://dashboard-kubernetes-dashboard.default.svc.cluster.local"
# Пропускаем проверку сертификата, если у нас самоподписанный
skipOpenidProviderTlsVerify: true
# Настройка прав доступа, пускаем на все path если мы в группе DataOPS
rules:
- "uri=/*|groups=DataOPS"
Осыдан кейін, сіз баруға тырысқанда
өтпе жолды орнату
Ыңғайлы болу үшін kubectl үшін конфигурация файлын генерациялайтын өтпелі жолды қосуға болады, оның көмегімен біз пайдаланушының астындағы Kubernetes-ке кіреміз.
helm install --name gangway stable/gangway -f values_gangway.yaml
values_gangway.yaml
gangway:
# Произвольное имя кластера
clusterName: "my-k8s"
# Где у нас OIDC провайдер
authorizeURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/auth"
tokenURL: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/token"
audience: "https://keycloak.example.org/auth/realms/kubernetes/protocol/openid-connect/userinfo"
# Теоритически сюда можно добавить groups которые мы замапили
scopes: ["openid", "profile", "email", "offline_access"]
redirectURL: "https://gangway.example.org/callback"
# Имя клиента
clientID: "kubernetes"
# Секрет
clientSecret: "c6ec03b8-d0b8-4cb6-97a0-03becba1d727"
# Если оставить дефолтное значние, то за имя пользователя будет братья <b>Frist name</b> <b>Second name</b>, а при "sub" его логин
usernameClaim: "sub"
# Доменное имя или IP адресс API сервера
apiServerURL: "https://192.168.99.111:8443"
# Включаем Ingress
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/proxy-buffer-size: "64k"
path: /
hosts:
- gangway.example.org
tls:
- secretName: tls-keycloak
hosts:
- gangway.example.org
# Если используем самоподписанный сертификат, то его(открытый корневой сертификат) надо указать.
trustedCACert: |-
-----BEGIN CERTIFICATE-----
MIIDVzCCAj+gAwIBAgIBATANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwHhcNMjAwMjE0MDkxODAwWhcNMzAwMjE0MDkxODAwWjA1MQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRGF0YU9QUzEUMBIGA1UEAxMLbXkgcm9vdCBrZXkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDyP749PqqIRwNSqaK6qr0Zsi03G4PTCUlgaYTPZuMrwUVPK8xX2dWWs9MPRMOdXpgr8aSTZnVfmelIlVz4D7o2vK5rfmAe9GPcK0WbwKwXyhFU0flS9sU/g46ogHFrk03SZxQAeJhMLfEmAJm8LF5HghtGDs3t4uwGsB95o+lqPLiBvxRB8ZS3jSpYpvPgXAuZWKdZUQ3UUZf0X3hGLp7uIcIwJ7i4MduOGaQEO4cePeEJy9aDAO6qV78YmHbyh9kaW+1DL/Sgq8NmTgHGV6UOnAPKHTnMKXl6KkyUz8uLBGIdVhPxrlzG1EzXresJbJenSZ+FZqm3oLqZbw54Yp5hAgMBAAGjcjBwMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFHISTOU/6BQqqnOZj+1xJfxpjiG0MAsGA1UdDwQEAwIBBjARBglghkgBhvhCAQEEBAMCAAcwHgYJYIZIAYb4QgENBBEWD3hjYSBjZXJ0aWZpY2F0ZTANBgkqhkiG9w0BAQsFAAOCAQEAj7HC8ObibwOLT4ZYmISJZwub9lcE0AZ5cWkPW39j/syhdbbqjK/6jy2D3WUEbR+s1Vson5Ov7JhN5In2yfZ/ByDvBnoj7CP8Q/ZMjTJgwN7j0rgmEb3CTZvnDPAz8Ijw3FP0cjxfoZ1Z0V2F44Ry7gtLJWr06+MztXVyto3aIz1/XbMQnXYlzc3c3B5yUQIy44Ce5aLRVsAjmXNqVRmDJ2QPNLicvrhnUJsO0zFWI+zZ2hc4Ge1RotCrjfOc9hQY63jZJ17myCZ6QCD7yzMzAob4vrgmkD4q7tpGrhPY/gDcE+lUNhC7DO3l0oPy2wsnT2TEn87eyWmDiTFG9zWDew==
-----END CERTIFICATE-----
Мынадай көрінеді. Конфигурация файлын дереу жүктеп алуға және оны пәрмендер жиынтығы арқылы жасауға мүмкіндік береді:
Ақпарат көзі: www.habr.com