рд╣рд╛рдореА LDAP рдкреНрд░рд╛рдзрд┐рдХрд░рдгрд▓рд╛рдИ Kubernetes рд▓рд╛рдИ рдЬреЛрдбреНрджрдЫреМрдВ

рд╣рд╛рдореА LDAP рдкреНрд░рд╛рдзрд┐рдХрд░рдгрд▓рд╛рдИ Kubernetes рд▓рд╛рдИ рдЬреЛрдбреНрджрдЫреМрдВ

рддрдкрд╛рдЗрдБрдХреЛ LDAP рд╕рд░реНрднрд░рдорд╛ Kubernetes рдЬрдбрд╛рди рдЧрд░реНрди рд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рд░ рд╕рдореВрд╣рд╣рд░реВрдХреЛ рдЖрдпрд╛рдд рд╕реЗрдЯрдЕрдк рдЧрд░реНрди Keycloak рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗрдорд╛ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ред рдпрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рддрдкрд╛рдЗрдБрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ RBAC рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рд░ Kubernetes Dashboard рд░ рдЖрдлреВрд▓рд╛рдИ рдХрд╕рд░реА рдЕрдзрд┐рдХреГрдд рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдерд╛рд╣рд╛ рдирднрдПрдХрд╛ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрд▓рд╛рдИ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди рдкреНрд░рдорд╛рдгреАрдХрд░рдг-рдкреНрд░реЛрдХреНрд╕реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреЗрдЫред

рдХреАрдХреНрд▓реЛрдХ рд╕реНрдерд╛рдкрдирд╛

рдорд╛рдиреМрдВ рдХрд┐ рддрдкрд╛рдИрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ LDAP рд╕рд░реНрднрд░ рдЫред рдпреЛ рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛, FreeIPA, OpenLDAP, рд╡рд╛ рдЬреЗ рдкрдирд┐ рд╣реБрди рд╕рдХреНрдЫред рдпрджрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ LDAP рд╕рд░реНрднрд░ рдЫреИрди рднрдиреЗ, рддреНрдпрд╕реЛрднрдП рд╕рд┐рджреНрдзрд╛рдиреНрддрдорд╛ рддрдкрд╛рдЗрдБ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд╕реАрдзрд╛ Keycloak рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рд╡рд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ oidc рдкреНрд░рджрд╛рдпрдХрд╣рд░реВ (Google, Github, Gitlab) рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдкрд░рд┐рдгрд╛рдо рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реБрдиреЗрдЫред

рд╕рдмреИрднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдХрд┐рдХреНрд▓реЛрдХ рдЖрдлреИрдВ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реМрдВ, рд╕реНрдерд╛рдкрдирд╛ рдЫреБрдЯреНрдЯреИ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рд╡рд╛ рд╕рд┐рдзреИ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рдорд╛, рдирд┐рдпрдордХреЛ рд░реВрдкрдорд╛, рдпрджрд┐ рддрдкрд╛рдИрдВрд╕рдБрдЧ рдзреЗрд░реИ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВ рдЫрдиреН рднрдиреЗ, рдпрд╕рд▓рд╛рдИ рдЫреБрдЯреНрдЯреИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрди рд╕рдЬрд┐рд▓реЛ рд╣реБрдиреЗрдЫред рдЕрд░реНрдХреЛрддрд░реНрдл, рддрдкрд╛рдИрдВ рд╕рдзреИрдВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рд░ рдпрд╕рд▓рд╛рдИ рд╕рд┐рдзреИ рдЖрдлреНрдиреЛ рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реНред

Keycloak рдбрд╛рдЯрд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓рд╛рдИ рдбрд╛рдЯрд╛рдмреЗрд╕ рдЪрд╛рд╣рд┐рдиреНрдЫред рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЫ h2 (рд╕рдмреИ рдбрд╛рдЯрд╛ рд╕реНрдерд╛рдиреАрдп рд░реВрдкрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░рд┐рдПрдХреЛ рдЫ), рддрд░ рдпреЛ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ postgres, mysql рд╡рд╛ mariadb.
рдпрджрд┐ рддрдкрд╛рдЗрдБ рдЕрдЭреИ рдкрдирд┐ Keycloak рдЫреБрдЯреНрдЯреИ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдирд┐рд░реНрдгрдп рдЧрд░реНрдиреБрд╣реБрдиреНрдЫ рднрдиреЗ, рддрдкрд╛рдЗрдБ рдорд╛ рдердк рд╡рд┐рд╕реНрддреГрдд рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдкрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ.

рдорд╣рд╛рд╕рдВрдШ рд╕реНрдерд╛рдкрдирд╛

