Бид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Энэ нийтлэлийг аль хэдийнээ өргөжүүлэх зорилгоор бичсэн болно байгаа, гэхдээ Microsoft ActiveDirectory-тэй багцын онцлогуудын талаар ярихаас гадна үүнийг нөхөж өгдөг.

Энэ нийтлэлд би хэрхэн суулгах, тохируулах талаар танд хэлэх болно:

  • түлхүүрийн нөмрөг нээлттэй эхийн төсөл юм. Энэ нь аппликешнүүдэд нэвтрэх нэг цэгээр хангадаг. Бидний сонирхож буй LDAP, OpenID зэрэг олон протоколуудтай ажилладаг.
  • түлхүүрийн нөмрөг хаалгач - Keycloak-ээр дамжуулан зөвшөөрлийг нэгтгэх боломжийг олгодог урвуу прокси програм.
  • Гарц - kubectl-ийн тохиргоог үүсгэдэг програм бөгөөд та OpenID-ээр дамжуулан Kubernetes API-д нэвтэрч холбогдох боломжтой.

Кубернетес дэх зөвшөөрөл хэрхэн ажилладаг вэ.

Бид RBAC ашиглан хэрэглэгчийн / бүлгийн эрхийг удирдах боломжтой, энэ талаар олон нийтлэл аль хэдийн бий болсон тул би энэ талаар дэлгэрэнгүй ярихгүй. Асуудал нь та RBAC ашиглан хэрэглэгчийн эрхийг хязгаарлаж болох боловч Кубернетес хэрэглэгчдийн талаар юу ч мэдэхгүй. Бид 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

Холбооны тохиргоо

Дараа нь вэб интерфэйс рүү очно уу keycloak.example.org

Зүүн буланд товшино уу Хүрээ нэмнэ үү

түлхүүр
үнэ цэнэ

нэр
кубернетс

Харагдах нэр
Kubernetes

Хэрэглэгчийн имэйл баталгаажуулалтыг идэвхгүй болгох:
Үйлчлүүлэгчийн хамрах хүрээ —> Имэйл —> Газрын зурагчин —> Имэйлийг баталгаажуулсан (Устгах)

Бид ActiveDirectory-аас хэрэглэгчдийг импортлохын тулд холбоо байгуулсан, би доор дэлгэцийн агшинг үлдээх болно, энэ нь илүү ойлгомжтой байх болно гэж бодож байна.

Хэрэглэгчийн холбоо —> Үйлчилгээ үзүүлэгч нэмэх... —> ldap

Холбооны тохиргооБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг
Бид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Хэрэв бүх зүйл зүгээр бол товчлуурыг дарсны дараа Бүх хэрэглэгчдийг синхрончлох та хэрэглэгчдийг амжилттай импортлох тухай мессежийг харах болно.

Дараа нь бид бүлгүүдийнхээ зураглалыг гаргах хэрэгтэй

Хэрэглэгчийн холбоо --> ldap_localhost --> Газрын зурагчид --> Үүсгэх

Газрын зурагчин үүсгэхБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Үйлчлүүлэгчийн тохиргоо

Keycloak-ийн хувьд үйлчлүүлэгч үүсгэх шаардлагатай бөгөөд энэ нь түүнээс зөвшөөрөл авах програм юм. Би дэлгэцийн агшин дээрх чухал цэгүүдийг улаанаар тодруулах болно.

Үйлчлүүлэгч -> Үүсгэх

Үйлчлүүлэгчийн тохиргооБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Бүлэгт зориулсан скоп үүсгэцгээе:

Client Scopes -> Үүсгэх

Хамрах хүрээ үүсгэхБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Мөн тэдэнд зориулж зураглагч тохируулна уу:

Client Scopes -> бүлгүүд -> Mappers -> Үүсгэх

Газрын зурагчинБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Манай бүлгүүдийн зураглалыг үндсэн Client Scope-д нэмнэ үү:

Clients -> kubernetes -> Client Scopes -> Үндсэн Client Scopes
Бид сонгоно уу бүлэг в Боломжтой үйлчлүүлэгчийн хүрээдарна уу Сонгосон нэмэх

Бид Keycloak дээр зөвшөөрөл авахын тулд ашиглах нууцыг олж авдаг (мөн үүнийг хэлхээнд бичнэ үү):

Үйлчлүүлэгч -> kubernetes -> Итгэмжлэх жуух бичиг -> Нууц
Энэ нь тохиргоог дуусгах боловч амжилттай зөвшөөрөл авсны дараа би 403 алдаа хүлээн авахад алдаа гарсан. Алдааны тайлан.

Засах:

Client Scopes —> үүрэг —> Mappers —> Үүсгэх

Газрын зурагБид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Скрипт код

// 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
...

Auth-proxy-г тохируулж байна

Та вэб програмаа хамгаалахын тулд keycloak gatekeeper ашиглаж болно. Энэхүү урвуу прокси нь хуудсыг харуулахын өмнө хэрэглэгчийг зөвшөөрөхөөс гадна таны тухай мэдээллийг толгойн хэсэгт байгаа програмын төгсгөлд дамжуулах болно. Тиймээс, хэрэв таны програм OpenID-г дэмждэг бол хэрэглэгч тэр даруй зөвшөөрөл авна. Kubernetes хяналтын самбарын жишээг авч үзье

Kubernetes хяналтын самбарыг суулгаж байна


helm install stable/kubernetes-dashboard --name dashboard -f values_dashboard.yaml

утгын_хяналтын самбар.yaml

enableInsecureLogin: true
service:
  externalPort: 80
rbac:
  clusterAdminRole: true
  create: true
serviceAccount:
  create: true
  name: 'dashboard-test'

Хандалтын эрхийг тохируулах:

DataOPS бүлгийн хэрэглэгчдэд кластерын админ эрх (стандарт ClusterRole кластер-админ) өгөх ClusterRoleBinding-ийг үүсгэцгээе.


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

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

утгууд_прокси.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"

Үүний дараа та очих гэж оролдох үед kubernetes-dashboard.example.org, бид Keycloak руу дахин чиглүүлэх бөгөөд амжилттай зөвшөөрөл авсан тохиолдолд аль хэдийн нэвтэрсэн хяналтын самбар руу орох болно.

гарц суурилуулах

Тохиромжтой болгохын тулд та kubectl-д зориулсан тохиргооны файл үүсгэх гарц нэмж болох бөгөөд үүний тусламжтайгаар бид Кубернетес рүү хэрэглэгчийнхээ доор орох болно.


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-----

Ийм харагдаж байна. Тохируулгын файлыг нэн даруй татаж аваад хэд хэдэн командыг ашиглан үүсгэх боломжийг танд олгоно.

Бид Keycloak ашиглан ActiveDirectory зөвшөөрлийг Kubernetes-д өгдөг

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх