Kubernetes ááᯠáááºá LDAP áá¬áá¬ááá¯á· áá»áááºáááºáááºááŸáá·áº á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááŸáá·áº á¡ááœá²á·áá»á¬ážá áááºááœááºážááŸá¯ááᯠááá·áºááœááºážáááºá¡ááœáẠá áá áºááá·áºááœááºážááẠKeycloak á¡áá¯á¶ážááŒá¯áááºážá¡ááœáẠáááºáááºážá á¬áááºá áááºážááẠááá·áºá¡á¬áž ááá·áºá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœáẠRBAC á áá áºááá·áºááœááºážáááºááŸáá·áº Kubernetes Dashboard ááŸáá·áº áááºážááá¯á·ááᯠáááºááá¯á·ááœáá·áºááŒá¯ááááºááᯠááááá±á¬ á¡ááŒá¬ážá¡ááá®áá±ážááŸááºážáá»á¬ážááᯠáá¬ááœááºááẠauth-proxy ááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáááºááŒá áºáááºá
áá±á¬á·áá»áááºáááºáááºááŒááºážá
ááá·áºááœáẠLDAP áá¬áá¬áá áºáá¯ááŸááá±ááŒá®áᯠáá°áááŒáá«á áá¯á·á áááºážááẠActive Directoryá FreeIPAá OpenLDAP ááá¯á·ááá¯áẠáááºááá¯á·áááºááŒá áºááá¯ááºáááºá ááá·áºááœáẠLDAP áá¬áá¬áááŸááá«áá áá°á¡áá áááºááẠKeycloak á¡ááºáá¬áá±á·á áºááœáẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠááá¯ááºááá¯ááºáááºáá®ážááá¯ááºáááºá ááá¯á·ááá¯áẠá¡áá»á¬ážáá°ááŸá¬ oidc áááºáá±á¬ááºááŸá¯áá±ážáá°áá»á¬áž (Googleá Githubá Gitlab) ááá¯á¡áá¯á¶ážááŒá¯ááŒááºážááŒáá·áº ááááºááẠá¡áá°áá°áá®ážáá«ážááŒá áºáááá·áºáááºá
ááááŠážá
áœá¬á Keycloak ááá¯ááºááá¯ááºááá·áºááœááºážááŒáá«á
áá¯á·á áááºáááºááŸá¯ááᯠáá®ážááŒá¬ážáá¯ááºáá±á¬ááºááá¯ááºáááºá ááá¯á·ááá¯áẠKubernetes á¡á
á¯á¡áá±ážááá¯á· ááá¯ááºááá¯áẠá
ááºážáááºážáá»ááºá¡áá±ááŒáá·áºá ááá·áºááœáẠKubernetes á¡á
á¯á¡áá±ážáá»á¬ážá
áœá¬ááŸááá«áá áááºážááᯠáá®ážááŒá¬ážáááºáááºááẠááá¯ááá¯ááœááºáá°áááºááŒá
áºáááºá áá
áºáááºááááºáž á¡ááŒá²áá¯á¶ážááá¯ááºáááºá
Keycloak áá±áá¬ááᯠááááºážáááºážáááºá áááºááẠáá±áá¬áá±á·á
áºáá
áºáᯠááá¯á¡ááºáááºááŒá
áºáááºá áá¯á¶áá±áá¬áž h2
(áá±áá¬á¡á¬ážáá¯á¶ážááᯠááŒááºááœááºážááœáẠááááºážáááºážáá¬ážáááº)á ááá¯á·áá±á¬áº áááºážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºáááºá postgres
, mysql
ááá¯á·ááá¯áẠmariadb
.
á¡áááºá áááºááẠKeycloak ááᯠáá®ážááŒá¬ážá
á® ááá·áºááœááºážááẠáá¯á¶ážááŒááºáá¬ážáá«áá áá±á¬ááºááẠá¡áá±ážá
ááẠááœáŸááºááŒá¬ážáá»ááºáá»á¬ážááᯠááœáẠáááºááŸá¬ááœá±á·ááá¯ááºáá«áááºá
á¡ááœá²á·áá»á¯ááºááœá²á·á ááºážááŸá¯
ááááá¯á¶ážá¡áá±áá²á· áááºáááºá¡áá áºáá áºáá¯ááᯠáááºáá®ážááá¯ááºááŒáá¡á±á¬ááºá Realm ááẠáá»áœááºá¯ááºááá¯á·á á¡ááá®áá±ážááŸááºážá áá±áá¬ááŒá áºáááºá á¡ááá®áá±ážááŸááºážáá áºáá¯á á®ááœáẠááá°áá®áá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááŸáá·áº ááœáá·áºááŒá¯áá»ááºáááºáááºáá»á¬ážááŒáá·áº áááºážáááá¯ááºááá¯ááºáááºáááºááŸáááá¯ááºáááºá áá¬á áá¬áááºáááºááᯠKeycloak ááá¯ááºááá¯ááºá á¡áá¯á¶ážááŒá¯ááŒá®áž á¡ááŒá¬ážá¡áá¬ááœá±á¡ááœáẠá¡áá¯á¶ážááŒá¯áá¬á ááŸá¬ážáá«áááºá
á á¬áááºáááºážáá»á¬áž áááºáááºááá·áºáá«á
option ááá¯
á¡ááá¯áž
á¡áááº
kubernetes
áá±á¬áºááŒáááºá·á¡áááº
Kubernetes
HTML Display Name
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
áá°áááºážá¡á¬ážááŒáá·áº Kubernetes ááẠá¡áá¯á¶ážááŒá¯áá°áá¡á®ážáá±ážááºááᯠá¡áááºááŒá¯ááŒá®áž áá¯ááºááá¯áẠá
á
áºáá±ážáááºá áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠLDAP áá¬áá¬ááá¯á¡áá¯á¶ážááŒá¯áá±áá±á¬ááŒá±á¬áá·áºá á€á
á
áºáá±ážááŸá¯ááẠá¡ááŒá²áááºážáá®ážáá«ážááŒááºáá¬áááºááŒá
áºáááºá false
. Kubernetes ááœáẠá€áááºáááºá ááá¯ááºá
á¬ážááŒá¯ááŸá¯ááᯠááááºáá¬ážááŒáá«á
áá¯á·á
áá±á¬ááºááẠáááºáááºáá»á¬áž -> á¡á®ážáá±ážááºááááºá ᬠ-> ááŒá±áá¯á¶ááá¬ážáá»á¬áž -> á¡á®ážáá±ážááºááᯠá¡áááºááŒá¯ááŒá®ážáá«ááŒá®á (áá»ááº)
áá² á¡ááœá²á·áá»á¯ááºááᯠáááºáá±á¬ááºááá¯ááºáá¡á±á¬ááºá
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœá²á·áá»á¯áẠ-> áááºáá±á¬ááºááŸá¯áá±ážáá°ááᯠááá·áºáá«... -> ldap
á€áááºááŸá¬ FreeIPA á¡ááœáẠááá°áá¬áá¯á¶á á¶áá áºáá¯ááŒá áºáááºá
option ááá¯
á¡ááá¯áž
Console Display Name
freeipa.example.org
áá±á¬ááºážáá»áá°
Red Hat Directory Server
UUID LDAP áááºááœáŸááºážáá»ááº
ipauniqueid
áá»áááºáááºááŸá¯ URL
ldaps://freeipa.example.org
á¡áá¯á¶ážááŒá¯áá° DN
cn=users,cn=accounts,dc=example,dc=org
DN áá»áááºáá«á
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org
á¡áá±á¬ááºá¡áá¬áž á
ááºážáá«á
<password>
Kerberos á
á
áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážááᯠááœáá·áºááŒá¯áá«-
on
Kerberos áááºááŒá±-
EXAMPLE.ORG
áá¬áá¬áá»á±á¬ááºážá¡á¯ááº-
HTTP/[email protected]
áá±á¬á·áááº-
/etc/krb5.keytab
á¡áá¯á¶ážááŒá¯áá°ááᯠkeycloak-svc
áá»áœááºá¯ááºááá¯á·á LDAP áá¬áá¬ááœáẠááŒáá¯áááºáááºáá®ážáá¬ážááá«áááºá
Active Directory áááá á¹á ááœááºá ááá¯ážááŸááºážá áœá¬ááœá±ážáá»ááºáá«á áá±á¬ááºážáá»áá°- Active Directory ááá¯á¡ááºáá±á¬ áááºáááºáá»á¬ážááᯠáá±á¬ááºáá²ááá¯á· á¡ááá¯á¡áá»á±á¬áẠááá·áºááœááºážááœá¬ážáá«áááºá
á á¬áááºáááºážáá»á¬áž ááŒá±á¬áºááŒá¬ááᯠSave áá¯ááºáááº
áá² áááºááœá¬ážááŒáá¡á±á¬ááºá
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœá²á·áá»á¯áẠ-> freeipa.example.org -> ááŒá±áá¯á¶ááá¬ážáá»á¬áž -> áá¬áááº
option ááá¯
á¡ááá¯áž
Ldap áá¯ááºáá±á¬áºáá»á¬áž
givenName
ááá¯á¡á¯ááºá á¯ááœá²á·ááŒá±áá¯á¶ááá¯ááœáá·áºáá«-
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááœá²á·áá»á¯áẠ-> freeipa.example.org -> ááŒá±áá¯á¶ááá¬ážáá»á¬áž -> áááºáá®áž
option ááá¯
á¡ááá¯áž
á¡áááº
groups
Mapper á¡áá»áá¯ážá¡á
á¬áž
group-ldap-mapper
LDAP á¡ááœá²á·áá»á¬áž DN
cn=groups,cn=accounts,dc=example,dc=org
User Group Retrieve Strategy
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
áááºážááẠáááºááá±ážááŸááºáž á áá áºááá·áºááœááºážááŸá¯ááᯠá¡ááŒá®ážáááºááŒá®ážá áááá¯ááºážááá·áº á áá áºááá·áºááœááºážááŒááºážááá¯á· áááºááœá¬ážááŒáá«á áá¯á·á
Client á áá áºááá·áºááœááºážááŒááºážá
áá¯á¶ážá áœá²áá°á¡áá Ạ(Keycloak) á០áá¯á¶ážá áœá²áá°áá»á¬ážááᯠáááºáá¶ááá·áº á¡ááá®áá±ážááŸááºážáá áºáᯠáááºáá®ážááŒáá«á áá¯á·á ááœá¬ážááŒáá¡á±á¬ááº:
clients -> áááºáá®áž
option ááá¯
á¡ááá¯áž
ááá¯ááºáž ID
kubernetes
áá¯á¶ážááœáá·áºá¡áá»áá¯ážá¡á
á¬áž
confidenrial
Root URL
http://kubernetes.example.org/
ááŸááºáááºáá±á¬ Redirect URI áá»á¬áž
http://kubernetes.example.org/*
á
á®áá¶ááá·áºááœá²áá° URL
http://kubernetes.example.org/
á¡ááœá²á·áá»á¬ážá¡ááœáẠáááºáááºáá áºáá¯ááá¯áááºáž áááºáá®ážáá«áááºá
áá±á¬ááºááẠáááºáááºáá»á¬áž -> áááºáá®áž
option ááá¯
á¡ááá¯áž
template
No template
á¡áááº
groups
á¡á¯ááºá
á¯áááºážááŒá±á¬ááºážá¡ááŒáá·áº
false
ááŒá®ážáá»áŸáẠáá°ááá¯á·á¡ááœáẠááŒá±áá¯á¶ááá¬ááᯠáááºááŸááºáá«á
áá±á¬ááºááẠáááºáááºáá»á¬áž -> á¡á¯ááºá á¯ááœá± -> ááŒá±áá¯á¶ááá¬ážáá»á¬áž -> áááºáá®áž
option ááá¯
á¡ááá¯áž
á¡áááº
groups
Mapper á¡áá»áá¯ážá¡á
á¬áž
Group membership
ááá¯áááºáá±á¬ááºážááá¯ááŸá¯á¡áááº
groups
ááᯠáá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·á client áááºáááºááœáẠá¡á¯ááºá á¯ááœá²á·ááŒá±áá¯á¶ááᯠááœáá·áºááẠááá¯á¡ááºáá«áááº-
clients -> Kubernetes -> áá±á¬ááºááẠáááºáááºáá»á¬áž -> áá°áááºáž Client áááºáááºáá»á¬áž
ááœá±ážáá»ááºááŒááºáž á¡á¯ááºá á¯ááœá± в áááá¯ááºáá±á¬ Client áááºáááºáá»á¬áž, ááŸáááºáá« ááœá±ážááá·áºáá«á
ááá¯áá»áœááºá¯ááºááá¯á·áá¡ááá®áá±ážááŸááºážáá á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážááá¯áááºááŸááºááŒáá«á áá¯á·á ááá¯á·ááœá¬ážáá«-
clients -> Kubernetes
option ááá¯
á¡ááá¯áž
ááœáá·áºááŒá¯áá»ááºááœáá·áºáá¬ážáááºá
ON
ááœááºážááá¯ááºááŒáá¡á±á¬áẠáááºááẠáááºážááẠáááá¯ááºážááá·áºá áá áºááá·áºááœááºážááŒááºážááᯠááŒá®ážááŒá±á¬ááºá á±áááºá ááᯠáááºááºáá±á«áºááŸá
clients -> Kubernetes -> á¡ááœáá·áºá¡á¬áá¬
áááºáááá¯ááºáááºá áá»áŸáá¯á·ááŸááºáá»áẠáá±á¬ááºááŸáá¯á¶ážáá«áááºá
Kubernetes ááᯠááŒááºáááºááŒááºáž
ODC ááœáá·áºááŒá¯áá»ááºá¡ááœáẠKubernetes ááᯠá
áá
áºááá·áºááœááºážááŒááºážááẠá¡ááœááºá¡áá±ážá¡ááœá²ááŒá
áºááŒá®áž á¡ááœááºááŸá¯ááºááœá±ážáá±á¬á¡áá¬ááá¯ááºáá«á áááºáá¯ááºáááºááá¯á¡ááºáááºááŸá¬ áááºá ODC áá¬áá¬á CA áááºááŸááºááᯠááá·áºáá¬ážáááºááŒá
áºáááºá /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 config ááá¯áááºáž á¡ááºááááºáá¯ááºáá«-
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 á¡á á¯á¡áá±ážáá»á¬ážá¡á¬ážáá¯á¶ážááœáẠá€á¡ááá·áºáá»á¬ážááᯠáááºáá¯ááºááá¯ááºáá«áááºá
áááŠážááœáá·áºááŒá¯áá»ááº
á€á¡ááá·áºáá»á¬ážááŒá®ážáá±á¬ááºá ááá·áºááœáẠODC ááœáá·áºááŒá¯áá»ááºááŒáá·áº ááŒááºáááºáááºááŸááºáá¬ážáá±á¬ Kubernetes á¡á á¯á¡áá±ážáá áºáᯠááŸáááŸáá·áºááŒá®ážááŒá áºáááºá áá áºáá¯áááºážáá±á¬á¡áá»ááºááŸá¬ ááá·áºá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááœáẠáááá¯ááºážááá·áºá¡ááŒááºá¡áááºá¡ááŒáẠáááºážááá¯á·áááá¯ááºááá¯áẠkubeconfig áááŸááá±ážááŒááºážáááºááŒá áºáááºá á€ááŒá¿áá¬ááá¯ááŒá±ááŸááºážáááºá á¡á±á¬ááºááŒááºáá±á¬ááœáá·áºááŒá¯áá»ááºáááŸáááŒá®ážáá±á¬áẠá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáá¶ááá¯á· kubeconfig áá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±ážááŒááºážááᯠááẠconfigure ááŒá¯áá¯ááºáááºááá¯á¡ááºáá«áááºá
áá«ááá¯áá¯ááºááá¯á·á á¡áá¯á¶ážááŒá¯áá°ááᯠá
á
áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒá®áž á¡ááŒá®ážááẠkubeconfig ááᯠáá±á«ááºážáá¯ááºáá¯ááºááœáá·áºááŒá¯áá²á· á¡áá°ážáááºá¡ááºááºááœá±ááᯠáááºá¡áá¯á¶ážááŒá¯ááá¯ááºáá«áááºá á¡áááºááŒá±áá¯á¶ážáá
áºáá¯ááá±á¬á·
Kuberos ááᯠconfigure áá¯ááºáááºá kubeconfig á¡ááœáẠááá°áá¬áá¯á¶á á¶ááᯠáá±á¬áºááŒááŒá®áž á¡á±á¬ááºáá« parameters áá»á¬ážááŒáá·áº run ááẠáá¯á¶áá±á¬ááºáá«áááºá
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááŒáá·áºááŸá¯áá«á
á¡áá¯á¶ážááŒá¯áááºáááºáž ááŒá
áºááá¯ááºáááºá
áááẠkubeconfig ááᯠsite ááœááºá
á
áºáá±ážááá¯ááºáááºá users[].user.auth-provider.config.id-token
áááºá kubeconfig á០ááá¯ááºáá±á«áºááŸá áá±á¬ááºáá
áºáá¯ááá¯á· áá»ááºááŒááºáž á
á¬áá¬ážááŸááºáááºážááᯠááá°áá«á
RBAC á áá áºááá·áºááœááºážááŸá¯
RBAC ááᯠconfigure áá¯ááºáá±á¬á¡áá«á á¡áá¯á¶ážááŒá¯áá°á¡ááẠ(á¡ááœáẠááŸá
áºáá¯áá¯á¶ážááᯠááá¯ážáá¬ážááá¯ááºáááºá 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 áááºááŸááºááŒááºážá
á¡á¶á·ááŒá
áá¬áá±á¬ááºážáá²á· ááá±á¬áá»ááºáá
áºáá¯ááŸááááºá
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
source: www.habr.com