ãã®ããŒãžã«èšèŒãããŠããæ å ±ã¯å€ãå¯èœæ§ããããŸã
ãã®ããŒãžã®æŽæ°æ¥ã¯è±èªçãããå€ããããèšèŒãããŠããæ å ±ãå€ãå¯èœæ§ããããŸããææ°ã®æ å ±ãã芧ã«ãªãããæ¹ã¯è±èªçã®ããŒãžãã芧ãã ãã: Controlling Access to the Kubernetes API
Kubernetes APIãžã®ã¢ã¯ã»ã¹ã³ã³ãããŒã«
ãã®ããŒãžã§ã¯Kubernetes APIãžã®ã¢ã¯ã»ã¹ã³ã³ãããŒã«ã®æŠèŠã説æããŸãã
Kubernetes APIã«ã¯kubectl
ãã¯ã©ã€ã¢ã³ãã©ã€ãã©ãªããããã¯RESTãªã¯ãšã¹ããçšããŠã¢ã¯ã»ã¹ããŸãã
APIã¢ã¯ã»ã¹ã«ã¯ã人éã®ãŠãŒã¶ãŒãšKubernetesãµãŒãã¹ã¢ã«ãŠã³ãã®äž¡æ¹ãèªèšŒå¯èœã§ãã
ãªã¯ãšã¹ããAPIã«å°éãããšã次ã®å³ã®ããã«ããã€ãã®æ®µéãçµãŸãã
ãã©ã³ã¹ããŒãå±€ã®ã»ãã¥ãªãã£
äžè¬çãªKubernetesã¯ã©ã¹ã¿ãŒã§ã¯ãAPIã¯TLSã§ä¿è·ããã443çªããŒãã§æäŸãããŸãã APIãµãŒããŒã¯èšŒææžãæç€ºããŸãã ãã®èšŒææžã¯ããã©ã€ããŒãèªèšŒå±(CA)ãçšããŠçœ²åããããšããäžè¬ã«èªç¥ãããŠããCAãšé£æºããå ¬ééµåºç€ã«åºã¥ã眲åããããšãå¯èœã§ãã
ã¯ã©ã¹ã¿ãŒããã©ã€ããŒãèªèšŒå±ã䜿çšããŠããå Žåãæ¥ç¶ãä¿¡é ŒããååãããŠããªããšç¢ºä¿¡ã§ããããã«ãã¯ã©ã€ã¢ã³ãäžã®~/.kube/config
ã«èšå®ããããã®CAèšŒææžã®ã³ããŒãå¿
èŠã§ãã
ã¯ã©ã€ã¢ã³ãã¯ããã®æ®µéã§TLSã¯ã©ã€ã¢ã³ãèšŒææžãæç€ºããããšãã§ããŸãã
èªèšŒ
TLSã確ç«ããããšãHTTPãªã¯ãšã¹ãã¯èªèšŒã®ã¹ãããã«ç§»è¡ããŸãã ããã¯å³äžã®ã¹ããã1ã«è©²åœããŸãã ã¯ã©ã¹ã¿ãŒäœæã¹ã¯ãªãããŸãã¯ã¯ã©ã¹ã¿ãŒç®¡çè ã¯ã1ã€ãŸãã¯è€æ°ã®Authenticatorã¢ãžã¥ãŒã«ãå®è¡ããããã«APIãµãŒããŒãèšå®ããŸãã Authenticatorã«ã€ããŠã¯ãèªèšŒã§è©³ãã説æãããŠããŸãã
èªèšŒã¹ããããžã®å ¥åã¯HTTPãªã¯ãšã¹ãå šäœã§ãããéåžžã¯ããããšã¯ã©ã€ã¢ã³ãèšŒææžã®äž¡æ¹ããŸãã¯ã©ã¡ããã調ã¹ãŸãã
èªèšŒã¢ãžã¥ãŒã«ã«ã¯ãã¯ã©ã€ã¢ã³ãèšŒææžããã¹ã¯ãŒãããã¬ãŒã³ããŒã¯ã³ãããŒãã¹ãã©ããããŒã¯ã³ãJSON Web Tokens(ãµãŒãã¹ã¢ã«ãŠã³ãã«äœ¿çš)ãªã©ããããŸãã
è€æ°ã®èªèšŒã¢ãžã¥ãŒã«ãæå®ããããšãã§ãããã®å Žåã1ã€ã®èªèšŒã¢ãžã¥ãŒã«ãæåãããŸã§ããããããé çªã«è©Šè¡ããŸãã
èªèšŒã§ããªãå ŽåãHTTPã¹ããŒã¿ã¹ã³ãŒã401ã§æåŠãããŸãã
ããã§ãªããã°ããŠãŒã¶ãŒã¯ç¹å®ã®username
ãšããŠèªèšŒããããã®ãŠãŒã¶ãŒåã¯åŸç¶ã®ã¹ãããã§ã®å€æã«äœ¿çšã§ããããã«ãªããŸãã
ãŸãããŠãŒã¶ãŒã®ã°ã«ãŒãã¡ã³ããŒã·ãããæäŸããèªèšŒæ©é¢ãšãæäŸããªãèªèšŒæ©é¢ããããŸãã
Kubernetesã¯ã¢ã¯ã»ã¹ã³ã³ãããŒã«ã®æ±ºå®ããªã¯ãšã¹ããã°ã«ãŠãŒã¶ãŒåã䜿çšããŸãããUser
ãªããžã§ã¯ããæããããŠãŒã¶ãŒåããã®ä»ã®ãŠãŒã¶ãŒã«é¢ããæ
å ±ãAPIã¯ã«ä¿åããŸããã
èªå¯
ãªã¯ãšã¹ããç¹å®ã®ãŠãŒã¶ãŒããã®ãã®ã§ãããšèªèšŒãããåŸããã®ãªã¯ãšã¹ãã¯èªå¯ãããå¿ èŠããããŸãã ããã¯å³ã®ã¹ããã2ã«è©²åœããŸãã
ãªã¯ãšã¹ãã«ã¯ããªã¯ãšã¹ãè ã®ãŠãŒã¶ãŒåããªã¯ãšã¹ããããã¢ã¯ã·ã§ã³ããã®ã¢ã¯ã·ã§ã³ã«ãã£ãŠåœ±é¿ãåãããªããžã§ã¯ããå«ããå¿ èŠããããŸãã æ¢åã®ããªã·ãŒã§ããŠãŒã¶ãŒãèŠæ±ãããã¢ã¯ã·ã§ã³ãå®äºããããã®æš©éãæã£ãŠãããšå®£èšãããŠããå Žåããªã¯ãšã¹ãã¯æ¿èªãããŸãã
äŸãã°ãBobã以äžã®ãããªããªã·ãŒãæã£ãŠããå Žåã圌ã¯åå空éprojectCaribou
å
ã®Podã®ã¿ãèªãããšãã§ããŸãã
{
"apiVersion": "abac.authorization.kubernetes.io/v1beta1",
"kind": "Policy",
"spec": {
"user": "bob",
"namespace": "projectCaribou",
"resource": "pods",
"readonly": true
}
}
Bobãæ¬¡ã®ãããªãªã¯ãšã¹ããããå ŽåãBobã¯åå空éprojectCaribou
ã®ãªããžã§ã¯ããèªãããšãèš±å¯ãããŠããã®ã§ããã®ãªã¯ãšã¹ãã¯èªå¯ãããŸãã
{
"apiVersion": "authorization.k8s.io/v1beta1",
"kind": "SubjectAccessReview",
"spec": {
"resourceAttributes": {
"namespace": "projectCaribou",
"verb": "get",
"group": "unicorn.example.org",
"resource": "pods"
}
}
}
Bobãåå空éprojectCaribou
ã®ãªããžã§ã¯ãã«æžã蟌ã¿(create
ãŸãã¯update
)ã®ãªã¯ãšã¹ããããå Žåãæ¿èªã¯æåŠãããŸãã
ãŸããããBobãprojectFish
ã®ãããªå¥ã®åå空éã«ãããªããžã§ã¯ããèªã¿èŸŒã(get
)ãªã¯ãšã¹ããããå Žåããæ¿èªã¯æåŠãããŸãã
Kubernetesã®èªå¯ã§ã¯ãçµç¹å šäœãŸãã¯ã¯ã©ãŠããããã€ããŒå šäœã®æ¢åã®ã¢ã¯ã»ã¹ã³ã³ãããŒã«ã·ã¹ãã ãšå¯Ÿè©±ããããã«ãå ±éã®REST屿§ã䜿çšããå¿ èŠããããŸãã ãããã®ã³ã³ãããŒã«ã·ã¹ãã ã¯ãKubernetes API以å€ã®APIãšããåãããå¯èœæ§ããããããREST圢åŒã䜿çšããããšãéèŠã§ãã
Kubernetesã¯ãABACã¢ãŒããRBACã¢ãŒããWebhookã¢ãŒããªã©ãè€æ°ã®èªå¯ã¢ãžã¥ãŒã«ããµããŒãããŠããŸãã 管çè ã¯ã¯ã©ã¹ã¿ãŒãäœæããéã«ãAPIãµãŒããŒã§äœ¿çšããèªèšŒã¢ãžã¥ãŒã«ãèšå®ããŸãã è€æ°ã®èªå¯ã¢ãžã¥ãŒã«ãèšå®ãããŠããå ŽåãKubernetesã¯åã¢ãžã¥ãŒã«ããã§ãã¯ããããããã®ã¢ãžã¥ãŒã«ããªã¯ãšã¹ããèªå¯ããå Žåããªã¯ãšã¹ããç¶è¡ããããšãã§ããŸãã ãã¹ãŠã®ã¢ãžã¥ãŒã«ããªã¯ãšã¹ããæåŠããå Žåããªã¯ãšã¹ãã¯æåŠãããŸã(HTTPã¹ããŒã¿ã¹ã³ãŒã403)ã
ãµããŒããããŠããèªå¯ã¢ãžã¥ãŒã«ã䜿çšããããªã·ãŒäœæã®è©³çްãå«ããKubernetesã®èªå¯ã«ã€ããŠã¯ãèªå¯ãåç §ããŠãã ããã
ã¢ãããã·ã§ã³ã³ã³ãããŒã«
ã¢ãããã·ã§ã³ã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã¯ããªã¯ãšã¹ãã倿ŽãããæåŠãããããããšãã§ãããœãããŠã§ã¢ã¢ãžã¥ãŒã«ã§ãã èªå¯ã¢ãžã¥ãŒã«ãå©çšã§ãã屿§ã«å ããŠãã¢ãããã·ã§ã³ã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã¯ãäœæãŸãã¯ä¿®æ£ããããªããžã§ã¯ãã®ã³ã³ãã³ãã«ã¢ã¯ã»ã¹ããããšãã§ããŸãã
ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã¯ããªããžã§ã¯ãã®äœæã倿Žãåé€ããŸãã¯æ¥ç¶(ãããã·)ãè¡ããªã¯ãšã¹ãã«å¯ŸããŠåäœããŸãã ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã¯ãåã«ãªããžã§ã¯ããèªã¿åãã ãã®ãªã¯ãšã¹ãã«ã¯åäœããŸããã è€æ°ã®ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒãèšå®ãããŠããå Žåã¯ãé çªã«åŒã³åºãããŸãã
ããã¯å³äžã®ã¹ããã3ã«è©²åœããŸãã
èªèšŒã»èªå¯ã¢ãžã¥ãŒã«ãšã¯ç°ãªããããããã®ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã¢ãžã¥ãŒã«ãæåŠããå Žåããªã¯ãšã¹ãã¯å³åº§ã«æåŠãããŸãã
ãªããžã§ã¯ããæåŠããã ãã§ãªããã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã¯ããã£ãŒã«ãã«è€éãªããã©ã«ããèšå®ããããšãã§ããŸãã
å©çšå¯èœãªã¢ãããã·ã§ã³ã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã¯ãã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒã«èšèŒãããŠããŸãã
ãªã¯ãšã¹ãããã¹ãŠã®ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒãééãããšã察å¿ããAPIãªããžã§ã¯ãã®æ€èšŒã«ãŒãã³ã䜿ã£ãŠæ€èšŒããããªããžã§ã¯ãã¹ãã¢ã«æžã蟌ãŸããŸã(å³ã®ã¹ããã4ã«è©²åœããŸã)ã
ç£æ»
Kubernetesã®ç£æ»ã¯ãã¯ã©ã¹ã¿ãŒå ã®äžé£ã®ã¢ã¯ã·ã§ã³ãææžåãããã»ãã¥ãªãã£ã«é¢é£ããæç³»åã®èšé²ãæäŸããŸãã ã¯ã©ã¹ã¿ãŒã¯ããŠãŒã¶ãŒãKubernetes APIã䜿çšããã¢ããªã±ãŒã·ã§ã³ãããã³ã³ã³ãããŒã«ãã¬ãŒã³èªèº«ã«ãã£ãŠçæãããã¢ã¯ãã£ããã£ãç£æ»ããŸãã
詳ããã¯ç£æ»ãã芧ãã ããã
APIãµãŒããŒã®IPãšããŒã
ãããŸã§ã®èª¬æã¯ãAPIãµãŒããŒã®ã»ãã¥ã¢ããŒãã«éä¿¡ããããªã¯ãšã¹ãã«é©çšãããŸã(å žåçãªã±ãŒã¹)ã APIãµãŒããŒã¯ãå®éã«ã¯2ã€ã®ããŒãã§ãµãŒãã¹ãæäŸããããšãã§ããŸãã
ããã©ã«ãã§ã¯ãKubernetes APIãµãŒããŒã¯2ã€ã®ããŒãã§HTTPãæäŸããŸãã
localhost
ããŒã:- ãã¹ããšããŒãã¹ãã©ããçšã§ããã¹ã¿ãŒããŒãã®ä»ã®ã³ã³ããŒãã³ã(ã¹ã±ãžã¥ãŒã©ãŒãã³ã³ãããŒã©ãŒãããŒãžã£ãŒ)ãAPIãšéä¿¡ããããã®ãã®ã§ãã
- TLSã¯äœ¿çšããŸããã
- ããã©ã«ãããŒãã¯8080ã§ãã
- ããã©ã«ãã®IPã¯localhostã§ããã
--insecure-bind-address
ãã©ã°ã§å€æŽããããšãã§ããŸãã - ãªã¯ãšã¹ãã¯èªèšŒãšèªå¯ã®ã¢ãžã¥ãŒã«ããã€ãã¹ããŸãã
- ãªã¯ãšã¹ãã¯ãã¢ãããã·ã§ã³ã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã«ãã£ãŠåŠçãããŸãã
- ãã¹ãã«ã¢ã¯ã»ã¹ããå¿ èŠããããããä¿è·ãããŠããŸãã
âã»ãã¥ã¢ããŒãâ:
- å¯èœãªéããã¡ãã䜿çšããŠãã ããã
- TLSã䜿çšããŸããèšŒææžã¯
--tls-cert-file
ãã©ã°ã§ãéµã¯--tls-private-key-file
ãã©ã°ã§èšå®ããŸãã - ããã©ã«ãããŒãã¯6443ã§ãã
--secure-port
ãã©ã°ã§å€æŽããããšãã§ããŸãã - ããã©ã«ãã®IPã¯ãæåã®élocalhostã®ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ãŒã¹ã§ãã
--bind-address
ãã©ã°ã§å€æŽããããšãã§ããŸãã - ãªã¯ãšã¹ãã¯ãèªèšŒã»èªå¯ã¢ãžã¥ãŒã«ã«ãã£ãŠåŠçãããŸãã
- ãªã¯ãšã¹ãã¯ãã¢ãããã·ã§ã³ã³ã³ãããŒã«ã¢ãžã¥ãŒã«ã«ãã£ãŠåŠçãããŸãã
- èªèšŒã»èªå¯ã¢ãžã¥ãŒã«ãå®è¡ãããŸãã
次ã®é ç®
èªèšŒãèªå¯ãAPIã¢ã¯ã»ã¹ã³ã³ãããŒã«ã«é¢ãã詳ããããã¥ã¡ã³ãã¯ãã¡ããã芧ãã ããã
- èªèšŒ
- ã¢ãããã·ã§ã³ã³ã³ãããŒã©ãŒ
- èªå¯
- èšŒææžã®çœ²åèŠæ±
- CSRã®æ¿èªãšèšŒææžã®çœ²åãå«ã
- ãµãŒãã¹ã¢ã«ãŠã³ã
以äžã«ã€ããŠãç¥ãããšãã§ããŸãã
- PodãAPIã¯ã¬ãã³ã·ã£ã«ãååŸããããã«Secretsã䜿çšããæ¹æ³ã«ã€ããŠã