GKE RBAC ๊ถŒ์žฅ์‚ฌํ•ญ


์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด(RBAC) ์ •์ฑ…์„ ๊ณ„ํšํ•˜๊ธฐ ์œ„ํ•œ ๊ถŒ์žฅ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. Google Kubernetes Engine(GKE)์—์„œ RBAC๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๋ ค๋ฉด ์—ญํ•  ๊ธฐ๋ฐ˜ ์•ก์„ธ์Šค ์ œ์–ด ๊ตฌ์„ฑ์„ ์ฐธ์กฐํ•˜์„ธ์š”. RBAC๋Š” Kubernetes์˜ ํ•ต์‹ฌ ๋ณด์•ˆ ๊ธฐ๋Šฅ์œผ๋กœ, ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์™€ ์›Œํฌ๋กœ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฆฌ์†Œ์Šค์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ์„ธ๋ถ„ํ™”๋œ ๊ถŒํ•œ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. RBAC ์—ญํ• ์„ ๋งŒ๋“ค๊ณ  ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ์„œ๋น„์Šค ๊ณ„์ • ๋˜๋Š” Google ๊ทธ๋ฃน์Šค์™€ ๊ฐ™์€ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ ์ฃผ์ฒด์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๋Š” ์กฐ์ง์˜ RBAC ์ •์ฑ…์„ ๊ณ„ํšํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๋ณด์•ˆ ์ „๋ฌธ๊ฐ€ ๋ฐ ์šด์˜์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. Google Cloud ์ฝ˜ํ…์ธ ์—์„œ ์ฐธ์กฐํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์—ญํ•  ๋ฐ ์˜ˆ์‹œ ํƒœ์Šคํฌ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ์ผ๋ฐ˜ GKE Enterprise ์‚ฌ์šฉ์ž ์—ญํ•  ๋ฐ ํƒœ์Šคํฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํŽ˜์ด์ง€๋ฅผ ์ฝ๊ธฐ ์ „ ๋‹ค์Œ ๋‚ด์šฉ์„ ์ˆ™์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฐ€์ด๋“œ์˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋Š” ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์š”์•ฝ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

RBAC ์ž‘๋™ ๋ฐฉ์‹

RBAC๋Š” ๋‹ค์Œ ์œ ํ˜•์˜ ์—ญํ•  ๋ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • ClusterRole: ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ์—ญํ• : ๋‹จ์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ์ œํ•œ๋˜๋Š” ๊ถŒํ•œ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค.
  • ClusterRoleBinding: ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— ClusterRole์„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • RoleBinding: ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— Role ๋˜๋Š” ClusterRole์„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

Role ๋˜๋Š” ClusterRole์—์„œ ๊ถŒํ•œ์„ rules๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ญํ• ์˜ ๊ฐ rules ํ•„๋“œ๋Š” API ๊ทธ๋ฃน, ์ด API ๊ทธ๋ฃน ๋‚ด์— ์žˆ๋Š” API ๋ฆฌ์†Œ์Šค, ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์— ํ—ˆ์šฉ๋˜๋Š” ๋™์‚ฌ(์ž‘์—…)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์„ ํƒ์ ์œผ๋กœ resourceNames ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ๋ฆฌ์†Œ์Šค์˜ ๋ช…๋ช…๋œ ์ธ์Šคํ„ด์Šค๋กœ ๋™์‚ฌ์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ๋ฆฌ์†Œ์Šค ์ธ์Šคํ„ด์Šค๋กœ ์•ก์„ธ์Šค ์ œํ•œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์—ญํ• ์„ ์ •์˜ํ•œ ํ›„ RoleBinding ๋˜๋Š” ClusterRoleBinding์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ญํ• ์„ ์ฃผ์ฒด์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋˜๋Š” ๋‹ค์ค‘ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ• ์ง€์— ๋”ฐ๋ผ ๋ฐ”์ธ๋”ฉ ์œ ํ˜•์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

RBAC ์—ญํ•  ์„ค๊ณ„

์ตœ์†Œ ๊ถŒํ•œ์˜ ์›์น™ ์‚ฌ์šฉ