рд╕рдмреИрднрдиреНрджрд╛ рдкрд╣рд┐рд▓реЗ, рдирдпрд╛рдБ рдХреНрд╖реЗрддреНрд░ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВред рдХреНрд╖реЗрддреНрд░ рд╣рд╛рдореНрд░реЛ рдЖрд╡реЗрджрди рдХреЛ рдард╛рдЙрдБ рд╣реЛред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдлрд░рдХ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕реЗрдЯрд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдЖрдлреНрдиреИ рджрд╛рдпрд░рд╛ рд╣реБрди рд╕рдХреНрдЫред рдорд╛рд╕реНрдЯрд░ рдХреНрд╖реЗрддреНрд░ рдХрд┐рдХреНрд▓реЛрдХ рдЖрдлреИрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХреЛ рдЫ рд░ рдпрд╕рд▓рд╛рдИ рдЕрд░реВ рдХреЗрд╣рд┐рдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рдЧрд▓рдд рд╣реЛред

Push рдХреНрд╖реЗрддреНрд░ рдердкреНрдиреБрд╣реЛрд╕реН

рд╡рд┐рдХрд▓реНрдк
рдореВрд▓реНрдп

рдирд╛рдо
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

рдХрд░реНрдмреЗрд░реЛрд╕ рдХреНрд╖реЗрддреНрд░:
EXAMPLE.ORG

рд╕рд░реНрднрд░ рдкреНрд░рд┐рдиреНрд╕рд┐рдкрд▓:
HTTP/[email protected]

рдХреБрдЮреНрдЬреА рдЯреНрдпрд╛рдм:
/etc/krb5.keytab

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ keycloak-svc рд╣рд╛рдореНрд░реЛ LDAP рд╕рд░реНрднрд░рдорд╛ рдЕрдЧреНрд░рд┐рдо рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред

рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╛рдорд▓рд╛ рдорд╛, рдмрд╕ рдЪрдпрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╡рд┐рдХреНрд░реЗрддрд╛: рд╕рдХреНрд░рд┐рдп рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд░ рдЖрд╡рд╢реНрдпрдХ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдлрд╛рд░рдордорд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рдореНрдорд┐рд▓рд┐рдд рд╣реБрдиреЗрдЫрдиреНред

Push рдмрдЪрдд

рдЕрдм рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВ:

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдорд╣рд╛рд╕рдВрдШ -> 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

рдпрд╕рд▓реЗ рдорд╣рд╛рд╕рдВрдШ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдЧрд░реНрджрдЫ, рдЧреНрд░рд╛рд╣рдХ рд╕реЗрдЯрдЕрдк рдЧрд░реНрди рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВред

рдЧреНрд░рд╛рд╣рдХ рд╕реЗрдЯрдЕрдк

рдПрдЙрдЯрд╛ рдирдпрд╛рдБ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ (рдХрд┐рдХреНрд▓реЛрдХрдмрд╛рдЯ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ)ред рдЬрд╛рдФрдВ:

рдЧреНрд░рд╛рд╣рдХрд╣рд░реБ -> рд╕рд┐рд░реНрдЬрдирд╛

рд╡рд┐рдХрд▓реНрдк
рдореВрд▓реНрдп

рдЧреНрд░рд╛рд╣рдХ рдЖрдИрдбреА
kubernetes

рдкрд╣реБрдБрдЪ рдкреНрд░рдХрд╛рд░
confidenrial

рдореВрд▓ рдпреБрдЖрд░рдПрд▓
http://kubernetes.example.org/

рд╡реИрдз рд░рд┐рдбрд┐рд░реЗрдХреНрдЯ URI рд╣рд░реВ
http://kubernetes.example.org/*

рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ URL
http://kubernetes.example.org/

рд╣рд╛рдореА рд╕рдореВрд╣рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рджрд╛рдпрд░рд╛ рдкрдирд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗрдЫреМрдВ:

рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛ -> рд╕рд┐рд░реНрдЬрдирд╛

рд╡рд┐рдХрд▓реНрдк
рдореВрд▓реНрдп

рдЯреЗрдореНрдкрд▓реЗрдЯ
No template

рдирд╛рдо
groups

рдкреВрд░реНрдг рд╕рдореВрд╣ рдорд╛рд░реНрдЧ
false

рд░ рддрд┐рдиреАрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ рдореНрдпрд╛рдкрд░ рд╕реЗрдЯ рдЕрдк рдЧрд░реНрдиреБрд╣реЛрд╕реН:

рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛ -> рд╕рдореВрд╣ -> рдореНрдпрд╛рдкрд░рд╣рд░реВ -> рд╕рд┐рд░реНрдЬрдирд╛

рд╡рд┐рдХрд▓реНрдк
рдореВрд▓реНрдп

рдирд╛рдо
groups

рдореНрдпрд╛рдкрд░ рдкреНрд░рдХрд╛рд░
Group membership

рдЯреЛрдХрди рджрд╛рд╡реА рдирд╛рдо
groups

рдЕрдм рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛рдорд╛ рд╕рдореВрд╣ рдореНрдпрд╛рдкрд┐рдЩ рд╕рдХреНрд╖рдо рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:

рдЧреНрд░рд╛рд╣рдХрд╣рд░реБ -> рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ -> рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛ -> рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛

рдЫрдиреМрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕рдореВрд╣ ╨▓ рдЙрдкрд▓рдмреНрдз рдЧреНрд░рд╛рд╣рдХ рджрд╛рдпрд░рд╛рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рдердкреНрдиреБрд╣реЛрд╕реН

рдЕрдм рд╣рд╛рдореНрд░реЛ рдЖрд╡реЗрджрди рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рд╕реЗрдЯ рдЕрдк рдЧрд░реМрдВ, рдЬрд╛рдиреБрд╣реЛрд╕реН:

рдЧреНрд░рд╛рд╣рдХрд╣рд░реБ -> рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕

рд╡рд┐рдХрд▓реНрдк
рдореВрд▓реНрдп

рдкреНрд░рд╛рдзрд┐рдХрд░рдг рд╕рдХреНрд╖рдо рдЧрд░рд┐рдпреЛ
ON

рдзрдХреЗрд▓реМрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░ рдпрд╕рд▓реЗ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдЧрд░реНрджрдЫ, рдЕрдм рдЯреНрдпрд╛рдмрдорд╛

рдЧреНрд░рд╛рд╣рдХрд╣рд░реБ -> рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ -> рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╣рд░реВ

рддрдкрд╛рдИрдВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЧреЛрдкреНрдп рдЬреБрди рд╣рд╛рдореА рдкрдЫрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред

Kubernetes рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрджреИ

OIDC рдкреНрд░рд╛рдзрд┐рдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ 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 рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВрдорд╛ рдпреА рдЪрд░рдгрд╣рд░реВ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдкреНрд░рд╛рд░рдореНрднрд┐рдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг

рдпреА рдЪрд░рдгрд╣рд░реВ рдкрдЫрд┐, рддрдкрд╛рдИрдВрд╕рдБрдЧ рдкрд╣рд┐рд▓реЗ рдиреИ OIDC рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдХреБрдмрд░реНрдиреЗрдЯреНрд╕ рдХреНрд▓рд╕реНрдЯрд░ рд╣реБрдиреЗрдЫред рдПрдХ рдорд╛рддреНрд░ рдмрд┐рдиреНрджреБ рдпреЛ рд╣реЛ рдХрд┐ рддрдкрд╛рдЗрдБрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд╕рдБрдЧ рдЕрдЭреИ рдкрдирд┐ рдЧреНрд░рд╛рд╣рдХ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рдЫреИрди, рд╕рд╛рдереИ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдЖрдлреНрдиреИ kubeconfigред рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рд╕рдлрд▓ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрдЫрд┐ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓рд╛рдИ kubeconfig рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рд░реА рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред

рдпреЛ рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБ рд╡рд┐рд╢реЗрд╖ рд╡реЗрдм рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЧрд░реНрди рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╕рдорд╛рдкреНрдд kubeconfig рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рд╕рдмреИрднрдиреНрджрд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдордзреНрдпреЗ рдПрдХ рд╣реЛ рдХреБрдмреЗрд░реЛрд╕, рдпрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рдПрдХ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╕рдмреИ Kubernetes рдХреНрд▓рд╕реНрдЯрд░рд╣рд░реВ рд╡рд░реНрдгрди рдЧрд░реНрди рд░ рддрд┐рдиреАрд╣рд░реВ рдмреАрдЪ рд╕рдЬрд┐рд▓реИрд╕рдБрдЧ рд╕реНрд╡рд┐рдЪ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

Kuberos рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди, рдпреЛ kubeconfig рдХреЛ рд▓рд╛рдЧрд┐ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╡рд░реНрдгрди рдЧрд░реНрди рд░ рдирд┐рдореНрди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдЪрд▓рд╛рдЙрди рдкрд░реНрдпрд╛рдкреНрдд рдЫ:

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

рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН рдЙрдкрдпреЛрдЧ Github рдорд╛ред

рдпреЛ рдкрдирд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ kubelogin рдпрджрд┐ рддрдкрд╛рдЗрдБ рд╕реАрдзреИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдХрдореНрдкреНрдпреБрдЯрд░рдорд╛ рдЕрдзрд┐рдХреГрдд рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ рднрдиреЗред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓реЗ рд╕реНрдерд╛рдиреАрдп рд╣реЛрд╕реНрдЯрдорд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╛рд░рдордХреЛ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд░ рдЦреЛрд▓реНрдиреЗрдЫред

рдкрд░рд┐рдгрд╛рдо kubeconfig рд╕рд╛рдЗрдЯ рдорд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ jwt.ioред рдХреЗрд╡рд▓ рдорд╛рди рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН 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 рдХреЛ рд▓рд╛рдЧрд┐ рдердк рдЙрджрд╛рд╣рд░рдгрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ 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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди