Оваа статија е напишана со цел да се прошири веќе
Во оваа статија ќе ви кажам како да инсталирате и конфигурирате:
- клуч наметка е проект со отворен код. Што обезбедува единствена влезна точка за апликации. Работи со многу протоколи, вклучително и LDAP и OpenID, кои се од нас.
- Чувар на врата — обратна прокси апликација која ви овозможува да интегрирате овластување преку Keycloak.
- Гангвеј — апликација која генерира конфигурација за kubectl со која можете да се најавите преку OpenID и да се поврзете на Kubernetes API.
Како функционираат дозволите во Kubernetes.
Можеме да управуваме со правата на корисници/групи користејќи RBAC, за ова веќе се создадени еден куп статии, нема да се задржам на ова во детали. Проблемот е што можете да користите RBAC за да ги ограничите корисничките права, но Kubernetes не знае ништо за корисниците. Излегува дека ни треба механизам за испорака на корисници во Кубернетес. За да го направите ова, ќе додадеме провајдер на Kuberntes OpenID, што ќе укаже дека таков корисник навистина постои, а самиот Kubernetes ќе му даде права.
Обука
- Ќе ви треба кластер Kubernetes или minikube
- 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 со следнава содржина:
клуч.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
Поставување на федерацијата
Следно, одете на веб-интерфејсот
Во левиот агол кликнете Додадете царство
Клучни
Вредност
Име
кубернети
Име на екранот
Кубернети
Оневозможи проверка на потврда за е-пошта на корисникот:
Опсегот на клиентот —> Е-пошта —> Мапери —> Потврдена е-пошта (Избриши)
Правиме федерација за увоз на корисници од 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
Треба да наведеме каде се наоѓа нашиот root сертификат од страницата и каде се наоѓа давателот на 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 во кластерот:
конфигурација на kubeadm
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
...
Поставување автентик-прокси
За да ја заштитите вашата веб-апликација, можете да го користите keycloak gatekeeper. Покрај фактот што овој обратен прокси ќе го овласти корисникот пред да ја прикаже страницата, исто така ќе пренесува информации за вас во заглавјата до крајната апликација. Така, ако вашата апликација поддржува OpenID, корисникот е веднаш овластен. Да го погледнеме примерот на Kubernetes Dashboard
Инсталирање на Kubernetes Dashboard
helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml
вредности_табла.yaml
enableInsecureLogin: true
service:
externalPort: 80
rbac:
clusterAdminRole: true
create: true
serviceAccount:
create: true
name: 'dashboard-test'
Поставување права за пристап:
Ајде да создадеме ClusterRoleBinding што ќе им даде администраторски права на кластерот (стандарден ClusterRole кластер-администратор) за корисниците во групата DataOPS.
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
Инсталирање на чувар на клучеви:
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
вредности_прокси.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"
После тоа, кога ќе се обидете да се најавите на
Инсталација на гангвеј
За погодност, можете да додадете gangway што ќе генерира конфигурациска датотека за kubectl, со чија помош ќе влеземе во Kubernetes под нашиот корисник.
helm install --name gangway stable/gangway -f values_gangway.yaml
вредности_гангвеј.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