๋ชฉ์ฐจ
ย Create Role
RBAC์์์ Role์ Object๋ฅผ ์์ฑํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์ผ๋ฐ ๊ฐ์ฒด๋ค์ฒ๋ผ ์ ์ ํ์ผ์ ์์ฑํด ์ ์ํ ์ ์๋ค.
Developer๋ผ๋ ์ญํ ์ Pod์ ๋ํ ์กฐํ, ์์ฑ, ์ญ์ ์ ConfigMap์ ๋ํ ์์ฑ ๊ถํ์ ๋ถ์ฌํ๋ค๊ณ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ญํ ์ ์ ์ํ ์ ์๋ค.
# developer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["list", "get", "create", "update", "delete"]
- apiGroups: [""]
resources: ["ConfigMap"]
verbs: ["create"]
YAML
๋ณต์ฌ
์ญํ ์ ๊ฐ ๊ท์น์ apiGroups, resources, verbs ์ธ ๊ฐ์ง ์น์
์ผ๋ก ๋๋๋ค. Core Group์ด๋ผ๋ฉด apiGroups ์น์
์ ๋น์๋ ์ ์์ง๋ง, ์๋๋ผ๋ฉด apiGroups ์น์
์ ๋ช
์ํด์ผ ํ๋ค. ์ ์ฝ๋์์ Pod์ ConfigMap์ core group์ด๊ธฐ ๋๋ฌธ์ apiGroups๋ฅผ ๋น์ธ ์ ์๋ค.
ย Link User to Role
์ฌ์ฉ์๋ฅผ ์ญํ ์ ์ฐ๊ฒฐํ๊ธฐ ์ํด์๋ RoleBinding์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
# devuser-developer-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: devuser-developer-binding
subjects:
- kind: User
name: dev-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: developer
apiGroup: rbac.authorization.k8s.io
YAML
๋ณต์ฌ
subjects๋ ์ฌ์ฉ์์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ง์ ํ๋ ๊ณณ์ด๋ฉฐ, roleRef์์๋ ์ญํ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ณณ์ด๋ค. ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง subjects๋ ๋ฆฌ์คํธ๋ก์ ์ฌ๋ฌ ์ฌ์ฉ์ ๋ฐ ๊ทธ๋ฃน์ ๊ฐ์ง์ง๋ง roleRef๋ ๋จ์ผ ์ญํ ๋ง ๊ฐ์ง ์ ์๋ค.
ย View RBAC
โข
kubectl get roles
โข
kubectl get rolebingings
โข
kubectl describe role <role>
โฆ
ํด๋น role์ ๋ํ ์ ์ฑ
๋ค ํ์ธ ๊ฐ๋ฅ
โช
Resources, Permissions of Resources
โข
kubectl describe rolebinding <rolebinding>
โฆ
์ฐ๊ฒฐ๋ ์ญํ ๊ณผ Subject ๋ชฉ๋ก ํ์ธ ๊ฐ๋ฅ
ย Check Access
์ฌ์ฉ์๊ฐ ํด๋ฌ์คํฐ์ ํน์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ ๊ถํ์ด ์๋์ง ํ์ธํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค. kubectl auth can-i ๋ช
๋ น์ ์ฌ์ฉํ๋ฉฐ, ํด๋น ๋ช
๋ น์ ํตํด yes/no๋ก ๊ถํ์ ํ์ธํ ์ ์๋ค.
# kubectl auth can-i <verb> <resouce>
kubectl auth can-i create deployments
kubectl auth can-i delete nodes
Bash
๋ณต์ฌ
๋ค๋ฅธ ์ฌ์ฉ์์ ๋ํ ๊ถํ์ ํ
์คํธํ๊ธฐ ์ํด ํด๋ฌ์คํฐ๋ก ํด๋น ์ฌ์ฉ์์ ์ธ์ฆ์ ๋ฐ์ ์ ์ํด์ผ ํ ๊น? ๊ทธ๋ ์ง ์์๋ ๋๋ค. --as ์ต์
์ ํตํด ํน์ ์ฌ์ฉ์์ ๋ํ ๊ถํ์ ํ์ธํ ์ ์๋ค. ์ด๋ฅผ ํ์ฉํด์ ํน์ ๋ค์์คํ์ด์ค์์ ์๋์ด ๊ฐ๋ฅํ์ง๋ ํ์ธํ ์ ์๋ค.
# kubectl auth can-i <verb> <resouce> --as <user>
kubectl auth can-i create deployments --as dev-user
kubectl auth can-i create deployments --as dev-user --namespace test
kubectl auth can-i delete nodes --as dev-user
Bash
๋ณต์ฌ
ย Restrict Access
Namespace
์์ฑํ Role๊ณผ RoleBinding์ ๋ค์์คํ์ด์ค ๋ฒ์ ๋ด์ ์๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํด์ผ ํ๋ค. Role์ metadata.namespace์ ์ง์ ๋ ๋ค์์คํ์ด์ค์ ๋ฆฌ์์ค์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ธฐ๋ณธ๊ฐ์ default ๋ค์์คํ์ด์ค๋ค.
์์๋ก ์์์ ์์ฑํ developer๋ผ๋ Role์ default ๋ค์์คํ์ด์ค์์ Pod์ ConfigMap์ ๋ํ ์ ๊ทผ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์ ์ญํ ์ ์ ๊ทผ์ ์ ํํ๊ณ ์ถ๋ค๋ฉด ์ ์ ํ์ผ์ ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํด์ผ ํ๋ค.
Resource Name
๋ค์์คํ์ด์ค๋ก ํด๋ฌ์คํฐ๋ด์ ๋ฆฌ์์ค์ ๋ํ ์ ๊ทผ์ ์ ํํ ์ ์์ง๋ง, ๋ ์ข์ ์ ํ๋ ๊ฐ๋ฅํ๋ค. Role์์ rules.resourceNames๋ฅผ ํตํด ๊ฐ๋ฅํ๋ฐ, ์ด๋ ์ ๊ทผ ๊ฐ๋ฅํ Namespace ๋ด์์ ํด๋น ์ด๋ฆ์ ๊ฐ์ง๋ ๋ฆฌ์์ค์๋ง ์ ๊ทผ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
# developer-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: developer
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "create", "update"]
resourceNames: ["blue", "orange"]
YAML
๋ณต์ฌ
์ ์ญํ ์ default ๋ค์์คํ์ด์ค ๋ด์์ blue, orange ์ด๋ฆ์ ๊ฐ์ง Pod์ ๋ํ์ฌ ์กฐํ, ์์ฑ, ์์ ์ด ๊ฐ๋ฅํ๋ค.