Ин мақола барои васеъ кардани он навишта шудааст
Дар ин мақола ман ба шумо мегӯям, ки чӣ тавр насб ва танзим кунед:
- клавиатура лоиҳаи кушодаасос мебошад. Ки як нуқтаи вурудро барои барномаҳо таъмин мекунад. Бо бисёр протоколҳо кор мекунад, аз ҷумла LDAP ва OpenID, ки мо ба онҳо таваҷҷӯҳ дорем.
- дарвозабони калид - замимаи прокси баръакс, ки ба шумо имкон медиҳад авторизатсияро тавассути Keycloak ворид кунед.
- гузаргоҳ - барномае, ки конфигуратсияро барои kubectl тавлид мекунад, ки шумо метавонед тавассути OpenID ворид шавед ва ба API Kubernetes пайваст шавед.
Чӣ гуна иҷозатҳо дар Кубернетес кор мекунанд.
Мо метавонем ҳуқуқҳои корбар/гурӯҳро бо истифода аз RBAC идора кунем, дар ин бора як қатор мақолаҳо аллакай офарида шудаанд, ман дар ин бора муфассал таваққуф намекунам. Мушкилот дар он аст, ки шумо метавонед RBAC-ро барои маҳдуд кардани ҳуқуқҳои корбар истифода баред, аммо Kubernetes дар бораи корбарон чизе намедонад. Маълум мешавад, ки ба мо механизми интиқоли корбар дар Kubernetes лозим аст. Барои ин, мо ба Kuberntes OpenID провайдер илова мекунем, ки мегӯяд, ки чунин корбар воқеан вуҷуд дорад ва худи Кубернетес ба ӯ ҳуқуқ медиҳад.
Омодагӣ
- Ба шумо кластери Kubernetes ё minikube лозим аст
- Рӯйхати фаъол
- Доменҳо:
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 бо мундариҷаи зерин эҷод кунед:
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
Таъсиси федератсия
Баъд, ба интерфейси веб гузаред
Дар кунҷи чап клик кунед Майдон илова кунед
калид
арзиши
ном
кубернетҳо
Бозтоби ном
Кубернитель
Тафтиши почтаи электронии корбарро хомӯш кунед:
Доираи муштарӣ —> Почтаи электронӣ —> Харитасозон —> Почтаи электронӣ тасдиқ карда шудааст (Нест кардан)
Мо федератсияро барои ворид кардани корбарон аз 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
Мо бояд муайян кунем, ки сертификати решаи мо дар куҷо ҷойгир аст ва провайдери 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 дар кластер:
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
...
Танзими аут-прокси
Шумо метавонед дарвозабони keycloak -ро барои муҳофизати барномаи веби худ истифода баред. Илова бар он, ки ин прокси баръакс ба корбар пеш аз нишон додани саҳифа иҷозат медиҳад, он инчунин маълумотро дар бораи шумо ба барномаи ниҳоӣ дар сарлавҳаҳо интиқол медиҳад. Ҳамин тариқ, агар барномаи шумо OpenID-ро дастгирӣ кунад, он гоҳ корбар фавран ваколатдор мешавад. Мисоли панели Kubernetes-ро дида мебароем
Насб кардани панели Kubernetes
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'
Муқаррар кардани ҳуқуқҳои дастрасӣ:
Биёед ClusterRoleBinding эҷод кунем, ки барои корбарони гурӯҳи DataOPS ҳуқуқи маъмури кластерро (ClusterRole кластер-администратори стандартӣ) медиҳад.
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
gatekeeper 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"
Баъд аз ин, вақте ки шумо кӯшиш ба рафтан ба
насби гузаргоҳ
Барои роҳат, шумо метавонед як гузаргоҳ илова кунед, ки файли конфигуратсияро барои kubectl тавлид кунад, ки бо ёрии он мо дар зери корбари худ ба Kubernetes ворид мешавем.
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-----
Чунин ба назар мерасад. Ба шумо имкон медиҳад, ки файли танзимотро фавран зеркашӣ кунед ва онро бо истифодаи маҷмӯи фармонҳо тавлид кунед:
Манбаъ: will.com