ααΆαααααααααΌα αα½αα’αααΈααααααααΎ Keycloak ααΎααααΈααααΆαα Kubernetes αα ααΆαααααΆαααΈααα LDAP ααααα’ααα α αΎααααα αααΆαααΆαα αΌαα’αααααααΎααααΆαα αα·ααααα»αα ααΆααΉαα’αα»ααααΆαα±ααα’αααααα‘αΎα RBAC αααααΆααα’αααααααΎααααΆααααααα’ααα αα·αααααΎααααΌααααΈαααααααααΆααααΆαααααΉαααααΌαααΎααααΈααΆαααΆα Kubernetes Dashboard αα·ααααααα·ααΈααααααααααααα·αααΉαααΈααααααααααα·αααα·α±αααααα½αα―αα
ααΆαααα‘αΎααα
α§αααΆααΆα’αααααΆααααΆαααΈααα 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α
αα·ααΆαααΆαα’αα·αα·αα -> α’ααΈααα -> α’αααααααΎαααααΈ -> ααΆααααααααααΆααα’ααΈααα (αα»α)
α₯α‘αΌαβααΎαβαααααΎαβαα αααααβαααααΆααβααΏαβαααβααΎαβαα α
αα αααααα’αααααααΎααααΆαα -> ααααααα’ααααααααααααΆ... -> α‘αΆααΆαα
αααααΊααΆα§ααΆα αααααααΆαααα‘αΎα 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 ααααΆααααααααΎαααΎα α’ααααααα ααααααα α αΎαααΆααααααα αΆαααΆα αααΉαααααΌαααΆααααα αΌααα αααα»ααααααααααααααααααααααα·α
αααα»α 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
α₯α‘αΌαααα ααΎαααααΌαααΎαααΆαααΌααααααΈαααα»ααα αααα»ααα·ααΆαααΆαα’αα·αα·ααααααααΎαα
α’αα·αα·αα -> Kubernetes -> αα·ααΆαααΆαα’αα·αα·αα -> αα·ααΆαααΆαα’αα·αα·ααααααΆαααΎα
ααααΎαααΎα αααα»α Π² αα·ααΆαααΆαα’αα·αα·αααααααΆαα α»α αααααααααααΆαααααΎαααΎα
α₯α‘αΌαααα α αΌαααΎααααα αααΆααααααααααΆαααααααα·ααΈααααααΎα ααΌαα αΌααα ααΆααα
α’αα·αα·αα -> Kubernetes
αααααΎα
ααααα
ααΆαααΎαααΆαα’αα»ααααΆα
ON
α αΌαααΎααα»α αααααΆαα»αααΆα α αΎαααΆαααα ααααΆαααα‘αΎααααΆαααΈαααααα α₯α‘αΌαααααα ααΎααααΆαα
α’αα·αα·αα -> Kubernetes -> αα·αα·ααααααΆαα
α’αααβα’αΆα βααα½αβααΆα ααΆααααααΆαα αααααΎαααΉαααααΎαα ααααααααα
ααααααα ααΆαααααααα Kubernetes
ααΆαααα‘αΎα Kubernetes αααααΆααααΆαα’αα»ααααΆαααΈ OIDC ααΊαα·αααΆααΏαααΌα
ααΆα
αα·ααα·ααααααΆα’αααΈααααααα»αααααΆαααααΆαααααααα α’αααΈαααα’αααααααΌαααααΎααΊααΆαααα·ααααΆαααααα CA αααααΆαααΈααα ODC ααααα’αααα /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 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 α’αΆα
ααααΆααα
αααα»α
ααΆααααααα’ααααααααΆαααααΌααααΈ
ααΆαααααααααα’ααα
αΆααααα½αα
ααααΆααααααααααα-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