RBAC ์—ญํ• ์— ๊ถŒํ•œ์„ ํ• ๋‹นํ•  ๋•Œ ์ตœ์†Œ ๊ถŒํ•œ์˜ ์›์น™์— ๋”ฐ๋ผ ํƒœ์Šคํฌ ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ์ตœ์†Œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œ ๊ถŒํ•œ์˜ ์›์น™์„ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์†์ƒ๋˜์—ˆ์„ ๋•Œ ๊ถŒํ•œ ์—์Šค์ปฌ๋ ˆ์ด์…˜ ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ค๊ณ  ๊ณผ๋„ํ•œ ์•ก์„ธ์Šค๋กœ ์ธํ•ด ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

์—ญํ• ์„ ์„ค๊ณ„ํ•  ๋•Œ๋Š” escalate ๋˜๋Š” bind ๋™์‚ฌ, PersistentVolumes์— ๋Œ€ํ•œ create ์•ก์„ธ์Šค, ์ธ์ฆ์„œ ์„œ๋ช… ์š”์ฒญ์— ๋Œ€ํ•œ create ์•ก์„ธ์Šค์™€ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๊ถŒํ•œ ์—์Šค์ปฌ๋ ˆ์ด์…˜ ์œ„ํ—˜์„ ์‹ ์ค‘ํ•˜๊ฒŒ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„ํ—˜ ๋ชฉ๋ก์€ Kubernetes RBAC - ๊ถŒํ•œ ์—์Šค์ปฌ๋ ˆ์ด์…˜ ์œ„ํ—˜์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๊ธฐ๋ณธ ์—ญํ•  ๋ฐ ๊ทธ๋ฃน ์‚ฌ์šฉ ์•ˆํ•จ

Kubernetes๋Š” API ๊ฒ€์ƒ‰์— ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ˜• ๊ตฌ์„ฑ์š”์†Œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ณธ ClusterRole ๋ฐ ClusterRoleBinding ์ง‘ํ•ฉ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋ณธ ์—ญํ• ๋กœ ๋ถ€์—ฌ๋˜๋Š” ๊ถŒํ•œ์€ ์—ญํ• ์— ๋”ฐ๋ผ ๊ด‘๋ฒ”์œ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Kubernetes์—๋Š” system: ํ”„๋ฆฌํ”ฝ์Šค๋กœ ์‹๋ณ„๋˜๋Š” ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋ฐ ์‚ฌ์šฉ์ž ๊ทธ๋ฃน ์ง‘ํ•ฉ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ Kubernetes์™€ GKE๋Š” ์ด๋Ÿฌํ•œ ์—ญํ• ์„ ๊ธฐ๋ณธ ๊ทธ๋ฃน ๋ฐ ๋‹ค์–‘ํ•œ ์ฃผ์ฒด์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. Kubernetes์—์„œ ์ƒ์„ฑ๋˜๋Š” ๊ธฐ๋ณธ ์—ญํ•  ๋ฐ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•œ ์ „์ฒด ๋ชฉ๋ก์€ ๊ธฐ๋ณธ ์—ญํ•  ๋ฐ ์—ญํ•  ๋ฐ”์ธ๋”ฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ์ผ๋ถ€ ๊ธฐ๋ณธ ์—ญํ• , ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์‹ ์ค‘ํ•˜๊ฒŒ ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์ด๋Ÿฌํ•œ ์—ญํ• , ์‚ฌ์šฉ์ž, ๊ทธ๋ฃน๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ณด์•ˆ ์ƒํ™ฉ์— ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๋ฆ„ ์œ ํ˜• ์„ค๋ช…
cluster-admin ClusterRole ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์ฃผ์ฒด์—๊ฒŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
system:anonymous ์‚ฌ์šฉ์ž

Kubernetes๋Š” ์ œ๊ณต๋œ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์—†๋Š” API ์„œ๋ฒ„ ์š”์ฒญ์— ์ด ์‚ฌ์šฉ์ž๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์—ญํ• ์„ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์—ญํ• ์—์„œ ๋ถ€์—ฌํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

system:unauthenticated ๊ทธ๋ฃน

Kubernetes๋Š” ์ œ๊ณต๋œ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์—†๋Š” API ์„œ๋ฒ„ ์š”์ฒญ์— ์ด ๊ทธ๋ฃน์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ทธ๋ฃน์— ์—ญํ• ์„ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์—ญํ• ์—์„œ ๋ถ€์—ฌํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

system:authenticated ๊ทธ๋ฃน

GKE๋Š” ๋ชจ๋“  Gmail ๊ณ„์ •์„ ํฌํ•จํ•˜์—ฌ Google ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•œ ๋ชจ๋“  ์‚ฌ์šฉ์ž์˜ API ์„œ๋ฒ„ ์š”์ฒญ์— ์ด ๊ทธ๋ฃน์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ๋ˆ„๊ตฌ๋‚˜ Google ๊ณ„์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— system:unauthenticated์™€ ์œ ์˜๋ฏธํ•˜๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด ๊ทธ๋ฃน์— ์—ญํ• ์„ ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ๋ชจ๋“  Gmail ๊ณ„์ •์„ ํฌํ•จํ•˜์—ฌ Google ๊ณ„์ •์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์—ญํ• ์—์„œ ๋ถ€์—ฌํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

system:masters ๊ทธ๋ฃน

Kubernetes๋Š” ์‹œ์Šคํ…œ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋„๋ก ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๊ทธ๋ฃน์— cluster-admin ClusterRole์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ทธ๋ฃน์— ์ž์ฒด ์ฃผ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ํ•ด๋‹น ์ฃผ์ฒด์—๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž, ์—ญํ• , ๊ทธ๋ฃน๊ณผ ๊ด€๋ จ๋œ ๋ฐ”์ธ๋”ฉ์„ ๋งŒ๋“ค์ง€ ๋งˆ์„ธ์š”. ์ด๋กœ ์ธํ•ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ณด์•ˆ ์ƒํ™ฉ์— ์˜๋„์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ cluster-admin ClusterRole์„ system:unauthenticated ๊ทธ๋ฃน์— ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ธ์ฆ๋˜์ง€ ์•Š์€ ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด์•ˆ ๋น„๋ฐ€์„ ํฌํ•จํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ์ด ๋†’์€ ์ด๋Ÿฌํ•œ ๋ฐ”์ธ๋”ฉ์€ ๋Œ€๋Ÿ‰ ๋ฉ€์›จ์–ด ์บ ํŽ˜์ธ๊ณผ ๊ฐ™์€ ๊ณต๊ฒฉ์˜ ํ‘œ์ ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ปค์Šคํ…€ ์—ญํ• ์„ system:unauthenticated ๊ทธ๋ฃน์— ๋ฐ”์ธ๋”ฉํ•˜๋ฉด ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ด๋‹น ์—ญํ• ์—์„œ ๋ถ€์—ฌํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ๋‹ค์Œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅด์„ธ์š”.

  • system:masters ๊ทธ๋ฃน์— ์ž์‹ ์˜ ์ฃผ์ฒด๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • system:unauthenticated ๊ทธ๋ฃน์„ RBAC ์—ญํ• ์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • system:authenticated ๊ทธ๋ฃน์„ RBAC ์—ญํ• ์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • system:anonymous ์‚ฌ์šฉ์ž๋ฅผ RBAC ์—ญํ• ์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • cluster-admin ClusterRole์„ ์ž์‹ ์˜ ์ฃผ์ฒด ๋˜๋Š” ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ๋งˆ์„ธ์š”. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์—ฌ๋Ÿฌ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์„ ์ •ํ™•ํ•˜๊ฒŒ ํŒ๋‹จํ•˜๊ณ  ํ•ด๋‹น ๋ชฉ์ ์— ๋งž๋Š” ํŠน์ • ์—ญํ• ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์ฃผ์ฒด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๊ธฐ ์ „ ๋‹ค๋ฅธ ๊ธฐ๋ณธ ์—ญํ• ๋กœ ๋ถ€์—ฌ๋˜๋Š” ๊ถŒํ•œ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๊ทธ๋ฃน์˜ ๊ตฌ์„ฑ์›์„ ์ˆ˜์ •ํ•˜๊ธฐ ์ „ ๊ธฐ๋ณธ ๊ทธ๋ฃน์— ๋ฐ”์ธ๋”ฉ๋œ ์—ญํ• ์„ ํ‰๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ทธ๋ฃน ์‚ฌ์šฉ ๋ฐฉ์ง€

