ืžื™ืจ ืคืึทืกื˜ืŸ LDAP ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืฆื• Kubernetes

ืžื™ืจ ืคืึทืกื˜ืŸ LDAP ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืฆื• Kubernetes

ื ืงื•ืจืฅ ื˜ื•ื˜ืึธืจื™ืึทืœ ื•ื•ืขื’ืŸ ื•ื•ื™ ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ Keycloak ืฆื• ืคืึทืจื‘ื™ื ื“ืŸ Kubernetes ืฆื• ื“ื™ื™ืŸ LDAP ืกืขืจื•ื•ืขืจ ืื•ืŸ ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืึทืจื™ื™ึทื ืคื™ืจ ืคื•ืŸ ื™ื•ื–ืขืจื– ืื•ืŸ ื’ืจื•ืคึผืขืก. ื“ืึธืก ื•ื•ืขื˜ ืœืึธื–ืŸ ืื™ืจ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ RBAC ืคึฟืึทืจ ื“ื™ื™ืŸ ื™ื•ื–ืขืจื– ืื•ืŸ ื ื•ืฆืŸ ืึทื•ื˜-ืคึผืจืึธืงืกื™ ืฆื• ื‘ืึทืฉื™ืฆืŸ Kubernetes ื“ืึทืฉื‘ืึธืจื“ ืื•ืŸ ืื ื“ืขืจืข ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื•ื•ืึธืก ืงืขื ืขืŸ ื ื™ืฉื˜ ืึธื˜ืขื ื˜ืึทืงื™ื™ื˜ ื–ื™ืš.

Keycloak ื™ื ืกื˜ืึทืœื™ืจื•ื ื’

ื–ืืœ ืก ื™ื‘ืขืจื ืขืžืขืŸ ืึทื– ืื™ืจ ืฉื•ื™ืŸ ื”ืึธื‘ืŸ ืึท LDAP ืกืขืจื•ื•ืขืจ. ื“ืึธืก ืงืขืŸ ื–ื™ื™ืŸ Active Directory, FreeIPA, OpenLDAP ืึธื“ืขืจ ืขืคึผืขืก ืึทื ื“ืขืจืฉ. ืื•ื™ื‘ ืื™ืจ ื˜ืึธืŸ ื ื™ื˜ ื”ืึธื‘ืŸ ืึท LDAP ืกืขืจื•ื•ืขืจ, ืื™ืŸ ืคึผืจื™ื ืฆื™ืคึผ ืื™ืจ ืงืขื ืขืŸ ืฉืึทืคึฟืŸ ื™ื•ื–ืขืจื– ื’ืœื™ื™ึทืš ืื™ืŸ ื“ื™ Keycloak ืฆื•ื‘ื™ื ื“, ืึธื“ืขืจ ื ื•ืฆืŸ ืขืคื ื˜ืœืขืš ืึธื™ื“ืง ืคึผืจืึทื•ื•ื™ื™ื“ืขืจื– (Google, Github, Gitlab), ื“ืขืจ ืจืขื–ื•ืœื˜ืึทื˜ ื•ื•ืขื˜ ื–ื™ื™ืŸ ื›ึผืžืขื˜ ื“ื™ ื–ืขืœื‘ืข.

ืงื•ื“ื ื›ืœ ืœืืžื™ืจ ืื™ื ืกื˜ืืœื™ืจืŸ Keycloak ืืœื™ื™ืŸ, ื“ื™ ืื™ื ืกื˜ืืœืืฆื™ืข ืงืขืŸ ืžืขืŸ ื“ื•ืจื›ืคื™ืจืขืŸ ืกืขืคึผืขืจืื˜ ืื“ืขืจ ื’ืœื™ื™ืš ืื™ืŸ ื Kubernetes ืงื ื•ื™ืœ, ื›ืกื“ืจ, ืื•ื™ื‘ ืื™ืจ ื”ืื˜ ืขื˜ืœื™ื›ืข Kubernetes ืงืœืืกื˜ืขืจื–, ื•ื•ืืœื˜ ื’ืขื•ื•ืขืŸ ื’ืจื™ื ื’ืขืจ ื“ืืก ืฆื• ืื™ื ืกื˜ืืœื™ืจืŸ ื‘ืื–ื•ื ื“ืขืจ. ืื•ื™ืฃ ื“ื™ ืื ื“ืขืจืข ื”ืึทื ื˜ ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขื ื“ื™ืง ื ื•ืฆืŸ ื‘ืึทืึทืžื˜ืขืจ ื”ืขืœื ื˜ืฉืึทืจื˜ ืื•ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ืขืก ื’ืœื™ื™ืš ืื™ืŸ ื“ื™ื™ืŸ ืงื ื•ื™ืœ.

ืฆื• ืงืจืึธื Keycloak ื“ืึทื˜ืŸ ืื™ืจ ื“ืึทืจืคึฟืŸ ืึท ื“ืึทื˜ืึทื‘ื™ื™ืก. ืคืขืœื™ืงื™ื™ึทื˜ ืื™ื– h2 (ืึทืœืข ื“ืึทื˜ืŸ ื–ืขื ืขืŸ ืกื˜ืึธืจื“ ืœืึธื•ืงืึทืœื™), ืึธื‘ืขืจ ืขืก ืื™ื– ืื•ื™ืš ืžืขื’ืœืขืš ืฆื• ื ื•ืฆืŸ postgres, mysql ืึธื“ืขืจ mariadb.
ืื•ื™ื‘ ืื™ืจ ื ืึธืš ื‘ืึทืฉืœื™ืกืŸ ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ Keycloak ืกืขืคึผืขืจืึทื˜ืœื™, ืื™ืจ ื•ื•ืขื˜ ื’ืขืคึฟื™ื ืขืŸ ืžืขืจ ื“ื™ื˜ื™ื™ืœื“ ื™ื ืกื˜ืจืึทืงืฉืึทื ื– ืื™ืŸ ื‘ืึทืึทืžื˜ืขืจ ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ.

ืกืขื˜ืึทืคึผ ืคื•ืŸ ืคืขื“ืขืจื™ื™ืฉืึทืŸ

ืขืจืฉื˜ืขืจ ืคื•ืŸ ืึทืœืข, ืœืึธืžื™ืจ ืžืึทื›ืŸ ืึท ื ื™ื™ึท ืžืขืœื•ื›ืข. ืžืขืœื•ื›ืข ืื™ื– ื“ืขืจ ืคึผืœืึทืฅ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื™ืขื“ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืงืขื ืขืŸ ื”ืึธื‘ืŸ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืžืขืœื•ื›ืข ืžื™ื˜ ืคืึทืจืฉื™ื“ืขื ืข ื ื™ืฆืขืจืก ืื•ืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืกืขื˜ื˜ื™ื ื’ืก. ื“ื™ ื”ืืจ ืžืขืœื•ื›ืข ืื™ื– ื’ืขื ื™ืฆื˜ ื“ื•ืจืš Keycloak ื–ื™ืš ืื•ืŸ ืขืก ืื™ื– ืคืึทืœืฉ ืฆื• ื ื•ืฆืŸ ืขืก ืคึฟืึทืจ ืขืคึผืขืก ืึทื ื“ืขืจืฉ.

ื“ืจื™ืงื˜ ื“ืึธ ืœื™ื™ื’ ืžืขืœื•ื›ืข

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ื ืึธืžืขืŸ
kubernetes

ืึทืจื•ื™ืกื•ื•ื™ื™ึทื–ืŸ ื ืึธืžืขืŸ
Kubernetes

HTML ื•ื•ื™ื™ึทื– ื ืึธืžืขืŸ
<img src="https://kubernetes.io/images/nav_logo.svg" width="400" >

Kubernetes ื“ื•ืจืš ืคืขืœื™ืงื™ื™ึทื˜ ื˜ืฉืขืงืก ืฆื™ ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ืก E- ื‘ืจื™ื•ื• ืื™ื– ื‘ืืฉื˜ืขื˜ื™ืงื˜ ืึธื“ืขืจ ื ื™ืฉื˜. ื–ื™ื ื˜ ืžื™ืจ ื ื•ืฆืŸ ืื•ื ื“ื–ืขืจ ืื™ื™ื’ืขื ืข LDAP ืกืขืจื•ื•ืขืจ, ื“ืขื ื˜ืฉืขืง ื•ื•ืขื˜ ื›ึผืžืขื˜ ืฉื˜ืขื ื“ื™ืง ืฆื•ืจื™ืงืงื•ืžืขืŸ false. ืœืึธืžื™ืจ ื“ื™ืกื™ื™ื‘ืึทืœ ื“ื™ ืคืึทืจื˜ืจืขื˜ื•ื ื’ ืคื•ืŸ ื“ืขื ืึธืคึผืฆื™ืข ืื™ืŸ Kubernetes:

ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก -> ื‘ืœื™ืฆืคึผืึธืกื˜ -> ืžืึทืคึผืคึผืขืจืก -> Email ื•ื•ืขืจืึทืคื™ื™ื“ (ืžืขืงืŸ)

