Kubernetes Tools/Istio

[Istio ๊ฐ€์ด๋“œ ep.19] 3๋ถ€ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ #3 | RBAC & AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ์ ‘๊ทผ ์ œ์–ด

ygtoken 2025. 3. 18. 11:42
728x90

๐Ÿ”น ๊ฐœ์š”

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Istio์˜ RBAC(Role-Based Access Control) ๋ฐ AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ์ ‘๊ทผ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
RBAC๋Š” ์‚ฌ์šฉ์ž์˜ ์—ญํ• (Role)์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ์ •์ฑ…์ด๋ฉฐ,
AuthorizationPolicy๋Š” Istio์—์„œ ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” ๋ณด์•ˆ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” RBAC ๊ฐœ๋…, AuthorizationPolicy ์„ค์ • ๋ฐฉ๋ฒ•,
๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ YAML ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ์ ‘๊ทผ ์ œ์–ด๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น 1. Istio์—์„œ RBAC๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

โœ… 1.1 RBAC(Role-Based Access Control) ๊ฐœ๋…

**RBAC(์—ญํ•  ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด)**๋Š” ์‚ฌ์šฉ์ž์˜ ์—ญํ• (Role)์— ๋”ฐ๋ผ ํŠน์ • ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ์„ ํ—ˆ์šฉ ๋˜๋Š” ์ฐจ๋‹จํ•˜๋Š” ๋ณด์•ˆ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.
Istio์—์„œ๋Š” RBAC ์ •์ฑ…์„ ํ™œ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„์˜ ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RBAC์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ์„œ๋น„์Šค ๊ฐ„ ๋ฌด๋‹จ ์ ‘๊ทผ ๋ฐฉ์ง€
  • ํŠน์ • ์‚ฌ์šฉ์ž ๋˜๋Š” ์„œ๋น„์Šค์—๋งŒ API ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ฐ€๋Šฅ
  • ์ •์ฑ… ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ๊ฐ•ํ™”

๐Ÿ’ก Kubernetes์˜ ๊ธฐ๋ณธ RBAC์™€ ๋‹ฌ๋ฆฌ, Istio๋Š” ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ์ œ์–ดํ•˜๋Š” RBAC ์ •์ฑ…์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


โœ… 1.2 AuthorizationPolicy๋ž€?

**AuthorizationPolicy(๊ถŒํ•œ ์ •์ฑ…)**๋Š” ์„œ๋น„์Šค ๊ฐ„ ํ†ต์‹ ์„ ์ œ์–ดํ•˜๋Š” Istio์˜ ๋ณด์•ˆ ๋ฆฌ์†Œ์Šค์ž…๋‹ˆ๋‹ค.
RBAC๋ฅผ ์ ์šฉํ•˜์—ฌ ํŠน์ • ์„œ๋น„์Šค๋งŒ ํŠน์ • API์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

AuthorizationPolicy์˜ ์ฃผ์š” ๊ธฐ๋Šฅ

  • ํŠน์ • ์„œ๋น„์Šค ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์–ด
  • IP, JWT ํ† ํฐ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋“ฑ์˜ ์กฐ๊ฑด์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผ ๊ถŒํ•œ ๋ถ€์—ฌ ๊ฐ€๋Šฅ
  • ๊ฑฐ๋ถ€ ์ •์ฑ…(Deny Policy)์„ ์„ค์ •ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ ‘๊ทผ์„ ์ฐจ๋‹จ

๐Ÿ”น 2. Istio RBAC ๋ฐ AuthorizationPolicy ์„ค์ •

โœ… 2.1 ํŠน์ • ์„œ๋น„์Šค์—๋งŒ ์ ‘๊ทผ ํ—ˆ์šฉํ•˜๊ธฐ

์•„๋ž˜ AuthorizationPolicy ์˜ˆ์ œ์—์„œ๋Š” ์„œ๋น„์Šค frontend๋งŒ backend ์„œ๋น„์Šค์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-frontend
  namespace: default
spec:
  action: ALLOW  # ์ ‘๊ทผ ํ—ˆ์šฉ
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/default/sa/frontend"]  # frontend ์„œ๋น„์Šค๋งŒ ํ—ˆ์šฉ
      to:
        - operation:
            methods: ["GET"]  # GET ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
            paths: ["/api/data"]  # ํŠน์ • API ๊ฒฝ๋กœ๋งŒ ํ—ˆ์šฉ

์„ค๋ช…:

  • action: ALLOW → ์ง€์ •๋œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • source.principals → frontend ์„œ๋น„์Šค ๊ณ„์ •๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • operation.methods: ["GET"] → GET ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  • operation.paths: ["/api/data"] → ํŠน์ • API ์—”๋“œํฌ์ธํŠธ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • ์™ธ๋ถ€ API์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ํŠน์ • ์„œ๋น„์Šค๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ œํ•œํ•  ๋•Œ ์‚ฌ์šฉ
  • ๋‚ด๋ถ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅ

โœ… 2.2 ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จํ•˜๊ณ  ์˜ˆ์™ธ์ ์œผ๋กœ ํ—ˆ์šฉํ•˜๊ธฐ

๊ธฐ๋ณธ์ ์œผ๋กœ **๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๊ณ , ํŠน์ • ์„œ๋น„์Šค์—๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ๋ณด์•ˆ ๋ชจ๋ธ(Whitelist ๋ฐฉ์‹)**์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ‘  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: deny-all
  namespace: default
spec:
  action: DENY  # ๋ชจ๋“  ์š”์ฒญ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จ

โ‘ก ํŠน์ • ์„œ๋น„์Šค(frontend)๋งŒ ํ—ˆ์šฉ

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: allow-frontend
  namespace: default
spec:
  action: ALLOW  # ํŠน์ • ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์š”์ฒญ๋งŒ ํ—ˆ์šฉ
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/default/sa/frontend"]  # frontend ์„œ๋น„์Šค๋งŒ ํ—ˆ์šฉ

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋น„์Šค ๊ฐ„ ํŠธ๋ž˜ํ”ฝ์„ ์ฐจ๋‹จํ•˜๊ณ , ํ•„์š”ํ•œ ์„œ๋น„์Šค๋งŒ ์˜ˆ์™ธ์ ์œผ๋กœ ์ ‘๊ทผ ํ—ˆ์šฉ

โœ… 2.3 JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ ์šฉํ•˜๊ธฐ

Istio์—์„œ๋Š” JWT(JSON Web Token)๋ฅผ ํ™œ์šฉํ•˜์—ฌ API ์š”์ฒญ์„ ์ธ์ฆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: jwt-auth
  namespace: default
spec:
  action: ALLOW
  rules:
    - from:
        - source:
            requestPrincipals: ["https://issuer.example.com/*"]  # JWT ๋ฐœ๊ธ‰์ž ๊ธฐ์ค€์œผ๋กœ ์ธ์ฆ
      to:
        - operation:
            paths: ["/secure-api"]  # "/secure-api" ๊ฒฝ๋กœ๋งŒ ๋ณดํ˜ธ

์„ค๋ช…:

  • source.requestPrincipals → JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ธ์ฆ
  • operation.paths: ["/secure-api"] → ๋ณดํ˜ธํ•  API ๊ฒฝ๋กœ ์„ค์ •

๐Ÿ’ก ํ™œ์šฉ ์‚ฌ๋ก€:

  • JWT ๊ธฐ๋ฐ˜ OAuth 2.0 ์ธ์ฆ ์‹œ์Šคํ…œ๊ณผ ํ†ตํ•ฉํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”

๐Ÿ”น 3. AuthorizationPolicy ์„ค์ • ํ™•์ธ ๋ฐ ํ…Œ์ŠคํŠธ

โœ… 3.1 AuthorizationPolicy ์ ์šฉ ํ™•์ธ

ํ˜„์žฌ ์ ์šฉ๋œ AuthorizationPolicy๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

kubectl get authorizationpolicy -n default

โœ… 3.2 ํŠน์ • ์„œ๋น„์Šค์˜ ์ ‘๊ทผ ๊ถŒํ•œ ํ™•์ธ

istioctl x authz check pod/<pod-name> -n default

์ถœ๋ ฅ ์˜ˆ์ œ:

ACTION: ALLOW
SOURCE: cluster.local/ns/default/sa/frontend
DESTINATION: cluster.local/ns/default/sa/backend

๐Ÿ’ก ALLOW๊ฐ€ ํ‘œ์‹œ๋˜๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์ด ํ—ˆ์šฉ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“Œ ๊ฒฐ๋ก 

  • RBAC(Role-Based Access Control)๋Š” ์„œ๋น„์Šค ๊ฐ„ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ์—ญํ•  ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ์ •์ฑ…์ž…๋‹ˆ๋‹ค.
  • AuthorizationPolicy๋ฅผ ํ™œ์šฉํ•˜๋ฉด ํŠน์ • ์„œ๋น„์Šค ๋˜๋Š” ์‚ฌ์šฉ์ž์˜ API ์ ‘๊ทผ์„ ์ œํ•œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Whitelist ๋ฐฉ์‹(๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŠธ๋ž˜ํ”ฝ ์ฐจ๋‹จ ํ›„ ์˜ˆ์™ธ์ ์œผ๋กœ ํ—ˆ์šฉ) ์ ์šฉ ๊ฐ€๋Šฅ
  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ํ™œ์šฉํ•˜์—ฌ API ์š”์ฒญ์„ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์Œ
  • ์„œ๋น„์Šค ๊ฐ„ ๋ฌด๋‹จ ์ ‘๊ทผ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Istio์˜ RBAC ๋ฐ AuthorizationPolicy๋ฅผ ์ ๊ทน ํ™œ์šฉํ•ด์•ผ ํ•จ
728x90