๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ Ingress Gateway์์ TLS(SSL) ์ธ์ฆ์๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ๊ณผ ์ธ๋ถ ์ธ์ฆ ์์คํ
๊ณผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
TLS๋ ์น ํธ๋ํฝ์ ์ํธํํ์ฌ ๋ฐ์ดํฐ์ ๊ธฐ๋ฐ์ฑ์ ๋ณด์ฅํ๋ ๋ณด์ ํ๋กํ ์ฝ์ด๋ฉฐ,
Istio์ Ingress Gateway๋ฅผ ํตํด TLS๋ฅผ ์ ์ฉํ๋ฉด ๋ณด์์ด ๊ฐํ๋ HTTPS ํธ๋ํฝ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
๋ํ, OAuth 2.0, OIDC, LDAP ๋ฑ ์ธ๋ถ ์ธ์ฆ ์์คํ ๊ณผ Istio๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ๋ ๋ค๋ฃจ๊ฒ ์ต๋๋ค.
๐น 1. Ingress Gateway์์ TLS ์ ์ฉ
โ 1.1 Istio Ingress Gateway์์ TLS๋ฅผ ์ ์ฉํ๋ ์ด์
- ํด๋ผ์ด์ธํธ์ ์๋น์ค ๊ฐ์ ํธ๋ํฝ์ ์ํธํํ์ฌ ๋ณด์ ๊ฐํ
- Istio ๋ด๋ถ ๋คํธ์ํฌ ํธ๋ํฝ๋ ๋ณดํธ ๊ฐ๋ฅ(mTLS ์ฐ๋ ๊ฐ๋ฅ)
- ๊ณต์ธ ์ธ์ฆ์๋ฅผ ์ ์ฉํ์ฌ ์ธ๋ถ์์ ์ ๋ขฐํ ์ ์๋ HTTPS ์๋น์ค ์ ๊ณต
โ 1.2 TLS ์ธ์ฆ์ ์์ฑ ๋ฐ Kubernetes Secret ๋ฑ๋ก
Istio์ Ingress Gateway์์ TLS๋ฅผ ํ์ฑํํ๋ ค๋ฉด ๋จผ์ TLS ์ธ์ฆ์๋ฅผ ์์ฑํ๊ณ Kubernetes Secret์ผ๋ก ์ ์ฅํด์ผ ํฉ๋๋ค.
โ OpenSSL์ ์ฌ์ฉํ์ฌ ์ธ์ฆ์ ์์ฑ
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=example.com"
โก TLS ์ธ์ฆ์๋ฅผ Kubernetes Secret์ผ๋ก ๋ฑ๋ก
kubectl create -n istio-system secret tls my-tls-secret --key=tls.key --cert=tls.crt
๐ก my-tls-secret์ด๋ผ๋ Secret์ ์์ฑํ๋ฉฐ, Ingress Gateway์์ ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ 1.3 Istio Ingress Gateway์์ TLS ์ ์ฉ
์๋ ์์ ๋ Ingress Gateway์์ TLS๋ฅผ ํ์ฑํํ๋ ์ค์ ์ ๋๋ค.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: my-secure-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 443
name: https
protocol: HTTPS
tls:
mode: SIMPLE
credentialName: my-tls-secret # Kubernetes Secret์์ TLS ์ธ์ฆ์ ๋ก๋
hosts:
- "example.com"
์ค๋ช :
- tls.mode: SIMPLE → HTTPS ํ์ฑํ
- credentialName: my-tls-secret → Kubernetes Secret์์ TLS ์ธ์ฆ์ ๋ก๋
- hosts: "example.com" → ํด๋น ๋๋ฉ์ธ์์๋ง HTTPS ์ ์ฉ
๐ก Ingress Gateway์์ ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, example.com ๋๋ฉ์ธ์ HTTPS๊ฐ ํ์ฑํ๋ฉ๋๋ค.
๐น 2. Ingress Gateway์ ์ธ๋ถ ์ธ์ฆ ์์คํ ์ฐ๋
โ 2.1 ์ธ๋ถ OAuth 2.0 / OIDC ์ธ์ฆ ์๋ฒ ์ฐ๋
Istio์ Ingress Gateway๋ OAuth 2.0 ๋ฐ OIDC ์ธ์ฆ ์์คํ
๊ณผ ์ฐ๋ํ์ฌ ์ฌ์ฉ์ ์ธ์ฆ์ ์ํํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด JWT ๊ธฐ๋ฐ์ ์ธ์ฆ์ ์ ์ฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
โ JWT ๊ธฐ๋ฐ RequestAuthentication ์ค์
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth
namespace: istio-system
spec:
selector:
matchLabels:
istio: ingressgateway
jwtRules:
- issuer: "https://auth.example.com"
jwksUri: "https://auth.example.com/.well-known/jwks.json"
์ค๋ช :
- issuer: "https://auth.example.com" → OAuth 2.0 ์ธ์ฆ ์๋ฒ์ ๋ฐ๊ธ์ ์ค์
- jwksUri: "https://auth.example.com/.well-known/jwks.json" → JWT ๊ฒ์ฆ์ ์ํ ๊ณต๊ฐ ํค URI
๐ก ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, Istio Ingress Gateway์์ ๋ค์ด์ค๋ ์์ฒญ์ด JWT ์ธ์ฆ์ ๊ฑฐ์น๋๋ก ์ค์ ๋ฉ๋๋ค.
โ 2.2 ์ธ๋ถ ์ธ์ฆ ์์คํ ๊ณผ AuthorizationPolicy ์ ์ฉ
OAuth 2.0 ๋๋ OIDC ์ธ์ฆ์ด ์๋ฃ๋ ์ฌ์ฉ์๋ง ํน์ API์ ์ ๊ทผํ ์ ์๋๋ก AuthorizationPolicy๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค.
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: oauth-policy
namespace: istio-system
spec:
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["https://auth.example.com/*"] # JWT ๊ธฐ๋ฐ ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํ์ฉ
to:
- operation:
paths: ["/secure-api"] # ๋ณดํธํ API ๊ฒฝ๋ก
์ค๋ช :
- requestPrincipals: ["https://auth.example.com/*"] → OAuth 2.0 ์ธ์ฆ์ด ์๋ฃ๋ ์ฌ์ฉ์๋ง ํ์ฉ
- operation.paths: ["/secure-api"] → ๋ณดํธํ API ๊ฒฝ๋ก ์ง์
๐ก ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, ์ธ์ฆ๋ ์ฌ์ฉ์๋ง /secure-api ์๋ํฌ์ธํธ์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐น 3. Ingress Gateway์์ TLS ๋ฐ ์ธ์ฆ ์ ์ฉ ํ ํ์ธ ๋ฐฉ๋ฒ
โ 3.1 HTTPS ํ์ฑํ ํ์ธ
Ingress Gateway์์ HTTPS๊ฐ ์ ์์ ์ผ๋ก ์ ์ฉ๋์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl get gateway -n istio-system
์ถ๋ ฅ ์์ :
NAME AGE
my-secure-gateway 5m
โ 3.2 ์ธ์ฆ๋ ์ฌ์ฉ์๋ง API ์ ๊ทผ ๊ฐ๋ฅํ์ง ํ ์คํธ
OAuth 2.0 ์ธ์ฆ ํ, Access Token์ ํฌํจํ์ฌ API ์์ฒญ์ ์คํํฉ๋๋ค.
curl -H "Authorization: Bearer " https://example.com/secure-api
๐ก ์ ํจํ Access Token์ด ์์ผ๋ฉด 401 Unauthorized ์๋ต์ด ๋ฐํ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- Istio Ingress Gateway์์ TLS๋ฅผ ์ ์ฉํ๋ฉด, ์ธ๋ถ ํธ๋ํฝ์ HTTPS๋ก ๋ณดํธํ ์ ์์ต๋๋ค.
- Ingress Gateway๋ Kubernetes Secret์ ํ์ฉํ์ฌ TLS ์ธ์ฆ์๋ฅผ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- OAuth 2.0 ๋ฐ OIDC ์ฐ๋์ ํตํด ์ธ๋ถ ์ธ์ฆ ์์คํ ๊ณผ ํตํฉํ ์ ์์ต๋๋ค.
- AuthorizationPolicy๋ฅผ ํ์ฉํ๋ฉด ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํน์ API์ ์ ๊ทผํ ์ ์๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.