ืื™ืฆื˜ ืœืึธืžื™ืจ ืฉื˜ืขืœืŸ ื“ื™ ืคืขื“ืขืจื™ื™ืฉืึทืŸ; ืฆื• ื˜ืึธืŸ ื“ืึธืก, ื’ื™ื™ืŸ ืฆื•:

ื‘ืึทื ื™ืฆืขืจ ืคืขื“ืขืจื™ื™ืฉืึทืŸ -> ืฆื•ื’ืขื‘ืŸ ืฉืคึผื™ื™ึทื–ืขืจโ€ฆ -> ldap

ื“ืึธ ืก ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ืกืขื˜ื˜ื™ื ื’ืก ืคึฟืึทืจ FreeIPA:

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ืงืึทื ืกืึธื•ืœ ื•ื•ื™ื™ึทื– ื ืึธืžืขืŸ
freeipa.example.org

ืคืึทืจืงื•ื™ืคืขืจ
Red Hat Directory Server

UUID LDAP ืึทื˜ืจื™ื‘ื™ื•ื˜
ipauniqueid

ืคึฟืึทืจื‘ื™ื ื“ื•ื ื’ URL
ldaps://freeipa.example.org

ื™ื•ื–ืขืจื– ื“ืŸ
cn=users,cn=accounts,dc=example,dc=org

ื‘ื™ื ื“ืŸ ื“ืŸ
uid=keycloak-svc,cn=users,cn=accounts,dc=example,dc=org

ื‘ื™ื ื“ืŸ ืงืจืึทื“ืขื ื˜ืฉืึทืœ
<password>

ืœืึธื–ืŸ Kerberos ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ:
on

Kerberos ืžืขืœื•ื›ืข:
EXAMPLE.ORG

ืกืขืจื•ื•ื™ืจืขืจ ื”ื•ื™ืคึผื˜:
HTTP/[email protected]

KeyTab:
/etc/krb5.keytab

ื‘ืึทื ื™ืฆืขืจ keycloak-svc ื“ืึทืจืคึฟืŸ ืฆื• ื–ื™ื™ืŸ ื‘ืืฉืืคืŸ ืื™ืŸ ืฉื˜ื™ื™ึทื’ืŸ ืื•ื™ืฃ ืื•ื ื“ื–ืขืจ LDAP ืกืขืจื•ื•ืขืจ.

ืื™ืŸ ื“ืขื ืคืึทืœ ืคื•ืŸ ืึทืงื˜ื™ื•ื• Directory, ืื™ืจ ื ืึธืจ ื“ืึทืจืคึฟืŸ ืฆื• ืกืขืœืขืงื˜ื™ืจืŸ ืคืึทืจืงื•ื™ืคืขืจ: ืึทืงื˜ื™ื•ื•ืข Directory ืื•ืŸ ื“ื™ ื ื™ื™ื˜ื™ืง ืกืขื˜ื˜ื™ื ื’ืก ื•ื•ืขื˜ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ืึทืจื™ื™ึทืŸ ื“ื™ ืคืึธืจืขื.

ื“ืจื™ืงื˜ ื“ืึธ ืฉืคึผืึธืจืŸ

ืื™ืฆื˜ ืœืืžื™ืจ ื’ื™ื™ืŸ ื•ื•ื™ื™ื˜ืขืจ:

ื‘ืึทื ื™ืฆืขืจ ืคืขื“ืขืจื™ื™ืฉืึทืŸ -> freeipa.example.org -> ืžืึทืคึผืคึผืขืจืก -> ืขืจืฉื˜ืข ื ืืžืขืŸ

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

Ldap ืึทื˜ืจื™ื‘ื™ื•ื˜
givenName

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ื’ืขื‘ืŸ ื’ืจื•ืคึผืข ืžืึทืคึผื™ื ื’:

ื‘ืึทื ื™ืฆืขืจ ืคืขื“ืขืจื™ื™ืฉืึทืŸ -> freeipa.example.org -> ืžืึทืคึผืคึผืขืจืก -> ืžืึทื›ืŸ

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ื ืึธืžืขืŸ
groups

