Atik sa a te ekri pou elaji sou deja
Nan atik sa a mwen pral di w kouman enstale ak konfigirasyon:
- keycloak se yon pwojè sous louvri. Ki bay yon sèl pwen antre pou aplikasyon yo. Travay ak anpil pwotokòl, tankou LDAP ak OpenID ki enterese nou.
- gadyen keycloak - aplikasyon proxy ranvèse ki pèmèt ou entegre otorizasyon atravè Keycloak.
- pasaj - yon aplikasyon ki jenere yon konfigirasyon pou kubectl ak kote ou ka konekte ak konekte ak API Kubernetes atravè OpenID.
Ki jan otorizasyon travay nan Kubernetes.
Nou ka jere dwa itilizatè / gwoup lè l sèvi avèk RBAC, yon pakèt atik yo te deja kreye sou sa a, mwen pa pral rete sou sa a an detay. Pwoblèm lan se ke ou ka itilize RBAC pou mete restriksyon sou dwa itilizatè yo, men Kubernetes pa konnen anyen sou itilizatè yo. Li sanble ke nou bezwen yon mekanis livrezon itilizatè nan Kubernetes. Pou fè sa, nou pral ajoute yon founisè nan Kuberntes OpenID, ki pral di ke yon itilizatè sa a reyèlman egziste, ak Kubernetes tèt li pral ba li dwa yo.
Fòmasyon
- Ou pral bezwen yon gwoup Kubernetes oswa minikube
- Anyè aktif
- Domèn:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Sètifika pou domèn oswa sètifika oto-siyen
Mwen pa pral rete sou kòman yo kreye yon sètifika oto-siyen, ou bezwen kreye 2 sètifika, sa a se rasin (Otorite Sètifika) ak kliyan wildcard pou domèn *.example.org.
Apre ou resevwa / bay sètifika, kliyan an dwe ajoute nan Kubernetes, pou sa nou kreye yon sekrè pou li:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Apre sa, nou pral sèvi ak li pou kontwolè Ingress nou an.
Enstalasyon Keycloak
Mwen deside ke fason ki pi fasil se sèvi ak solisyon pare pou sa a, sètadi tablo Helm.
Enstale repozitwa a epi mete ajou li:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Kreye yon dosye keycloak.yml ak kontni sa a:
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
Konfigirasyon federasyon an
Apre sa, ale nan koòdone entènèt la
Klike nan kwen gòch la Ajoute domèn
Kle
Valè
Non
gouvènè
Display Non
Kubernetes
Enfim verifikasyon imel itilizatè a:
Dimansyon kliyan —> Imèl —> Mapeur —> Imèl verifye (Efase)
Nou mete federasyon pou enpòte itilizatè soti nan ActiveDirectory, mwen pral kite ekran anba a, mwen panse ke li pral pi klè.
Federasyon itilizatè —> Ajoute founisè… —> ldap
Konfigirasyon federasyon an
Si tout bagay byen, apre w fin peze bouton an Senkronize tout itilizatè yo ou pral wè yon mesaj sou enpòte siksè itilizatè yo.
Apre sa nou bezwen map gwoup nou yo
Federasyon itilizatè --> ldap_localhost --> Mappers --> Kreye
Kreye yon mape
Konfigirasyon kliyan an
Li nesesè yo kreye yon kliyan, an tèm de Keycloak, sa a se yon aplikasyon ki pral otorize nan men l '. Mwen pral mete aksan sou pwen enpòtan yo nan ekran an wouj.
Kliyan —> Kreye
Konfigirasyon kliyan an
Ann kreye scoupe pou gwoup yo:
Dimansyon Kliyan —> Kreye
Kreye dimansyon
Epi mete yon mape pou yo:
Dimansyon Kliyan —> gwoup —> Mapè —> Kreye
Mapper
Ajoute kat gwoup nou yo nan Dimansyon Kliyan Default yo:
Kliyan —> kubernetes —> Dimansyon Kliyan —> Dimansyon Kliyan Default
Chwazi gwoup в Dimansyon Kliyan ki disponibpouse Ajoute chwazi yo
Nou jwenn sekrè a (epi ekri li nan fil la) ke nou pral itilize pou otorizasyon nan Keycloak:
Kliyan —> kubernetes —> kalifikasyon —> sekrè
Sa a konplete konfigirasyon an, men mwen te gen yon erè lè, apre otorizasyon siksè, mwen te resevwa yon erè 403.
Ranje:
Dimansyon Kliyan —> wòl —> Mapeur —> Kreye
Mapè
Kò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();
Konfigirasyon Kubernetes
Nou bezwen presize ki kote sètifika rasin nou an soti nan sit la manti, ak ki kote founisè OIDC a sitiye.
Pou fè sa, edite fichye a /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
...
Mete ajou konfigirasyon kubeadm nan gwoup la:
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
...
Mete otorizasyon-proxy
Ou ka itilize keycloak gatekeeper pou pwoteje aplikasyon w lan. Anplis lefèt ke prokurasyon ranvèse sa a pral otorize itilizatè a anvan li montre paj la, li pral tou pase enfòmasyon sou ou nan aplikasyon an fen nan tèt yo. Kidonk, si aplikasyon w lan sipòte OpenID, lè sa a itilizatè a otorize imedyatman. Konsidere egzanp Kubernetes Dashboard
Enstale 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'
Mete dwa aksè:
Ann kreye yon ClusterRoleBinding ki pral bay dwa administratè gwoup (estanda ClusterRole cluster-admin) pou itilizatè yo nan gwoup DataOPS la.
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
Enstale 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"
Apre sa, lè ou eseye ale nan
enstalasyon pasaj
Pou konvenyans, ou ka ajoute yon pasaj ki pral jenere yon dosye konfigirasyon pou kubectl, avèk èd nan ki nou pral antre nan Kubernetes anba itilizatè nou an.
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-----
Sanble sa a. Pèmèt ou imedyatman telechaje fichye konfigirasyon an epi jenere li lè l sèvi avèk yon seri kòmandman:
Sous: www.habr.com