gcloud CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ system:unauthenticated ๋ฐ system:authenticated ๊ทธ๋ฃน์ด๋‚˜ system:anonymous ์‚ฌ์šฉ์ž๋ฅผ ์ฐธ์กฐํ•˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๊ธฐ๋ณธ์ด ์•„๋‹Œ RBAC ๋ฐ”์ธ๋”ฉ์„ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ GKE ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ธฐ์กด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ๋‹ค์Œ ํ”Œ๋ž˜๊ทธ ์ค‘ ํ•˜๋‚˜ ๋˜๋Š” ๋‘˜ ๋‹ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ด๋Ÿฌํ•œ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š” ๊ธฐ๋ณธ Kubernetes ๋ฐ”์ธ๋”ฉ์€ ์ค‘์ง€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด GKE ๋ฒ„์ „ 1.30.1-gke.1283000 ์ด์ƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์—ญํ•  ๋ฐ ๊ทธ๋ฃน ์‚ฌ์šฉ ๊ฐ์ง€ ๋ฐ ์‚ญ์ œ

ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ RBAC ๋ฐ”์ธ๋”ฉ์—์„œ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ์ž์™€ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด GKE๊ฐ€ Google Cloud ์ฝ˜์†”์˜ ๋ณด์•ˆ ์ƒํ™ฉ ๋Œ€์‹œ๋ณด๋“œ์— ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ํด๋Ÿฌ์Šคํ„ฐ ๋˜๋Š” Fleet์— ํ‘œ์ค€ ๋“ฑ๊ธ‰์˜ Kubernetes ๋ณด์•ˆ ์ƒํ™ฉ ์Šค์บ”์„ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์›Œํฌ๋กœ๋“œ ๊ตฌ์„ฑ ๊ฐ์‚ฌ ์‚ฌ์šฉ ์„ค์ •์„ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋ฐ ๊ทธ๋ฃน์„ ์ฐธ์กฐํ•˜๋Š” ํŠน์ • RoleBinding ๋˜๋Š” ClusterRoleBindings๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•๊ณผ ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

ClusterRoleBindings
  1. ์†Œ์œ ์ž๊ฐ€ system:anonymous, system:unauthenticated ๋˜๋Š” system:authenticated์ธ ClusterRoleBinding์˜ ์ด๋ฆ„์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

    kubectl get clusterrolebindings -o json \
      | jq -r '["Name"], ["-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'
    

    ์ถœ๋ ฅ์—๋Š” ๋‹ค์Œ ClusterRoleBinding๋งŒ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.

    Name
    ----
    "system:basic-user"
    "system:discovery"
    "system:public-info-viewer"
    

    ์ถœ๋ ฅ์— ๊ธฐ๋ณธ์ด ์•„๋‹Œ ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๊ฐ ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์— ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ์ด ์—†์œผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

  2. ๋ฐ”์ธ๋”ฉ๊ณผ ์—ฐ๊ฒฐ๋œ ์—ญํ• ์˜ ๊ถŒํ•œ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

    kubectl get clusterrolebinding CLUSTER_ROLE_BINDING_NAME -o json \
        | jq ' .roleRef.name +" " + .roleRef.kind' \
        | sed -e 's/"//g' \
        | xargs -l bash -c 'kubectl get $1 $0 -o yaml'
    

    CLUSTER_ROLE_BINDING_NAME์„ ๊ธฐ๋ณธ์ด ์•„๋‹Œ ClusterRoleBinding์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
    ...
    rules:
    - apiGroups:
      - ""
      resources:
      - secrets
      verbs:
      - get
      - watch
      - list
    

    ์ถœ๋ ฅ์˜ ๊ถŒํ•œ์„ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— ๋ถ€์—ฌํ•ด๋„ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ถ”๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ์— ์˜ํ•ด ๋ถ€์—ฌ๋œ ๊ถŒํ•œ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete clusterrolebinding CLUSTER_ROLE_BINDING_NAME
    

    CLUSTER_ROLE_BINDING_NAME์„ ์‚ญ์ œํ•  ClusterRoleBinding์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

RoleBindings
  1. ์†Œ์œ ์ž๊ฐ€ system:anonymous, system:unauthenticated ๋˜๋Š” system:authenticated์ธ RoleBinding์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฐ ์ด๋ฆ„์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

    kubectl get rolebindings -A -o json \
      | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'
    

    ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ์œผ๋ฉด ์ถœ๋ ฅ์ด ๋นˆ ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์— ๊ธฐ๋ณธ์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ์ด ํฌํ•จ๋œ ๊ฒฝ์šฐ ๊ฐ ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์ด ๋น„์–ด ์žˆ์œผ๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

    RoleBinding ์ด๋ฆ„๋งŒ ์•Œ๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์ผ์น˜ํ•˜๋Š” rolebinding์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    kubectl get rolebindings -A -o json \
      | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(.metadata.name == "ROLE_BINDING_NAME") | [.metadata.namespace, .metadata.name]) | @tsv'
    

    ROLE_BINDING_NAME์„ ๊ธฐ๋ณธ์ด ์•„๋‹Œ RoleBinding์˜ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

  2. ๋ฐ”์ธ๋”ฉ๊ณผ ์—ฐ๊ฒฐ๋œ ์—ญํ• ์˜ ๊ถŒํ•œ์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

    kubectl get rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACE -o json \
        | jq ' .roleRef.name +" " + .roleRef.kind' \
        | sed -e 's/"//g' \
        | xargs -l bash -c 'kubectl get $1 $0 -o yaml --namespace ROLE_BINDING_NAMESPACE'
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • ROLE_BINDING_NAME: ๊ธฐ๋ณธ์ด ์•„๋‹Œ RoleBinding์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • ROLE_BINDING_NAMESPACE: ๊ธฐ๋ณธ์ด ์•„๋‹Œ RoleBinding์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
    ...
    rules:
    - apiGroups:
      - ""
      resources:
      - secrets
      verbs:
      - get
      - watch
      - list
    

    ์ถœ๋ ฅ์˜ ๊ถŒํ•œ์„ ๊ธฐ๋ณธ ์‚ฌ์šฉ์ž ๋˜๋Š” ๊ทธ๋ฃน์— ๋ถ€์—ฌํ•ด๋„ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ์ถ”๊ฐ€ ์กฐ์น˜๋ฅผ ์ทจํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ์— ์˜ํ•ด ๋ถ€์—ฌ๋œ ๊ถŒํ•œ์ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จ๋˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  3. ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ๋ฐ”์ธ๋”ฉ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    kubectl delete rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACE
    

    ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • ROLE_BINDING_NAME: ์‚ญ์ œํ•  RoleBinding์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
    • ROLE_BINDING_NAMESPACE: ์‚ญ์ œํ•  RoleBinding์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ˆ˜์ค€์œผ๋กœ ๊ถŒํ•œ ๋ฒ”์œ„ ์ง€์ •

์›Œํฌ๋กœ๋“œ ๋˜๋Š” ์‚ฌ์šฉ์ž์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”์ธ๋”ฉ ๋ฐ ์—ญํ• ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋ ค๋ฉด RoleBinding๊ณผ ํ•จ๊ป˜ Role์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋‚˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด RoleBinding๊ณผ ํ•จ๊ป˜ ClusterRole์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๋ ค๋ฉด ClusterRoleBinding๊ณผ ํ•จ๊ป˜ ClusterRole์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ํ•œ ์ ์€ ์ˆ˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์™€์ผ๋“œ ์นด๋“œ ์‚ฌ์šฉ ์•ˆํ•จ

* ๋ฌธ์ž๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์— ์ ์šฉ๋˜๋Š” ์™€์ผ๋“œ ์นด๋“œ์ž…๋‹ˆ๋‹ค. ๊ทœ์น™์— ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์„ธ์š”. RBAC ๊ทœ์น™์—์„œ API ๊ทธ๋ฃน, ๋ฆฌ์†Œ์Šค, ๋™์‚ฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด verbs ํ•„๋“œ์— *๋ฅผ ์ง€์ •ํ•˜๋ฉด ๋ฆฌ์†Œ์Šค์— get, list, watch, patch, update, deletecollection, delete ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ํ‘œ์—์„œ๋Š” ๊ทœ์น™์—์„œ ์™€์ผ๋“œ ์นด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ
- rules:
    apiGroups: ["apps","extensions"]
    resources: ["deployments"]
    verbs: ["get","list","watch"]

ํŠนํžˆ apps ๋ฐ extensions API ๊ทธ๋ฃน์— get, list, watch ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["*"]
    resources: ["deployments"]
    verbs: ["get","list","watch"]

๋ชจ๋“  API ๊ทธ๋ฃน์—์„œ deployments์— ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["apps", "extensions"]
    resources: ["deployments"]
    verbs: ["get", "list", "watch"]

apps ๋ฐ extensions API ๊ทธ๋ฃน์˜ ๋ฐฐํฌ์— get, list, watch ๋™์‚ฌ๋งŒ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["apps", "extensions"]
    resources: ["deployments"]
    verbs: ["*"]

patch ๋˜๋Š” delete๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ชจ๋“  ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ๊ทœ์น™์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ตœ์†Œ ๊ถŒํ•œ์˜ ์•ก์„ธ์Šค ๋ถ€์—ฌ

๊ทœ์น™์„ ๊ณ„ํšํ•  ๋•Œ ๊ฐ ์—ญํ• ์—์„œ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ์ตœ์†Œ ๊ถŒํ•œ์˜ ๊ทœ์น™ ์„ค๊ณ„๋ฅผ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒ์œ„ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์„ธ์š”.

  1. ๊ฐ ๋ฆฌ์†Œ์Šค์—์„œ ์ฃผ์ฒด๊ฐ€ ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฐ ๋™์‚ฌ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ RBAC ๊ทœ์น™ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ทœ์น™ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•œ ํ›„์—๋Š” ๊ทœ์น™์„ ๋ถ„์„ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ทœ์น™์— ๋™์ผํ•œ verbs ๋ชฉ๋ก์ด ํฌํ•จ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ทœ์น™์„ ๋‹จ์ผ ๊ทœ์น™์œผ๋กœ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‚จ์€ ๊ทœ์น™์€ ์„œ๋กœ ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ณด๋‹ค ์ฒด๊ณ„์ ์ธ ๊ทœ์น™ ์„ค๊ณ„๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ ๋ฆฌ์†Œ์Šค์— ๋™์ผํ•œ ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ทœ์น™์€ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉ๋˜๊ณ  ๋ฆฌ์†Œ์Šค์— ์„œ๋กœ ๋‹ค๋ฅธ ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ๊ทœ์น™์€ ๊ฐœ๋ณ„์ ์œผ๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์›Œํฌ๋กœ๋“œ์— deployments ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜์ง€๋งŒ daemonsets ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด์„œ๋Š” list ๋ฐ watch๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์—ญํ• ์„ ๋งŒ๋“ค ๋•Œ ๊ฐœ๋ณ„ ๊ทœ์น™์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. RBAC ์—ญํ• ์„ ์›Œํฌ๋กœ๋“œ์— ๋ฐ”์ธ๋”ฉํ•  ๋•Œ๋Š” deployments์—์„œ watch๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์˜ˆ์‹œ๋กœ, ์›Œํฌ๋กœ๋“œ์— pods ๋ฆฌ์†Œ์Šค์™€ daemonsets ๋ฆฌ์†Œ์Šค ๋ชจ๋‘ get ๋ฐ watch๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์›Œํฌ๋กœ๋“œ์—์„œ ๋‘ ๋ฆฌ์†Œ์Šค ๋ชจ๋‘ ๋™์ผํ•œ ๋™์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ์ด๋ฅผ ๋‹จ์ผ ๊ทœ์น™์œผ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—์„œ๋Š” ๋‘ ๊ทœ์น™ ์„ค๊ณ„๊ฐ€ ๋ชจ๋‘ ์ž‘๋™ํ•˜์ง€๋งŒ ์š”๊ตฌ์— ๋”ฐ๋ผ ๋ถ„ํ•  ๊ทœ์น™์ด ๋ฆฌ์†Œ์Šค ์•ก์„ธ์Šค๋ฅผ ๋” ์„ธ๋ถ€์ ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ
- rules:
    apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["get"]
- rules:
    apiGroups: ["apps"]
    resources: ["daemonsets"]
    verbs: ["list", "watch"]

Deployments์— ๋Œ€ํ•ด get ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•˜๊ณ  DaemonSets์— ๋Œ€ํ•ด watch ๋ฐ list ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ฒด๋Š” Deployments๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["apps"]
    resources: ["deployments", "daemonsets"]
    verbs: ["get","list","watch"]

Deployments ๋ฐ DaemonSets ๋ชจ๋‘์— ๋™์‚ฌ๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. deployments ๊ฐ์ฒด์— ๋Œ€ํ•ด list ์•ก์„ธ์Šค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ฃผ์ฒด์—๋„ ์ด ์•ก์„ธ์Šค๊ฐ€ ๋ถ€์—ฌ๋ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["apps"]
    resources: ["daemonsets", "deployments"]
    verbs: ["list", "watch"]

daemonsets ๋ฐ deployments ๋ฆฌ์†Œ์Šค ๋ชจ๋‘์— ๋Œ€ํ•ด ์ฃผ์ฒด์— ๋™์ผํ•œ ๋™์‚ฌ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 2๊ฐœ ๊ทœ์น™์„ ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: ["apps"]
    resources: ["daemonsets"]
    verbs: ["list", "watch"]
- rules:
    apiGroups: ["apps"]
    resources: ["deployments"]
    verbs: ["list", "watch"]

์ด๋Ÿฌํ•œ ๋ถ„ํ•  ๊ทœ์น™์€ ๊ฒฐํ•ฉ๋œ ๊ทœ์น™๊ณผ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€๋งŒ ์—ญํ•  ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ถˆํ•„์š”ํ•œ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ • ๋ฆฌ์†Œ์Šค ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œํ•œ

RBAC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ทœ์น™์—์„œ resourceNames ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์˜ ํŠน์ • ๋ช…๋ช…๋œ ์ธ์Šคํ„ด์Šค๋กœ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด seccomp-high ConfigMap์„ updateํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋Š” RBAC ์—ญํ• ์„ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ resourceNames๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ConfigMap๋งŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ resourceNames๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Œ
- rules:
    apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["seccomp-high"]
    verbs: ["update"]

์ฃผ์ฒด๊ฐ€ seccomp-high ConfigMap๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ฒด๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋‹ค๋ฅธ ConfigMap์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

- rules:
    apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["update"]

์ฃผ์ฒด๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ seccomp-high ConfigMap ๋ฐ ๋‹ค๋ฅธ ConfigMap์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

- rules:
    apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["list"]
- rules:
    apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["seccomp-high"]
    verbs: ["update"]

seccomp-high๋ฅผ ํฌํ•จํ•˜์—ฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ๋ชจ๋“  ConfigMap์— list ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. update ์•ก์„ธ์Šค๋ฅผ seccomp-high ConfigMap๋งŒ์œผ๋กœ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ช…๋œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด list๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๊ทœ์น™์ด ๋ถ„ํ• ๋ฉ๋‹ˆ๋‹ค.

- rules:
    apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["update", "list"]

list ์•ก์„ธ์Šค์™€ ํ•จ๊ป˜ ๋ชจ๋“  ConfigMap์— ๋Œ€ํ•ด update ์•ก์„ธ์Šค๋ฅผ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ •์ด RBAC ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋„๋ก ํ—ˆ์šฉ ์•ˆํ•จ

rbac.authorization.k8s.io API ๊ทธ๋ฃน์— bind, escalate, create, update, patch ๊ถŒํ•œ์ด ์žˆ๋Š” Role ๋˜๋Š” ClusterRole ๋ฆฌ์†Œ์Šค๋ฅผ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ escalate ๋ฐ bind๋Š” ๊ณต๊ฒฉ์ž๊ฐ€ RBAC์— ๋‚ด์žฅ๋œ ์—์Šค์ปฌ๋ ˆ์ด์…˜ ๋ฐฉ์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Kubernetes ์„œ๋น„์Šค ๊ณ„์ •

๊ฐ ์›Œํฌ๋กœ๋“œ์— Kubernetes ์„œ๋น„์Šค ๊ณ„์ • ๋งŒ๋“ค๊ธฐ

๊ฐ ์›Œํฌ๋กœ๋“œ์— ๊ฐœ๋ณ„ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ํ•ด๋‹น ์„œ๋น„์Šค ๊ณ„์ •์— ์ตœ์†Œ ๊ถŒํ•œ์ธ Role ๋˜๋Š” ClusterRole์„ ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์„œ๋น„์Šค ๊ณ„์ • ์‚ฌ์šฉ ์•ˆํ•จ