ื˜ื™ืคึผ ืžืึทืคึผืขืจ
group-ldap-mapper

LDAP ื’ืจื•ืคึผืขืก ื“ืŸ
cn=groups,cn=accounts,dc=example,dc=org

ื‘ืึทื ื™ืฆืขืจ ื’ืจื•ืคึผืขืก ืฆื•ืจื™ืงืงืจื™ื’ืŸ ืกื˜ืจืึทื˜ืขื’ื™ืข
GET_GROUPS_FROM_USER_MEMBEROF_ATTRIBUTE

ืื™ืฆื˜ ืึทื– ื“ื™ ืคืขื“ืขืจื™ื™ืฉืึทืŸ ืกืขื˜ืึทืคึผ ืื™ื– ื’ืึทื ืฅ, ืœืึธื–ืŸ ืื•ื ื“ื– ืžืึทืš ืื•ื™ืฃ ืฆื• ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขื ืงืœื™ืขื ื˜.

ืงืœื™ืขื ื˜ ืกืขื˜ืึทืคึผ

ืœืึธืžื™ืจ ืฉืึทืคึฟืŸ ืึท ื ื™ื™ึทืข ืงืœื™ืขื ื˜ (ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื•ื•ืึธืก ื•ื•ืขื˜ ื‘ืึทืงื•ืžืขืŸ ื ื™ืฆืขืจืก ืคึฟื•ืŸ Keycloak). ืœืืžื™ืจ ื•ื•ื™ื™ื˜ืขืจ ื’ื™ื™ืŸ:

ืงืœื™ื™ืึทื ืฅ -> ืžืึทื›ืŸ

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ืงืœื™ืขื ื˜ ืฉื™ื™ึทืŸ
kubernetes

ืึทืงืกืขืก ื˜ื™ืคึผ
confidenrial

ื•ื•ืึธืจืฆืœ URL
http://kubernetes.example.org/

ื’ื™ืœื˜ื™ืง ืจื™ื“ืขืจืขืงื˜ URIs
http://kubernetes.example.org/*

ืึทื“ืžื™ืŸ URL
http://kubernetes.example.org/

ืœืึธืžื™ืจ ืื•ื™ืš ืžืึทื›ืŸ ืึท ืคืึทืจื ืขื ืคึฟืึทืจ ื’ืจื•ืคึผืขืก:

ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก -> ืžืึทื›ืŸ

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ืžื•ืกื˜ืขืจ
No template

ื ืึธืžืขืŸ
groups

ื’ืึทื ืฅ ื’ืจื•ืคึผืข ื“ืจืš
false

ืื•ืŸ ืฉื˜ืขืœืŸ ืึท ืžืึทืคึผืคึผืขืจ ืคึฟืึทืจ ื–ื™ื™:

ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก -> ื’ืจื•ืคึผืขืก -> ืžืึทืคึผืคึผืขืจืก -> ืžืึทื›ืŸ

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ื ืึธืžืขืŸ
groups

ืžืึทืคึผืขืจ ื˜ื™ืคึผ
Group membership

ื˜ืึธืงืขืŸ ืคืึธื“ืขืจืŸ ื ืึธืžืขืŸ
groups

ืื™ืฆื˜ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื’ืขื‘ืŸ ืžืึทืคึผื™ื ื’ ื’ืจื•ืคึผืข ืื™ืŸ ืื•ื ื“ื–ืขืจ ืงืœื™ืขื ื˜ ืคืึทืจื ืขื:

ืงืœื™ื™ืึทื ืฅ -> kubernetes -> ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก -> ืคืขืœื™ืงื™ื™ึทื˜ ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก

ืงืœื™ื™ึทื‘ืŸ ื’ืจื•ืคึผืขืก ะฒ ื‘ื ื™ืžืฆื ืงืœื™ืขื ื˜ ืกืงืึธืคึผืขืก, ื“ืจื™ืงืŸ ืœื™ื™ื’ ืื•ื™ืกื’ืขืงืœื™ื‘ืŸ

ืื™ืฆื˜ ืœืึธื–ืŸ ืื•ื ื“ื– ืงืึทื ืคื™ื’ื™ืขืจ ื“ื™ ืึธื˜ืขื ื˜ืึทืงื™ื™ืฉืึทืŸ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ, ื’ื™ื™ืŸ ืฆื•:

ืงืœื™ื™ืึทื ืฅ -> kubernetes

