
Невелика инструкция за това как с помощта на Keycloak можете да свържете Kubernetes с вашия LDAP-сървър и да настроите импорта на потребители и групи. Това ще ви позволи да конфигурирате RBAC за вашите потребители и да използвате auth-proxy за защита на Kubernetes Dashboard и други приложения, които не могат да извършват авторизация сами.
Инсталиране на Keycloak
Предполагаме, че вече разполагате с LDAP-сървър. Това може да бъде Active Directory, FreeIPA, OpenLDAP или нещо друго. Ако нямате LDAP-сървър, можете в действителност да създавате потребители директно в интерфейса на Keycloak или да използвате публични oidc-провайдери (Google, Github, Gitlab), резултатът ще бъде почти същият.
Първо, ще инсталираме самия Keycloak; инсталацията може да се извърши отделно или директно в Kubernetes клъстера. Обикновено, ако разполагате с няколко Kubernetes клъстера, би било по-лесно да го инсталирате отделно. От друга страна, винаги можете да използвате и да го инсталирате направо в вашия клъстер.
За съхранение на данните на Keycloak ще ви е необходима база данни. По подразбиране се използва h2 (всички данни се съхраняват локално), но е възможно също да се използва postgres, mysql или mariadb.
Ако все пак сте решили да инсталирате Keycloak отделно, по-подробни инструкции можете да намерите в .
Настройка на федерацията
Първо, ще създадем нов realm. Realm е пространството на нашето приложение. Всяко приложение може да има свой realm с различни потребители и настройки за авторизация. Master realm се използва от самия Keycloak и не е правилно да го използвате за нещо друго.
Натиснете Добавяне на област
Option
Стойност
Name
kubernetes
Показваме име
Kubernetes
HTML Display Name
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes по подразбиране проверява дали e-mail адресът на потребителя е потвърден. Понеже използваме собствен LDAP-сървър, тази проверка почти винаги ще връща неверно. Нека деактивираме показването на този параметър в Kubernetes:
Client scopes —> Email —> Mappers —> Email verified (Изтрий)
Сега ще настроим федерацията, за това ще отидем на:
User federation —> Добави провайдер… —> ldap
Пример за настройка за FreeIPA:
Option
Стойност
Console Display Name
freeipa.example.org
Продавач
Red Hat Directory Server
UUID LDAP attribute
ipauniqueid
Connection URL
ldaps://freeipa.example.org
Users DN
cn=users,cn=accounts,dc=example,dc=org
Bind DN
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
Bind Credential
<password>
Позволи Kerberos удостоверяване:
включено
Kerberos Realm:
EXAMPLE.ORG
Сървърен принципал:
HTTP/freeipa.example.org@EXAMPLE.ORG
KeyTab:
/etc/krb5.keytab
Потребителят keycloak-svc трябва да бъде създаден предварително на нашия LDAP-сървър.
В случая с Active Directory, просто изберете Vendor: Active Directory и необходимите настройки ще бъдат автоматично поставени в формуляра.
Натиснете Запази
Сега ще отидем на:
User federation —> freeipa.example.org —> Mappers —> Име
Option
Стойност
Ldap атрибут
givenName
Сега ще активираме мапинга на групи:
User federation —> freeipa.example.org —> Mappers —> Create
Option
Стойност
Name
groups
Тип на мапера
group-ldap-mapper
LDAP Groups DN
cn=групи,cn=акаунти,dc=example,dc=org
Стратегия за извличане на потребителски групи
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
С това настройката на федерацията приключва, преминаваме към настройката на клиента.
Настройка на клиента
Ще създадем нов клиент (приложение, което ще получава потребителите от Keycloak). Преминаваме към:
Клиенти —> Create
Option
Стойност
Client ID
kubernetes
Тип на достъпа
конфиденциален
Коренен URL
http://kubernetes.example.org/
Валидни редирект URIs
http://kubernetes.example.org/*
Административен URL
http://kubernetes.example.org/
Също така ще създадем scope за групи:
Client Scopes —> Create
Option
Стойност
Шаблон
Без шаблон
Name
groups
Пълен път на групата
неверно
И ще настроим маппер за тях:
Client Scopes —> groups —> Mappers —> Create
Option
Стойност
Name
groups
Тип на мапера
Членство в група
Име на токенен клейм
groups
Сега трябва да активираме мапинга на групи в нашия client scope:
Клиенти —> kubernetes —> Client Scopes —> Default Client Scopes
Избираме groups в Налични Client Scopes, натискаме Добави избраните
Сега ще настроим аутентификацията на нашето приложение, преминаваме към:
Клиенти —> kubernetes
Option
Стойност
Разрешена авторизация
ON
Натиснете запазване и с това настройката на клиента е завършена, сега в раздела
Клиенти —> kubernetes —> Credentials
можете да получите Secret което ще използваме по-късно.
Настройка на Kubernetes
Настройката на Kubernetes за OIDC-авторизация е достатъчно тривиална и не е нещо особено сложно. Всичко, което трябва да направите, е да поставите CA-сертификата на вашия OIDC-сървър в /etc/kubernetes/pki/oidc-ca.pem и да добавите необходимите опции за kube-apiserver.
За това актуализирайте /etc/kubernetes/manifests/kube-apiserver.yaml на всички ваши майстори:
...
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
...И също така обновете kubeadm конфиг в клъстера, за да не загубите тези настройки при актуализиране:
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
...С това настройката на Kubernetes приключва. Можете да повторите тези действия във всички ваши Kubernetes клъстери.
Начална авторизация
След тези действия вече ще имате Kubernetes клъстер с настроена OIDC авторизация. Единственото нещо е, че вашите потребители все още нямат настроен клиент, както и собствен kubeconfig. За да решите този проблем, трябва да настроите автоматично издаване на kubeconfig на потребителите след успешна авторизация.
За това можете да използвате специализирани уеб приложения, които позволяват аутентификация на потребителя, а след това да свалят готов kubeconfig. Едно от най-удобните е , той позволява в един конфиг да опишете всички Kubernetes клъстери и лесно да превключвате между тях.
За настройка на Kuberos е достатъчно да опишете шаблон за kubeconfig и да стартирате с следните параметри:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/templateЗа по-подробна информация вижте на Github.
Също така е възможно да се използва ако искате да извършите удостоверяване директно на компютъра на потребителя. В този случай на потребителя ще се отвори браузър с формуляр за удостоверяване на localhost.
Полученият kubeconfig може да бъде проверен на сайта . Просто копирайте стойността users[].user.auth-provider.config.id-token от вашия kubeconfig във формуляра на сайта и незабавно ще получите декодирането.
Настройка на RBAC
При настройка на RBAC можете да се обръщате както към името на потребителя (полето name в jwt-токена), така и към групата потребители (полето groups в jwt-токена). Ето пример за настройка на правата за групата 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Повече примери за RBAC можете да намерите в
Конфигуриране на auth-proxy
Има чудесен проект , който позволява защита на всяко приложение, предоставяйки на потребителя възможността да се удостоверява на OIDC-сървера. Ще покажа как можете да го настроите на примера на Kubernetes Dashboard:
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=
- --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Източник: habr.com
