From 0b1763b59b1cda19e6702c22ca0426150e8ea615 Mon Sep 17 00:00:00 2001 From: "wusub.shin@softcamp.co.kr" Date: Wed, 11 Dec 2024 18:01:00 +0900 Subject: [PATCH] =?UTF-8?q?=ED=8F=AC=EC=8A=A4=ED=8C=85=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../add-jwt-verification-proxy-to-istio.mdx | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/pages/msa/add-jwt-verification-proxy-to-istio.mdx b/pages/msa/add-jwt-verification-proxy-to-istio.mdx index 726ac50..dc827bd 100644 --- a/pages/msa/add-jwt-verification-proxy-to-istio.mdx +++ b/pages/msa/add-jwt-verification-proxy-to-istio.mdx @@ -46,6 +46,8 @@ istiod-8454df4fbb-7z8xz 1/1 Running 0 2m 서비스 간 트래픽의 인증을 설정하는 역할을 한다. 주로 트래픽의 인증 방법(예: mTLS, JWT 등)을 정의한다 +**`PeerAuthentication` 는 `namespace` 범위로 적용되기에 같은 목적일 경우 하나만 존재하면 된다** + 여기서는 `jwt 인증` 만 살펴보겠다 ```yaml filename="peer-authentication.yaml" @@ -55,6 +57,8 @@ metadata: name: jwt-authentication namespace: my-namespace spec: + mtls: + mode: DISABLE jwt: issuer: "https://auth.example.com" jwksUri: "https://auth.example.com/.well-known/jwks.json" @@ -64,14 +68,21 @@ spec: - `kind` : 리소스의 유형. 여기서는 PeerAuthentication을 정의. - `metadata.name` : 리소스의 이름. - `metadata.namespace` : 리소스가 적용될 네임스페이스. 특정 네임스페이스에만 영향을 미침 +- `spec.mtls.mode` : 클라이언트, 서버 간의 TLS 상호 인증 기능 비활성화 - `spec.jwt.issuer` : JWT 토큰의 발급자(iss 클레임). 필수. - `spec.jwt.jwksUri` : JWT 서명 키를 가져오는 URI (JWKS). 이 URI에서 공개 키를 가져와 토큰 검증에 사용. - `spec.jwt.audiences` : JWT 토큰의 aud 클레임과 일치해야 하는 값. 리스트로 제공하며 여러 Audience를 지정 가능. + + + + ### AuthorizationPolicy 란? 요청을 필터링하거나 특정 조건에 맞는 요청만 허용하기 위해 사용 +**`AuthorizationPolicy` 는 `app` 별로 적용되기에 적용되어야할 `app` 이 여러개라면 똑같이 여러개의 `AuthorizationPolicy` 를 생성해야한다** + ```yaml filename="authorization-policy.yaml" apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy @@ -105,3 +116,73 @@ spec: - `to.operation` : 요청의 속성(HTTP 메서드, 경로 등)을 정의. - `to.methods` : 허용할 HTTP 메서드 (예: GET, POST). - `to.paths` : 특정 경로를 필터링. + + + +### RequestAuthentication 란? + +```yaml filename="requestAuthentication-yaml " +apiVersion: security.istio.io/v1 +kind: RequestAuthentication +metadata: + name: httpbin + namespace: foo +spec: + selector: + matchLabels: + app: httpbin + jwtRules: + - issuer: "issuer-foo" + jwksUri: https://example.com/.well-known/jwks.json +``` + +- `selector` : app: httpbin 라벨이 있는 Pod에 적용 +- `jwtRules` : JWT 토큰의 검증 규칙을 정의 +- `issuer` : JWT 토큰의 iss 클레임 값과 비교하여 발급자를 검증. +- `jwksUri` : JWT 토큰 서명을 검증하기 위한 공개 키를 포함한 JWKS URI. + +## RequestAuthentication + AuthorizationPolicy + +```yaml filename="RequestAuthentication" +apiVersion: security.istio.io/v1 +kind: RequestAuthentication +metadata: + name: httpbin + namespace: foo +spec: + selector: + matchLabels: + app: httpbin + jwtRules: + - issuer: "issuer-foo" + jwksUri: https://example.com/.well-known/jwks.json +``` + +```yaml filename="AuthorizationPolicy" +apiVersion: security.istio.io/v1beta1 +kind: AuthorizationPolicy +metadata: + name: httpbin-policy + namespace: foo +spec: + selector: + matchLabels: + app: httpbin + rules: + - from: + - source: + requestPrincipals: ["issuer-foo/subject@example.com"] +``` + +**RequestAuthentication**은 HTTP 요청에서 JWT 검증을 수행하기 위한 리소스. +**PeerAuthentication**은 서비스 간 mTLS 인증 또는 네트워크 수준 인증을 설정하는 데 사용. + + +### 등록 방법 + +`kubectl apply -f authorization-policy.yaml` +`kubectl apply -f peer-authentication.yaml` + +이런식으로 등록할 수 있다 + +