ื‘ืจื™ื™ืจืข
ื•ื•ืขืจื˜

ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืขื ื™ื™ื‘ืึทืœื“
ON

ืœืืžื™ืจ ื“ืจื™ืงืŸ ืฉืคึผืึธืจืŸ ืื•ืŸ ืžื™ื˜ ื“ืขื ื“ื™ ืงืœื™ืขื ื˜ ืกืขื˜ืึทืคึผ ืื™ื– ื’ืขืขื ื“ื™ืงื˜, ืื™ืฆื˜ ืื•ื™ืฃ ื“ื™ ืงื•ื•ื™ื˜ืœ

ืงืœื™ื™ืึทื ืฅ -> kubernetes -> ืงืจืขื“ืขื ื˜ื™ืึทืœืก

ืื™ืจ ืงืขื ืขืŸ ื‘ืึทืงื•ืžืขืŸ ืกืึธื“ ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ื•ื•ื™ื™ึทื˜ืขืจ.

ืงืึทื ืคื™ื’ื™ืขืจื™ื ื’ Kubernetes

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ Kubernetes ืคึฟืึทืจ OIDC ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืื™ื– ื’ืึทื ืฅ ื ื™ืฉื˜ื™ืง ืื•ืŸ ื ื™ืฉื˜ ื–ื™ื™ืขืจ ืงืึธืžืคึผืœื™ืฆื™ืจื˜. ื›ืœ ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื˜ืึธืŸ ืื™ื– ืฉื˜ืขืœืŸ ื“ื™ 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 ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื™ืŸ ื“ืขื ืงื ื•ื™ืœ ืึทื–ื•ื™ ื ื™ืฉื˜ ืฆื• ืคืึทืจืœื™ืจืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก ื•ื•ืขืŸ ืึทืคึผื“ื™ื™ื˜ื™ื ื’:

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 ืงื ื•ื™ืœ ืžื™ื˜ ืงืึทื ืคื™ื’ื™ืขืจื“ ืึธื™ื“ืง ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ. ื“ืขืจ ื‘ืœื•ื™ื– ื–ืึทืš ืื™ื– ืึทื– ื“ื™ื™ืŸ ื™ื•ื–ืขืจื– ื”ืึธื‘ืŸ ื ื™ืฉื˜ ื ืึธืš ืึท ืงืึทื ืคื™ื’ื™ืขืจื“ ืงืœื™ืขื ื˜ ืึธื“ืขืจ ื–ื™ื™ืขืจ ืื™ื™ื’ืขื ืข kubeconfig. ืฆื• ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื, ืื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ ืึธื˜ืึทืžืึทื˜ื™ืง ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ืคื•ืŸ kubeconfig ืฆื• ื™ื•ื–ืขืจื– ื ืึธืš ืึท ื’ืขืจืึธื˜ืŸ ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ.

ืฆื• ื˜ืึธืŸ ื“ืึธืก, ืื™ืจ ืงืขื ืขืŸ ื ื•ืฆืŸ ืกืคึผืขืฆื™ืขืœ ื•ื•ืขื‘ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื– ื•ื•ืึธืก ืœืึธื–ืŸ ืื™ืจ ืฆื• ืึธื˜ืขื ื˜ืึทืงื™ื™ื˜ ื“ืขื ื‘ืึทื ื™ืฆืขืจ ืื•ืŸ ื“ืึทืŸ ืืจืืคืงืืคื™ืข ื“ื™ ืคืึทืจื˜ื™ืง kubeconfig. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืžืขืจืกื˜ ื‘ืึทืงื•ื•ืขื ืื™ื– ืงื•ื‘ืขืจืึธืก, ืขืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ืึทืœืข Kubernetes ืงืœืึทืกื˜ืขืจื– ืื™ืŸ ืื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืื•ืŸ ืœื™ื™ื›ื˜ ื‘ืึทืฉื˜ื™ืžืขืŸ ืฆื•ื•ื™ืฉืŸ ื–ื™ื™.

ืฆื• ืงืึทื ืคื™ื’ื™ืขืจ Kuberos, ื ืึธืจ ื‘ืึทืฉืจื™ื™ึทื‘ืŸ ื“ื™ ืžื•ืกื˜ืขืจ ืคึฟืึทืจ kubeconfig ืื•ืŸ ืœื•ื™ืคืŸ ืขืก ืžื™ื˜ ื“ื™ ืคืืœื’ืขื ื“ืข ืคึผืึทืจืึทืžืขื˜ืขืจืก:

