๋ชฉ์ฐจ
ย Why Authorization?
๊ด๋ฆฌ์, ๊ฐ๋ฐ์, ํ
์คํฐ, ๋ชจ๋ํฐ๋ง ์ ํ๋ฆฌ์ผ์ด์
๋ฑ ํด๋ฌ์คํฐ์ ์ก์ธ์คํ๋ ๊ณ์ ๋ค์ ๋ค์ํ๋ค. ํ์ง๋ง ๋ชจ๋ ํด๋ฌ์คํฐ์ ๊ณ์ ๋ค์ด ๊ฐ์ ์ ๊ทผ ๊ถํ์ ๊ฐ์ง๊ฒ ํ๋ ๊ฒ์ ์ด์ ๋ฐ ๋ณด์์์ ์์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ฐ๋ผ์ ํด๋ฌ์คํฐ ๋ด์์ ๊ถํ ๋ถ์ฌ๋ฅผ ํจ์ผ๋ก์จ ์ฌ์ฉ์์ ๋ํ ์ ๊ทผ์ ์ ํํ ์ ์๋ค.
ย Mechanisms
ย Node
kube-apiserver์๋ ์ฌ์ฉ์์ kublet์ด ์ ๊ทผํ๋ค. ์ฌ์ฉ์๋ ๊ด๋ฆฌ ๋ชฉ์ ์ผ๋ก ์ ๊ทผ์ ์๋ํ๊ณ , kubelet์ ํด๋ฌ์คํฐ ๋
ธ๋์ ๊ด๋ฆฌ ํ๋ก์ธ์ค๋ฅผ ์ํด ์ ๊ทผํ๋ค.
kublet์ API Server์ ์ ๊ทผํ์ฌ ์๋น์ค, ์๋ํฌ์ธํธ, ๋
ธ๋, ํ๋์ ๋ํ ์ ๋ณด๋ฅผ ์ฝ๋๋ค. ๋ํ ๋
ธ๋์ ์ํ์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ณด๊ณ ํ์ฌ ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์ ์งํ๋ค.
Read | Write |
Services | Node status |
Endpoints | Pod status |
Nodes | Events |
Pods |
์ด๋ฌํ ์์ฒญ๋ค์ Node Authorizer๋ผ๋ ์์คํ
์ ์ํด ์ฒ๋ฆฌ๋๋ค.
Node Authorizer๋ system:node ๊ทธ๋ฃน์๊ฒ ํด๋ฌ์คํฐ ๋ด์ ์ ๊ทผ๊ณผ ๊ด๋ จ๋ ๊ถํ์ ๋ถ์ฌํ๋ค. kubelet์ system:node ๊ทธ๋ฃน์ ์ผ๋ถ๋ถ์ผ๋ก, ์ธ์ฆ์์์ system:node: ๋ฅผ prefix๋ก ๊ฐ์ง๋ค.
๋ฐ๋ผ์ kubelet์ Node Authorizer์๊ฒ ํด๋ฌ์คํฐ์ ์ ๊ทผ๊ณผ ๊ด๋ฆฌ ํ๋ก์ธ์ค์ ๋ํ ๊ถํ์ ๋ถ์ฌ๋ฐ๋๋ค. ์ด๋ API Server์ ๋ํ ๋ด๋ถ ์ ๊ทผ์ด๋ค.
ย ABAC
API Server์ ๋ํ ์ธ๋ถ ์ ๊ทผ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ถํ ๋ถ์ฌ ๋ฐฉ์ ์ค ํ๋๋ ABAC์ด๋ค.
Attribute Based Access Control์ ์ฌ์ฉ์์๊ฒ ์์ฑ์ด๋ ๊ทธ๋ฃน์ ๋ฐ๋ผ ํน์ ๊ถํ์ ๋ถ์ฌํ๋ ๋ฐฉ์์ด๋ค.
{"kind": "Policy", "spec": {"user":"dev-user", "namespace": "*", "resource": "pods", "apiGroup": "*"}}
{"kind": "Policy", "spec": {"user":"dev-user-2", "namespace": "*", "resource": "pods", "apiGroup": "*"}}
{"kind": "Policy", "spec": {"group":"dev-user", "namespace": "*", "resource": "pods", "apiGroup": "*"}}
{"kind": "Policy", "spec": {"user":"security-1", "namespace": "*", "resource": "csr", "apiGroup": "*"}}
JSON
๋ณต์ฌ
ABAC ๋ฐฉ์์ ๊ฐ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ๋ํ์ฌ ํน์ ํ์์ผ๋ก ์ ์ฑ
์ ์ ์ํ ์ ์ฑ
ํ์ผ์ ์์ฑํ์ฌ, ๊ทธ ํ์ผ์ API ์๋ฒ์ ์ ๋ฌํด์ผ ํ๋ค. ๋ณด์ ์ค์ ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ณ๊ฒฝํ ๋๋ง๋ค ์ ์ฑ
ํ์ผ์ ์์ ํ๊ณ kube-apiserver๋ฅผ ์ฌ์์ํด์ผํ๋ค๋ ์ ์ด ๋จ์ ์ด๋ค.
ย RBAC
์ก์ธ์ค ๊ด๋ฆฌ์ ๋ ํ์ค์ ์ธ ์ ๊ทผ๋ฒ์ผ๋ก RBAC์ ์ฌ์ฉํ๋ค.
Role Based Access Control์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ๋ํด ๊ถํ์ ๋ถ์ฌํ๋ ๊ฒ์ด ๋์ ์ญํ ์ ์ ์ํ๋ค. ์ ์ ํ ๊ถํ์ ๊ฐ์ง ์งํฉ์ผ๋ก ์ญํ ์ ์์ฑํ์ฌ ํด๋น ์ญํ ์ ์ฌ์ฉ์๋ ๊ทธ๋ฃน์ ์ฐ๊ฒฐํ๋ค. ์ญํ ์ ์์ ํ๋ฉด ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ฌ์ฉ์์ ๊ถํ์ด ๋ณ๊ฒฝ๋๋ค.
ย Webhook
์ฟ ๋ฒ๋คํฐ์ค ๋ด์ฅ ๋ฉ์ปค๋์ฆ์ด ์๋ Open Policy Agent(OPA)์ ๊ฐ์ด ์๋ํํฐ๋ฅผ ํตํด ์ธ๋ถ์์ ๊ถํ์ ๊ด๋ฆฌํ๋ค๋ฉด Webhook์ ์ฌ์ฉํ ์ ์๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ์ฌ์ฉ์์ ๊ทธ์ ์ ๊ทผ ์๊ตฌ ์ฌํญ์ ๋ํ ์ ๋ณด๋ฅผ ์ธ๋ถ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๋ฌํ๊ธฐ ์ํด API ํธ์ถ์ ์ํํ๋ค. ์ธ๋ถ ์ฑ์ ์ ๊ณต๋ ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ์ฌ์ฉ์์ ์ ๊ทผ์ ํ์ฉํ ์ง ๋ง์ง ๊ฒฐ์ ํ๊ณ , ๊ทธ ์๋ต์ ๋ฐ๋ผ ์ฌ์ฉ์๋ ์ ๊ทผ์ ํ๊ฐ๋ฐ๊ฒ ๋๋ค.
ย AlwaysAllow & AlwaysDeny
AlwaysAllow์ AlwaysDeny๋ ์ด๋ฆ์์ ์ ์ ์๋ฏ ์ด๋ค ์น์ธ ํ์ธ๋ ์์ด ๋ชจ๋ ์์ฒญ์ ํ์ฉํ๊ฑฐ๋ ๊ฑฐ์ ํ๋ ๊ถํ ๋ถ์ฌ ๋ฐฉ์์ด๋ค.
Configure Modes
๊ถํ ๋ถ์ฌ์ ๋ํ ๋ค์ํ ๋ชจ๋๋ค์ kube-apiserver์ authorization-mode ์ต์
์ ํตํด ์ค์ ๋๋ค. ์ต์
์ ๊ธฐ๋ณธ๊ฐ์ AlwaysAllow์ด๋ฉฐ, ์ฌ๋ฌ ๋ชจ๋๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
Multi-mode
์ฌ๋ฌ ๋ชจ๋๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ์๋ ์ง์ ๋ ์์๋๋ก ๊ฐ๊ฐ์ ์์ฒญ์ ๋ํ ๊ถํ์ด ๋ถ์ฌ๋๋ค.
์ฌ์ฉ์๊ฐ Node, RBAC, Webhook์ ์ง์ ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด, ๋จผ์ Node Authorizer๊ฐ ์ฒ๋ฆฌํ๋ค. Node Authorizer๋ ๋
ธ๋ ์์ฒญ๋ง ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ์์ฒญ์ ๊ฑฐ๋ถํ๋ค.
๋ชจ๋์ด ์์ฒญ์ ๊ฑฐ๋ถํ๋ฉด ๋ค์ ๋ชจ๋๋ก ์ ๋ฌ๋๋ค. ๋ค์ ๋ชจ๋์ธ RBAC์ด ์ฌ์ฉ์๋ฅผ ํ์ธํ๊ณ ์น์ธํ๋ค๋ฉด, ๋์ด์ ๋ค์ ๋ชจ๋๋ก ์์ฒญ์ด ์ ๋ฌ๋์ง ์๋๋ค.