ما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

این مقاله برای گسترش در مورد قبلا نوشته شده است موجود، اما در مورد ویژگی های باندل با Microsoft ActiveDirectory صحبت می کند و همچنین آن را تکمیل می کند.

در این مقاله نحوه نصب و پیکربندی را به شما خواهم گفت:

  • شنل کلید یک پروژه متن باز است. که یک نقطه ورود واحد را برای برنامه ها فراهم می کند. با بسیاری از پروتکل ها کار می کند، از جمله LDAP و OpenID که ما به آنها علاقه مندیم.
  • شنل کلید دروازه بان - برنامه پروکسی معکوس که به شما امکان می دهد مجوز را از طریق Keycloak یکپارچه کنید.
  • راهرو - برنامه ای که یک پیکربندی برای kubectl ایجاد می کند که با آن می توانید وارد شوید و از طریق OpenID به API Kubernetes متصل شوید.

نحوه کار مجوزها در Kubernetes

ما می توانیم حقوق کاربر / گروه را با استفاده از RBAC مدیریت کنیم، مجموعه ای از مقالات قبلاً در این مورد ایجاد شده است، من در این مورد با جزئیات صحبت نمی کنم. مشکل این است که شما می توانید از RBAC برای محدود کردن حقوق کاربر استفاده کنید، اما Kubernetes چیزی در مورد کاربران نمی داند. به نظر می رسد که ما به یک مکانیسم تحویل کاربر در Kubernetes نیاز داریم. برای این کار یک ارائه دهنده به Kuberntes OpenID اضافه می کنیم که می گوید چنین کاربری واقعا وجود دارد و خود Kubernetes به او حقوق می دهد.

پرورش

  • شما به یک خوشه 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 خود استفاده خواهیم کرد.

نصب Keycloak

من تصمیم گرفتم که ساده ترین راه استفاده از راه حل های آماده برای این کار است، یعنی نمودارهای فرمان.

مخزن را نصب کنید و آن را به روز کنید:

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

در گوشه سمت چپ کلیک کنید قلمرو اضافه کنید

کلید
ارزش

نام
کوبرنتس

نام نمایشی
کوبرنیتس

غیرفعال کردن تأیید ایمیل کاربر:
حوزه مشتری —> ایمیل —> نقشه نگاران —> ایمیل تایید شده (حذف)

ما فدراسیونی را برای وارد کردن کاربران از ActiveDirectory راه اندازی کردیم، من اسکرین شات ها را در زیر می گذارم، فکر می کنم واضح تر شود.

فدراسیون کاربر —> افزودن ارائه دهنده… —> ldap

راه اندازی فدراسیونما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم
ما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

اگر همه چیز خوب است، پس از فشار دادن دکمه همگام سازی همه کاربران پیامی در مورد واردات موفقیت آمیز کاربران مشاهده خواهید کرد.

در مرحله بعد باید گروه های خود را نقشه برداری کنیم

فدراسیون کاربر --> ldap_localhost --> Mappers --> ایجاد

ایجاد نقشه کشما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

راه اندازی مشتری

ایجاد یک مشتری ضروری است، از نظر Keycloak، این برنامه ای است که از او مجاز می شود. من نکات مهم در اسکرین شات را با رنگ قرمز برجسته می کنم.

مشتریان —> ایجاد

راه اندازی مشتریما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

بیایید فضایی برای گروه ها ایجاد کنیم:

Client Scopes —> Create

دامنه ایجاد کنیدما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

و یک نقشه بردار برای آنها تنظیم کنید:

Client Scopes —> groups —> Mappers —> Create

نقشه‌بردارما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

نگاشت گروه های خود را به محدوده پیش فرض مشتری اضافه کنید:

Clients —> kubernetes —> Client Scopes —> Default Client Scopes
انتخاب کنید گروه в محدوده مشتری در دسترسکلیک کنید انتخاب شده را اضافه کنید

ما راز را دریافت می کنیم (و آن را در رشته می نویسیم) که برای مجوز در Keycloak استفاده می کنیم:

مشتریان —> kubernetes —> اعتبارنامه ها —> راز
این راه‌اندازی را کامل می‌کند، اما زمانی که پس از تأیید موفقیت‌آمیز، خطای 403 را دریافت کردم، با خطا مواجه شدم. گزارش اشکال.

ثابت:

Client Scopes —> roles —> Mappers —> Create

نقشه کشما مجوز ActiveDirectory را با استفاده از Keycloak به 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

values_dashboard.yaml

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

تنظیم حقوق دسترسی:

بیایید یک ClusterRoleBinding ایجاد کنیم که حقوق مدیریت کلاستر (ClusterRole استاندارد cluster-admin) را برای کاربران در گروه 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

دروازه کلید کلید را نصب کنید:


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"

پس از آن، هنگامی که شما سعی می کنید به kubernetes-dashboard.example.org، به Keycloak هدایت می شویم و در صورت تأیید موفقیت آمیز به داشبوردی که قبلاً وارد شده اید می رسیم.

نصب باند

برای راحتی، می توانید یک گانگوی اضافه کنید که یک فایل پیکربندی برای 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-----

به نظر می رسد این است. به شما امکان می دهد بلافاصله فایل پیکربندی را دانلود کرده و با استفاده از مجموعه ای از دستورات آن را تولید کنید:

ما مجوز ActiveDirectory را با استفاده از Keycloak به Kubernetes متصل می کنیم

منبع: www.habr.com

اضافه کردن نظر