kuberos https://keycloak.example.org/auth/realms/kubernetes kubernetes /cfg/secret /cfg/template

ืคึฟืึทืจ ืžืขืจ ื“ื™ื˜ื™ื™ืœื“ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื–ืขืŸ ื‘ืึทื ื™ืฅ ืื•ื™ืฃ ื’ื™ื˜ื”ื•ื‘.

ืขืก ืื™ื– ืื•ื™ืš ืžืขื’ืœืขืš ืฆื• ื ื•ืฆืŸ kubelogin ืื•ื™ื‘ ืื™ืจ ื•ื•ื™ืœืŸ ืฆื• ืึธื˜ืขืจื™ื™ื– ื’ืœื™ื™ึทืš ืื•ื™ืฃ ื“ื™ ื‘ืึทื ื™ืฆืขืจ 'ืก ืงืึธืžืคึผื™ื•ื˜ืขืจ. ืื™ืŸ ื“ืขื ืคืึทืœ, ื“ืขืจ ื‘ืึทื ื™ืฆืขืจ ื•ื•ืขื˜ ืขืคืขื ืขืŸ ืึท ื‘ืœืขื˜ืขืจืขืจ ืžื™ื˜ ืึท ื“ืขืจืœื•ื™ื‘ืขื ื™ืฉ ืคืึธืจืขื ืื•ื™ืฃ ืœืึธืงืึทืœื”ืึธืกื˜.

ื“ื™ ืจื™ื–ืึทืœื˜ื™ื ื’ kubeconfig ืงืขื ืขืŸ ื–ื™ื™ืŸ ืึธืคึผื’ืขืฉื˜ืขืœื˜ ืื•ื™ืฃ ื“ืขืจ ื•ื•ืขื‘ื–ื™ื™ื˜ืœ jwt.io. ื ืึธืจ ื ืึธื›ืžืึทื›ืŸ ื“ื™ ื•ื•ืขืจื˜ users[].user.auth-provider.config.id-token ืคื•ืŸ ื“ื™ื™ืŸ kubeconfig ืฆื• ื“ื™ ืคืึธืจืขื ืื•ื™ืฃ ื“ื™ ื•ื•ืขื‘ื–ื™ื™ื˜ืœ ืื•ืŸ ื’ืœื™ื™ืš ื‘ืึทืงื•ืžืขืŸ ืึท ื˜ืจืึทื ืกืงืจื™ืคึผื˜.

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ RBAC

ื•ื•ืขืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื ื’ RBAC, ืื™ืจ ืงืขื ืขืŸ ืึธืคึผืฉื™ืงืŸ ืฆื• ื‘ื™ื™ื“ืข ื“ื™ ื ืืžืขืŸ (ืคืขืœื“ name ืื™ืŸ ื“ื™ jwt token), ืื•ืŸ ืคึผืขืจ ื‘ืึทื ื™ืฆืขืจ ื’ืจื•ืคึผืข (ืคืขืœื“ groups ืื™ืŸ jwt token). ื“ืึธ ืื™ื– ืึท ื‘ื™ื™ืฉืคึผื™ืœ ืคื•ืŸ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืจืขื›ื˜ ืคึฟืึทืจ ืึท ื’ืจื•ืคึผืข 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 ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื‘ืึทืึทืžื˜ืขืจ Kubernetes ื“ืึทืงื™ื•ืžืขื ื˜ื™ื™ืฉืึทืŸ

ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ืึทื•ื˜-ืคึผืจืึธืงืกื™

ืขืก ืื™ื– ืึท ื•ื•ื•ื ื“ืขืจืœืขืš ืคึผืจื•ื™ืขืงื˜ ืฉืœื™ืกืœืงืœืึธืง-ื˜ื•ื™ืขืจ-ื”ื™ื˜ืขืจ, ื•ื•ืึธืก ืึทืœืึทื•ื– ืื™ืจ ืฆื• ื‘ืึทืฉื™ืฆืŸ ืงื™ื™ืŸ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ื“ื•ืจืš ืฆื•ืฉื˜ืขืœืŸ ื“ื™ ื‘ืึทื ื™ืฆืขืจ ื“ื™ ืคื™ื™ื™ืงื™ื™ื˜ ืฆื• ืึธื˜ืขื ื˜ืึทืงื™ื™ื˜ ืฆื• ื“ื™ 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=<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

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’