๋ฉ๋ชจ. ๋ฒ์ญ:
์ฐ๋ฆฌ๋ Istio์ ๊ธฐ๋ฅ์ ์์ฐํ๊ธฐ ์ํด Istio์ ์์ ๋ง์ดํฌ๋ก์๋น์ค ์ ํ๋ฆฌ์ผ์ด์ ์ธ Sentiment Analysis๋ฅผ ๋ฐฐํฌํ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ค์ ํ์ต๋๋ค.
Istio๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์๋, ์๊ฐ ์ด๊ณผ, ํ๋ก ์ฐจ๋จ๊ธฐ, ์ถ์ , ๋ชจ๋ํฐ๋ง๊ณผ ๊ฐ์ ๋ ์ด์ด๋ฅผ ๊ตฌํํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋น์ค๋ฅผ ์๊ท๋ชจ๋ก ์ ์งํ ์ ์์์ต๋๋ค. ๋ํ A/B ํ
์คํธ, ๋ฏธ๋ฌ๋ง, ์นด๋๋ฆฌ์ ๋กค์์ ๋ฑ ๊ณ ๊ธ ํ
์คํธ ๋ฐ ๋ฐฐํฌ ๊ธฐ์ ์ ์ฌ์ฉํ์ต๋๋ค.
์๋ก์ด ์๋ฃ์์๋ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ํฅํ ๊ธธ์ ๋ง์ง๋ง ๋จ๊ณ์ธ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ๋ค๋ฃฐ ๊ฒ์
๋๋ค. Istio์์๋ ์ ๋ง ๊ธฐ์ฉ๋๋ค!
Istio์ ์ธ์ฆ ๋ฐ ์น์ธ
๋๋ ์ธ์ฆ๊ณผ ๊ถํ ๋ถ์ฌ์์ ์๊ฐ์ ๋ฐ์ ๊ฒ์ด๋ผ๊ณ ๊ฒฐ์ฝ ๋ฏฟ์ง ์์์ต๋๋ค. ์ด๋ฌํ ์ฃผ์ ๋ฅผ ์ฌ๋ฏธ์๊ณ , ๋์ฑ ์๊ฐ์ ์ฃผ๊ธฐ ์ํด Istio๋ ๊ธฐ์ ์ ๊ด์ ์์ ๋ฌด์์ ์ ๊ณตํ ์ ์์ต๋๊น?
๋๋ต์ ๊ฐ๋จํฉ๋๋ค. Istio๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ๋ํ ์ฑ ์์ ์๋น์ค์์ Envoy ํ๋ก์๋ก ์ ํํฉ๋๋ค. ์์ฒญ์ด ์๋น์ค์ ๋๋ฌํ ๋์ฏค์๋ ์ด๋ฏธ ์ธ์ฆ ๋ฐ ๊ถํ์ด ๋ถ์ฌ๋์์ผ๋ฏ๋ก ๋น์ฆ๋์ค์ ์ ์ฉํ ์ฝ๋๋ฅผ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.
์ข์ ๊ฒ ๊ฐ๋์? ๋ด๋ถ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค!
Auth0์ผ๋ก ์ธ์ฆ
ID ๋ฐ ์ก์ธ์ค ๊ด๋ฆฌ๋ฅผ ์ํ ์๋ฒ๋ก ํ๊ฐํ์ด ์๊ณ ์ฌ์ฉ์ด ์ง๊ด์ ์ด๋ฉฐ ๋ง์์ ๋๋ Auth0์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋์ผํ ์์น์ด ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋ ์ ์์ต๋๋ค.
์์ํ๋ ค๋ฉด ๋ค์์ผ๋ก ์ด๋ํ์ธ์.
ํ์ผ์ ์ด ๋๋ฉ์ธ์ ์ง์ ํ์ธ์. resource-manifests/istio/security/auth-policy.yaml
(
apiVersion: authentication.istio.io/v1alpha1
kind: Policy
metadata:
name: auth-policy
spec:
targets:
- name: sa-web-app
- name: sa-feedback
origins:
- jwt:
issuer: "https://{YOUR_DOMAIN}/"
jwksUri: "https://{YOUR_DOMAIN}/.well-known/jwks.json"
principalBinding: USE_ORIGIN
์ด๋ฌํ ์์์ ๋ฐํ์ผ๋ก Pilot (Istio์ ์ธ ๊ฐ์ง ๊ธฐ๋ณธ ์ ์ด ํ๋ฉด ๊ตฌ์ฑ ์์ ์ค ํ๋ - ๋๋ต ๋ฒ์ญ) ์์ฒญ์ ์๋น์ค๋ก ์ ๋ฌํ๊ธฐ ์ ์ ์์ฒญ์ ์ธ์ฆํ๋๋ก Envoy๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. sa-web-app
ะธ sa-feedback
. ๋์์ ์๋น์ค Envoy์๋ ๊ตฌ์ฑ์ด ์ ์ฉ๋์ง ์์ต๋๋ค. sa-frontend
, ํ๋ฐํธ์๋๋ฅผ ์ธ์ฆ๋์ง ์์ ์ํ๋ก ๋ ์ ์์ต๋๋ค. ์ ์ฑ
์ ์ ์ฉํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ ์คํํ์ญ์์ค.
$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io โauth-policyโ created
ํ์ด์ง๋ก ๋์๊ฐ ์์ฒญ์ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ํ๋ก ๋๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ฌด๋จ 401. ์ด์ Auth0์ผ๋ก ์ธ์ฆํ๋๋ก ํ๋ฐํธ์๋ ์ฌ์ฉ์๋ฅผ ๋ฆฌ๋๋ ์ ํ๊ฒ ์ต๋๋ค.
Auth0์ผ๋ก ์์ฒญ ์ธ์ฆ
์ต์ข ์ฌ์ฉ์ ์์ฒญ์ ์ธ์ฆํ๋ ค๋ฉด ์ธ์ฆ๋ ์๋น์ค(๋ฆฌ๋ทฐ, ์ธ๋ถ ์ ๋ณด ๋ฐ ํ๊ฐ)๋ฅผ ๋ํ๋ด๋ API๋ฅผ Auth0์ ์์ฑํด์ผ ํฉ๋๋ค. API๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์์ผ๋ก ์ด๋ํ์ธ์. Auth0 ํฌํธ > API > API ์์ฑ ์์์ ์์ฑํ์ธ์.
์ฌ๊ธฐ์ ์ค์ํ ์ ๋ณด๋ ํ์ธ, ๋์ค์ ์คํฌ๋ฆฝํธ์์ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ ์ด๋ณด์:
- ์ค๋์ธ์ค (Audience): {YOUR_AUDIENCE}
ํ์ํ ๋๋จธ์ง ์ธ๋ถ ์ ๋ณด๋ ์น์ ์ Auth0 ํฌํธ์ ์์ต๋๋ค. ์ดํ๋ฆฌ์ผ์ด์ - ๊ณ ๋ฅด๋ค ์ํ ์ ์ฉ (API์ ํจ๊ป ์๋์ผ๋ก ์์ฑ๋จ)
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ธ ๊ฒ์ ๋๋ค:
- ๋๋ฉ์ธ: {YOUR_DOMAIN}
- ๊ณ ๊ฐ ID: {YOUR_CLIENT_ID}
๋ค์์ผ๋ก ์คํฌ๋กค ์ํ ์ ์ฉ ํ ์คํธ ํ๋๋ก ํ์ฉ๋ ์ฝ๋ฐฑ URL (์ฝ๋ฐฑ์ ๋ํด ํ์ธ๋ URL), ์ธ์ฆ์ด ์๋ฃ๋ ํ ํธ์ถ์ด ์ ์ก๋์ด์ผ ํ๋ URL์ ์ง์ ํฉ๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
http://{EXTERNAL_IP}/callback
๊ทธ๋ฆฌ๊ณ ํ์ฉ๋๋ ๋ก๊ทธ์์ URL (๋ก๊ทธ์์์ด ํ์ฉ๋ URL) ๋ค์์ ์ถ๊ฐํ์ธ์.
http://{EXTERNAL_IP}/logout
ํ๋ก ํธ์๋๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
ํ๋ฐํธ์๋ ์ ๋ฐ์ดํธ
์ง์ ์ผ๋ก ์ ํ auth0
์ ์ฅ์ [istio-mastery]
. ์ด ๋ถ๊ธฐ์์๋ ์ธ์ฆ์ ์ํด ์ฌ์ฉ์๋ฅผ Auth0์ผ๋ก ๋ฆฌ๋๋ ์
ํ๊ณ ๋ค๋ฅธ ์๋น์ค์ ๋ํ ์์ฒญ์ JWT ํ ํฐ์ ์ฌ์ฉํ๋๋ก ํ๋ฐํธ์๋ ์ฝ๋๊ฐ ๋ณ๊ฒฝ๋์์ต๋๋ค. ํ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋ฉ๋๋ค(
analyzeSentence() {
fetch('/sentiment', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${auth.getAccessToken()}` // Access Token
},
body: JSON.stringify({ sentence: this.textField.getValue() })
})
.then(response => response.json())
.then(data => this.setState(data));
}
Auth0์์ ํ
๋ํธ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํ๋ฐํธ์๋๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๋ค์์ ์ฝ๋๋ค. sa-frontend/src/services/Auth.js
์์์ ์ด ๊ฐ์ ๊ทธ ์์ ๋ฐ๊พธ์ญ์์ค (
const Config = {
clientID: '{YOUR_CLIENT_ID}',
domain:'{YOUR_DOMAIN}',
audience: '{YOUR_AUDIENCE}',
ingressIP: '{EXTERNAL_IP}' // ะัะฟะพะปัะทัะตััั ะดะปั ัะตะดะธัะตะบัะฐ ะฟะพัะปะต ะฐััะตะฝัะธัะธะบะฐัะธะธ
}
์ ์ฒญ์๊ฐ ์ค๋น๋์์ต๋๋ค. ๋ณ๊ฒฝ ์ฌํญ์ ๋น๋ํ๊ณ ๋ฐฐํฌํ ๋ ์๋ ๋ช ๋ น์ Docker ID๋ฅผ ์ง์ ํ์ธ์.
$ docker build -f sa-frontend/Dockerfile
-t $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
sa-frontend
$ docker push $DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
$ kubectl set image deployment/sa-frontend
sa-frontend=$DOCKER_USER_ID/sentiment-analysis-frontend:istio-auth0
์ฑ์ ์ฌ์ฉํด ๋ณด์ธ์! ๋ก๊ทธ์ธ(๋๋ ๋ฑ๋ก)์ด ํ์ํ Auth0์ผ๋ก ๋ฆฌ๋๋ ์ ๋๋ฉฐ, ๊ทธ ํ ์ด๋ฏธ ์ธ์ฆ๋ ์์ฒญ์ด ์ด๋ฃจ์ด์ง๋ ํ์ด์ง๋ก ๋ค์ ์ ์ก๋ฉ๋๋ค. ์ปฌ์ ์ฌ์ฉํ์ฌ ๊ธฐ์ฌ์ ์ฒซ ๋ฒ์งธ ๋ถ๋ถ์์ ์ธ๊ธํ ๋ช ๋ น์ ์๋ํ๋ฉด ์ฝ๋๋ฅผ ์ป์ ์ ์์ต๋๋ค. 401 ์ํ ์ฝ๋, ์์ฒญ์ด ์น์ธ๋์ง ์์์์ ๋ํ๋ ๋๋ค.
๋ค์ ๋จ๊ณ์ธ ์์ฒญ ์น์ธ์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
Auth0์ ํตํ ์น์ธ
์ธ์ฆ์ ํตํด ์ฌ์ฉ์๊ฐ ๋๊ตฌ์ธ์ง ์ดํดํ ์ ์์ง๋ง, ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ ์ ์๋ ๋์์ ์๊ธฐ ์ํด์๋ ์ธ์ฆ์ด ํ์ํฉ๋๋ค. Istio๋ ์ด๋ฅผ ์ํ ๋๊ตฌ๋ ์ ๊ณตํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ ๊ฐ์ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค(์๋ ๋ค์ด์ด๊ทธ๋จ ์ฐธ์กฐ).
- ํ์ (์ฌ์ฉ์) โ SA-WebApp ๋ฐ SA-Frontend ์๋น์ค์๋ง ์ก์ธ์คํ ์ ์์ต๋๋ค.
- ์ค์ฌ์ (์ฌํ์) โ ์ธ ๊ฐ์ง ์๋น์ค ๋ชจ๋์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
๊ถํ ๋ถ์ฌ ๊ฐ๋
์ด๋ฌํ ๊ทธ๋ฃน์ ์์ฑํ๊ธฐ ์ํด Auth0 Authorization ํ์ฅ์ ์ฌ์ฉํ๊ณ Istio๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ํ ์์ค์ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
Auth0 ์ธ์ฆ ์ค์น ๋ฐ ๊ตฌ์ฑ
Auth0 ํฌํธ์์ ํ์ฅ ํ๋ก๊ทธ๋จ(ํ์ฅ) ๋ฐ ์ค์น ์ธ์ฆ0 ์ธ์ฆ. ์ค์น ํ ๋ค์์ผ๋ก ์ด๋ํฉ๋๋ค. ์น์ธ ํ์ฅ, ๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์๋จ์ ํด๋ฆญํ๊ณ ์ ์ ํ ๋ฉ๋ด ์ต์ ์ ์ ํํ์ฌ ํ ๋ํธ ๊ตฌ์ฑ์ผ๋ก ์ด๋ํฉ๋๋ค. (๊ตฌ์ฑ). ๊ทธ๋ฃน ํ์ฑํ (์ฌ๋ฌ ๋ผ) ๊ท์น ๊ฒ์ ๋ฒํผ์ ํด๋ฆญํ์ธ์. (๊ฒ์ ๊ท์น).
๊ทธ๋ฃน ๋ง๋ค๊ธฐ
์ธ์ฆ ํ์ฅ์์ ๋ค์์ผ๋ก ์ด๋ํ์ธ์. ๊ทธ๋ฃน ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฃน์ ๋ง๋ค์ด์ ์ด์์. ์ธ์ฆ๋ ๋ชจ๋ ์ฌ์ฉ์๋ฅผ ์ผ๋ฐ ์ฌ์ฉ์๋ก ์ทจ๊ธํ๋ฏ๋ก ํด๋น ์ฌ์ฉ์๋ฅผ ์ํด ์ถ๊ฐ ๊ทธ๋ฃน์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฃน ์ ํ ์ด์์, ๋๋ฅด๋ค ํ์ ์ถ๊ฐ, ๊ธฐ๋ณธ ๊ณ์ ์ ์ถ๊ฐํ์ธ์. ์ผ๋ถ ์ฌ์ฉ์๋ ๊ทธ๋ฃน ์์ด ๊ทธ๋๋ก ๋์ด ์ก์ธ์ค๊ฐ ๊ฑฐ๋ถ๋๋๋ก ํ์ธ์. (์ ์ฌ์ฉ์๋ ๋ค์์ ํตํด ์๋์ผ๋ก ์์ฑํ ์ ์์ต๋๋ค. Auth0 ํฌํธ > ์ฌ์ฉ์ > ์ฌ์ฉ์ ์์ฑ.)
์ก์ธ์ค ํ ํฐ์ ๊ทธ๋ฃน ํด๋ ์ ์ถ๊ฐ
์ฌ์ฉ์๊ฐ ๊ทธ๋ฃน์ ์ถ๊ฐ๋์์ง๋ง ์ด ์ ๋ณด๋ ์ก์ธ์ค ํ ํฐ์๋ ๋ฐ์๋์ด์ผ ํฉ๋๋ค. OpenID Connect๋ฅผ ์ค์ํ๊ณ ๋์์ ํ์ํ ๊ทธ๋ฃน์ ๋ฐํํ๋ ค๋ฉด ํ ํฐ์ ์์ฒด ํ ํฐ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
๊ท์น์ ๋ง๋ค๋ ค๋ฉด Auth0 ํฌํธ๋ก ์ด๋ํ์ธ์. ๊ท์น, ๋๋ฅด๋ค ๊ท์น ๋ง๋ค๊ธฐ ํ ํ๋ฆฟ์์ ๋น ๊ท์น์ ์ ํํฉ๋๋ค.
์๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ์ฌ ์ ๊ท์น์ผ๋ก ์ ์ฅํ์ธ์. ๊ทธ๋ฃน ํด๋ ์ ์ถ๊ฐ (
function (user, context, callback) {
context.accessToken['https://sa.io/group'] = user.groups[0];
return callback(null, user, context);
}
์ฃผ์: ์ด ์ฝ๋๋ ๊ถํ ๋ถ์ฌ ํ์ฅ์ ์ ์๋ ์ฒซ ๋ฒ์งธ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๊ฐ์ ธ์ ์ด๋ฅผ ์ฌ์ฉ์ ์ง์ ํด๋ ์์ผ๋ก ์ก์ธ์ค ํ ํฐ์ ์ถ๊ฐํฉ๋๋ค(Auth0์์ ์๊ตฌํ๋ ๋๋ก ํด๋น ๋ค์์คํ์ด์ค ์๋).
ํ์ด์ง๋ก ๋์๊ฐ๊ธฐ ๊ท์น ๋ค์ ์์๋ก ์์ฑ๋ ๋ ๊ฐ์ง ๊ท์น์ด ์๋์ง ํ์ธํ์ธ์.
- auth0-์ธ์ฆ-ํ์ฅ
- ๊ทธ๋ฃน ํด๋ ์ ์ถ๊ฐ
๊ทธ๋ฃน ํ๋๋ ๊ท์น์ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ํ๋ฏ๋ก ์์๊ฐ ์ค์ํฉ๋๋ค. auth0-์ธ์ฆ-ํ์ฅ ๊ทธ ํ์๋ ๋ ๋ฒ์งธ ๊ท์น์ ๋ฐ๋ผ ํด๋ ์์ผ๋ก ์ถ๊ฐ๋ฉ๋๋ค. ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ ์ก์ธ์ค ํ ํฐ์ ๋๋ค.
{
"https://sa.io/group": "Moderators",
"iss": "https://sentiment-analysis.eu.auth0.com/",
"sub": "google-oauth2|196405271625531691872"
// [ัะพะบัะฐัะตะฝะพ ะดะปั ะฝะฐะณะปัะดะฝะพััะธ]
}
์ด์ ๊ทธ๋ฃน์ ํด๋ ์์์ ๊ฐ์ ธ์ฌ ์ฌ์ฉ์ ์ก์ธ์ค๋ฅผ ํ์ธํ๋๋ก Envoy ํ๋ก์๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค(https://sa.io/group
) ๋ฐํ๋ ์ก์ธ์ค ํ ํฐ์ ํฌํจ๋ฉ๋๋ค. ์ด๊ฒ์ด ๊ธฐ์ฌ์ ๋ค์ ์น์
์ ์ฃผ์ ์
๋๋ค.
Istio์ ์น์ธ ๊ตฌ์ฑ
์น์ธ์ด ์๋ํ๋ ค๋ฉด Istio์ฉ RBAC๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํฉ๋๋ค.
apiVersion: "rbac.istio.io/v1alpha1"
kind: RbacConfig
metadata:
name: default
spec:
mode: 'ON_WITH_INCLUSION' # 1
inclusion:
services: # 2
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
- "sa-feedback.default.svc.cluster.local"
์ค๋ช :
- 1 - ํ๋์ ๋์ด๋ ์๋น์ค ๋ฐ ๋ค์์คํ์ด์ค์ ๋ํด์๋ง RBAC๋ฅผ ํ์ฑํํฉ๋๋ค.
Inclusion
; - 2 โ ์ฐ๋ฆฌ๋ ์๋น์ค ๋ชฉ๋ก์ ๋์ดํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
$ kubectl apply -f resource-manifests/istio/security/enable-rbac.yaml
rbacconfig.rbac.istio.io/default created
์ด์ ๋ชจ๋ ์๋น์ค์๋ ์ญํ ๊ธฐ๋ฐ ์ก์ธ์ค ์ ์ด๊ฐ ํ์ํฉ๋๋ค. ์ฆ, ๋ชจ๋ ์๋น์ค์ ๋ํ ์ ๊ทผ์ด ๊ธ์ง๋๋ฉฐ ์ด์ ๋ํ ๋์์ด ์ด๋ฃจ์ด์ง๊ฒ ๋ฉ๋๋ค. RBAC: access denied
. ์ด์ ์น์ธ๋ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ์ ํ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
์ผ๋ฐ ์ฌ์ฉ์์ ์ ๊ทผ ๊ตฌ์ฑ
๋ชจ๋ ์ฌ์ฉ์๋ SA-Frontend ๋ฐ SA-WebApp ์๋น์ค์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ์์ด์ผ ํฉ๋๋ค. ๋ค์ Istio ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋์์ต๋๋ค.
- ์๋น์ค ์ญํ โ ์ฌ์ฉ์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ถ๋ฆฌ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
- ServiceRoleBinding โ ์ด ServiceRole์ด ๋๊ตฌ์๊ฒ ์ํ๋์ง ๊ฒฐ์ ํฉ๋๋ค.
์ผ๋ฐ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ํน์ ์๋น์ค(
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: regular-user
namespace: default
spec:
rules:
- services:
- "sa-frontend.default.svc.cluster.local"
- "sa-web-app.default.svc.cluster.local"
paths: ["*"]
methods: ["*"]
๊ทธ๋ฆฌ๊ณ ํตํด regular-user-binding
๋ชจ๋ ํ์ด์ง ๋ฐฉ๋ฌธ์์๊ฒ ServiceRole์ ์ ์ฉํฉ๋๋ค(
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: regular-user-binding
namespace: default
spec:
subjects:
- user: "*"
roleRef:
kind: ServiceRole
name: "regular-user"
"๋ชจ๋ ์ฌ์ฉ์"๋ ์ธ์ฆ๋์ง ์์ ์ฌ์ฉ์๋ SA ์น์ฑ์ ์ก์ธ์คํ ์ ์๋ค๋ ์๋ฏธ์ ๋๊น? ์๋์, ์ ์ฑ ์ JWT ํ ํฐ์ ์ ํจ์ฑ์ ํ์ธํฉ๋๋ค.
๊ตฌ์ฑ์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
$ kubectl apply -f resource-manifests/istio/security/user-role.yaml
servicerole.rbac.istio.io/regular-user created
servicerolebinding.rbac.istio.io/regular-user-binding created
์ค์ฌ์๋ฅผ ์ํ ์ก์ธ์ค ๊ตฌ์ฑ
์ค์ฌ์์ ๊ฒฝ์ฐ ๋ชจ๋ ์๋น์ค(
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
name: mod-user
namespace: default
spec:
rules:
- services: ["*"]
paths: ["*"]
methods: ["*"]
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๋ ์ก์ธ์ค ํ ํฐ์ ํด๋ ์์ด ํฌํจ๋ ์ฌ์ฉ์์๊ฒ๋ง ๊ทธ๋ฌํ ๊ถ๋ฆฌ๋ฅผ ์ํฉ๋๋ค. https://sa.io/group
์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ Moderators
(
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
name: mod-user-binding
namespace: default
spec:
subjects:
- properties:
request.auth.claims[https://sa.io/group]: "Moderators"
roleRef:
kind: ServiceRole
name: "mod-user"
๊ตฌ์ฑ์ ์ ์ฉํด ๋ณด๊ฒ ์ต๋๋ค.
$ kubectl apply -f resource-manifests/istio/security/mod-role.yaml
servicerole.rbac.istio.io/mod-user created
servicerolebinding.rbac.istio.io/mod-user-binding created
ํน์ฌ์ ์บ์ฑ์ผ๋ก ์ธํด ์น์ธ ๊ท์น์ด ์ ์ฉ๋๋ ๋ฐ ๋ช ๋ถ ์ ๋ ๊ฑธ๋ฆด ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ฌ์ฉ์์ ์ค์ฌ์์ ์ก์ธ์ค ์์ค์ด ์๋ก ๋ค๋ฅธ์ง ํ์ธํ ์ ์์ต๋๋ค.
์ด ๋ถ๋ถ์ ๋ํ ๊ฒฐ๋ก
ํ์ง๋ง ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ์ ๋ํ ๋ ๊ฐ๋จํ๊ณ ๊ฐํธํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์์ ํ ์ ๊ทผ ๋ฐฉ์์ ๋ณธ ์ ์ด ์์ต๋๊น?
์๋น์ค์ ๋ํ ์ต์ข ์ฌ์ฉ์ ์ก์ธ์ค์ ์ธ์ฆ ๋ฐ ๊ถํ ๋ถ์ฌ๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ โโ๋ฐ๋ ์ธ ๊ฐ์ง Istio ๋ฆฌ์์ค(RbacConfig, ServiceRole ๋ฐ ServiceRoleBinding)๋ง ํ์ํ์ต๋๋ค.
๋ํ, ์ฐ๋ฆฌ๋ ํน์ฌ ์๋น์ค๋ฅผ ํตํด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ฒ๋ฆฌํ์ฌ ๋ค์์ ๋ฌ์ฑํ์ต๋๋ค.
- ๋ณด์ ๋ฌธ์ ๋ฐ ๋ฒ๊ทธ๊ฐ ํฌํจ๋ ์ ์๋ ์ผ๋ฐ ์ฝ๋์ ์์ ์ค์ ๋๋ค.
- ํ๋์ ์๋ํฌ์ธํธ๊ฐ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค๋ ์ฌ์ค์ด ๋ฐํ์ง๊ณ ์ด๋ฅผ ๋ณด๊ณ ํ๋ ๊ฒ์ ์์ด๋ฒ๋ฆฌ๋ ์ด๋ฆฌ์์ ์ํฉ์ ์๋ฅผ ์ค์ ๋๋ค.
- ์๋ก์ด ์ญํ ์ด๋ ๊ถํ์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ชจ๋ ์๋น์ค๋ฅผ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์์ต๋๋ค.
- ์๋ก์ด ์๋น์ค๋ ์ฌ์ ํ ๋จ์ํ๊ณ ์์ ํ๋ฉฐ ๋น ๋ฆ ๋๋ค.
์ถ๋ ฅ
Istio๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ ์๋น์ค์ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ฏธ์์ ์ํ๋ก ๋๋๋ฆฌ์ง ์๊ณ ๋ ๋น์ฆ๋์ค์ ์ค์ํ ์์ ์ ๋ฆฌ์์ค๋ฅผ ์ง์คํ ์ ์์ต๋๋ค.
์ธ ๋ถ๋ถ์ผ๋ก ๊ตฌ์ฑ๋ ์ด ๊ธฐ์ฌ์์๋ ์ค์ ํ๋ก์ ํธ์์ Istio๋ฅผ ์์ํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์ง์๊ณผ ๋ฏธ๋ฆฌ ์ค๋น๋ ์ค์ฉ์ ์ธ ์ง์นจ์ ์ ๊ณตํ์ต๋๋ค.
๋ฒ์ญ๊ฐ์ ์ถ์
๋ธ๋ก๊ทธ์์๋ ์ฝ์ด๋ณด์ธ์.
- "Istio๋ฅผ ์ฌ์ฉํ ๋ง์ดํฌ๋ก์๋น์ค๋ก ๋์๊ฐ๊ธฐ":
1๋ถ(์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ) ,ํํธ 2(๋ผ์ฐํ , ํธ๋ํฝ ์ ์ด) ; - ยซ
Conduit - Kubernetes์ฉ ๊ฒฝ๋ ์๋น์ค ๋ฉ์ "; - ยซ
์๋น์ค ๋ฉ์๋ ๋ฌด์์ด๋ฉฐ [๋ง์ดํฌ๋ก์๋น์ค๊ฐ ํฌํจ๋ ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ] ์๋น์ค ๋ฉ์๊ฐ ํ์ํ ์ด์ ๋ ๋ฌด์์ ๋๊น? ".
์ถ์ฒ : habr.com