ActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Bu makale, zaten mevcut olanı genişletmek için yazılmıştır. mevcut, ancak paketin özelliklerinden Microsoft ActiveDirectory ile bahseder ve onu tamamlar.

Bu yazıda size nasıl kurulacağını ve yapılandırılacağını anlatacağım:

  • tuş pelerini açık kaynaklı bir projedir. Bu, uygulamalar için tek bir giriş noktası sağlar. İlgilendiğimiz LDAP ve OpenID dahil olmak üzere çeşitli protokollerle çalışır.
  • bekçi bekçisi - Keycloak aracılığıyla yetkilendirmeyi entegre etmenize izin veren ters proxy uygulaması.
  • iskele - kubectl için oturum açabileceğiniz ve OpenID aracılığıyla Kubernetes API'sine bağlanabileceğiniz bir yapılandırma oluşturan bir uygulama.

Kubernet'lerde izinler nasıl çalışır?

RBAC kullanarak kullanıcı / grup haklarını yönetebiliriz, bu konuda zaten bir sürü makale oluşturuldu, bunun üzerinde ayrıntılı olarak durmayacağım. Sorun şu ki, kullanıcı haklarını kısıtlamak için RBAC'ı kullanabilirsiniz, ancak Kubernetes kullanıcılar hakkında hiçbir şey bilmiyor. Kubernetes'te bir kullanıcı dağıtım mekanizmasına ihtiyacımız olduğu ortaya çıktı. Bunu yapmak için Kuberntes OpenID'ye, böyle bir kullanıcının gerçekten var olduğunu söyleyecek bir sağlayıcı ekleyeceğiz ve Kubernetes'in kendisi ona hakları verecek.

Eğitim

  • Bir Kubernetes kümesine veya minikube'ye ihtiyacınız olacak
  • Active Directory
  • Etki alanları:
    anahtarlık.example.org
    kubernetes-dashboard.example.org
    iskele.example.org
  • Etki alanları veya kendinden imzalı sertifika için sertifika

Kendinden imzalı bir sertifikanın nasıl oluşturulacağı üzerinde durmayacağım, 2 sertifika oluşturmanız gerekiyor, bu *.example.org alanı için kök (Sertifika Yetkilisi) ve joker istemcidir

Sertifikaları aldıktan / verdikten sonra, istemcinin Kubernetes'e eklenmesi gerekir, bunun için bir sır oluştururuz:

kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem

Ardından, Giriş denetleyicimiz için kullanacağız.

Keycloak Kurulumu

Bunun için en kolay yolun hazır çözümler yani dümen çizelgeleri kullanmak olduğuna karar verdim.

Depoyu kurun ve güncelleyin:

helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update

Aşağıdaki içeriğe sahip bir keycloak.yml dosyası oluşturun:

anahtarlık.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

Federasyon kurulumu

Ardından, web arayüzüne gidin anahtarlık.example.org

Sol köşedeki tıklayın bölge ekle

anahtar
Özellik

Name
Kubernetes

<span style="color:white">Görünen İsim</span>
Kubernetes

Kullanıcı e-posta doğrulamasını devre dışı bırak:
İstemci kapsamları —> E-posta —> Eşleyiciler —> E-posta doğrulandı (Sil)

ActiveDirectory'den kullanıcı almak için federasyon kurduk, aşağıya ekran görüntülerini bırakacağım, daha anlaşılır olur diye düşünüyorum.

Kullanıcı federasyonu —> Sağlayıcı ekle… —> ldap

Federasyon kurulumuActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz
ActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Her şey yolundaysa, düğmeye bastıktan sonra Tüm kullanıcıları senkronize et kullanıcıların başarılı bir şekilde içe aktarılmasıyla ilgili bir mesaj göreceksiniz.

Sonra gruplarımızı haritalandırmamız gerekiyor

Kullanıcı federasyonu --> ldap_localhost --> Eşleyiciler --> Oluştur

Eşleyici oluşturmaActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

İstemci kurulumu

Keycloak açısından client oluşturmak gerekiyor, bu ondan yetki alınacak bir uygulama. Ekran görüntüsündeki önemli noktaları kırmızıyla vurgulayacağım.

İstemciler —> Oluştur

İstemci kurulumuActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Gruplar için kapsam oluşturalım:

İstemci Kapsamları —> Oluştur

Kapsam oluşturActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Ve onlar için bir eşleştirici kurun:

İstemci Kapsamları —> gruplar —> Eşleyiciler —> Oluştur

HaritacıActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Gruplarımızın eşlemesini Varsayılan İstemci Kapsamlarına ekleyin:

İstemciler —> kubernet'ler —> İstemci Kapsamları —> Varsayılan İstemci Kapsamları
Seçme gruplar в Kullanılabilir İstemci Kapsamlarıbasın Seçileni ekle

Keycloak'ta yetkilendirme için kullanacağımız sırrı alıyoruz (ve konuya yazıyoruz):

İstemciler —> kubernetler —> Kimlik Bilgileri —> Gizli
Bu, kurulumu tamamlar, ancak başarılı yetkilendirmeden sonra 403 hatası aldığımda bir hatayla karşılaştım. Hata raporu.

Düzeltmek:

İstemci Kapsamları —> roller —> Eşleyiciler —> Oluştur

mapperActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Komut dosyası kodu

// add current client-id to token audience
token.addAudience(token.getIssuedFor());

// return token issuer as dummy result assigned to iss again
token.getIssuer();

Kubernet'leri Yapılandırma

Siteden kök sertifikamızın nerede olduğunu ve OIDC sağlayıcısının nerede olduğunu belirtmemiz gerekiyor.
Bunu yapmak için /etc/kubernetes/manifests/kube-apiserver.yaml dosyasını düzenleyin

kube-apserver.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
...

Kümede kubeadm yapılandırmasını güncelleyin:

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

au-proxy ayarı

Web uygulamanızı korumak için keycloak gatekeeper kullanabilirsiniz. Bu ters proxy, kullanıcıya sayfayı göstermeden önce yetki vermesinin yanı sıra, başlıklardaki son uygulamaya sizinle ilgili bilgileri de iletecektir. Böylece uygulamanız OpenID'yi destekliyorsa kullanıcı hemen yetkilendirilir. Kubernetes Dashboard örneğini düşünün

Kubernetes Dashboard'u Kurma


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

değerler_dashboard.yaml

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

Erişim haklarını ayarlama:

DataOPS grubundaki kullanıcılar için küme yönetici hakları (standart ClusterRole küme yöneticisi) verecek bir ClusterRoleBinding oluşturalım.


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 ağ geçidi bekçisini kurun:


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

değerler_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"

Bundan sonra, gitmeye çalıştığınızda kubernetes-dashboard.example.org, Keycloak'a yönlendirileceğiz ve başarılı bir yetkilendirme durumunda, halihazırda oturum açmış olan Gösterge Tablosuna ulaşacağız.

iskele kurulumu

Kolaylık sağlamak için, kubectl için bir yapılandırma dosyası oluşturacak bir geçit ekleyebilirsiniz, bunun yardımıyla kullanıcımız altında Kubernetes'e gireceğiz.


helm install --name gangway stable/gangway -f values_gangway.yaml

değerler_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-----

Buna benzer. Yapılandırma dosyasını hemen indirmenize ve bir dizi komut kullanarak oluşturmanıza olanak tanır:

ActiveDirectory yetkilendirmesini Keycloak kullanarak Kubernetes'e sabitliyoruz

Kaynak: habr.com

Yorum ekle