πŸ” μ‹ μž…μ΄ μ‹€μˆ˜λ‘œ μ„œλ²„λ₯Ό μ§€μš°μ§€ λͺ»ν•˜κ²Œ – Kubernetes RBAC μ„€μ •

μ§€κΈˆκΉŒμ§€λŠ” ν΄λŸ¬μŠ€ν„°μ˜ λͺ¨λ“  κΆŒν•œμ„ κ°€μ§„ admin κ³„μ •μœΌλ‘œ μ‹€μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€. μ‹€μ œ νšŒμ‚¬λΌλ©΄ μ΄λ ‡κ²Œ ν•˜λ©΄ μ•ˆ λ©λ‹ˆλ‹€. μ‹ μž… κ°œλ°œμžμ—κ²Œ kubectl κΆŒν•œμ„ μ£ΌλŠ”λ° μ‹€μˆ˜λ‘œ kubectl delete pod --all을 μΉ˜λŠ” 사고가 일어날 수 있죠. RBAC(Role-Based Access Control) 은 “λˆ„κ°€, μ–΄λ–€ λ¦¬μ†ŒμŠ€μ—, 무엇을 ν•  수 μžˆλŠ”μ§€”λ₯Ό μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•˜λŠ” μΏ λ²„λ„€ν‹°μŠ€μ˜ λ³΄μ•ˆ μ‹œμŠ€ν…œμž…λ‹ˆλ‹€.


🎯 이번 μ‹€μŠ΅ μ‹œλ‚˜λ¦¬μ˜€

μ‹ μž… 개발자용 계정(dev-sa)을 λ§Œλ“€μ–΄μ„œ λ‹€μŒκ³Ό 같이 κΆŒν•œμ„ μ œν•œν•©λ‹ˆλ‹€.

  • βœ… κ°€λŠ₯: νŒŒλ“œ λͺ©λ‘ 쑰회(list), 상세 쑰회(get), 둜그 보기(watch)
  • ❌ λΆˆκ°€λŠ₯: νŒŒλ“œ μ‚­μ œ(delete), 생성(create), μˆ˜μ •(edit)

🧩 RBAC의 3μš”μ†Œ

파일 3개λ₯Ό λΆ„λ¦¬ν•΄μ„œ λ§Œλ“œλŠ” 게 ν•΅μ‹¬μž…λ‹ˆλ‹€. μ΄μœ κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μš”μ†ŒYAMLμ—­ν• 
ServiceAccountdev-sa.yaml사원증 (ID만 있음, κΆŒν•œ μ—†μŒ)
Rolepod-reader-role.yaml업무 맀뉴얼 (무엇을 ν•  수 μžˆλŠ”μ§€ κ·œμΉ™)
RoleBindingdev-rolebinding.yamlκ·Όλ‘œκ³„μ•½μ„œ (μ‚¬μ›μ—κ²Œ 업무λ₯Ό λΆ€μ—¬)

νŒŒμΌμ„ λΆ„λ¦¬ν•˜λ©΄ μž¬μ‚¬μš©μ΄ λ©λ‹ˆλ‹€. μƒˆ νŒ€μ›μ΄ λ“€μ–΄μ˜€λ©΄ dev-sa.yaml만 μƒˆλ‘œ λ§Œλ“€κ³  같은 Role을 Bindingν•˜λ©΄ λ©λ‹ˆλ‹€. Role은 μˆ˜μ • 없이 μž¬ν™œμš©ν•©λ‹ˆλ‹€.


πŸ› οΈ κ΅¬ν˜„

Step 1: 계정 생성 (ServiceAccount)

# dev-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: dev-sa
  namespace: default
kubectl apply -f dev-sa.yaml

Step 2: κΆŒν•œ κ·œμΉ™ μ •μ˜ (Role)

# pod-reader-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods", "pods/log"]     # νŒŒλ“œμ™€ νŒŒλ“œ λ‘œκ·Έμ—λ§Œ 적용
  verbs: ["get", "list", "watch"]     # 쑰회만 ν—ˆμš©, delete μ—†μŒ!
kubectl apply -f pod-reader-role.yaml

Step 3: κΆŒν•œ μ—°κ²° (RoleBinding)

# dev-rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: dev-pod-reader
  namespace: default
subjects:
- kind: ServiceAccount
  name: dev-sa
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
kubectl apply -f dev-rolebinding.yaml

βœ… κΆŒν•œ 검증

admin κ³„μ •μ—μ„œ λ‘œκ·Έμ•„μ›ƒν•˜μ§€ μ•Šκ³ , --as μ˜΅μ…˜μœΌλ‘œ dev-sa 계정을 ν‰λ‚΄λ‚΄μ„œ(Impersonation) ν…ŒμŠ€νŠΈν•©λ‹ˆλ‹€.

# νŒŒλ“œ λͺ©λ‘ 쑰회 β†’ 성곡해야 함
kubectl auth can-i list pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: yes βœ…

# νŒŒλ“œ μ‚­μ œ β†’ 거뢀돼야 함
kubectl auth can-i delete pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: no πŸ›‘οΈ

# νŒŒλ“œ 생성 β†’ 거뢀돼야 함
kubectl auth can-i create pods --as=system:serviceaccount:default:dev-sa
# κ²°κ³Ό: no πŸ›‘οΈ

πŸ” 계정 이름 ꡬ쑰 λœ―μ–΄λ³΄κΈ°

--as μ˜΅μ…˜μ— μ“°μ΄λŠ” system:serviceaccount:default:dev-sa의 의미:

system:serviceaccount : default : dev-sa
β”‚                        β”‚         β”‚
β”‚                        β”‚         └── 계정 이름 (μš°λ¦¬κ°€ μ§€μ •)
β”‚                        └── λ„€μž„μŠ€νŽ˜μ΄μŠ€ (계정이 μ†ν•œ 곡간)
└── μ‹œμŠ€ν…œ κ³„μ •μž„μ„ λ‚˜νƒ€λ‚΄λŠ” 접두어 (κ³ μ •κ°’)

πŸ’‘ Role vs ClusterRole β€” λ²”μœ„κ°€ λ‹€λ¦…λ‹ˆλ‹€

RoleClusterRole
적용 λ²”μœ„νŠΉμ • λ„€μž„μŠ€νŽ˜μ΄μŠ€μ „μ²΄ ν΄λŸ¬μŠ€ν„°
μ‚¬μš© μΌ€μ΄μŠ€νŒ€λ³„ κΆŒν•œ λΆ„λ¦¬λ…Έλ“œ 관리, PV 관리 λ“±

μ§€κΈˆ λ§Œλ“  pod-reader Role은 default λ„€μž„μŠ€νŽ˜μ΄μŠ€μ—μ„œλ§Œ μœ νš¨ν•©λ‹ˆλ‹€. λ‹€λ₯Έ λ„€μž„μŠ€νŽ˜μ΄μŠ€μ˜ νŒŒλ“œλŠ” λ³Ό 수 μ—†μŠ΅λ‹ˆλ‹€. 전체 ν΄λŸ¬μŠ€ν„°μ˜ νŒŒλ“œλ₯Ό λ³Ό 수 있게 ν•˜λ €λ©΄ ClusterRole을 써야 ν•©λ‹ˆλ‹€.


πŸ’‘ μ‹€μ œ 적용 μ˜ˆμ‹œ

라즈베리파이 ν”„λ‘œμ νŠΈμ— μ μš©ν–ˆμ„ λ•Œμ˜ κ³„νš:

admin 계정: ν΄λŸ¬μŠ€ν„° 전체 관리
prometheus-sa: λ©”νŠΈλ¦­ μˆ˜μ§‘μš© (nodes, pods 쑰회만)
dev-sa: νŒŒλ“œ 쑰회 + 둜그 보기 (μ‚­μ œ λΆˆκ°€)
ci-sa: Deployment μ—…λ°μ΄νŠΈλ§Œ κ°€λŠ₯ (μ‚­μ œ λΆˆκ°€)

μ™ΈλΆ€ λͺ¨λ‹ˆν„°λ§ 도ꡬ(Prometheus)에 전체 admin κΆŒν•œμ„ μ£Όμ§€ μ•Šκ³ , ν•„μš”ν•œ κΆŒν•œλ§Œ λ”± 잘라 μ£ΌλŠ” λ°©μ‹μž…λ‹ˆλ‹€.


βœ… 정리

RBAC은 μΏ λ²„λ„€ν‹°μŠ€ ν΄λŸ¬μŠ€ν„°λ₯Ό μ—¬λŸ¬ νŒ€μ΄ μ‚¬μš©ν•˜λŠ” ν™˜κ²½μ—μ„œ ν•„μˆ˜μž…λ‹ˆλ‹€. κΆŒν•œ μ„€κ³„λŠ” “μ΅œμ†Œ κΆŒν•œ 원칙(Principle of Least Privilege)” β€” ν•„μš”ν•œ κ²ƒλ§Œ, ν•„μš”ν•œ λ²”μœ„μ—μ„œλ§Œ λΆ€μ—¬ν•˜λŠ” 게 κΈ°λ³Έμž…λ‹ˆλ‹€.

λ‹€μŒ κΈ€μ—μ„œλŠ” νŠΈλž˜ν”½μ΄ λͺ°λ¦΄ λ•Œ μžλ™μœΌλ‘œ νŒŒλ“œλ₯Ό λŠ˜λ¦¬λŠ” HPA(Horizontal Pod Autoscaler) λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.