ہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

یہ مضمون پہلے ہی پر وسعت کے لیے لکھا گیا ہے۔ موجودہ، لیکن Microsoft ActiveDirectory کے ساتھ بنڈل کی خصوصیات کے بارے میں بات کرتا ہے، اور اس کی تکمیل بھی کرتا ہے۔

اس آرٹیکل میں میں آپ کو بتاؤں گا کہ انسٹال اور کنفیگر کیسے کریں:

  • چابی کی چادر ایک اوپن سورس پروجیکٹ ہے۔ جو درخواستوں کے لیے داخلے کا ایک پوائنٹ فراہم کرتا ہے۔ بہت سے پروٹوکولز کے ساتھ کام کرتا ہے، بشمول LDAP اور OpenID جس میں ہماری دلچسپی ہے۔
  • چابی کی چادر والا دربان - ریورس پراکسی ایپلی کیشن جو آپ کو کیکلوک کے ذریعے اجازت کو مربوط کرنے کی اجازت دیتی ہے۔
  • گنگو - ایک ایپلی کیشن جو kubectl کے لیے ایک کنفیگریشن تیار کرتی ہے جس کے ساتھ آپ اوپن آئی ڈی کے ذریعے لاگ ان اور کوبرنیٹس API سے جڑ سکتے ہیں۔

کبرنیٹس میں اجازتیں کیسے کام کرتی ہیں۔

ہم RBAC کا استعمال کرتے ہوئے صارف/گروپ کے حقوق کا انتظام کر سکتے ہیں، اس بارے میں پہلے ہی مضامین کا ایک گروپ بنایا جا چکا ہے، میں اس پر تفصیل سے بات نہیں کروں گا۔ مسئلہ یہ ہے کہ آپ صارف کے حقوق کو محدود کرنے کے لیے RBAC کا استعمال کر سکتے ہیں، لیکن Kubernetes صارفین کے بارے میں کچھ نہیں جانتا۔ یہ پتہ چلتا ہے کہ ہمیں Kubernetes میں صارف کی ترسیل کے طریقہ کار کی ضرورت ہے۔ ایسا کرنے کے لیے، ہم Kuberntes OpenID میں ایک فراہم کنندہ شامل کریں گے، جو کہے گا کہ ایسا صارف واقعی موجود ہے، اور Kubernetes خود اسے حقوق دے گا۔

ٹریننگ

  • آپ کو کبرنیٹس کلسٹر یا منی کیوب کی ضرورت ہوگی۔
  • ایکٹو ڈائریکٹری
  • ڈومینز:
    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 کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔
ہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

اگر سب ٹھیک ہے تو بٹن دبانے کے بعد تمام صارفین کو سنکرونائز کریں۔ آپ کو صارفین کی کامیاب درآمد کے بارے میں ایک پیغام نظر آئے گا۔

اگلا ہمیں اپنے گروپس کا نقشہ بنانے کی ضرورت ہے۔

یوزر فیڈریشن --> ldap_localhost --> میپرز --> تخلیق کریں۔

میپر بناناہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

کلائنٹ سیٹ اپ

ایک کلائنٹ بنانا ضروری ہے، Keycloak کے لحاظ سے، یہ ایک ایسی درخواست ہے جو اس کی طرف سے اختیار کی جائے گی۔ میں سرخ رنگ میں اسکرین شاٹ میں اہم نکات کو اجاگر کروں گا۔

کلائنٹ -> تخلیق کریں۔

کلائنٹ سیٹ اپہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

آئیے گروپس کے لیے سکوپ بناتے ہیں:

کلائنٹ کے دائرہ کار -> تخلیق کریں۔

دائرہ کار بنائیںہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

اور ان کے لیے میپر مرتب کریں:

کلائنٹ کے دائرہ کار —> گروپس —> میپرز —> تخلیق کریں۔

میپرہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

ہمارے گروپس کی میپنگ کو ڈیفالٹ کلائنٹ اسکوپس میں شامل کریں:

کلائنٹس —> kubernetes —> کلائنٹ اسکوپس —> ڈیفالٹ کلائنٹ اسکوپس
منتخب کریں گروہوں в دستیاب کلائنٹ کے دائرہ کار، دبائیں منتخب شامل کریں۔

ہمیں راز ملتا ہے (اور اسے تھریڈ پر لکھتے ہیں) جسے ہم Keycloak میں اجازت کے لیے استعمال کریں گے:

کلائنٹس —> kubernetes —> اسناد —> خفیہ
یہ سیٹ اپ کو مکمل کرتا ہے، لیکن مجھے ایک خامی تھی جب، کامیاب اجازت کے بعد، مجھے ایک غلطی 403 موصول ہوئی۔ غلطیوں کی تفصیل.

درست کریں:

کلائنٹ کے دائرہ کار —> کردار —> میپرز —> تخلیق کریں۔

میپرہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

اسکرپٹ کوڈ

// 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 config کو اپ ڈیٹ کریں:

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 سیٹ کرنا

آپ اپنی ویب ایپلیکیشن کی حفاظت کے لیے کی کلوک گیٹ کیپر استعمال کر سکتے ہیں۔ اس حقیقت کے علاوہ کہ یہ ریورس پراکسی صفحہ دکھانے سے پہلے صارف کو اجازت دے گی، یہ آپ کے بارے میں معلومات کو ہیڈرز میں آخری ایپلیکیشن تک بھی دے گی۔ اس طرح، اگر آپ کی ایپلیکیشن 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 cluster-admin) دے گا۔


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 کے لیے ایک config فائل تیار کرے گا، جس کی مدد سے ہم اپنے صارف کے تحت 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-----

ایسا لگتا ہے۔ آپ کو کنفگ فائل کو فوری طور پر ڈاؤن لوڈ کرنے اور کمانڈز کے سیٹ کا استعمال کرتے ہوئے اسے بنانے کی اجازت دیتا ہے:

ہم Keycloak کا استعمال کرتے ہوئے Kubernetes کو ActiveDirectory کی اجازت کو باندھتے ہیں۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں