๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์์ ๋คํธ์ํฌ ์ ์ฑ
(NetworkPolicy)์ ํ์ฉํ์ฌ ์๋น์ค ๊ฐ์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Kubernetes์ NetworkPolicy๋ ๊ธฐ๋ณธ์ ์ผ๋ก L3/L4(Network Layer)์์ ํธ๋ํฝ์ ์ ํํ์ง๋ง,
Istio๋ฅผ ํ์ฉํ๋ฉด L7(Application Layer)๊น์ง ์ ์ฑ
์ ์ธ๋ฐํ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ ๊ธฐ๋ณธ์ ์ธ Kubernetes ๋คํธ์ํฌ ์ ์ฑ ๊ณผ Istio์ AuthorizationPolicy๋ฅผ ํ์ฉํ ๋คํธ์ํฌ ๋ณด์ ๊ฐํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Kubernetes ๋คํธ์ํฌ ์ ์ฑ (NetworkPolicy) ๊ฐ์
โ 1.1 NetworkPolicy๋?
NetworkPolicy๋ Kubernetes์์ Pod ๊ฐ ํธ๋ํฝ์ ์ ์ดํ๋ ๋ณด์ ์ ์ฑ
์
๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Kubernetes๋ ๋ชจ๋ Pod ๊ฐ์ ํธ๋ํฝ์ ํ์ฉํ์ง๋ง,
NetworkPolicy๋ฅผ ์ ์ฉํ๋ฉด ํน์ ๋คํธ์ํฌ ํธ๋ํฝ๋ง ํ์ฉํ ์ ์์ต๋๋ค.
NetworkPolicy์ ์ฃผ์ ๊ธฐ๋ฅ
- ํน์ ๋ค์์คํ์ด์ค ๋๋ ๋ผ๋ฒจ ๊ธฐ๋ฐ์ผ๋ก ํธ๋ํฝ ์ ์ด
- L3/L4(Network Layer) ์์ค์์ ๋คํธ์ํฌ ์ ๊ทผ ์ ํ
- Ingress(๋ค์ด์ค๋ ํธ๋ํฝ) ๋ฐ Egress(๋๊ฐ๋ ํธ๋ํฝ) ์ ์ฑ ์ค์ ๊ฐ๋ฅ
โ 1.2 ๊ธฐ๋ณธ์ ์ธ Kubernetes NetworkPolicy ์์
์๋ NetworkPolicy๋ ํน์ ๋ค์์คํ์ด์ค์์ ๋ผ๋ฒจ์ด role: backend์ธ Pod๋ง role: frontend์์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ค์ ํฉ๋๋ค.
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
podSelector:
matchLabels:
role: backend # backend ์๋น์ค์ ๋ํ ์ ์ฑ
์ ์ฉ
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend # frontend์์ ๋ค์ด์ค๋ ํธ๋ํฝ๋ง ํ์ฉ
ports:
- protocol: TCP
port: 8080
์ค๋ช :
- podSelector.matchLabels.role: backend โ backend ์๋น์ค์ ๋ํ ์ ์ฑ ์ ์ฉ
- policyTypes: Ingress โ ๋ค์ด์ค๋ ํธ๋ํฝ์ ์ ์ด
- from.podSelector.matchLabels.role: frontend โ frontend ์๋น์ค์์ ์ค๋ ํธ๋ํฝ๋ง ํ์ฉ
- ports.protocol: TCP, port: 8080 โ TCP 8080 ํฌํธ๋ก์ ์์ฒญ๋ง ํ์ฉ
๐ก NetworkPolicy๋ ๋คํธ์ํฌ ๊ณ์ธต(L3/L4)์์ ํธ๋ํฝ์ ์ ํํ๋ ์ญํ ์ ํฉ๋๋ค.
๐น 2. Istio์ ๋คํธ์ํฌ ๋ณด์ ๋ฐ ํธ๋ํฝ ์ ์ด
โ 2.1 Istio์ ๋คํธ์ํฌ ๋ณด์ ๊ฐ๋
Istio์์๋ Kubernetes์ NetworkPolicy ๋์ AuthorizationPolicy๋ฅผ ํ์ฉํ์ฌ ๋คํธ์ํฌ ๋ณด์์ ๊ฐํํ ์ ์์ต๋๋ค.
Istio์ ๋ณด์ ์ ์ฑ
์ L7(Application Layer)๊น์ง ์ ์ด ๊ฐ๋ฅํ์ฌ, HTTP ์์ฒญ ์์ค์์ ํธ๋ํฝ์ ์ ํํ ์ ์์ต๋๋ค.
Istio์ ๋คํธ์ํฌ ๋ณด์ ๊ธฐ๋ฅ
- L7 ๊ธฐ๋ฐ์ ํธ๋ํฝ ํํฐ๋ง (HTTP ๋ฉ์๋, ํค๋, JWT ์ธ์ฆ ๋ฑ)
- ์๋น์ค ๊ฐ mTLS๋ฅผ ํ์ฉํ์ฌ ๋คํธ์ํฌ ์ํธํ ๊ฐ๋ฅ
- AuthorizationPolicy๋ฅผ ํ์ฉํ์ฌ API ์๋ํฌ์ธํธ๋ณ ์ ๊ทผ ์ ์ด ๊ฐ๋ฅ
๐ก Istio์ AuthorizationPolicy๋ L3, L4, L7 ๋ ๋ฒจ์์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค.
โ 2.2 Istio์ AuthorizationPolicy๋ฅผ ํ์ฉํ ๋คํธ์ํฌ ์ ์ฑ ์ ์ฉ
์๋ AuthorizationPolicy๋ role: frontend๊ฐ ์ค์ ๋ Pod๋ง backend ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํฉ๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-frontend-to-backend
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
principals: ["cluster.local/ns/default/sa/frontend"] # frontend ์๋น์ค๋ง ํ์ฉ
to:
- operation:
methods: ["GET"] # GET ์์ฒญ๋ง ํ์ฉ
paths: ["/api/data"] # ํน์ ๊ฒฝ๋ก๋ง ํ์ฉ
์ค๋ช :
- action: ALLOW โ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์ฒญ๋ง ํ์ฉ
- source.principals: ["cluster.local/ns/default/sa/frontend"] โ frontend ์๋น์ค์์ ์ค๋ ์์ฒญ๋ง ํ์ฉ
- operation.methods: ["GET"] โ GET ์์ฒญ๋ง ํ์ฉ
- operation.paths: ["/api/data"] โ ํน์ API ์๋ํฌ์ธํธ๋ง ์ ๊ทผ ๊ฐ๋ฅ
๐ก Istio๋ ๋คํธ์ํฌ ๊ณ์ธต(L3/L4)๋ฟ๋ง ์๋๋ผ, ์ ํ๋ฆฌ์ผ์ด์ ๊ณ์ธต(L7)๊น์ง ์ธ๋ฐํ ๋ณด์ ์ ์ฑ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๐น 3. Istio์ ๋คํธ์ํฌ ์ ์ฑ ํ์ฉ ์ฌ๋ก
โ 3.1 ํน์ ๋ค์์คํ์ด์ค ๊ฐ ํธ๋ํฝ ์ฐจ๋จ
์๋ AuthorizationPolicy๋ namespace: production์ ์๋น์ค๋ namespace: staging์ ์๋น์ค์ ํต์ ํ ์ ์๋๋ก ์ ํํฉ๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: deny-staging-to-production
namespace: production
spec:
action: DENY
rules:
- from:
- source:
namespaces: ["staging"] # staging ๋ค์์คํ์ด์ค์์ ์ค๋ ํธ๋ํฝ ์ฐจ๋จ
๐ก ์ด์(Production) ํ๊ฒฝ์ ์๋น์ค์ ๋ํ ๋ถํ์ํ ์ ๊ทผ์ ์ฐจ๋จํ ๋ ์ ์ฉํฉ๋๋ค.
โ 3.2 ๋ด๋ถ ์๋น์ค ๊ฐ ํธ๋ํฝ ์ ํ ๋ฐ ํน์ IP ํ์ฉ
์๋ AuthorizationPolicy๋ ์ธ๋ถ IP(์: ๋ก์ปฌ VPN IP)์์๋ง ํน์ API์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํฉ๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: allow-vpn-access
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["192.168.1.0/24"] # VPN IP ๋์ญ์์๋ง ์ ๊ทผ ํ์ฉ
to:
- operation:
paths: ["/secure-api"]
๐ก ๋ด๋ถ VPN ์ฌ์ฉ์๋ง API๋ฅผ ํธ์ถํ ์ ์๋๋ก ๋ณด์ ์ ์ฑ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
๐น 4. Istio ๋คํธ์ํฌ ์ ์ฑ ์ ์ฉ ํ ํ์ธ ๋ฐฉ๋ฒ
โ 4.1 ์ ์ฉ๋ AuthorizationPolicy ํ์ธ
ํ์ฌ ์ ์ฉ๋ AuthorizationPolicy๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get authorizationpolicy -n default
โ 4.2 ํน์ ์๋น์ค์ ์ ๊ทผ ํ ์คํธ
curl -H "Authorization: Bearer " https://api.example.com/secure-api
๐ก ์ ํจํ JWT๊ฐ ํฌํจ๋์ง ์๊ฑฐ๋, ์ ์ฑ ์ ์ํด ์ฐจ๋จ๋ ์์ฒญ์ด๋ฉด 403 Forbidden ์๋ต์ด ๋ฐํ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- Kubernetes์ NetworkPolicy๋ L3/L4(Network Layer)์์ ๋คํธ์ํฌ ํธ๋ํฝ์ ์ ํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- Istio์ AuthorizationPolicy๋ L7(Application Layer)๊น์ง ์ ์ด ๊ฐ๋ฅํ์ฌ, HTTP ์์ฒญ ์์ค์ ๋ณด์ ์ ์ฑ ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์๋น์ค ๊ฐ ํต์ ์ ์ ํํ๊ณ , ํน์ ๋ค์์คํ์ด์ค ๋๋ IP ๊ธฐ๋ฐ์ผ๋ก ์ ๊ทผ์ ํ์ฉํ๊ฑฐ๋ ์ฐจ๋จํ ์ ์์ต๋๋ค.
- Istio์ ๋ณด์ ์ ์ฑ ์ ํ์ฉํ๋ฉด ๋ด๋ถ ๋ฐ ์ธ๋ถ ํธ๋ํฝ์ ์์ ํ๊ฒ ์ ์ดํ์ฌ ๋ณด์์ฑ์ ๊ฐํํ ์ ์์ต๋๋ค.