Bu makale, zaten mevcut olanı genişletmek için yazılmıştır.
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
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 kurulumu
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şturma
İ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 kurulumu
Gruplar için kapsam oluşturalım:
İstemci Kapsamları —> Oluştur
Kapsam oluştur
Ve onlar için bir eşleştirici kurun:
İstemci Kapsamları —> gruplar —> Eşleyiciler —> Oluştur
Haritacı
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.
Düzeltmek:
İstemci Kapsamları —> roller —> Eşleyiciler —> Oluştur
mapper
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
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:
Kaynak: habr.com