Kubernetes๋Š” ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— default๋ผ๋Š” ์„œ๋น„์Šค ๊ณ„์ •์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. default ์„œ๋น„์Šค ๊ณ„์ •์€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์„œ๋น„์Šค ๊ณ„์ •์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๋Š” ํฌ๋“œ์— ์ž๋™์œผ๋กœ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค. Role ๋˜๋Š” ClusterRole์„ default ์„œ๋น„์Šค ๊ณ„์ •์— ๋ฐ”์ธ๋”ฉํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Kubernetes๋Š” ์ด๋Ÿฌํ•œ ์—ญํ• ์— ์•ก์„ธ์Šค๊ฐ€ ๋ถ€์—ฌ๋  ํ•„์š”๊ฐ€ ์—†๋Š” ํฌ๋“œ์— default ์„œ๋น„์Šค ๊ณ„์ •์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์ž๋™์œผ๋กœ ๋งˆ์šดํŠธํ•˜์ง€ ์•Š์Œ

ํฌ๋“œ ์‚ฌ์–‘์˜ automountServiceAccountToken ํ•„๋“œ๋Š” Kubernetes๊ฐ€ Kubernetes ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด ํ† ํฐ์„ ํฌ๋“œ์— ์‚ฝ์ž…ํ•˜๋„๋ก ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ๋Š” ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes API ์„œ๋ฒ„์— ๋Œ€ํ•ด ์ธ์ฆ๋œ ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ•„๋“œ์˜ ๊ธฐ๋ณธ๊ฐ’์€ true์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  GKE ๋ฒ„์ „์—์„œ ํฌ๋“œ๊ฐ€ API ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ํฌ๋“œ ์‚ฌ์–‘์— automountServiceAccountToken=false๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ ๋น„๋ฐ€ ๊ธฐ๋ฐ˜ ํ† ํฐ๋ณด๋‹ค ์ž„์‹œ ํ† ํฐ ์„ ํ˜ธ

๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ์˜ kubelet ํ”„๋กœ์„ธ์Šค๋Š” ๊ฐ ํฌ๋“œ์— ๋Œ€ํ•ด ๋‹จ๊ธฐ ์ž๋™ ์ˆœํ™˜ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ ์‚ฌ์–‘์—์„œ automountServiceAccountToken ํ•„๋“œ๋ฅผ false๋กœ ์„ค์ •ํ•˜์ง€ ์•Š๋Š” ํ•œ kubelet์€ ์ด ํ† ํฐ์„ ํฌ๋“œ์— ์˜ˆ์ƒ ๋ณผ๋ฅจ์œผ๋กœ ๋งˆ์šดํŠธํ•ฉ๋‹ˆ๋‹ค. ํฌ๋“œ์—์„œ Kubernetes API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ API ์„œ๋ฒ„์— ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์„ ์ˆ˜๋™์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜๋Š” ๊ฒฝ์šฐ Kubernetes ๋ณด์•ˆ ๋น„๋ฐ€์„ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์„ ์ €์žฅํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋น„๋ฐ€ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ๊ณ„์ • ํ† ํฐ์€ ๋งŒ๋ฃŒ๋˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ์ˆœํ™˜๋˜์ง€ ์•Š๋Š” ๋ ˆ๊ฑฐ์‹œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค ๊ณ„์ •์— ๋Œ€ํ•ด ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฉด TokenRequest API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™์œผ๋กœ ์ˆœํ™˜๋˜๋Š” ๋‹จ๊ธฐ ํ† ํฐ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ง€์†์ ์œผ๋กœ RBAC ๊ถŒํ•œ ๊ฒ€ํ† 

RBAC ์—ญํ•  ๋ฐ ์•ก์„ธ์Šค๋ฅผ ์ •๊ธฐ์ ์œผ๋กœ ๊ฒ€ํ† ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ์—์Šค์ปฌ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ ๋ฐ ์ค‘๋ณต ๊ทœ์น™์„ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ญ์ œ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŠน๋ณ„ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š” Role์„ ๋ฐ”์ธ๋”ฉํ•˜๋Š” RoleBinding์„ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. ๊ณต๊ฒฉ์ž๊ฐ€ ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ์‚ญ์ œ๋œ ์‚ฌ์šฉ์ž์™€ ๋™์ผํ•œ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉ์ž ๊ณ„์ •์„ ๋งŒ๋“ค๋ฉด ํ•ด๋‹น Role์— ๋ฐ”์ธ๋”ฉ๋˜๊ณ  ๋™์ผํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ •๊ธฐ์ ์ธ ๊ฒ€ํ† ๋Š” ์ด๋Ÿฌํ•œ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ฒดํฌ๋ฆฌ์ŠคํŠธ ์š”์•ฝ

๋‹ค์Œ ๋‹จ๊ณ„