ΠΠ°Π»ΡΠΊ ΡΡΠΎΠΊ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ 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 Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎΡΠΎ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. ΠΡΡΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΠΎΠ±Π»Π°ΡΡ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π° ΠΎΡΠΎΡΠΈΠ·Π°ΡΠΈΡ. ΠΠ»Π°Π²Π½ΠΎΡΠΎ ΡΠ°ΡΡΡΠ²ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡ ΡΠ°ΠΌΠΈΡ Keycloak ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ ΠΌΡ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎΡΠΎ ΠΈ Π΄Π° Π±ΠΈΠ»ΠΎ Π΄ΡΡΠ³ΠΎ Π΅ Π³ΡΠ΅ΡΠ½ΠΎ.
ΡΠ»Π°ΡΡΠΊ ΠΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΎΠ±Π»Π°ΡΡ
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠΌΠ΅
kubernetes
ΠΠΌΠ΅ Π·Π° ΠΏΠΎΠΊΠ°Π·Π²Π°Π½Π΅
Kubernetes
HTML ΠΏΠΎΠΊΠ°Π·Π²Π°Π½ΠΎ ΠΈΠΌΠ΅
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >
Kubernetes ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π΄Π°Π»ΠΈ ΠΈΠΌΠ΅ΠΉΠ»ΡΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΅ ΠΏΠΎΡΠ²ΡΡΠ΄Π΅Π½ ΠΈΠ»ΠΈ Π½Π΅. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ LDAP ΡΡΡΠ²ΡΡ, ΡΠ°Π·ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΏΠΎΡΡΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΡΠ΅ ΡΠ΅ Π²ΡΡΠ½Π΅ false
. ΠΠ΅ΠΊΠ° Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΠ°Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π² Kubernetes:
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°Ρ -> ΠΠΌΠ΅ΠΉΠ» -> ΠΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈ -> ΠΈΠΌΠ΅ΠΉΠ» ΠΏΠΎΡΠ²ΡΡΠ΄Π΅Π½ (ΠΠ·ΡΡΠΈΠΉ)
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ΅Π΄Π΅ΡΠ°ΡΠΈΡΡΠ°, Π·Π° ΡΠΎΠ²Π° ΠΎΡΠΈΠ²Π°ΠΌΠ΅ Π½Π°:
ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ° ΡΠ΅Π΄Π΅ΡΠ°ΡΠΈΡ -> ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π΄ΠΎΡΡΠ°Π²ΡΠΈΠΊ... -> LDAP
ΠΡΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π·Π° FreeIPA:
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠΎΠΊΠ°Π·Π²Π°Π½ΠΎ ΠΈΠΌΠ΅ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ°
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 -> ΠΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈ -> ΠΠΌΠ΅
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
Ldap Π°ΡΡΠΈΠ±ΡΡΠΈ
givenName
Π‘Π΅Π³Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΉΡΠ΅ Π³ΡΡΠΏΠΎΠ²ΠΎΡΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅:
ΠΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ° ΡΠ΅Π΄Π΅ΡΠ°ΡΠΈΡ -> freeipa.example.org -> ΠΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈ -> Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π°
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠΌΠ΅
groups
Π’ΠΈΠΏ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°Ρ
group-ldap-mapper
LDAP Π³ΡΡΠΏΠΈ DN
cn=groups,cn=accounts,dc=example,dc=org
Π‘ΡΡΠ°ΡΠ΅Π³ΠΈΡ Π·Π° ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ° Π³ΡΡΠΏΠ°
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE
Π’ΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΡΠ΅Π΄Π΅ΡΠ°ΡΠΈΡΡΠ°, Π½Π΅ΠΊΠ° Π΄Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π΅ΠΌ ΠΊΡΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ Π½ΠΎΠ² ΠΊΠ»ΠΈΠ΅Π½Ρ (ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΎΡ Keycloak). ΠΠ° ΡΡΡΠ³Π²Π°ΠΌΠ΅:
ΠΠ»ΠΈΠ΅Π½ΡΠΈ -> Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π°
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π΅Π½ Π½ΠΎΠΌΠ΅Ρ
kubernetes
Π’ΠΈΠΏ Π΄ΠΎΡΡΡΠΏ
confidenrial
ΠΠΎΡΠ΅Π½ URL
http://kubernetes.example.org/
ΠΠ°Π»ΠΈΠ΄Π½ΠΈ URI Π°Π΄ΡΠ΅ΡΠΈ Π·Π° ΠΏΡΠ΅Π½Π°ΡΠΎΡΠ²Π°Π½Π΅
http://kubernetes.example.org/*
ΠΠ΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΈΠ²Π΅Π½ URL Π°Π΄ΡΠ΅Ρ
http://kubernetes.example.org/
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΎΠ±Ρ Π²Π°Ρ Π·Π° Π³ΡΡΠΏΠΈ:
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°Ρ -> Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π°
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
Π¨Π°Π±Π»ΠΎΠ½
No template
ΠΠΌΠ΅
groups
ΠΡΠ»Π΅Π½ Π³ΡΡΠΏΠΎΠ² ΠΏΡΡ
false
Π Π½Π°ΡΡΡΠΎΠΉΡΠ΅ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°Ρ Π·Π° ΡΡΡ :
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°Ρ -> Π³ΡΡΠΏΠΈ -> ΠΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈ -> Π‘ΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π°
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
ΠΠΌΠ΅
groups
Π’ΠΈΠΏ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°Ρ
Group membership
ΠΠΌΠ΅ Π½Π° ΠΈΡΠΊ Π·Π° ΡΠΎΠΊΠ΅Π½
groups
Π‘Π΅Π³Π° ΡΡΡΠ±Π²Π° Π΄Π° Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ Π³ΡΡΠΏΠΎΠ²ΠΎ ΠΊΠ°ΡΡΠΎΠ³ΡΠ°ΡΠΈΡΠ°Π½Π΅ Π² ΠΎΠ±Ρ Π²Π°ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΊΠ»ΠΈΠ΅Π½Ρ:
ΠΠ»ΠΈΠ΅Π½ΡΠΈ -> ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈ -> ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°Ρ -> ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°ΡΠΈ ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅
ΠΠ·Π±Π΅ΡΠ΅ΡΠ΅ Π³ΡΡΠΏΠΈ Π² ΠΠ°Π»ΠΈΡΠ½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈ ΠΎΠ±Ρ Π²Π°ΡΠΈΠ½Π°ΡΠΈΡΠ½Π΅ΡΠ΅ ΠΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΈΠ·Π±ΡΠ°Π½ΠΈ
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π½Π°ΡΡΡΠΎΠΈΠΌ ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΎΡΠΈΠ΄Π΅ΡΠ΅ Π½Π°:
ΠΠ»ΠΈΠ΅Π½ΡΠΈ -> ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈ
ΠΠΏΡΠΈΡ
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ
Π£ΠΏΡΠ»Π½ΠΎΠΌΠΎΡΠ°Π²Π°Π½Π΅ΡΠΎ Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΎ
ON
ΠΠ° Π½Π°ΡΠΈΡΠΊΠ°ΠΌΠ΅ Π·Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΈ ΡΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΡΠ΅Π³Π° Π² ΡΠ°Π·Π΄Π΅Π»Π°
ΠΠ»ΠΈΠ΅Π½ΡΠΈ -> ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈ -> Π°ΠΊΡΠ΅Π΄ΠΈΡΠΈΠ²Π½ΠΈ ΠΏΠΈΡΠΌΠ°
ΠΌΠΎΠΆΠ΅Ρ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΡ Π’Π°ΠΉΠ½Π° ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ.
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½Π΅ Π½Π° 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. ΠΠ΄ΠΈΠ½ ΠΎΡ Π½Π°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΠ΅ Π΅
ΠΠ° Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Kuberos Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄Π° ΠΎΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½Π° Π·Π° kubeconfig ΠΈ Π΄Π° Π³ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ:
kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template
ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π²ΠΆ
Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΡΡ 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 ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π²
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΡΠΎΠΊΡΠΈ Π·Π° ΡΠ΄ΠΎΡΡΠΎΠ²Π΅ΡΡΠ²Π°Π½Π΅
ΠΠΌΠ° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ
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
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com