Aquest article ja s'ha escrit per ampliar-lo
En aquest article us explicaré com instal·lar i configurar:
- mantell de claus és un projecte de codi obert. Que proporciona un únic punt d'entrada per a les sol·licituds. Funciona amb una varietat de protocols, inclosos LDAP i OpenID que ens interessen.
- porter de claus - aplicació de proxy invers que us permet integrar l'autorització mitjançant Keycloak.
- Passerella - una aplicació que genera una configuració per a kubectl amb la qual podeu iniciar sessió i connectar-vos a l'API de Kubernetes mitjançant OpenID.
Com funcionen els permisos a Kubernetes.
Podem gestionar els drets d'usuari/grup mitjançant RBAC, ja s'han creat un munt d'articles sobre això, no m'atendré en això en detall. El problema és que podeu utilitzar RBAC per restringir els drets dels usuaris, però Kubernetes no sap res dels usuaris. Resulta que necessitem un mecanisme de lliurament dels usuaris a Kubernetes. Per fer-ho, afegirem un proveïdor a Kuberntes OpenID, que dirà que aquest usuari realment existeix, i el mateix Kubernetes li donarà els drets.
Entrenament
- Necessitareu un clúster o minikube de Kubernetes
- Active Directory
- Dominis:
keycloak.example.org
kubernetes-dashboard.example.org
passarel·la.exemple.org - Certificat per a dominis o certificat autofirmat
No em detendré en com crear un certificat autofirmat, cal que creeu 2 certificats, aquesta és l'arrel (Autoritat de certificació) i el client comodí per al domini *.example.org
Després de rebre/emetre certificats, el client s'ha d'afegir a Kubernetes, per a això li creem un secret:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
A continuació, l'utilitzarem per al nostre controlador d'entrada.
Instal·lació de Keycloak
Vaig decidir que la manera més senzilla és utilitzar solucions ja fetes per a això, és a dir, gràfics de timó.
Instal·leu el repositori i actualitzeu-lo:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Creeu un fitxer keycloak.yml amb el contingut següent:
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
Configuració de la federació
A continuació, aneu a la interfície web
Feu clic a la cantonada esquerra Afegeix regne
Clau
Valor
Nom
kubernets
Mostra nom
Kubernetes
Desactiva la verificació del correu electrònic de l'usuari:
Àmbits del client —> Correu electrònic —> Mappers —> Correu electrònic verificat (Suprimeix)
Hem configurat la federació per importar usuaris d'ActiveDirectory, deixaré captures de pantalla a continuació, crec que serà més clar.
Federació d'usuaris —> Afegeix un proveïdor... —> ldap
Configuració de la federació
Si tot va bé, després de prémer el botó Sincronitza tots els usuaris veureu un missatge sobre la importació correcta dels usuaris.
A continuació, hem de fer un mapa dels nostres grups
Federació d'usuaris --> ldap_localhost --> Mappers --> Crear
Creació d'un mapeador
Configuració del client
Cal crear un client, pel que fa a Keycloak, aquesta és una aplicació que estarà autoritzada des d'ell. Destacaré els punts importants de la captura de pantalla en vermell.
Clients —> Crear
Configuració del client
Creem un scoupe per a grups:
Àmbits del client —> Crear
Crea abast
I configureu-los un mapeador:
Àmbits del client —> grups —> Mappers —> Crear
Cartografiador
Afegiu el mapeig dels nostres grups als àmbits de client predeterminats:
Clients —> kubernetes —> Àmbits de client —> Àmbits de client predeterminats
seleccionar grups в Àmbits de client disponibles, premeu Afegeix seleccionats
Obtenim el secret (i l'escriurem al fil) que utilitzarem per a l'autorització a Keycloak:
Clients —> kubernetes —> Credencials —> Secret
Això completa la configuració, però vaig tenir un error quan, després de l'autorització correcta, vaig rebre un error 403.
Correcció:
Àmbits del client —> rols —> Mappers —> Crear
mapper
Codi d'script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Configuració de Kubernetes
Hem d'especificar on es troba el nostre certificat arrel del lloc i on es troba el proveïdor OIDC.
Per fer-ho, editeu el fitxer /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
...
Actualitzeu la configuració de kubeadm al clúster:
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
...
configuració d'auth-proxy
Podeu utilitzar Keycloak gatekeeper per protegir la vostra aplicació web. A més del fet que aquest proxy invers autoritzarà l'usuari abans de mostrar la pàgina, també passarà informació sobre tu a les capçaleres a l'aplicació final. Així, si la vostra aplicació és compatible amb OpenID, l'usuari està immediatament autoritzat. Considereu l'exemple de Kubernetes Dashboard
Instal·lació de 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'
Configuració de permisos:
Creem un ClusterRoleBinding que donarà drets d'administrador del clúster (clúster-administrador estàndard de ClusterRole) per als usuaris del grup 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
Instal·leu 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"
Després d'això, quan intenteu anar-hi
instal·lació de passarel·la
Per comoditat, podeu afegir una passarel·la que generarà un fitxer de configuració per a kubectl, amb l'ajuda del qual entrarem a Kubernetes sota el nostre usuari.
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-----
Sembla això. Us permet descarregar immediatament el fitxer de configuració i generar-lo mitjançant un conjunt d'ordres:
Font: www.habr.com