Krótki samouczek na temat wykorzystania Keycloak do połączenia Kubernetes z serwerem LDAP i skonfigurowania importu użytkowników i grup. Umożliwi to skonfigurowanie kontroli RBAC dla użytkowników i użycie uwierzytelniania proxy do ochrony Kubernetes Dashboard i innych aplikacji, które nie mogą się samodzielnie uwierzytelnić.
Instalacja klucza
Załóżmy, że masz już serwer LDAP. Może to być Active Directory, FreeIPA, OpenLDAP lub cokolwiek innego. Jeśli nie masz serwera LDAP, to w zasadzie możesz tworzyć użytkowników bezpośrednio w interfejsie Keycloak lub korzystać z publicznych dostawców oidc (Google, Github, Gitlab), wynik będzie prawie taki sam.
Na początek zainstalujmy sam Keycloak, instalację można przeprowadzić osobno lub bezpośrednio do klastra Kubernetes, z reguły jeśli mamy kilka klastrów Kubernetes, łatwiej byłoby zainstalować go osobno. Z drugiej strony zawsze możesz skorzystać
Aby przechowywać dane Keycloak, będziesz potrzebować bazy danych. Wartość domyślna to h2
(wszystkie dane są przechowywane lokalnie), ale można je również wykorzystać postgres
, mysql
lub mariadb
.
Jeśli nadal zdecydujesz się zainstalować Keycloak osobno, bardziej szczegółowe instrukcje znajdziesz w
Konfiguracja federacji
Przede wszystkim stwórzmy nową krainę. Dziedzina to przestrzeń naszej aplikacji. Każda aplikacja może mieć własną dziedzinę z różnymi użytkownikami i ustawieniami autoryzacji. Królestwo Master jest używane przez samego Keycloaka i niewłaściwe jest używanie go do czegokolwiek innego.
Kliknij Dodaj dziedzinę
Option
wartość
Imię
kubernetes
Wyświetlana nazwa
Kubernetes
Nazwa wyświetlana HTML
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes domyślnie sprawdza, czy adres e-mail użytkownika został potwierdzony, czy nie. Ponieważ korzystamy z własnego serwera LDAP, to sprawdzenie prawie zawsze będzie zwracane false
. Wyłączmy reprezentację tego ustawienia w Kubernetes:
Zakresy klienta -> E-mail -> Twórcy map -> e-mail zweryfikowany (Kasować)
Teraz załóżmy federację, w tym celu przechodzimy do:
Federacja użytkowników -> Dodaj dostawcę… -> ldap
Oto przykładowa konfiguracja dla FreeIPA:
Option
wartość
Nazwa wyświetlana konsoli
freeipa.example.org
Sprzedawca
Red Hat Directory Server
Atrybut UUID LDAP
ipauniqueid
Adres URL połączenia
ldaps://freeipa.example.org
Nazwa wyróżniająca użytkownika
cn=users,cn=accounts,dc=example,dc=org
Wiązanie DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Powiąż poświadczenie
<password>
Zezwalaj na uwierzytelnianie Kerberos:
on
Królestwo Kerberos:
EXAMPLE.ORG
Główny serwer:
HTTP/[email protected]
zakładka kluczowa:
/etc/krb5.keytab
Użytkownicy keycloak-svc
należy wcześniej utworzyć na naszym serwerze LDAP.
W przypadku Active Directory wystarczy wybrać Dostawca: Active Directory a niezbędne ustawienia zostaną automatycznie wstawione do formularza.
Kliknij Zapisz
Teraz przejdźmy dalej:
Federacja użytkowników -> freeipa.example.org -> Twórcy map -> Imię
Option
wartość
Atrybuty Ldapa
givenName
Teraz włącz mapowanie grupowe:
Federacja użytkowników -> freeipa.example.org -> Twórcy map -> Stwórz
Option
wartość
Imię
groups
Typ mapera
group-ldap-mapper
Grupy LDAP DN
cn=groups,cn=accounts,dc=example,dc=org
Strategia odzyskiwania grupy użytkowników
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
To kończy konfigurację federacji, przejdźmy do konfiguracji klienta.
Konfiguracja klienta
Stwórzmy nowego klienta (aplikację, która będzie przyjmować użytkowników z Keycloak). Chodźmy:
Klienci -> Stwórz
Option
wartość
identyfikator klienta
kubernetes
Typ dostępu
confidenrial
Główny adres URL
http://kubernetes.example.org/
Prawidłowe identyfikatory URI przekierowania
http://kubernetes.example.org/*
Adres URL administratora
http://kubernetes.example.org/
Stworzymy również zakres dla grup:
Zakresy klienta -> Stwórz
Option
wartość
szablon
No template
Imię
groups
Pełna ścieżka grupowa
false
I skonfiguruj dla nich narzędzie do mapowania:
Zakresy klienta -> grupy -> Twórcy map -> Stwórz
Option
wartość
Imię
groups
Typ mapera
Group membership
Nazwa żądania tokenu
groups
Teraz musimy włączyć mapowanie grupowe w zakresie naszego klienta:
Klienci -> Kubernetes -> Zakresy klienta -> Domyślne zakresy klienta
wybierać grupy в Dostępne zakresy klienta, naciskać Dodaj zaznaczone
Teraz skonfigurujmy uwierzytelnianie naszej aplikacji, przejdźmy do:
Klienci -> Kubernetes
Option
wartość
Autoryzacja włączona
ON
Pchnijmy zapisać i to kończy konfigurację klienta, teraz na karcie
Klienci -> Kubernetes -> Listy uwierzytelniające
możesz dostać Tajemnica z którego skorzystamy później.
Konfigurowanie Kubernetesa
Konfiguracja Kubernetesa do autoryzacji OIDC jest dość banalna i niezbyt skomplikowana. Wszystko, co musisz zrobić, to umieścić certyfikat CA swojego serwera OIDC /etc/kubernetes/pki/oidc-ca.pem
i dodaj niezbędne opcje dla kube-apiserver.
Aby to zrobić, zaktualizuj /etc/kubernetes/manifests/kube-apiserver.yaml
na wszystkich twoich panach:
...
spec:
containers:
- command:
- kube-apiserver
...
- --oidc-ca-file=/etc/kubernetes/pki/oidc-ca.pem
- --oidc-client-id=kubernetes
- --oidc-groups-claim=groups
- --oidc-issuer-url=https://keycloak.example.org/auth/realms/kubernetes
- --oidc-username-claim=email
...
Zaktualizuj także konfigurację kubeadm w klastrze, aby nie stracić tych ustawień podczas aktualizacji:
kubectl edit -n kube-system configmaps kubeadm-config
...
data:
ClusterConfiguration: |
apiServer:
extraArgs:
oidc-ca-file: /etc/kubernetes/pki/oidc-ca.pem
oidc-client-id: kubernetes
oidc-groups-claim: groups
oidc-issuer-url: https://keycloak.example.org/auth/realms/kubernetes
oidc-username-claim: email
...
To kończy konfigurację Kubernetes. Możesz powtórzyć te kroki we wszystkich klastrach Kubernetes.
Wstępna autoryzacja
Po wykonaniu tych kroków będziesz mieć już skonfigurowany klaster Kubernetes ze skonfigurowaną autoryzacją OIDC. Problem w tym, że Twoi użytkownicy nie mają jeszcze skonfigurowanego klienta ani własnego kubeconfig. Aby rozwiązać ten problem, musisz skonfigurować automatyczne wydawanie kubeconfig użytkownikom po pomyślnej autoryzacji.
Można w tym celu skorzystać ze specjalnych aplikacji webowych, które pozwalają na uwierzytelnienie użytkownika, a następnie pobranie gotowego kubeconfig. Jednym z najwygodniejszych jest
Aby skonfigurować Kuberos, wystarczy opisać szablon kubeconfig i uruchomić go z następującymi parametrami:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
Więcej szczegółów znajdziesz
Można również skorzystać
Wynikowy kubeconfig można sprawdzić na stronie users[].user.auth-provider.config.id-token
z kubeconfig do formularza na stronie i od razu uzyskaj transkrypcję.
Konfiguracja RBAC
Konfigurując RBAC, możesz odwołać się zarówno do nazwy użytkownika (pole name
w tokenie jwt) i dla grupy użytkowników (pole groups
w tokenie jwt). Oto przykład ustawienia uprawnień dla grupy kubernetes-default-namespace-admins
:
kubernetes-default-namespace-admins.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: default-admins
namespace: default
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: kubernetes-default-namespace-admins
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: default-admins
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: kubernetes-default-namespace-admins
Więcej przykładów RBAC można znaleźć w
Ustawianie uwierzytelniającego proxy
Jest wspaniały projekt
dashboard-proxy.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kubernetes-dashboard-proxy
spec:
replicas: 1
template:
metadata:
labels:
app: kubernetes-dashboard-proxy
spec:
containers:
- args:
- --listen=0.0.0.0:80
- --discovery-url=https://keycloak.example.org/auth/realms/kubernetes
- --client-id=kubernetes
- --client-secret=<your-client-secret-here>
- --redirection-url=https://kubernetes-dashboard.example.org
- --enable-refresh-tokens=true
- --encryption-key=ooTh6Chei1eefooyovai5ohwienuquoh
- --upstream-url=https://kubernetes-dashboard.kube-system
- --resources=uri=/*
image: keycloak/keycloak-gatekeeper
name: kubernetes-dashboard-proxy
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
readinessProbe:
httpGet:
path: /oauth/health
port: 80
initialDelaySeconds: 3
timeoutSeconds: 2
---
apiVersion: v1
kind: Service
metadata:
name: kubernetes-dashboard-proxy
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: kubernetes-dashboard-proxy
type: ClusterIP
Źródło: www.habr.com