Ĉi tiu artikolo estis skribita por pligrandigi la jam
En ĉi tiu artikolo mi rakontos al vi kiel instali kaj agordi:
- ŝlosilmantelo estas malfermkoda projekto. Kiu provizas ununuran punkton de eniro por aplikoj. Funkcias kun multaj protokoloj, inkluzive de LDAP kaj OpenID, pri kiuj ni interesiĝas.
- ŝlosilmantelo pordisto - inversa prokura aplikaĵo, kiu ebligas al vi integri rajtigon per Keycloak.
- pasejo - aplikaĵo, kiu generas agordon por kubectl, per kiu vi povas ensaluti kaj konektiĝi al la Kubernetes API per OpenID.
Kiel funkcias permesoj en Kubernetes.
Ni povas administri uzant-/grupajn rajtojn uzante RBAC, amaso da artikoloj jam estis kreitaj pri tio, mi ne detale detale pri tio. La problemo estas, ke vi povas uzi RBAC por limigi uzantrajtojn, sed Kubernetes scias nenion pri uzantoj. Rezultas, ke ni bezonas uzantan liveran mekanismon en Kubernetes. Por fari tion, ni aldonos provizanton al Kuberntes OpenID, kiu diros, ke tia uzanto vere ekzistas, kaj Kubernetes mem donos al li la rajtojn.
Trejnado
- Vi bezonos Kubernetes-areton aŭ minikube
- Aktiva Dosierujo
- Domajnoj:
keycloak.example.org
kubernetes-dashboard.example.org
pasejo.ekzemplo.org - Atestilo por domajnoj aŭ memsubskribita atestilo
Mi ne pritraktos kiel krei memsubskribitan atestilon, vi devas krei 2 atestojn, ĉi tio estas la radiko (Atestila Aŭtoritato) kaj ĵokera kliento por la domajno *.example.org.
Post kiam vi ricevas/eldonos atestojn, la kliento devas esti aldonita al Kubernetes, por tio ni kreas sekreton por ĝi:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Poste, ni uzos ĝin por nia Ingress-regilo.
Instalado de Keycloak
Mi decidis, ke la plej facila maniero estas uzi pretajn solvojn por ĉi tio, nome stirilaj leteroj.
Instalu la deponejon kaj ĝisdatigu ĝin:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Kreu keycloak.yml dosieron kun la sekva enhavo:
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
Federacia aranĝo
Tuj poste, iru al la retinterfaco
Klaku en la maldekstra angulo Aldonu regnon
ŝlosilo
valoro
Nomo
kubernetoj
Montri Nomo
Kubernetoj
Malebligu uzantan retpoŝtan konfirmon:
Klientokampoj —> Retpoŝto —> Mapistoj —> Retpoŝto kontrolita (Forigi)
Ni starigis federacion por importi uzantojn el ActiveDirectory, mi lasos ekrankopiojn sube, mi pensas, ke ĝi estos pli klara.
Uzantfederacio —> Aldoni provizanton... —> ldap
Federacia aranĝo
Se ĉio estas en ordo, tiam post premado de la butono Sinkronigu ĉiujn uzantojn vi vidos mesaĝon pri la sukcesa importo de uzantoj.
Poste ni devas mapi niajn grupojn
Uzantfederacio --> ldap_localhost --> Mapistoj --> Krei
Kreante mapiston
Klienta agordo
Necesas krei klienton, laŭ Keycloak, ĉi tio estas aplikaĵo, kiu estos rajtigita de li. Mi reliefigos la gravajn punktojn en la ekrankopio ruĝe.
Klientoj —> Krei
Klienta agordo
Ni kreu scoupe por grupoj:
Kliento Amplekso —> Krei
Krei amplekson
Kaj starigu mapigilon por ili:
Kliento Amplekso —> grupoj —> Mapistoj —> Krei
Mapisto
Aldonu la mapadon de niaj grupoj al la Defaŭltaj Klientaj Amplekso:
Klientoj —> kubernetes —> Kliento-Ampleksoj —> Defaŭlta Kliento-Amplekso
Elektu grupoj в Disponeblaj Kliento-Ampleksoj, premu Aldoni elektitan
Ni ricevas la sekreton (kaj skribas ĝin al la fadeno) kiun ni uzos por rajtigo en Keycloak:
Klientoj —> kubernetes —> Akreditaĵoj —> Sekreto
Ĉi tio kompletigas la aranĝon, sed mi havis eraron kiam, post sukcesa rajtigo, mi ricevis eraron 403.
Ripari:
Kliento Amplekso —> roloj —> Mapistoj —> Krei
Mapisto
Skriptokodo
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Agordante Kubernetes
Ni devas specifi kie troviĝas nia radika atestilo de la retejo, kaj kie troviĝas la OIDC-provizanto.
Por fari tion, redaktu la dosieron /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
...
Ĝisdatigu kubeadm-agordon en la areto:
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
...
Agordi aŭth-proxy
Vi povas uzi keycloak gatekeeper por protekti vian retejon. Krom la fakto, ke ĉi tiu inversa prokurilo rajtigos la uzanton antaŭ ol montri la paĝon, ĝi ankaŭ transdonos informojn pri vi en la kaplinioj al la fina aplikaĵo. Tiel, se via aplikaĵo subtenas OpenID, tiam la uzanto tuj estas rajtigita. Konsideru la ekzemplon de Kubernetes Dashboard
Instalante Kubernetes Dashboard
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'
Agordi alirrajtojn:
Ni kreu ClusterRoleBinding, kiu donos al cluster-administran rajtojn (norma ClusterRole cluster-admin) por uzantoj en la DataOPS-grupo.
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
Instalu 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
valoroj_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"
Post tio, kiam vi provas iri al
pasejinstalado
Por komforto, vi povas aldoni pasejon, kiu generos agordan dosieron por kubectl, kun la helpo de kiu ni eniros Kubernetes sub nia uzanto.
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-----
Aspektas tiel. Ebligas vin tuj elŝuti la agordan dosieron kaj generi ĝin per aro da komandoj:
fonto: www.habr.com