ãã®ããŒãžã«èšèŒãããŠããæ å ±ã¯å€ãå¯èœæ§ããããŸã
ãã®ããŒãžã®æŽæ°æ¥ã¯è±èªçãããå€ããããèšèŒãããŠããæ å ±ãå€ãå¯èœæ§ããããŸããææ°ã®æ å ±ãã芧ã«ãªãããæ¹ã¯è±èªçã®ããŒãžãã芧ãã ãã: Authenticating
èªèšŒ
ãã®ããŒãžã§ã¯ãèªèšŒã®æŠèŠã«ã€ããŠèª¬æããŸãã
Kubernetesã«ããããŠãŒã¶ãŒ
ãã¹ãŠã®Kubernetesã¯ã©ã¹ã¿ãŒã«ã¯ã2çš®é¡ã®ãŠãŒã¶ãŒããããŸããKubernetesã«ãã£ãŠç®¡çããããµãŒãã¹ã¢ã«ãŠã³ããšãéåžžã®ãŠãŒã¶ãŒã§ãã
ã¯ã©ã¹ã¿ãŒããç¬ç«ãããµãŒãã¹ã¯éåžžã®ãŠãŒã¶ãŒã以äžã®æ¹æ³ã§ç®¡çããããšãæ³å®ãããŠããŸãã
- ç§å¯éµãé åžãã管çè
- KeystoneãGoogle Accountsã®ãããªãŠãŒã¶ãŒã¹ãã¢
- ãŠãŒã¶ãŒåãšãã¹ã¯ãŒãã®ãªã¹ããæã€ãã¡ã€ã«
ãããèæ ®ãããšã Kubernetesã¯éåžžã®ãŠãŒã¶ãŒã¢ã«ãŠã³ãã衚ããªããžã§ã¯ããæã¡ãŸããã APIã³ãŒã«ãä»ããŠãéåžžã®ãŠãŒã¶ãŒãã¯ã©ã¹ã¿ãŒã«è¿œå ããããšã¯ã§ããŸããã
APIã³ãŒã«ãä»ããŠéåžžã®ãŠãŒã¶ãŒã远å ã§ããŸããããã¯ã©ã¹ã¿ãŒã®èªèšŒå±(CA)ã«çœ²åãããæå¹ãªèšŒææžã§è¡šããŠãŒã¶ãŒã¯èªèšŒæžã¿ãšå€æãããŸãããã®æ§æã§ã¯ãKubernetesã¯èšŒææžã®âsubjectâå ã«ããäžè¬çãªååãã£ãŒã«ã(äŸãã°ãâ/CN=bobâ)ãããŠãŒã¶ãŒåãç¹å®ããŸãããããããããŒã«ããŒã¹ã¢ã¯ã»ã¹å¶åŸ¡(RBAC)ãµãã·ã¹ãã ã¯ããŠãŒã¶ãŒããããªãœãŒã¹ã«ãããç¹å®ã®æäœãå®è¡ããããã«èªèšŒæžã¿ãã©ããç¹å®ããŸãã詳现ã¯ã èšŒææžèŠæ±å ã®éåžžã®ãŠãŒã¶ãŒã®é¡ç®ãåç §ããŠãã ããã
察ç
§çã«ããµãŒãã¹ã¢ã«ãŠã³ãã¯Kubernetes APIã«ãã£ãŠç®¡çããããŠãŒã¶ãŒã§ãããµãŒãã¹ã¢ã«ãŠã³ãã¯ç¹å®ã®åå空éã«ãã€ã³ããããŠãããAPIãµãŒããŒã«ãã£ãŠèªåçã«äœæãããããAPIã³ãŒã«ã«ãã£ãŠæåã§äœæãããŸãããµãŒãã¹ã¢ã«ãŠã³ãã¯ãSecrets
ãšããŠä¿åãããè³æ Œæ
å ±ã®éåã«çŽä»ããããŠããŸãããããPodã«ããŠã³ãããããšã§ãã¯ã©ã¹ã¿ãŒå
ã®ããã»ã¹ãKubernetes APIãšéä¿¡ã§ããããã«ããŸãã
APIãªã¯ãšã¹ãã¯ãéåžžã®ãŠãŒã¶ãŒããµãŒãã¹ã¢ã«ãŠã³ãã«çŽä»ããããŠããããå¿åãªã¯ãšã¹ããšããŠæ±ãããŸããã€ãŸããã¯ãŒã¯ã¹ããŒã·ã§ã³ã§kubectl
ãå
¥åãã人éã®ãŠãŒã¶ãŒãããããŒãäžã®kubelets
ãã³ã³ãããŒã«ãã¬ãŒã³ã®ã¡ã³ããŒãŸã§ãã¯ã©ã¹ã¿ãŒå
å€ã®å
šãŠã®ããã»ã¹ã¯ãAPIãµãŒããŒãžã®ãªã¯ãšã¹ããè¡ãéã«èªèšŒãè¡ããå¿åãŠãŒã¶ãŒãšããŠæ±ãããå¿
èŠããããŸãã
èªèšŒæŠç¥
Kubernetesã¯ãã¯ã©ã€ã¢ã³ãèšŒææžãBearerããŒã¯ã³ãèªèšŒãããã·ãHTTP BasicèªèšŒã䜿ããèªèšŒãã©ã°ã€ã³ãéããŠAPIãªã¯ãšã¹ããèªèšŒããŸããAPIãµãŒããŒã«HTTPãªã¯ãšã¹ããéä¿¡ããããšããã©ã°ã€ã³ã¯ä»¥äžã®å±æ§ããªã¯ãšã¹ãã«é¢é£ä»ããããšããŸãã
- ãŠãŒã¶ãŒå: ãšã³ããŠãŒã¶ãŒãèå¥ããæååã§ããäžè¬çã«ãªå€ã¯ã
kube-admin
ãjane@example.com
ã§ãã - UID: ãšã³ããŠãŒã¶ãŒãèå¥ããæååã§ããããŠãŒã¶ãŒåãããäžè²«æ§ãšäžææ§ãæãããããšãããã®ã§ãã
- ã°ã«ãŒã: åèŠçŽ ããŠãŒã¶ãŒã®åœ¹å²ã瀺ããããªæå³ãæã€æååã®éåã§ãã
system:masters
ãdevops-team
ãšãã£ãå€ãäžè¬çã§ãã - 远å ãã£ãŒã«ã: èªèšŒè ãæçšãšæãããè¿œå æ å ±ãä¿æããæååã®ãªã¹ãã«å¯Ÿãããæååã®ãããã§ãã
ãã¹ãŠã®å€ã¯èªèšŒã·ã¹ãã ã«å¯ŸããŠéééã§ãããèªå¯æ©èœãè§£éããå Žåã«ã®ã¿æå³ãæã¡ãŸãã
äžåºŠã«è€æ°ã®èªèšŒæ¹æ³ãæå¹ã«ããããšãã§ããŸããéåžžã¯ã以äžã®ããã«å°ãªããšã2ã€ã®æ¹æ³ã䜿çšããã¹ãã§ãã
- ãµãŒãã¹ã¢ã«ãŠã³ãçšã®ãµãŒãã¹ã¢ã«ãŠã³ãããŒã¯ã³
- ãŠãŒã¶ãŒèªèšŒã®ããã®ãå°ãªããšã1ã€ã®ä»ã®æ¹æ³
è€æ°ã®èªèšŒã¢ãžã¥ãŒã«ãæå¹åãããŠããå Žåããªã¯ãšã¹ãã®èªèšŒã«æåããæåã®ã¢ãžã¥ãŒã«ããè©äŸ¡ãç°¡ç¥åããŸããAPIãµãŒããŒã¯ãèªèšŒã®å®è¡é åºãä¿èšŒããŸããã
system:authenticated
ã°ã«ãŒãã«ã¯ããã¹ãŠã®èªèšŒæžã¿ãŠãŒã¶ãŒã®ã°ã«ãŒãã®ãªã¹ããå«ãŸããŸãã
ä»ã®èªèšŒãããã³ã«(LDAPãSAMLãKerberosãX509ã¹ããŒã ãªã©)ãšã®çµ±åã¯ãèªèšŒãããã·ãèªèšŒWebhookã䜿çšããŠå®æœã§ããŸãã
X509ã¯ã©ã€ã¢ã³ãèšŒææž
ã¯ã©ã€ã¢ã³ãèšŒææžèªèšŒã¯ãAPIãµãŒããŒã«--client-ca-file=SOMEFILE
ãªãã·ã§ã³ãæž¡ãããšã§æå¹ã«ãªããŸããåç
§ããããã¡ã€ã«ã«ã¯ãAPIãµãŒããŒã«æç€ºãããã¯ã©ã€ã¢ã³ãèšŒææžãæ€èšŒããããã«äœ¿çšãã1ã€ä»¥äžã®èªèšŒå±ãå«ãŸããŠããå¿
èŠããããŸããã¯ã©ã€ã¢ã³ãèšŒææžãæç€ºãããæ€èšŒãããå Žåããµããžã§ã¯ãã®Common Nameããªã¯ãšã¹ãã®ãŠãŒã¶ãŒåãšããŠäœ¿çšãããŸããKubernetes1.4æç¹ã§ã¯ãã¯ã©ã€ã¢ã³ãèšŒææžã¯ãèšŒææžã®Organizationãã£ãŒã«ãã䜿çšããŠããŠãŒã¶ãŒã®ã°ã«ãŒãã¡ã³ããŒã·ããã瀺ãããšãã§ããŸãããããŠãŒã¶ãŒã«å¯ŸããŠè€æ°ã®ã°ã«ãŒãã¡ã³ããŒã·ãããå«ããã«ã¯ãèšŒææžã«è€æ°ã®Organizationãã£ãŒã«ããå«ããŸãã
äŸãã°ãèšŒææžçœ²åèŠæ±ãçæããããã«ãopenssl
ã³ãã³ãã©ã€ã³ããŒã«ã䜿çšããŸãã
openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2"
ããã«ããã"app1"ãš"app2"ã®2ã€ã®ã°ã«ãŒãã«å±ãããŠãŒã¶ãŒå"jbeda"ã®èšŒææžçœ²åèŠæ±ãäœæãããŸãã
ã¯ã©ã€ã¢ã³ãèšŒææžã®çææ¹æ³ã«ã€ããŠã¯ãèšŒææžã®ç®¡çãåç §ããŠãã ããã
éçãªããŒã¯ã³ãã¡ã€ã«
ã³ãã³ãã©ã€ã³ã§--token-auth-file=SOMEFILE
ãªãã·ã§ã³ãæå®ãããšãAPIãµãŒããŒã¯ãã¡ã€ã«ããBearerããŒã¯ã³ãèªã¿èŸŒã¿ãŸããçŸåšã®ãšãããããŒã¯ã³ã®æå¹æéã¯ç¡ããAPIãµãŒããŒãåèµ·åããªãéãããŒã¯ã³ã®ãªã¹ãã倿Žããããšã¯ã§ããŸããã
ããŒã¯ã³ãã¡ã€ã«ã¯ãããŒã¯ã³ããŠãŒã¶ãŒåããŠãŒã¶ãŒUIDã®å°ãªããšã3ã€ã®åãæã€csvãã¡ã€ã«ã§ããã®åŸã«ãªãã·ã§ã³ã§ã°ã«ãŒãåãä»ããŸãã
åè:
è€æ°ã®ã°ã«ãŒããããå Žåã¯ããã«ã¯ã©ãŒãã§å²ãå¿ èŠããããŸãã
token,user,uid,"group1,group2,group3"
ãªã¯ãšã¹ãã«BearerããŒã¯ã³ãå«ãã
HTTPã¯ã©ã€ã¢ã³ãããBearerããŒã¯ã³èªèšŒãå©çšããå ŽåãAPIãµãŒããŒã¯Bearer THETOKEN
ãšããå€ãæã€Authorization
ããããŒãåŸ
ã¡åããŸããBearerããŒã¯ã³ã¯ãHTTPã®ãšã³ã³ãŒãã£ã³ã°ãšã¯ã©ãŒãæ©èœãå©çšããŠHTTPããããŒã®å€ã«å
¥ããããšãã§ããæååã§ãªããã°ãªããŸãããäŸãã°ãBearerããŒã¯ã³ã31ada4fd-adec-460c-809a-9e56ceb75269
ã§ããã°ãHTTPã®ãããã以äžã®ããã«ããŸãã
Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269
ããŒãã¹ãã©ããããŒã¯ã³
Kubernetes v1.18 [stable]
æ°ããã¯ã©ã¹ã¿ãŒã®å¹ççãªããŒãã¹ãã©ãããå¯èœã«ããããã«ãKubernetesã«ã¯ããŒãã¹ãã©ããããŒã¯ã³ãšåŒã°ããåçã«ç®¡çãããBearerããŒã¯ã³ã¿ã€ããå«ãŸããŠããŸãããããã®ããŒã¯ã³ã¯ãkube-system
åå空éã«SecretsãšããŠæ ŒçŽãããåçã«ç®¡çãããäœæãããããããšãã§ããŸããã³ã³ãããŒã©ãŒãããŒãžã£ãŒã«ã¯ãTokenCleanerã³ã³ãããŒã©ãŒãå«ãŸããŠãããããŒãã¹ãã©ããããŒã¯ã³ã®æå¹æéãåãããšåé€ããŸãã
ããŒã¯ã³ã®åœ¢åŒã¯[a-z0-9]{6}.[a-z0-9]{16}
ã§ããæåã®ã³ã³ããŒãã³ãã¯ããŒã¯ã³IDã§ããã第2ã®ã³ã³ããŒãã³ãã¯Token Secretã§ãã以äžã®ããã«ãããŒã¯ã³ãHTTPããããŒã«æå®ããŸãã
Authorization: Bearer 781292.db7bc3a58fc5f07e
APIãµãŒããŒã®--enable-bootstrap-token-auth
ãã©ã°ã§ãBootstrap Token Authenticatorãæå¹ã«ããå¿
èŠããããŸããTokenCleanerã³ã³ãããŒã©ãŒãæå¹ã«ããã«ã¯ãã³ã³ãããŒã©ãŒãããŒãžã£ãŒã®--controllers
ãã©ã°ã䜿ããŸãã--controllers=*,tokencleaner
ã®ããã«ããŠè¡ããŸããã¯ã©ã¹ã¿ãŒãããŒãã¹ãã©ããããããã«kubeadm
ã䜿çšããŠããå Žåã¯ãkubeadm
ãããã代è¡ããŠãããŸãã
èªèšŒæ©èœã¯system:bootstrap:<Token ID>
ãšããååã§èªèšŒããŸããããã¯system:bootstrappers
ã°ã«ãŒãã«å«ãŸããŸããååãšã°ã«ãŒãã¯æå³çã«å¶éãããŠããããŠãŒã¶ãŒãããŒãã¹ãã©ããåŸã«ãããã®ããŒã¯ã³ã䜿ããªãããã«ããŠããŸãããŠãŒã¶ãŒåãšã°ã«ãŒãã¯ãã¯ã©ã¹ã¿ãŒã®ããŒãã¹ãã©ããããµããŒãããé©åãªèªå¯ããªã·ãŒãäœæããããã«äœ¿çšãããkubeadm
ã«ãã£ãŠäœ¿çšãããŸãã
ããŒãã¹ãã©ããããŒã¯ã³ã®èªèšŒæ©èœãã³ã³ãããŒã©ãŒã«ã€ããŠã®è©³çްãªèª¬æãkubeadm
ã§ãããã®ããŒã¯ã³ã管çããæ¹æ³ã«ã€ããŠã¯ãããŒãã¹ãã©ããããŒã¯ã³ãåç
§ããŠãã ããã
ãµãŒãã¹ã¢ã«ãŠã³ãããŒã¯ã³
ãµãŒãã¹ã¢ã«ãŠã³ãã¯ãèªåçã«æå¹åãããèªèšŒæ©èœã§ã眲åãããBearerããŒã¯ã³ã䜿ã£ãŠãªã¯ãšã¹ããæ€èšŒããŸãããã®ãã©ã°ã€ã³ã¯ããªãã·ã§ã³ãšããŠ2ã€ã®ãã©ã°ãåããŸãã
--service-account-key-file
: BearerããŒã¯ã³ã«çœ²åããããã®PEMãšã³ã³ãŒããããéµãå«ããã¡ã€ã«ã§ããæå®ããªãå Žåã¯ãAPIãµãŒããŒã®TLSç§å¯éµã䜿ãããŸãã--service-account-lookup
: æå¹ã«ãããšãAPIããåé€ãããããŒã¯ã³ã¯åãæ¶ãããŸãã
ãµãŒãã¹ã¢ã«ãŠã³ãã¯éåžžãAPIãµãŒããŒã«ãã£ãŠèªåçã«äœæãããServiceAccount
Admission Controllerãä»ããŠã¯ã©ã¹ã¿ãŒå
ã®Podã«é¢é£ä»ããããŸããBearerããŒã¯ã³ã¯ãPodã®ããç¥ãããå Žæã«ããŠã³ããããããã«ããã¯ã©ã¹ã¿ãŒå
ã®ããã»ã¹ãAPIãµãŒããŒéä¿¡ã§ããããã«ãªããŸããã¢ã«ãŠã³ãã¯PodSpec
ã®serviceAccountName
ãã£ãŒã«ãã䜿ã£ãŠãæç€ºçã«Podã«é¢é£ä»ããããšãã§ããŸãã
åè:
èªåã§è¡ããããããéåžžserviceAccountName
ã¯çç¥ããŸããapiVersion: apps/v1 # ãã®apiVersionã¯ãKubernetes1.9æç¹ã§é©åã§ã
kind: Deployment
metadata:
name: nginx-deployment
namespace: default
spec:
replicas: 3
template:
metadata:
# ...
spec:
serviceAccountName: bob-the-bot
containers:
- name: nginx
image: nginx:1.14.2
ãµãŒãã¹ã¢ã«ãŠã³ãã®BearerããŒã¯ã³ã¯ãã¯ã©ã¹ã¿ãŒå€ã§äœ¿çšããããã«å®å
šã«æå¹ã§ãããKubernetes APIãšéä¿¡ãããé·æçãªãžã§ãã®ã¢ã€ãã³ãã£ãã£ãäœæããããã«äœ¿çšããããšãã§ããŸãããµãŒãã¹ã¢ã«ãŠã³ããæåã§äœæããã«ã¯ãåã«kubectl create serviceaccount (NAME)
ã³ãã³ãã䜿çšããŸããããã«ãããçŸåšã®åå空éã«ãµãŒãã¹ã¢ã«ãŠã³ããšé¢é£ããSecretãäœæãããŸãã
kubectl create serviceaccount jenkins
serviceaccount "jenkins" created
以äžã®ããã«ãé¢é£ããSecretã確èªã§ããŸãã
kubectl get serviceaccounts jenkins -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
# ...
secrets:
- name: jenkins-token-1yvwg
äœæãããSecretã¯ãAPIãµãŒããŒã®ãããªãã¯èªèšŒå±ãšçœ²åãããJSON Web Token(JWT)ãä¿æããŸãã
kubectl get secret jenkins-token-1yvwg -o yaml
apiVersion: v1
data:
ca.crt: (base64ã§ãšã³ã³ãŒããããAPIãµãŒããŒã®èªèšŒå±)
namespace: ZGVmYXVsdA==
token: (base64ã§ãšã³ã³ãŒããããBearerããŒã¯ã³)
kind: Secret
metadata:
# ...
type: kubernetes.io/service-account-token
åè:
Secretã¯åžžã«base64ã§ãšã³ã³ãŒããããããããããã®å€ãbase64ã§ãšã³ã³ãŒããããŠããŸãã眲åãããJWTã¯ãäžãããããµãŒãã¹ã¢ã«ãŠã³ããšããŠèªèšŒããããã®BearerããŒã¯ã³ãšããŠäœ¿çšã§ããŸããããŒã¯ã³ããªã¯ãšã¹ãã«å«ããæ¹æ³ã«ã€ããŠã¯ããªã¯ãšã¹ãã«BearerããŒã¯ã³ãå«ãããåç §ããŠãã ãããéåžžããããã®Secretã¯APIãµãŒããŒãžã®ã¯ã©ã¹ã¿ãŒå ã¢ã¯ã»ã¹çšã«Podã«ããŠã³ããããŸãããã¯ã©ã¹ã¿ãŒå€ããã䜿çšããããšãã§ããŸãã
ãµãŒãã¹ã¢ã«ãŠã³ãã¯ããŠãŒã¶ãŒåsystem:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)
ã§èªèšŒãããã°ã«ãŒãsystem:serviceaccounts
ãšsystem:serviceaccounts:(NAMESPACE)
ã«å²ãåœãŠãããŸãã
èŠå: ãµãŒãã¹ã¢ã«ãŠã³ãããŒã¯ã³ã¯Secretã«ä¿æãããŠãããããSecretã«ã¢ã¯ã»ã¹ã§ãããŠãŒã¶ãŒã¯èª°ã§ããµãŒãã¹ã¢ã«ãŠã³ããšããŠèªèšŒããããšãã§ããŸãããµãŒãã¹ã¢ã«ãŠã³ãã«æš©éãä»äžããããSecretã®èªã¿åãæ©èœãä»äžãããããéã«ã¯æ³šæãå¿ èŠã§ãã
OpenID ConnectããŒã¯ã³
OpenID Connectã¯ãAzure Active DirectoryãSalesforceãGoogleãªã©ãããã€ãã®OAuth2ãããã€ããŒã§ãµããŒããããŠããOAuth2ã®äžçš®ã§ãã ãã®ãããã³ã«ã®OAuth2ã®äž»ãªæ¡åŒµæ©èœã¯ãID TokenãšåŒã°ãããã¢ã¯ã»ã¹ããŒã¯ã³ãšã¢ã¯ã»ã¹ããŒã¯ã³ãšäžç·ã«è¿ããã远å ãã£ãŒã«ãã§ãã ãã®ããŒã¯ã³ã¯ããŠãŒã¶ãŒã®é»åã¡ãŒã«ãªã©ã®ããç¥ããããã£ãŒã«ããæã€JSON Web Token(JWT)ã§ããããµãŒããŒã«ãã£ãŠçœ²åãããŠããŸããããŒã¯ã³ããªã¯ãšã¹ãã«å«ããæ¹æ³ã«ã€ããŠã¯ããªã¯ãšã¹ãã«BearerããŒã¯ã³ãå«ãããåç §ããŠãã ããã
- IDãããã€ããŒã«ãã°ã€ã³ããŸã
- IDãããã€ããŒã¯ã
access_token
ãid_token
ãrefresh_token
ãæäŸããŸã kubectl
ã䜿ãå Žåã¯ã--token
ãã©ã°ã§id_token
ã䜿ãããkubeconfig
ã«çŽæ¥è¿œå ããŠãã ããkubectl
ã¯ãid_token
ãAuthorizationãšåŒã°ããããããŒã§APIãµãŒããŒã«éããŸã- APIãµãŒããŒã¯ãèšå®ã§æå®ãããèšŒææžãšç §åããããšã§ãJWT眲åãæå¹ã§ããããšã確èªããŸã
id_token
ã®æå¹æéãåããŠããªãããšã確èªããŸã- ãŠãŒã¶ãŒãèªå¯ãããŠããããšã確èªããŸã
- èªå¯ããããšãAPIãµãŒããŒã¯
kubectl
ã«ã¬ã¹ãã³ã¹ãè¿ããŸã kubectl
ã¯ãŠãŒã¶ãŒã«ãã£ãŒãããã¯ãæäŸããŸã
èªåã誰ã§ãããã確èªããããã«å¿
èŠãªããŒã¿ã¯ãã¹ãŠid_token
ã®äžã«ããã®ã§ãKubernetesã¯IDãããã€ããŒãšéä¿¡ããå¿
èŠããããŸããããã¹ãŠã®ãªã¯ãšã¹ããã¹ããŒãã¬ã¹ã§ããã¢ãã«ã§ã¯ãããã¯éåžžã«èªèšŒã®ããã®ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããäžæ¹ã§ã以äžã®ããã«ããã€ã課é¡ããããŸãã
- Kubernetesã«ã¯ãèªèšŒããã»ã¹ãèµ·åããããã®"Webã€ã³ã¿ãŒãã§ãŒã¹"ããããŸãããã¯ã¬ãã³ã·ã£ã«ãåéããããã®ãã©ãŠã¶ãã€ã³ã¿ãŒãã§ãŒã¹ããªãããããŸãIDãããã€ãã«èªèšŒãè¡ãå¿ èŠããããŸãã
id_token
ã¯ãåãæ¶ãããšãã§ããŸãããããã¯èšŒææžã®ãããªãã®ã§ãæå¹æéãçã(æ°åã®ã¿)å¿ èŠãããã®ã§ãæ°åããšã«æ°ããããŒã¯ã³ãååŸããªããã°ãªããªãã®ã¯éåžžã«é¢åã§ãã- Kubernetesããã·ã¥ããŒããžã®èªèšŒã«ãããŠã
kubectl proxy
ã³ãã³ããid_token
ãæ³šå ¥ãããªããŒã¹ãããã·ã䜿ã以å€ã«ãç°¡åãªæ¹æ³ã¯ãããŸããã
APIãµãŒããŒã®èšå®
ãã©ã°ã€ã³ãæå¹ã«ããã«ã¯ãAPIãµãŒããŒã§ä»¥äžã®ãã©ã°ãèšå®ããŸãã
ãã©ã¡ãŒã¿ãŒ | 説æ | äŸ | å¿ é ã |
---|---|---|---|
--oidc-issuer-url | APIãµãŒããŒãå
¬é眲åéµãçºèŠã§ããããã«ãããããã€ããŒã®URLã§ãã https:// ã¹ããŒã ã䜿çšããURLã®ã¿ãåãå
¥ããããŸããããã¯éåžžã"https://accounts.google.com"ã"https://login.salesforce.com"ã®ããã«ãã¹ãæããªããããã€ãã®ãã£ã¹ã«ããªãŒURLã§ãããã®URLã¯ã.well-known/openid-configuration ã®äžã®ã¬ãã«ãæãå¿
èŠããããŸãã | ãã£ã¹ã«ããªãŒURLãhttps://accounts.google.com/.well-known/openid-configuration ã§ããå Žåãå€ã¯https://accounts.google.com ãšããŸãã | ã¯ã |
--oidc-client-id | ãã¹ãŠã®ããŒã¯ã³ãçºè¡ãããªããã°ãªããªãã¯ã©ã€ã¢ã³ãIDã§ãã | kubernetes | ã¯ã |
--oidc-username-claim | ãŠãŒã¶ãŒåãšããŠäœ¿çšããJWTã®ã¯ã¬ãŒã ãæå®ããŸããããã©ã«ãã§ã¯sub ã䜿çšãããŸãããããã¯ãšã³ããŠãŒã¶ãŒã®äžæã®èå¥åã§ããããšãæåŸ
ãããŸãã管çè
ã¯ãããã€ããŒã«å¿ããŠemail ãname ãªã©ã®ä»ã®ã¯ã¬ãŒã ãéžæããããšãã§ããŸãããã ããä»ã®ãã©ã°ã€ã³ãšã®ååã®è¡çªãé²ãããã«ãemail 以å€ã®ã¯ã¬ãŒã ã«ã¯ããã¬ãã£ãã¯ã¹ãšããŠçºè¡è
ã®URLãä»ããããŸãã | sub | ããã |
--oidc-username-prefix | æ¢åã®åå(system: ãŠãŒã¶ãŒãªã©)ãšã®è¡çªãé²ãããã«ããŠãŒã¶ãŒåã®åã«ãã¬ãã£ãã¯ã¹ãä»å ããŸããäŸãã°oidc: ãšããå€ã¯ãoidc:jane.doe ã®ãããªãŠãŒã¶ãŒåãçæããŸãããã®ãã©ã°ãæå®ãããŠãããã--oidc-username-claim ãemail 以å€ã®å€ã§ããå Žåããã¬ãã£ãã¯ã¹ã®ããã©ã«ãã¯(Issuer URL)# ã§ã(Issuer URL) ã¯--oidc-issuer-url ã®å€ã§ãããã¹ãŠã®ãã¬ãã£ãã¯ã¹ãç¡å¹ã«ããããã«ã¯ã- ãšããå€ã䜿çšã§ããŸãã | oidc: | ããã |
--oidc-groups-claim | ãŠãŒã¶ãŒã®ã°ã«ãŒããšããŠäœ¿çšããJWTã®ã¯ã¬ãŒã ã§ããã¯ã¬ãŒã ãããå Žåã¯ãæååã®é åã§ããå¿ èŠããããŸãã | groups | ããã |
--oidc-groups-prefix | æ¢åã®åå(system: ã°ã«ãŒããªã©)ãšã®è¡çªãé²ãããã«ãã°ã«ãŒãåã®åã«ãã¬ãã£ãã¯ã¹ãä»å ããŸããäŸãã°oidc: ãšããå€ã¯ãoidc:engineering ãoidc:infra ã®ãããªã°ã«ãŒãåãçæããŸãã | oidc: | ããã |
--oidc-required-claim | IDããŒã¯ã³ã®äžã®å¿ é ã¯ã¬ãŒã ãèšè¿°ããkey=valueã®ãã¢ã§ããèšå®ãããŠããå Žåãã¯ã¬ãŒã ãäžèŽããå€ã§IDããŒã¯ã³ã«ååšããããšãæ€èšŒãããŸãããã®ãã©ã°ãç¹°ãè¿ããŠè€æ°ã®ã¯ã¬ãŒã ãæå®ããŸãã | claim=value | ããã |
--oidc-ca-file | IDãããã€ããŒã®WebèšŒææžã«çœ²åããèªèšŒå±ã®èšŒææžãžã®ãã¹ã§ããããã©ã«ãã¯ãã¹ãã®ã«ãŒãèªèšŒå±ãæå®ãããŸãã | /etc/kubernetes/ssl/kc-ca.pem | ããã |
éèŠãªã®ã¯ãAPIãµãŒããŒã¯OAuth2ã¯ã©ã€ã¢ã³ãã§ã¯ãªããããåäžã®çºè¡è
ãä¿¡é Œããããã«ããèšå®ã§ããªãããšã§ããããã«ããããµãŒãããŒãã£ãŒã«çºè¡ãããã¯ã¬ãã³ã·ã£ã«ãä¿¡é Œããã«ãGoogleã®ãããªãããªãã¯ãããã€ããŒã䜿çšããããšãã§ããŸããè€æ°ã®OAuthã¯ã©ã€ã¢ã³ããå©çšããã管çè
ã¯ãazp
ã¯ã¬ãŒã ããµããŒãããŠãããããã€ãããããã¯ã©ã€ã¢ã³ããå¥ã®ã¯ã©ã€ã¢ã³ãã«ä»£ãã£ãŠããŒã¯ã³ãçºè¡ã§ãããããªä»çµã¿ãæ€èšããå¿
èŠããããŸãã
Kubernetesã¯OpenID Connect IDãããã€ããŒãæäŸããŠããŸãããæ¢åã®ãããªãã¯ãªOpenID Connect IDãããã€ããŒ(Googleããã®ä»ãªã©)ã䜿çšã§ããŸãããããã¯ãCoreOS dexãKeycloakãCloudFoundryUAAãTremolo Securityã®OpenUnisonãªã©ãç¬èªã®IDãããã€ããŒãå®è¡ããããšãã§ããŸãã
IDãããã€ããŒãKubernetesãšé£æºããããã«ã¯ã以äžã®ããšãå¿ èŠã§ãã
- ãã¹ãŠã§ã¯ãªããã[OpenID Connect Discovery](https://openid.net/specs/openid-connect-discovery-1_0.htmlïŒããµããŒãããŠããããš
- å»ããŠããªãæå·ãçšããTLSã§å®è¡ãããŠããããš
- èªèšŒå±ã眲åããèšŒææžãæã£ãŠããããš(èªèšŒå±ãåçšã§ã¯ãªãå Žåããèªå·±çœ²åã®å Žåãå¯)
äžè¿°ã®èŠä»¶#3ãèªèšŒå±çœ²åä»ãèšŒææžãå¿
èŠãšããããšã«ã€ããŠã泚æäºé
ããããŸããGoogleãMicrosoftãªã©ã®ã¯ã©ãŠããããã€ããŒã§ã¯ãªããç¬èªã®IDãããã€ããŒããããã€ããå Žåã¯ãããšãèªå·±çœ²åãããŠããŠããCA
ãã©ã°ãTRUE
ã«èšå®ãããŠããèšŒææžã«ãã£ãŠçœ²åãããIDãããã€ããŒã®WebãµãŒããŒèšŒææžãæã£ãŠããªããã°ãªããŸãããããã¯ãGoèšèªã®TLSã¯ã©ã€ã¢ã³ãå®è£
ããèšŒææžæ€èšŒã«é¢ããæšæºã«å¯ŸããŠéåžžã«å³æ Œã§ããããã§ããèªèšŒå±ããæã¡ã§ãªãå Žåã¯ãCoreOSããŒã ã®ãã®ã¹ã¯ãªããã䜿çšããŠãã·ã³ãã«ãªèªèšŒå±ãšçœ²åä»ãã®èšŒææžãšéµã®ãã¢ãäœæããããšãã§ããŸãã
ãŸãã¯ããã®é¡äŒŒã®ã¹ã¯ãªããã䜿ã£ãŠããã寿åœãé·ããããããŒãµã€ãºã®å€§ããSHA256èšŒææžãçæã§ããŸãã
ç¹å®ã®ã·ã¹ãã çšã®ã»ããã¢ããæé ã¯ã以äžãåç §ããŠãã ããã
kubectlã®äœ¿çš
éžæè¢1 - OIDCèªèšŒæ©èœ
æåã®éžæè¢ã¯ãkubectlã®oidc
èªèšŒæ©èœãå©çšããããšã§ããããã¯ãã¹ãŠã®ãªã¯ãšã¹ãã®BearerããŒã¯ã³ãšããŠid_token
ãèšå®ããæå¹æéãåãããšããŒã¯ã³ãæŽæ°ããŸãããããã€ããŒã«ãã°ã€ã³ããåŸãkubectlã䜿ã£ãŠid_token
ãrefresh_token
ãclient_id
ãclient_secret
ã远å ããŠãã©ã°ã€ã³ãèšå®ããŸãã
ãªãã¬ãã·ã¥ããŒã¯ã³ã®ã¬ã¹ãã³ã¹ã®äžéšãšããŠid_token
ãè¿ããªããããã€ããŒã¯ããã®ãã©ã°ã€ã³ã§ã¯ãµããŒããããŠããªãã®ã§ã以äžã®"éžæè¢2"ã䜿çšããŠãã ããã
kubectl config set-credentials USER_NAME \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=( issuer url ) \
--auth-provider-arg=client-id=( your client id ) \
--auth-provider-arg=client-secret=( your client secret ) \
--auth-provider-arg=refresh-token=( your refresh token ) \
--auth-provider-arg=idp-certificate-authority=( path to your ca certificate ) \
--auth-provider-arg=id-token=( your id_token )
äŸãšããŠãIDãããã€ããŒã«èªèšŒããåŸã«ä»¥äžã®ã³ãã³ããå®è¡ããŸãã
kubectl config set-credentials mmosley \
--auth-provider=oidc \
--auth-provider-arg=idp-issuer-url=https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP \
--auth-provider-arg=client-id=kubernetes \
--auth-provider-arg=client-secret=1db158f6-177d-4d9c-8a8b-d36869918ec5 \
--auth-provider-arg=refresh-token=q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXqHega4GAXlF+ma+vmYpFcHe5eZR+slBFpZKtQA= \
--auth-provider-arg=idp-certificate-authority=/root/ca.pem \
--auth-provider-arg=id-token=eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw
ããã¯ä»¥äžã®ãããªæ§æã«ãªããŸãã
users:
- name: mmosley
user:
auth-provider:
config:
client-id: kubernetes
client-secret: 1db158f6-177d-4d9c-8a8b-d36869918ec5
id-token: eyJraWQiOiJDTj1vaWRjaWRwLnRyZW1vbG8ubGFuLCBPVT1EZW1vLCBPPVRybWVvbG8gU2VjdXJpdHksIEw9QXJsaW5ndG9uLCBTVD1WaXJnaW5pYSwgQz1VUy1DTj1rdWJlLWNhLTEyMDIxNDc5MjEwMzYwNzMyMTUyIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL29pZGNpZHAudHJlbW9sby5sYW46ODQ0My9hdXRoL2lkcC9PaWRjSWRQIiwiYXVkIjoia3ViZXJuZXRlcyIsImV4cCI6MTQ4MzU0OTUxMSwianRpIjoiMm96US15TXdFcHV4WDlHZUhQdy1hZyIsImlhdCI6MTQ4MzU0OTQ1MSwibmJmIjoxNDgzNTQ5MzMxLCJzdWIiOiI0YWViMzdiYS1iNjQ1LTQ4ZmQtYWIzMC0xYTAxZWU0MWUyMTgifQ.w6p4J_6qQ1HzTG9nrEOrubxIMb9K5hzcMPxc9IxPx2K4xO9l-oFiUw93daH3m5pluP6K7eOE6txBuRVfEcpJSwlelsOsW8gb8VJcnzMS9EnZpeA0tW_p-mnkFc3VcfyXuhe5R3G7aa5d8uHv70yJ9Y3-UhjiN9EhpMdfPAoEB9fYKKkJRzF7utTTIPGrSaSU6d2pcpfYKaxIwePzEkT4DfcQthoZdy9ucNvvLoi1DIC-UocFD8HLs8LYKEqSxQvOcvnThbObJ9af71EwmuE21fO5KzMW20KtAeget1gnldOosPtz1G5EwvaQ401-RPQzPGMVBld0_zMCAwZttJ4knw
idp-certificate-authority: /root/ca.pem
idp-issuer-url: https://oidcidp.tremolo.lan:8443/auth/idp/OidcIdP
refresh-token: q1bKLFOyUiosTfawzA93TzZIDzH2TNa2SMm0zEiPKTUwME6BkEo6Sql5yUWVBSWpKUGphaWpxSVAfekBOZbBhaEW+VlFUeVRGcluyVF5JT4+haZmPsluFoFu5XkpXk5BXq
name: oidc
id_token
ã®æå¹æéãåãããšãkubectl
ã¯refresh_token
ãšclient_secret
ãçšããŠid_token
ã®æŽæ°ããããšããŸããrefresh_token
ãšid_token
ã®æ°ããå€ã¯ã.kube/config
ã«æ ŒçŽãããŸãã
éžæè¢2 - --token
ãªãã·ã§ã³ã®äœ¿çš
kubectl
ã³ãã³ãã§ã¯ã--token
ãªãã·ã§ã³ã䜿ã£ãŠããŒã¯ã³ãæž¡ãããšãã§ããã以äžã®ããã«ããã®ãªãã·ã§ã³ã«id_token
ãã³ããŒããŠè²Œãä»ããã ãã§ãã
kubectl --token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczovL21sYi50cmVtb2xvLmxhbjo4MDQzL2F1dGgvaWRwL29pZGMiLCJhdWQiOiJrdWJlcm5ldGVzIiwiZXhwIjoxNDc0NTk2NjY5LCJqdGkiOiI2RDUzNXoxUEpFNjJOR3QxaWVyYm9RIiwiaWF0IjoxNDc0NTk2MzY5LCJuYmYiOjE0NzQ1OTYyNDksInN1YiI6Im13aW5kdSIsInVzZXJfcm9sZSI6WyJ1c2VycyIsIm5ldy1uYW1lc3BhY2Utdmlld2VyIl0sImVtYWlsIjoibXdpbmR1QG5vbW9yZWplZGkuY29tIn0.f2As579n9VNoaKzoF-dOQGmXkFKf1FMyNV0-va_B63jn-_n9LGSCca_6IVMP8pO-Zb4KvRqGyTP0r3HkHxYy5c81AnIh8ijarruczl-TK_yF5akjSTHFZD-0gRzlevBDiH8Q79NAr-ky0P4iIXS8lY9Vnjch5MF74Zx0c3alKJHJUnnpjIACByfF2SCaYzbWFMUNat-K1PaUk5-ujMBG7yYnr95xD-63n8CO8teGUAAEMx6zRjzfhnhbzX-ajwZLGwGUBT4WqjMs70-6a7_8gZmLZb2az1cZynkFRj2BaCkVT3A2RrjeEwZEtGXlMqKJ1_I2ulrOVsYx01_yD35-rw get nodes
WebhookããŒã¯ã³èªèšŒ
WebhookèªèšŒã¯ãBearerããŒã¯ã³ãæ€èšŒããããã®ããã¯ã§ãã
--authentication-token-webhook-config-file
: ãªã¢ãŒãã®WebhookãµãŒãã¹ãžã®ã¢ã¯ã»ã¹æ¹æ³ãèšè¿°ããèšå®ãã¡ã€ã«ã§ã--authentication-token-webhook-cache-ttl
: èªèšŒããã£ãã·ã¥ããæéãæ±ºå®ããŸããããã©ã«ãã¯2åã§ã
èšå®ãã¡ã€ã«ã¯ãkubeconfigã®ãã¡ã€ã«åœ¢åŒã䜿çšããŸãã
ãã¡ã€ã«å
ã§ãclusters
ã¯ãªã¢ãŒããµãŒãã¹ããusers
ã¯APIãµãŒããŒã®WebhookãæããŸããäŸãã°ã以äžã®ããã«ãªããŸãã
# Kubernetes APIã®ããŒãžã§ã³
apiVersion: v1
# APIãªããžã§ã¯ãã®çš®é¡
kind: Config
# clustersã¯ããªã¢ãŒããµãŒãã¹ãæããŸãã
clusters:
- name: name-of-remote-authn-service
cluster:
certificate-authority: /path/to/ca.pem # ãªã¢ãŒããµãŒãã¹ãæ€èšŒããããã®CA
server: https://authn.example.com/authenticate # ã¯ãšãªãããªã¢ãŒããµãŒãã¹ã®URLã'https'ã䜿çšããå¿
èŠããããŸãã
# usersã¯ãAPIãµãŒããŒã®Webhookèšå®ãæããŸãã
users:
- name: name-of-api-server
user:
client-certificate: /path/to/cert.pem # Webhookãã©ã°ã€ã³ã䜿ãããã®èšŒææž
client-key: /path/to/key.pem # èšŒææžã«åèŽããéµ
# kubeconfigãã¡ã€ã«ã«ã¯ã³ã³ããã¹ããå¿
èŠã§ããAPIãµãŒããŒçšã®ãã®ãçšæããŠãã ããã
current-context: webhook
contexts:
- context:
cluster: name-of-remote-authn-service
user: name-of-api-sever
name: webhook
ã¯ã©ã€ã¢ã³ããäžèšã®ããã«BearerããŒã¯ã³ã䜿çšããŠAPIãµãŒããŒãšã®èªèšŒã詊ã¿ãå ŽåãèªèšŒWebhookã¯ããŒã¯ã³ãå«ãJSONã§ã·ãªã¢ã©ã€ãºãããauthentication.k8s.io/v1beta1
TokenReview
ãªããžã§ã¯ãããªã¢ãŒããµãŒãã¹ã«POSTããŸããKubernetesã¯ãã®ãããªããããŒãäžè¶³ããŠãããªã¯ãšã¹ããäœæããããšã¯ããŸããã
Webhook APIãªããžã§ã¯ãã¯ãä»ã®Kubernetes APIãªããžã§ã¯ããšåãããã«ãVersioning Compatibility Ruleã«åŸãããšã«æ³šæããŠãã ãããå®è£
è
ã¯ãããŒã¿ãªããžã§ã¯ãã§ä¿èšŒãããäºææ§ãç·©ãããšã«æ³šæããæ£ãããã·ãªã¢ã©ã€ãŒãŒã·ã§ã³ã䜿çšãããããã«ãªã¯ãšã¹ãã®"apiVersion"ãã£ãŒã«ãã確èªããå¿
èŠããããŸããããã«APIãµãŒããŒã¯ãAPIæ¡åŒµã°ã«ãŒãauthentication.k8s.io/v1beta1
ãæå¹ã«ããªããã°ãªããŸãã(--runtime config=authentication.k8s.io/v1beta1=true
)ã
POSTããã£ã¯ã以äžã®åœ¢åŒã«ãªããŸãã
{
"apiVersion": "authentication.k8s.io/v1beta1",
"kind": "TokenReview",
"spec": {
"token": "(BearerããŒã¯ã³)"
}
}
ãªã¢ãŒããµãŒãã¹ã¯ãã°ã€ã³ã®æåã瀺ãããã«ããªã¯ãšã¹ãã®status
ãã£ãŒã«ããåããããšãæåŸ
ãããŸããã¬ã¹ãã³ã¹ããã£ã®spec
ãã£ãŒã«ãã¯ç¡èŠãããçç¥ããããšãã§ããŸããBearerããŒã¯ã³ã®æ€èšŒã«æåãããšã以äžã®ããã«BearerããŒã¯ã³ãè¿ãããŸãã
{
"apiVersion": "authentication.k8s.io/v1beta1",
"kind": "TokenReview",
"status": {
"authenticated": true,
"user": {
"username": "janedoe@example.com",
"uid": "42",
"groups": [
"developers",
"qa"
],
"extra": {
"extrafield1": [
"extravalue1",
"extravalue2"
]
}
}
}
}
ãªã¯ãšã¹ãã«å€±æããå Žåã¯ã以äžã®ããã«è¿ãããŸãã
{
"apiVersion": "authentication.k8s.io/v1beta1",
"kind": "TokenReview",
"status": {
"authenticated": false
}
}
HTTPã¹ããŒã¿ã¹ã³ãŒãã¯ã远å ã®ãšã©ãŒã³ã³ããã¹ããæäŸããããã«äœ¿ãããšãã§ããŸãã
èªèšŒãããã·
APIãµãŒããŒã¯ãX-Remote-User
ã®ããã«ãªã¯ãšã¹ããããã®å€ãããŠãŒã¶ãŒãèå¥ããããã«èšå®ããããšãã§ããŸãã
ããã¯ããªã¯ãšã¹ããããã®å€ãèšå®ããèªèšŒãããã·ãšçµã¿åãããŠäœ¿çšããããã«èšèšã§ãã
--requestheader-username-headers
: å¿ é ã§ããã倧æåå°æåãåºå¥ããŸããããŠãŒã¶ãŒã®IDããã§ãã¯ããããã®ããããŒåãé çªã«æå®ããŸããå€ãå«ãæåã®ããããŒãããŠãŒã¶ãŒåãšããŠäœ¿ãããŸãã--requestheader-group-headers
: ããŒãžã§ã³1.6以éã§ä»»æã§ããã倧æåå°æåãåºå¥ããŸããã"X-Remote-Group"ãæšå¥šããŸãããŠãŒã¶ãŒã®ã°ã«ãŒãããã§ãã¯ããããã®ããããŒåãé çªã«æå®ããŸããæå®ãããããããŒã®å šãŠã®å€ããã°ã«ãŒãåãšããŠäœ¿ãããŸãã--requestheader-extra-headers-prefix
ããŒãžã§ã³1.6以éã§ä»»æã§ããã倧æåå°æåãåºå¥ããŸããã"X-Remote-Extra-"ãæšå¥šããŸãããŠãŒã¶ãŒã«é¢ããè¿œå æ å ±ã倿ããããã«æ€çŽ¢ããããããŒã®ãã¬ãã£ãã¯ã¹ã§ããéåžžãèšå®ãããèªå¯ãã©ã°ã€ã³ã«ãã£ãŠäœ¿çšãããŸããæå®ããããã¬ãã£ãã¯ã¹ã®ããããã§å§ãŸãããããŒã¯ããã¬ãã£ãã¯ã¹ãåé€ãããŸããããããŒåã®æ®ãã®éšåã¯å°æååããããŒã»ã³ããã³ãŒãã£ã³ã°ãããŠè¿œå ã®ããŒãšãªããããããŒã®å€ã远å ã®å€ãšãªããŸãã
åè:
1.11.3(ããã³1.10.7ã1.9.11)ãããåã®ããŒãžã§ã³ã§ã¯ã远å ã®ããŒã«ã¯HTTPããããŒã©ãã«ã§äœ¿çšå¯èœãªæåã®ã¿ãå«ããããšãã§ããŸãããäŸãã°ããã®ãããªèšå®ãè¡ããŸãã
--requestheader-username-headers=X-Remote-User
--requestheader-group-headers=X-Remote-Group
--requestheader-extra-headers-prefix=X-Remote-Extra-
以äžã®ãããªãªã¯ãšã¹ããèããŸãã
GET / HTTP/1.1
X-Remote-User: fido
X-Remote-Group: dogs
X-Remote-Group: dachshunds
X-Remote-Extra-Acme.com%2Fproject: some-project
X-Remote-Extra-Scopes: openid
X-Remote-Extra-Scopes: profile
ãã®ãªã¯ãšã¹ãã¯ããã®ãŠãŒã¶ãŒæ å ±ãååŸããŸãã
name: fido
groups:
- dogs
- dachshunds
extra:
acme.com/project:
- some-project
scopes:
- openid
- profile
ããããŒã®ã¹ããŒãã£ã³ã°ãé²ããããèªèšŒãããã·ã¯ãªã¯ãšã¹ãããããŒããã§ãã¯ãããåã«ãæå®ãããèªèšŒå±ã«å¯Ÿããæ€èšŒã®ããã«æå¹ãªã¯ã©ã€ã¢ã³ãèšŒææžãAPIãµãŒããŒãžæç€ºããå¿ èŠããããŸãã
--requestheader-client-ca-file
: å¿ é ã§ããPEMãšã³ã³ãŒããããèšŒææžãã³ãã«ã§ããæå¹ãªã¯ã©ã€ã¢ã³ãèšŒææžãæç€ºãããªã¯ãšã¹ãããããŒã§ãŠãŒã¶ãŒåããã§ãã¯ãããåã«ãæå®ããããã¡ã€ã«å ã®èªèšŒå±ã«å¯ŸããŠæ€èšŒããå¿ èŠããããŸãã--requestheader-allowed-names
: ä»»æã§ããCommon Name(CN)ã®å€ã®ãªã¹ãã§ããèšå®ãããŠããå Žåããªã¯ãšã¹ãããããŒã§ãŠãŒã¶ãŒåããã§ãã¯ãããåã«ãæå®ããããªã¹ãã®CNãæã€æå¹ãªã¯ã©ã€ã¢ã³ãèšŒææžãæç€ºããå¿ èŠããããŸãã空ã®å Žåã¯ãä»»æã®CNãèš±å¯ãããŸãã
å¿åãªã¯ãšã¹ã
ãã®æ©èœãæå¹ã«ãããšãä»ã®èšå®ãããèªèšŒæ¹æ³ã§æåŠãããªãã£ããªã¯ãšã¹ãã¯å¿åãªã¯ãšã¹ããšããŠæ±ããã system:anonymous
ãšãããŠãŒã¶ãŒåãšsystem:unauthenticated
ãšããã°ã«ãŒããäžããããŸãã
äŸãã°ãããŒã¯ã³èªèšŒãèšå®ãããŠãããå¿åã¢ã¯ã»ã¹ãæå¹ã«ãªã£ãŠãããµãŒããŒäžã§ãç¡å¹ãªBearerããŒã¯ã³ãæäŸãããªã¯ãšã¹ãã¯401 Unauthorized
ãšã©ãŒãåãåããŸããBearerããŒã¯ã³ãæäŸããªããªã¯ãšã¹ãã¯å¿åãªã¯ãšã¹ããšããŠæ±ãããŸãã
ããŒãžã§ã³1.5.1ãã1.5.xã§ã¯ãå¿åã¢ã¯ã»ã¹ã¯ããã©ã«ãã§ã¯ç¡å¹ã«ãªã£ãŠãããAPIãµãŒããŒã« --anonymous-auth=true
ãªãã·ã§ã³ãæž¡ãããšã§æå¹ã«ããããšãã§ããŸãã
ããŒãžã§ã³1.6以éã§ã¯ãAlwaysAllow
以å€ã®èªèšŒã¢ãŒãã䜿çšãããŠããå Žåãå¿åã¢ã¯ã»ã¹ãããã©ã«ãã§æå¹ã§ããã--anonymous-auth=false
ãªãã·ã§ã³ãAPIãµãŒããŒã«æž¡ãããšã§ç¡å¹ã«ã§ããŸãã
1.6以éãABACããã³RBACèªå¯æ©èœã¯ãsystem:anonymous
ãŠãŒã¶ãŒãŸãã¯system:unauthenticated
ã°ã«ãŒãã®æç€ºçãªèªèšŒãå¿
èŠãšããããã«ãªã£ãããã*
ãŠãŒã¶ãŒãŸãã¯*
ã°ã«ãŒããžã®ã¢ã¯ã»ã¹ãèš±å¯ããåŸæ¥ã®ããªã·ãŒã«ãŒã«ã«ã¯å¿åãŠãŒã¶ãŒã¯å«ãŸããŸããã
ãŠãŒã¶ãŒã®åœè£
ãŠãŒã¶ãŒã¯åœè£ ããããŒã䜿ã£ãŠå¥ã®ãŠãŒã¶ãŒãšããŠæ¯ãèãããšãã§ããŸããããã«ããããªã¯ãšã¹ããèªèšŒãããŠãŒã¶ãŒæ å ±ãæåã§äžæžãããããšãå¯èœã§ããäŸãã°ã管çè ã¯ãã®æ©èœã䜿ã£ãŠäžæçã«å¥ã®ãŠãŒã¶ãŒã«åœè£ ããªã¯ãšã¹ããæåŠããããã©ããã確èªããããšã§èªå¯ããªã·ãŒããããã°ããããšãã§ããŸãã
åœè£ ãªã¯ãšã¹ãã¯æåã«ãªã¯ãšã¹ãäžã®ãŠãŒã¶ãŒãšããŠèªèšŒãè¡ããæ¬¡ã«åœè£ ãŠãŒã¶ãŒæ å ±ã«åãæ¿ããŸãã
- ãŠãŒã¶ãŒã¯ãèªèšŒæ å ±ãšåœè£ ããããŒã䜿ã£ãŠAPIã³ãŒã«ãè¡ããŸãã
- APIãµãŒããŒã¯ãŠãŒã¶ãŒãèªèšŒããŸãã
- APIãµãŒããŒã¯ãèªèšŒããããŠãŒã¶ãŒãåœè£ ããæš©éãæã£ãŠããããšã確èªããŸãã
- ãªã¯ãšã¹ãããããŠãŒã¶ãŒæ å ±ã¯ãåœè£ ããå€ã«çœ®ãæããããŸãã
- ãªã¯ãšã¹ããè©äŸ¡ãããèªå¯ã¯åœè£ ããããŠãŒã¶ãŒæ å ±ã«åºã¥ããŠå®è¡ãããŸãã
åœè£ ãªã¯ãšã¹ããå®è¡ããéã«ã¯ã以äžã®HTTPãããã䜿çšããããšãã§ããŸãã
Impersonate-User
: ãŠãŒã¶ãŒåãæå®ããŸãããã®ãŠãŒã¶ãŒãšããŠæ¯ãèããŸããImpersonate-Group
: ã°ã«ãŒãåãæå®ããŸãããã®ã°ã«ãŒããšããŠæ¯ãèããŸããè€æ°åæå®ããŠè€æ°ã®ã°ã«ãŒããèšå®ããããšãã§ããŸããä»»æã§ããã"Impersonate-User"ãå¿ èŠã§ããImpersonate-Extra-( extra name )
: 远å ãã£ãŒã«ãããŠãŒã¶ãŒã«é¢é£ä»ããããã«äœ¿çšãããåçãªããããŒã§ããä»»æã§ããã"Impersonate-User"ãå¿ èŠã§ããäžè²«ããŠä¿åãããããã«ã¯ã( extra name )
ã¯å°æåã§ããå¿ èŠããããHTTPããããŒã©ãã«ã§äœ¿çšå¯èœãªæå以å€ã®æåã¯ãUTF-8ã§ãããããŒã»ã³ããšã³ã³ãŒãã£ã³ã°ãããŠããå¿ èŠããããŸã.
åè:
1.11.3(ããã³1.10.7ã1.9.11)ãããåã®ããŒãžã§ã³ã§ã¯ã( extra name )
ã«ã¯HTTPããããŒã©ãã«ã§äœ¿çšå¯èœãªæåã®ã¿ãå«ããããšãã§ããŸããã以äžããããããŒã®äŸã§ãã
Impersonate-User: jane.doe@example.com
Impersonate-Group: developers
Impersonate-Group: admins
Impersonate-Extra-dn: cn=jane,ou=engineers,dc=example,dc=com
Impersonate-Extra-acme.com%2Fproject: some-project
Impersonate-Extra-scopes: view
Impersonate-Extra-scopes: development
kubectl
ã䜿ãå Žåã¯ã--as
ãã©ã°ã«Impersonate-User
ããããŒãã--as-group
ãã©ã°ã«Impersonate-Group
ããããŒãèšå®ããŸãã
kubectl drain mynode
Error from server (Forbidden): User "clark" cannot get nodes at the cluster scope. (get nodes mynode)
--as
ãã©ã°ãš--as-group
ãã©ã°ãèšå®ããŸãã
kubectl drain mynode --as=superman --as-group=system:masters
node/mynode cordoned
node/mynode drained
ãŠãŒã¶ãŒãã°ã«ãŒãããŸãã¯è¿œå ãã£ãŒã«ããåœè£ ããããã«ãåœè£ ãŠãŒã¶ãŒã¯åœè£ ããã屿§ã®çš®é¡("user"ã"group"ãªã©)ã«å¯ŸããŠã"åœè£ ãã"æäœãè¡ãèœåãæã£ãŠããå¿ èŠããããŸããRBACèªå¯ãã©ã°ã€ã³ãæå¹ãªã¯ã©ã¹ã¿ãŒã®å Žåã以äžã®ClusterRoleã¯ããŠãŒã¶ãŒãšã°ã«ãŒãã®åœè£ ããããŒãèšå®ããããã«å¿ èŠãªã«ãŒã«ãç¶²çŸ ããŠããŸãã
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: impersonator
rules:
- apiGroups: [""]
resources: ["users", "groups", "serviceaccounts"]
verbs: ["impersonate"]
远å ãã£ãŒã«ãã¯ã"userextras"ãªãœãŒã¹ã®ãµããªãœãŒã¹ãšããŠè©äŸ¡ãããŸãããŠãŒã¶ãŒã远å ãã£ãŒã«ã"scopes"ã«åœè£ ããããŒã䜿çšã§ããããã«ããã«ã¯ããŠãŒã¶ãŒã«ä»¥äžã®ãããªããŒã«ãä»äžããå¿ èŠããããŸãã
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: scopes-impersonator
rules:
# "Impersonate-Extra-scopes"ããããŒãèšå®ã§ããŸãã
- apiGroups: ["authentication.k8s.io"]
resources: ["userextras/scopes"]
verbs: ["impersonate"]
åœè£
ããããŒã®å€ã¯ããªãœãŒã¹ãåãåŸãresourceNames
ã®éåãå¶éããããšã§ã管çããããšãã§ããŸãã
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: limited-impersonator
rules:
# "jane.doe@example.com"ãšãããŠãŒã¶ãŒãåœè£
ã§ããŸãã
- apiGroups: [""]
resources: ["users"]
verbs: ["impersonate"]
resourceNames: ["jane.doe@example.com"]
# "developers"ãš"admins"ãšããã°ã«ãŒããåœè£
ã§ããŸãã
- apiGroups: [""]
resources: ["groups"]
verbs: ["impersonate"]
resourceNames: ["developers","admins"]
# "view"ãš"development"ãå€ã«æã€"scopes"ãšãã远å ãã£ãŒã«ããåœè£
ã§ããŸãã
- apiGroups: ["authentication.k8s.io"]
resources: ["userextras/scopes"]
verbs: ["impersonate"]
resourceNames: ["view", "development"]
client-goã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³
Kubernetes v1.11 [beta]
k8s.io/client-go
ãšãããã䜿çšããkubectl
ãkubelet
ã®ãããªããŒã«ã¯ãå€éšã³ãã³ããå®è¡ããŠãŠãŒã¶ãŒã®èªèšŒæ
å ±ãåãåãããšãã§ããŸãã
ãã®æ©èœã¯k8s.io/client-go
ããã€ãã£ãã«ãµããŒãããŠããªãèªèšŒãããã³ã«(LDAPãKerberosãOAuth2ãSAMLãªã©)ãšã¯ã©ã€ã¢ã³ããµã€ãã§çµ±åããããã®ãã®ã§ãããã©ã°ã€ã³ã¯ãããã³ã«åºæã®ããžãã¯ãå®è£
ãã䜿çšããäžéæãªã¯ã¬ãã³ã·ã£ã«ãè¿ããŸããã»ãšãã©ãã¹ãŠã®ã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãã¯ã©ã€ã¢ã³ããã©ã°ã€ã³ãçæããã¯ã¬ãã³ã·ã£ã«ãã©ãŒããããè§£éããããã«ãWebhookããŒã¯ã³èªèšŒããµããŒããããµãŒããŒãµã€ãã³ã³ããŒãã³ããå¿
èŠã§ãã
䜿çšäŸ
ããçµç¹ã¯ãLDAPã¯ã¬ãã³ã·ã£ã«ããŠãŒã¶ãŒåºæã®çœ²åæžã¿ããŒã¯ã³ãšäº€æããå€éšãµãŒãã¹ãå®è¡ãããšä»®å®ããŸãããã®ãµãŒãã¹ã¯ãããŒã¯ã³ãæ€èšŒããããã«WebhookããŒã¯ã³èªèšŒãªã¯ãšã¹ãã«å¿çããããšãã§ããŸãããŠãŒã¶ãŒã¯ã¯ãŒã¯ã¹ããŒã·ã§ã³ã«ã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã
以äžã®ããã«ããŠãAPIã«å¯ŸããŠèªèšŒãè¡ããŸãã
- ãŠãŒã¶ãŒã¯
kubectl
ã³ãã³ããçºè¡ããŸãã - ã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³ã¯ãLDAPã¯ã¬ãã³ã·ã£ã«ã®å ¥åããŠãŒã¶ãŒã«èŠæ±ããã¯ã¬ãã³ã·ã£ã«ãå€éšãµãŒãã¹ãšããŒã¯ã³ãšäº€æããŸãã
- ã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³ã¯ããŒã¯ã³ã
client-go
ã«è¿ããŸããããã¯APIãµãŒããŒã«å¯ŸããBearerããŒã¯ã³ãšããŠäœ¿çšãããŸãã - APIãµãŒããŒã¯ãWebhookããŒã¯ã³èªèšŒã䜿çšããŠã
TokenReview
ãå€éšãµãŒãã¹ã«éä¿¡ããŸãã - å€éšãµãŒãã¹ã¯ããŒã¯ã³ã®çœ²åãæ€èšŒãããŠãŒã¶ãŒã®ãŠãŒã¶ãŒåãšã°ã«ãŒããè¿ããŸãã
èšå®
ã¯ã¬ãã³ã·ã£ã«ãã©ã°ã€ã³ã®èšå®ã¯ãuserãã£ãŒã«ãã®äžéšãšããŠkubectlã®èšå®ãã¡ã€ã«ã§è¡ããŸãã
apiVersion: v1
kind: Config
users:
- name: my-user
user:
exec:
# å®è¡ããã³ãã³ãã§ããå¿
é ã§ãã
command: "example-client-go-exec-plugin"
# ExecCredentialsãªãœãŒã¹ããã³ãŒãããéã«äœ¿çšããAPIã®ããŒãžã§ã³ãå¿
é ã§ãã
#
# ãã©ã°ã€ã³ãè¿ãAPIã®ããŒãžã§ã³ã¯ãããã«èšèŒãããŠããããŒãžã§ã³ãšäžèŽããªããã°ãªããŸãã
#
# è€æ°ã®ããŒãžã§ã³ããµããŒãããããŒã«(client.authentication.k8s.io/v1alpha1ãªã©)ãšçµ±åããã«ã¯ã
# ç°å¢å€æ°ãèšå®ããããexecãã©ã°ã€ã³ãæåŸ
ããããŒãžã§ã³ã瀺ãåŒæ°ãããŒã«ã«æž¡ããŸãã
apiVersion: "client.authentication.k8s.io/v1beta1"
# ãã©ã°ã€ã³ãå®è¡ããéã«èšå®ããç°å¢å€æ°ã§ããä»»æã§ãã
env:
- name: "FOO"
value: "bar"
# ãã©ã°ã€ã³ãå®è¡ããéã«æž¡ãåŒæ°ã§ããä»»æã§ãã
args:
- "arg1"
- "arg2"
clusters:
- name: my-cluster
cluster:
server: "https://172.17.4.100:6443"
certificate-authority: "/etc/kubernetes/ca.pem"
contexts:
- name: my-cluster
context:
cluster: my-cluster
user: my-user
current-context: my-cluster
çžå¯Ÿçãªã³ãã³ããã¹ã¯ãèšå®ãã¡ã€ã«ã®ãã£ã¬ã¯ããªãŒããã®çžå¯Ÿçãªãã®ãšããŠè§£éãããŸããKUBECONFIGã/home/jane/kubeconfig
ã«èšå®ãããŠããŠãexecã³ãã³ãã./bin/example-client-go-exec-plugin
ã®å Žåããã€ããª/home/jane/bin/example-client-go-exec-plugin
ãå®è¡ãããŸãã
- name: my-user
user:
exec:
# kubeconfigã®ãã£ã¬ã¯ããªãŒãžã®çžå¯Ÿãã¹
command: "./bin/example-client-go-exec-plugin"
apiVersion: "client.authentication.k8s.io/v1beta1"
å ¥åºåãã©ãŒããã
å®è¡ãããã³ãã³ãã¯ExecCredential
ãªããžã§ã¯ããstdout
ã«åºåããŸããk8s.io/client-go
ã¯status
ã§è¿ãããèªèšŒæ
å ±ãçšããŠãKubernetes APIã«å¯ŸããŠèªèšŒãè¡ãããŸãã
察話çãªã»ãã·ã§ã³ããå®è¡ããå Žåãstdin
ã¯ãã©ã°ã€ã³ã«çŽæ¥å
¬éãããŸãããã©ã°ã€ã³ã¯TTYãã§ãã¯ã䜿ã£ãŠã察話çã«ãŠãŒã¶ãŒã«ããã³ãããåºãããšãé©åãã©ããã倿ããå¿
èŠããããŸãã
BearerããŒã¯ã³ã®ã¯ã¬ãã³ã·ã£ã«ã䜿çšããããã«ããã©ã°ã€ã³ã¯ExecCredential
ã®ã¹ããŒã¿ã¹ã«ããŒã¯ã³ãè¿ããŸãã
{
"apiVersion": "client.authentication.k8s.io/v1beta1",
"kind": "ExecCredential",
"status": {
"token": "my-bearer-token"
}
}
ãããã¯ãPEMãšã³ã³ãŒããããã¯ã©ã€ã¢ã³ãèšŒææžãšéµãè¿ããŠãTLSã¯ã©ã€ã¢ã³ãèªèšŒã䜿çšããããšãã§ããŸãã
ãã©ã°ã€ã³ãåŸç¶ã®åŒã³åºãã§ç°ãªãèšŒææžãšéµãè¿ããšãk8s.io/client-go
ã¯ãµãŒããŒãšã®æ¢åã®æ¥ç¶ãéããŠãæ°ããTLSãã³ãã·ã§ã€ã¯ã匷å¶ããŸã
æå®ãããå ŽåãclientKeyData
ãšclientCertificateData
äž¡æ¹ãååšããªããã°ãªããŸããã
clientCertificateData
ã«ã¯ããµãŒããŒã«éä¿¡ããããã®äžéèšŒææžãå«ããããšãã§ããŸãã
{
"apiVersion": "client.authentication.k8s.io/v1beta1",
"kind": "ExecCredential",
"status": {
"clientCertificateData": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----",
"clientKeyData": "-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"
}
}
ãªãã·ã§ã³ã§ãã¬ã¹ãã³ã¹ã«ã¯RFC3339ã®ã¿ã€ã ã¹ã¿ã³ããšããŠãã©ãŒããããããã¯ã¬ãã³ã·ã£ã«ã®æå¹æéãå«ããããšãã§ããŸããæå¹æéã®æç¡ã«ã¯ã以äžã®ãããªåœ±é¿ãããŸãã
- æå¹æéãå«ãŸããŠããå ŽåãBearerããŒã¯ã³ãšTLSã¯ã¬ãã³ã·ã£ã«ã¯æå¹æéã«éãããŸã§ããŸãã¯ãµãŒããŒãHTTPã¹ããŒã¿ã¹ã³ãŒã401ã§å¿çãããšãããŸãã¯ããã»ã¹ãçµäºãããŸã§ãã£ãã·ã¥ãããŸãã
- æå¹æéãçç¥ãããå ŽåãBearerããŒã¯ã³ãšTLSã¯ã¬ãã³ã·ã£ã«ã¯ãµãŒããŒãHTTPã¹ããŒã¿ã¹ã³ãŒã401ã§å¿çãããšãããŸãã¯ããã»ã¹ãçµäºãããŸã§ãã£ãã·ã¥ãããŸãã
{
"apiVersion": "client.authentication.k8s.io/v1beta1",
"kind": "ExecCredential",
"status": {
"token": "my-bearer-token",
"expirationTimestamp": "2018-03-05T17:30:20-08:00"
}
}