๐น ๊ฐ์
์ด๋ฒ ๊ธ์์๋ Istio์ Identity(์ ์) ๋ฐ ์ธ์ฆ(Authentication) ์ฒด๊ณ๋ฅผ ์ดํดํ๊ณ , ์๋น์ค ๋ณด์์ ๊ฐํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Istio๋ ์๋น์ค ๊ฐ์ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ณ ์ ํ ์๋น์ค ID๋ฅผ ์์ฑํ๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ์ ์ํํฉ๋๋ค.
์ด๋ฅผ ํตํด Zero Trust ๋ณด์ ๋ชจ๋ธ์ ์คํํ ์ ์์ผ๋ฉฐ,
mTLS(Mutual TLS), JWT(JSON Web Token), OAuth 2.0 ๋ฑ์ ์ธ์ฆ ๋ฐฉ์์ ์ง์ํฉ๋๋ค.
์ด ๊ธ์์๋ Istio์ ์ธ์ฆ ์ฒด๊ณ, ์๋น์ค ID ๋ฐ๊ธ ๋ฐฉ์, ๊ทธ๋ฆฌ๊ณ mTLS ๋ฐ JWT๋ฅผ ํ์ฉํ ๋ณด์ ๊ฐํ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
๐น 1. Istio์ Identity(์ ์) ์์คํ
โ 1.1 Istio์์ Identity๋?
Istio์ Identity(์ ์)๋ ์๋น์ค ๊ฐ ํต์ ์์ ์ ๋ขฐ์ฑ์ ๊ฒ์ฆํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ณด์ ๊ฐ๋
์
๋๋ค.
๊ฐ ์๋น์ค๋ Istio๋ฅผ ํตํด ๊ณ ์ ํ ID๋ฅผ ๋ถ์ฌ๋ฐ์ผ๋ฉฐ, ์ด ID๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆ์ด ์ด๋ฃจ์ด์ง๋๋ค.
Istio์ Identity ์ฃผ์ ํน์ง
- ์๋น์ค ๊ฐ mTLS๋ฅผ ํตํด ์ธ์ฆ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ๋ขฐ์ฑ์ ๋ณด์ฅ
- ๊ฐ ์๋น์ค๊ฐ ๊ณ ์ ํ ์๋น์ค ๊ณ์ (Service Account)๊ณผ ์ธ์ฆ์๋ฅผ ๊ฐ์ง
- Zero Trust ๋ณด์ ๋ชจ๋ธ์ ์ง์ํ์ฌ, ๋ด๋ถ ๋คํธ์ํฌ์์๋ ์ธ์ฆ์ ์๊ตฌ
โ 1.2 Istio์ ์๋น์ค Identity ๋ฐ๊ธ ๋ฐฉ์
Istio๋ ๊ฐ ์๋น์ค์ ๋ํด SPIFFE(Secure Production Identity Framework for Everyone) ID๋ฅผ ํ ๋นํฉ๋๋ค.
SPIFFE ID๋ ์๋น์ค์ ๊ณ ์ ํ ์ ์์ ๋ํ๋ด๋ฉฐ, ์๋น์ค ๊ฐ ์ธ์ฆ ๋ฐ ์ ๊ทผ ์ ์ด์ ์ฌ์ฉ๋ฉ๋๋ค.
Istio์ SPIFFE ID ํ์
spiffe://cluster.local/ns/<namespace>/sa/<service-account>
์์ :
spiffe://cluster.local/ns/default/sa/my-service
๐ก Istio๋ SPIFFE ID๋ฅผ ์ฌ์ฉํ์ฌ, ์๋น์ค ๊ฐ ์ธ์ฆ์ ์ํํ๊ณ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
๐น 2. Istio์์ ์ธ์ฆ(Authentication) ๋ฐฉ์
โ 2.1 mTLS(Mutual TLS) ์ธ์ฆ
**mTLS(Mutual TLS)**๋ ์๋น์ค ๊ฐ ํต์ ์ ์ํธํํ๊ณ , ๊ฐ ์๋น์ค๊ฐ ์๋ก์ ์ ์์ ๊ฒ์ฆํ๋ ๋ฐฉ์์
๋๋ค.
Istio์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก mTLS๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ์ธ์ฆ์๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
mTLS ์ธ์ฆ์ ์ํ PeerAuthentication ์ค์
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: enable-mtls
namespace: default
spec:
mtls:
mode: STRICT # ๋ชจ๋ ์๋น์ค ๊ฐ ํธ๋ํฝ์ mTLS๋ก ์ํธํ
์ค๋ช :
- mtls.mode: STRICT → ๋ชจ๋ ์๋น์ค ๊ฐ ํต์ ์ ์ํธํ(mTLS ์ ์ฉ)
๐ก mTLS๋ฅผ ์ ์ฉํ๋ฉด, Istio๋ ์๋น์ค ๊ฐ์ ๋ชจ๋ ํธ๋ํฝ์ ์๋์ผ๋ก ์ํธํํฉ๋๋ค.
โ 2.2 JWT(JSON Web Token) ์ธ์ฆ
Istio๋ JWT๋ฅผ ํ์ฉํ์ฌ ์ฌ์ฉ์ ๋๋ ์๋น์ค ์ธ์ฆ์ ์ํํ ์ ์์ต๋๋ค.
JWT ์ธ์ฆ์ ์ํ RequestAuthentication ์ค์
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: jwt-auth
namespace: default
spec:
selector:
matchLabels:
app: my-service # ํน์ ์๋น์ค์ JWT ์ธ์ฆ ์ ์ฉ
jwtRules:
- issuer: "https://auth.example.com" # JWT ๋ฐ๊ธ์
jwksUri: "https://auth.example.com/.well-known/jwks.json" # ๊ณต๊ฐ ํค URI
์ค๋ช :
- issuer → JWT ๋ฐ๊ธ์(OAuth 2.0 ์ธ์ฆ ์๋ฒ)
- jwksUri → JWT ์๋ช ์ ๊ฒ์ฆํ ๊ณต๊ฐ ํค URL
๐ก JWT๋ฅผ ์ ์ฉํ๋ฉด API ์์ฒญ ์ ์ ํจํ JWT ํ ํฐ์ด ํฌํจ๋์ด์ผ๋ง ์๋น์ค์ ์ ๊ทผํ ์ ์์ต๋๋ค.
โ 2.3 Istio์ AuthorizationPolicy๋ฅผ ํ์ฉํ ์ธ์ฆ ๊ฐํ
Istio์์๋ AuthorizationPolicy๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ์ ์(Identity)์ ๋ฐ๋ผ ์๋น์ค ์ ๊ทผ์ ์ ์ดํ ์ ์์ต๋๋ค.
JWT ์ธ์ฆ์ ์๊ตฌํ๋ AuthorizationPolicy ์ค์
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: require-jwt
namespace: default
spec:
action: ALLOW
rules:
- from:
- source:
requestPrincipals: ["https://auth.example.com/*"] # JWT ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํ์ฉ
to:
- operation:
paths: ["/secure-api"] # ๋ณดํธํ API ๊ฒฝ๋ก
์ค๋ช :
- requestPrincipals: ["https://auth.example.com/*"] → JWT ์ธ์ฆ๋ ์ฌ์ฉ์๋ง ํ์ฉ
- operation.paths: ["/secure-api"] → ํน์ API ๊ฒฝ๋ก ๋ณดํธ
๐ก ์ด ์ค์ ์ ์ ์ฉํ๋ฉด, JWT ์ธ์ฆ์ ๊ฑฐ์น์ง ์์ ์์ฒญ์ /secure-api์ ์ ๊ทผํ ์ ์์ต๋๋ค.
๐น 3. ์ธ์ฆ ์ ์ฉ ํ ํ์ธ ๋ฐฉ๋ฒ
โ 3.1 ์๋น์ค์ Identity ํ์ธ
ํ์ฌ ์๋น์ค๊ฐ ์ด๋ค Identity(SPIFFE ID)๋ฅผ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํฉ๋๋ค.
kubectl exec -it <pod-name> -n <namespace> -- cat /etc/istio/proxy/certs/root-cert.pem
โ 3.2 JWT ์ธ์ฆ ํ ์คํธ
JWT๋ฅผ ํฌํจํ์ฌ API ์์ฒญ์ ํ ์คํธํฉ๋๋ค.
curl -H "Authorization: Bearer " https://api.example.com/secure-api
๐ก ์ ํจํ JWT๊ฐ ํฌํจ๋์ง ์์ผ๋ฉด 401 Unauthorized ์๋ต์ด ๋ฐํ๋ฉ๋๋ค.
๐ ๊ฒฐ๋ก
- Istio๋ ์๋น์ค ๊ฐ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด Identity(SPIFFE ID)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- mTLS(Mutual TLS)๋ฅผ ํ์ฉํ๋ฉด ์๋น์ค ๊ฐ ํต์ ์ ์ํธํํ๊ณ , ์ํธ ์ธ์ฆ์ ์ํํ ์ ์์ต๋๋ค.
- JWT ์ธ์ฆ์ ํ์ฉํ๋ฉด ์ฌ์ฉ์์ API ์์ฒญ์ ๋ณดํธํ ์ ์์ผ๋ฉฐ, OAuth 2.0 ๋ฐ OIDC์ ์ฐ๋ํ ์ ์์ต๋๋ค.
- AuthorizationPolicy๋ฅผ ํ์ฉํ๋ฉด ํน์ ์ธ์ฆ๋ ์ฌ์ฉ์ ๋๋ ์๋น์ค๋ง ํน์ API์ ์ ๊ทผํ ์ ์๋๋ก ์ ํํ ์ ์์ต๋๋ค.