Ev gotar bi armanca berfirehkirina berê hatiye nivîsandin
Di vê gotarê de ez ê ji we re vebêjim ka meriv çawa saz dike û mîheng dike:
- keycloak projeyek çavkaniyek vekirî ye. Ku ji bo serîlêdanan xalek têketinê ya yekane peyda dike. Bi gelek protokolan re dixebite, di nav de LDAP û OpenID, ku ji me re eleqedar in.
- Keycloak dergevan - serîlêdanek proxy berevajî ku dihêle hûn bi rêya Keycloak destûrnameyê yek bikin.
- Gangway - serîlêdanek ku ji bo kubectl vesaziyek çêdike ku hûn pê re dikarin bi OpenID ve têkevinê û bi Kubernetes API-yê ve girêdin.
Çawa destûr di Kubernetes de dixebitin.
Em dikarin mafên bikarhêner / komê bi karanîna RBAC-ê bi rêve bibin, jixwe komek gotar li ser vê yekê hatine afirandin, ez ê bi hûrgulî li ser vê yekê nesekinim. Pirsgirêk ev e ku hûn dikarin RBAC bikar bînin da ku mafên bikarhêner sînordar bikin, lê Kubernetes di derbarê bikarhêneran de tiştek nizane. Derket holê ku em hewceyê mekanîzmayek radestkirina bikarhêner li Kubernetes in. Ji bo vê yekê, em ê pêşkêşkerek li Kuberntes OpenID zêde bikin, ku dê destnîşan bike ku bikarhênerek wusa bi rastî heye, û Kubernetes bixwe dê mafan bide wî.
Amadekirin
- Hûn ê hewceyê komek Kubernetes an minikube bin
- Dîra Active Active
- Domain:
keycloak.example.org
kubernetes-dashboard.example.org
gangway.example.org - Sertîfîka ji bo domanan an sertîfîkaya xwe-îmzakirî
Ez ê bi hûrgulî neçim ka meriv çawa sertîfîkayek xwe-îmzakirî biafirîne; hûn hewce ne ku 2 sertîfîkayan biafirînin, ev kok (Desthilatdariya Sertîfîkayê) û qertafa xerîdar e ji bo domaina *.example.org
Piştî ku hûn sertîfîkayan werdigirin/nivîsin, hûn hewce ne ku sertîfîkaya xerîdar li Kubernetes zêde bikin; ji bo vê yekê, ji bo wê nepeniyek biafirînin:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
Dûv re em ê wê ji bo kontrolkera xweya Ingress bikar bînin
Sazkirina Keycloak
Min biryar da ku riya herî hêsan ev bû ku ji bo vê yekê çareseriyên amade bikar bînin, ango nexşeyên helm.
Depoyê saz bikin û wê nûve bikin:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Bi naveroka jêrîn pelek keycloak.yml biafirînin:
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
Sazkirina Federasyonê
Piştre, biçin navrûya webê
Li quncika çepê bikirtînin Herêmê zêde bikin
Qûfle
Giranî
Nav
Kubernetes
Navekî Display
Kubernetes
Kontrolkirina pejirandina e-nameya bikarhêner neçalak bike:
Qadên xerîdar —> E-name —> Nexşeyan —> E-name piştrastkirî (Jêbibe)
Em federasyonek saz dikin da ku bikarhêneran ji ActiveDirectory derxînin, ez ê dîmenên li jêr bihêlim, ez difikirim ku ew ê zelaltir be.
Federasyona Bikarhêner —> Pêşkêşker lê zêde bike… —> ldap
Sazkirina Federasyonê
Ger her tişt baş e, wê hingê piştî pêlkirina bişkojkê Hemî bikarhêneran senkronîze bikin Hûn ê peyamek bibînin ku têketina serketî ya bikarhêneran destnîşan dike.
Piştre divê em komên xwe nexşeyê bikin
Federasyona bikarhêner -> ldap_localhost -> Mappers -> Afirandin
Çêkirina nexşerê
Sazkirina xerîdar
Pêdivî ye ku hûn xerîdarek biafirînin, di warê Keycloak de ev serîlêdanek e ku dê ji hêla wê ve were destûr kirin. Ez ê di dîmenê de xalên girîng bi rengê sor ronî bikim.
Xerîdar -> Create
Sazkirina xerîdar
Werin em ji bo koman kopiyek biafirînin:
Qadên Xerîdar -> Afirandin
Çêkirina çarçoveyek
Û ji wan re nexşeyek saz bikin:
Qadên Xerîdar -> Kom -> Nexşesaz -> Afirandin
Mapper
Em nexşeya komên xwe li Qadeyên Xerîdar ên Pêşbirk zêde dikin:
Xerîdar -> kubernetes -> Qada xerîdar -> Qada xerîdar a xwerû
Em hilbijêre komên в Qadên Xerîdar ên Berdest, çap bikin Hilbijartî zêde bike
Em razê digirin (û wê li cîhek binivîsin) ku em ê ji bo destûrnameyê li Keycloak bikar bînin:
Xerîdar -> kubernetes -> pêbawer -> veşartî
Ev sazkirinê temam dike, lê gava ku, piştî destûrnameya serketî, min xeletiyek 403 wergirt, xeletiyek min derket.
Pêvekirin:
Qadên Xerîdar -> Role -> Mappers -> Afirandin
Mappers
Koda skrîptê
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Veavakirina Kubernetes
Pêdivî ye ku em destnîşan bikin ka sertîfîkaya meya root ji malperê li ku ye, û peydakerê OIDC li ku ye.
Ji bo vê yekê, pelê biguherînin /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
...
Veavakirina kubeadm di komê de nûve bikin:
kubeadm veavakirina
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
...
Sazkirina auth-proxy
Ji bo parastina serîlêdana weba xwe, hûn dikarin keycloak gatekeeper bikar bînin. Digel vê yekê ku ev proxy berevajî dê destûr bide bikarhêner berî ku rûpelê nîşan bide, ew ê di sernavan de agahdariya we jî ji serîlêdana paşîn re bişîne. Ji ber vê yekê, heke serîlêdana we OpenID piştgirî dike, bikarhêner tavilê destûr tê dayîn. Ka em li mînaka Kubernetes Dashboard binêrin
Sazkirina 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'
Sazkirina mafên gihîştinê:
Werin em ClusterRoleBindingek biafirînin ku dê mafên rêvebirê komê (standard ClusterRole-rêvebir) bide bikarhênerên di koma DataOPS de.
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
Sazkirina dergehê keycloak:
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"
Piştî vê yekê, gava ku hûn hewl didin ku têkevinê
Sazkirina Gangway
Ji bo rehetiyê, hûn dikarin gangwayek lê zêde bikin ku dê pelek mîhengê ji bo kubectl çêbike, bi alîkariya wê em ê têkevin Kubernetes di bin bikarhênerê xwe de.
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-----
Tiştekî wiha xuya dike. Destûrê dide we ku hûn tavilê pelek mîhengê dakêşin û wê bi karanîna komek fermanan çêbikin:
Source: www.habr.com