Este artigo foi escrito para ampliar o xa
Neste artigo vouche dicir como instalar e configurar:
- chaveiro é un proxecto de código aberto. O que proporciona un único punto de entrada para as solicitudes. Funciona con moitos protocolos, incluíndo LDAP e OpenID nos que estamos interesados.
- porteiro de chaveiro - aplicación de proxy inverso que che permite integrar a autorización a través de Keycloak.
- pasarela - unha aplicación que xera unha configuración para kubectl coa que pode iniciar sesión e conectarse á API de Kubernetes a través de OpenID.
Como funcionan os permisos en Kubernetes.
Podemos xestionar os dereitos de usuarios/grupos usando RBAC, xa se crearon unha morea de artigos sobre isto, non vou determe en detalle. O problema é que podes usar RBAC para restrinxir os dereitos dos usuarios, pero Kubernetes non sabe nada sobre os usuarios. Resulta que necesitamos un mecanismo de entrega de usuarios en Kubernetes. Para iso, engadiremos un provedor a Kuberntes OpenID, que dirá que ese usuario realmente existe, e o propio Kubernetes concederalle os dereitos.
Adestramento
- Necesitarás un clúster ou minikube de Kubernetes
- Active Directory
- Dominios:
keycloak.example.org
kubernetes-dashboard.example.org
pasarela.example.org - Certificado para dominios ou certificado autoasinado
Non vou determe sobre como crear un certificado autoasinado, cómpre crear 2 certificados, este é o cliente raíz (Autoridade de certificación) e comodín para o dominio *.example.org
Despois de recibir/emitir certificados, o cliente debe engadirse a Kubernetes, para iso creamos un segredo para el:
kubectl create secret tls tls-keycloak --cert=example.org.crt --key=example.org.pem
A continuación, usarémolo para o noso controlador de entrada.
Instalación de Keycloak
Decidín que o xeito máis sinxelo é usar solucións preparadas para iso, é dicir, gráficos de timón.
Instala o repositorio e actualízao:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm repo update
Cree un ficheiro keycloak.yml co seguinte contido:
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
Configuración da federación
A continuación, vai á interface web
Fai clic na esquina esquerda Engadir reino
Clave
Valor
nome
kubernetes
Mostrar Name
Kubernetes
Desactivar a verificación do correo electrónico do usuario:
Ámbitos do cliente —> Correo electrónico —> Mapeadores —> Correo electrónico verificado (Eliminar)
Configuramos a federación para importar usuarios de ActiveDirectory, deixarei capturas de pantalla a continuación, creo que quedará máis claro.
Federación de usuarios —> Engadir provedor... —> ldap
Configuración da federación
Se todo está ben, despois de premer o botón Sincronizar todos os usuarios verá unha mensaxe sobre a importación exitosa de usuarios.
A continuación temos que mapear os nosos grupos
Federación de usuarios --> ldap_localhost --> Mappers --> Crear
Creando un mapeador
Configuración do cliente
É necesario crear un cliente, en termos de Keycloak, esta é unha aplicación que será autorizada por el. Destacarei os puntos importantes na captura de pantalla en vermello.
Clientes —> Crear
Configuración do cliente
Imos crear scoupe para grupos:
Ámbitos do cliente —> Crear
Crear ámbito
E configura un mapeador para eles:
Ámbitos do cliente —> grupos —> Mapeadores —> Crear
Mapeador
Engade a asignación dos nosos grupos aos ámbitos de cliente predeterminados:
Clientes —> kubernetes —> Ámbitos de cliente —> Ámbitos de cliente predeterminados
seleccionar grupos в Ámbitos de cliente dispoñibles, prema Engadir seleccionado
Recibimos o segredo (e escríbeo no fío) que usaremos para a autorización en Keycloak:
Clientes —> kubernetes —> Credenciais —> Segredo
Isto completa a configuración, pero tiven un erro cando, despois da autorización exitosa, recibín un erro 403.
Corrección:
Ámbitos do cliente —> roles —> Mappers —> Crear
Mapeador
Código de script
// add current client-id to token audience
token.addAudience(token.getIssuedFor());
// return token issuer as dummy result assigned to iss again
token.getIssuer();
Configuración de Kubernetes
Debemos especificar onde se atopa o noso certificado raíz do sitio e onde se atopa o provedor OIDC.
Para iso, edite o ficheiro /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
...
Actualiza a configuración de kubeadm no clúster:
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
...
Configurando o proxy de autenticación
Podes usar o Keycloak Gatekeeper para protexer a túa aplicación web. Ademais de que este proxy inverso autorizará ao usuario antes de mostrar a páxina, tamén pasará información sobre ti á aplicación final nas cabeceiras. Así, se a súa aplicación admite OpenID, entón o usuario está autorizado inmediatamente. Considere o exemplo de Kubernetes Dashboard
Instalación de Kubernetes Dashboard
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'
Configuración de dereitos de acceso:
Imos crear un ClusterRoleBinding que outorgará dereitos de administrador do clúster (clúster-admin estándar de ClusterRole) para os usuarios do grupo DataOPS.
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
Instalar keycloak gatekeeper:
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
valores_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"
Despois diso, cando tentas ir
instalación de pasarela
Para comodidade, pode engadir unha pasarela que xerará un ficheiro de configuración para kubectl, coa axuda do cal entraremos en Kubernetes baixo o noso usuario.
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-----
Parece así. Permítelle descargar inmediatamente o ficheiro de configuración e xeralo mediante un conxunto de comandos:
Fonte: www.habr.com