ááŸááºáá»ááºá áá¬áá¬ááŒááº:
Istio áá áœááºážáááºáá»á¬ážááá¯ááŒááááºá¡ááœááºáá»áœááºá¯ááºááá¯á·ááẠIstio ááŸáá·áºá¥ááᬠmicroservice á¡ááá®áá±ážááŸááºážáá áºáá¯á Sentiment Analysis ááá¯á¡áá¯á¶ážááŒá¯ááá·áº Kubernetes á¡á á¯á¡áá±ážááá¯áááºáá±á¬ááºáá¬ážáá«áááºá
Istio ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯áá»á¬ážááᯠáá±ážáááºá¡á±á¬ááºáá¬ážááá¯ááºáá²á·ááŒá®áž áááºážááá¯á·ááẠááŒááºáááºááŒáá¯ážá
á¬ážááŒááºážá á¡áá»áááºáá¯ááºááŒááºážá Circuit Breakersá ááŒá±áá¬áá¶ááŒááºážá á
á±á¬áá·áºááŒáá·áºááŒááºážá
ááá·áº á¡ááœáŸá¬áá»á¬ážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠáááá¯á¡ááºáá±á¬ááŒá±á¬áá·áºááŒá
áºáááºá ááá¯á·á¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááá·áºááŒáá·áºá
ááºážáááºááŒááºážááŸáá·áº ááŒáá·áºáá»ááºááŒááºážáááºážááá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá²á·áááº- A/B á
ááºážáááºááŒááºážá áá¯á¶áá°áá°ážááŒááºážááŸáá·áº áááá¹ááá®áá¯ááºááŒááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
áá
á¹á
ááºážá¡áá
áºááœááºá áá¯ááºáááºážáááºááá¯ážááá¯á·ááœá¬ážáá¬áááºážááŒá±á¬ááºážáá±á«áºááŸá áá±á¬ááºáá¯á¶ážá¡ááœáŸá¬áá»á¬ážááᯠááá¯ááºááœááºááŒá±ááŸááºážáá«áááº- á
á
áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŸáá·áº ááœáá·áºááŒá¯áá»ááº- Istio ááœáẠáááºážááẠá¡ááŸááºáááẠáá»á±á¬áºááœáŸááºááŸá¯áá
áºáá¯ááŒá
áºáááºá
Istio ááŸá á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŸáá·áº ááœáá·áºááŒá¯áá»ááº
á á áºááŸááºááŒá±á¬ááºážááŸáá·áº ááœáá·áºááŒá¯áá»ááºááŒáá·áº áá»áœááºá¯ááºá¡á¬áž ááŸá¯á¶á·áá±á¬áºáá¶ááááºáᯠáááºáá±á¬á¡áá«á០áá¯á¶áááºááá¯ááºáá«á á€á¡ááŒá±á¬ááºážá¡áá¬áá»á¬ážááᯠáá»á±á¬áºá áá¬áá±á¬ááºážá á±ááẠIstio ááẠáááºážááá¬ááŸá¯áá±á¬áá·áºá០á¡áááºá¡áá¬ááᯠáá±ážáá±á¬ááºááá¯ááºááááºážá
á¡ááŒá±ááẠááá¯ážááŸááºážáááº- Istio ááẠá€á áœááºážáááºáá»á¬ážá¡ááœáẠááá·áºáááºáá±á¬ááºááŸá¯áá»á¬ážá០Envoy proxy ááá¯á· ááŒá±á¬ááºážáá²áá±ážáá«áááºá áá±á¬ááºážááá¯áá»ááºáá»á¬ážááẠáááºáá±á¬ááºááŸá¯áá»á¬ážáá±á¬ááºááŸááá»áááºááœáẠáááºážááá¯á·ááᯠá á áºááŸááºááŒá±á¬ááºážááŸáá·áº ááá¬ážáááºááœáá·áºááŒá¯áá¬ážááŒá®ážááŒá áºáá±á¬ááŒá±á¬áá·áº áááºáá¯ááºáá±á¬ááºáááá·áºá¡áá¬ááŸá¬ á á®ážááœá¬ážáá±ážá¡ááœáẠá¡áá¯á¶ážáááºáá±á¬áá¯ááºááᯠáá±ážáá¬ážááŒááºážááŒá áºáááºá
áá±á¬ááºážáá¬ážáá²? á¡ááœááºážááá¯ááŒáá·áºáá¡á±á¬ááºá
Auth0 ááŒáá·áº á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážá
á¡áá±á¬ááºá¡áá¬ážááŸáá·áº ááá°áá¯á¶ážá
áœá²ááá¯ááºááŸá¯ á
á®áá¶ááá·áºááœá²ááŸá¯á¡ááœáẠáá¬áá¬áá
áºáá¯á¡áá±ááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡á
ááºážáá¬ážááŸááºážáá«ááŸááá±á¬ 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 ááŸá á¡ááŒá±áᶠControl Plane á¡á
áááºá¡ááá¯ááºáž áá¯á¶ážáá¯á¡áááºá០áá
áºáᯠ- ááá·áºááŸááºážááŒá± áá¬áá¬ááŒááºáá«áááºá) áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠáááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á· áááá¯á·áá® á¡áá±á¬ááºá¡áá¬ážá
áá
á
áºááẠEnvoy ááᯠá
á®á
ááºáááºááŸááºáááº- sa-web-app
О sa-feedback
. áá
áºáá»áááºáááºážááœááºá ááœá²á·á
ááºážááŸá¯áá¯á¶á
á¶ááᯠáááºáá±á¬ááºááŸá¯ Envoys ááœáẠáááºáá±á¬ááºááŸá¯áááŸááá«á sa-frontend
ááŸá±á·áááºážááᯠá¡áá±á¬ááºá¡áá¬ážáááá¯ááºáá¯á¶áá² ááœááºááœá¬ážááœáá·áºáá±ážáááºá áá°áá«áááá¯á¡áá¯á¶ážááŒá¯áááºá á¡áááá·áºááá¯ááœáá·áºáá«-
$ kubectl apply -f resource-manifests/istio/security/auth-policy.yaml
policy.authentication.istio.io âauth-policyâ created
á á¬áá»ááºááŸá¬ááá¯á· ááŒááºááœá¬ážááŒá®áž áá±á¬ááºážááá¯áá»ááºáá áºáᯠááŒá¯áá¯ááºáá« - áááºážááẠá¡ááŒá±á¡áá±ááŸáá·áº á¡áá¯á¶ážáááºáááºááᯠáááºááœá±á·ááá«áááºá 401 áá¯ááºááá¯ááºááœáá·áºáááŸááá«. ááᯠAuth0 ááŒáá·áº á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááẠfrontend á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠááŒááºááœáŸááºážááá¯ááºááŒáá«á áá¯á·á
Auth0 ááŒáá·áº áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠá á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážá
á¡áá¯á¶ážááŒá¯áá°áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠá á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒáááºá á á áºááŸááºááŒá±á¬ááºážá¡áááºááŒá¯áá¬ážáá±á¬áááºáá±á¬ááºááŸá¯áá»á¬áž (ááŒááºáááºáá¯á¶ážáááºááŒááºážá á¡áá±ážá áááºááŸáá·áº á¡ááá·áºáááºááŸááºáá»ááºáá»á¬áž) ááá¯ááá¯ááºá á¬ážááŒá¯ááá·áº Auth0 ááœáẠAPI áá áºáá¯áááºáá®ážááẠááá¯á¡ááºáá«áááºá API áá áºáá¯áááºáá®ážáááºá ááá¯á·ááœá¬ážáá«á Auth0 Portal > APIs > API áááºáá®ážáá«á áá±á¬ááºááá¯ááŒáá·áºáá«á
á€áá±áá¬ááœáẠá¡áá±ážááŒá®ážáá±á¬á¡áá»ááºááŸá¬ ááœá²ááŒá¬ážáááºááŸááºáá¬ááºááœáŸááºážááœáẠáá±á¬ááºááŸáá¯á¶ážáá«áááºá áá®á¡ááá¯ááºážáá±ážááŒáá·áºáá¡á±á¬ááºá
- ááááááº- {YOUR_AUDIENCE}
áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬ áá»ááºá¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááŸá¬ ááá¹áááŸá Auth0 Portal ááœáẠáááºááŸááá±áá«áááºá applications ááᯠ- ááœá±ážáá»ááºáá«á á ááºážáááºáá»áŸá±á¬ááºááœáŸá¬ (API ááŸáá·áºá¡áá° á¡ááá¯á¡áá»á±á¬áẠáááºáá®ážáá¬ážáááº)á
á€ááœááºáá»áœááºá¯ááºááá¯á·áá±ážáá«áááº:
- ááá¯ááááºážâ {YOUR_DOMAIN}
- áá¯á¶ážá áœá²áá° ID- {YOUR_CLIENT_ID}
ááá¯á· áááºážáá«á á ááºážáááºáá»áŸá±á¬ááºááœáŸá¬ á á¬áá¬ážá¡ááœááºááá¯á· ááŒááºáá±á«áºááẠURL áá»á¬ážááᯠááœáá·áºááŒá¯áá¬ážáááºá (ááŒááºáá±á«áºááŒááºážá¡ááœáẠááŒá±ááŸááºážáá¬ážáá±á¬ URL áá»á¬áž)á á¡áá±á¬ááºá¡áá¬ážá áá á áºááŒááºážááŒá®ážáá¯á¶ážááŒá®ážáá±á¬áẠáá±á«áºááá¯ááŸá¯áá±ážááá¯á·ááá·áºááá·áº URL ááᯠáááºááŸááºáá±ážáá«áááºá áá»áœááºá¯ááºááá¯á·áááá á¹á ááœááºá
http://{EXTERNAL_IP}/callback
ááá¯á¡ááá¯á· ááœááºááẠURL áá»á¬ážááᯠááœáá·áºááŒá¯áá¬ážáááºá (ááœááºáááºááœáá·áºááŒá¯áá¬ážáá±á¬ URL áá»á¬áž) ááá·áºáá«-
http://{EXTERNAL_IP}/logout
ááŸá±á·áá¯á¶ážááá¯á· áááºááœá¬ážááŒáá«á áá¯á·á
Frontend á¡ááºááááº
áá¬áááœá²ááá¯á·ááŒá±á¬ááºážáá«á 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 ááá¯á· ááŒááºááœáŸááºážáá¶ááááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áẠá á áºááŸááºááŒá±á¬ááºážá¡áááºááŒá¯ááŒá®ážáá±á¬ áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááŒá¯áá¯ááºáá¬ážááá·áº á á¬áá»ááºááŸá¬ááá¯á· ááŒááºáááºáá±ážááá¯á·áááºááŒá áºáááºá á¡áááºá áááºááẠáá±á¬ááºážáá«ážá áááááá¯ááºážáá»á¬ážááœáẠáá±á¬áºááŒáá¬ážáá±á¬ á¡áááá·áºáá»á¬ážááᯠcurl ááŒáá·áº á ááºážááŒáá·áºáá«áá áááºááẠáá¯ááºááᯠáááŸááááºááŒá áºáááºá 401 á¡ááŒá±á¡áá±áá¯ááºáá±á¬ááºážááá¯áá»ááºááẠááœáá·áºááŒá¯áá»ááºáááŸááᯠá¡áá»ááºááŒáááºá
áá±á¬ááºáá áºááá·áºááᯠá ááŒáá«á áá¯á· - áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠááœáá·áºááŒá¯áá«á
Auth0 ááŒáá·áº ááœáá·áºááŒá¯áá»ááº
á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááŒááºážááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áá¯á¶ážá áœá²áá°áá áºáŠážááŒá áºáááºááᯠáá¬ážáááºááá¯ááºáá±á¬áºáááºáž áááºážááá¯á·áá¶áááºáá±á¬ááºááœáá·áºááŸááááºááᯠááááŸáááẠááœáá·áºááŒá¯áá»ááºááá¯á¡ááºáá«áááºá Istio ááẠáááºážá¡ááœáẠáááááá¬áá»á¬ážááá¯áááºáž áá±ážáá«áááºá
á¥ááá¬á¡áá±áá²á·á á¡áá¯á¶ážááŒá¯áá°á¡á¯ááºá á¯ááŸá áºáá¯ááᯠáááºáá®ážááŒáá·áºáá¡á±á¬áẠ(á¡á±á¬ááºá áá¯á¶ááŒááºážááá¯ááŒáá·áºáá«)á
- á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááẠ(á¡áá¯á¶ážááŒá¯áá°áá»á¬áž) â SA-WebApp ááŸáá·áº SA-Frontend áááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á·áᬠáááºáá±á¬ááºááœáá·áºá
- ááŒá®ážááŒááºáá°áá»á¬áž (ááááºážáá»á±á¬ááºážáá°áá»á¬áž) - áááºáá±á¬ááºááŸá¯ áá¯á¶ážáá¯á áá¯á¶ážááᯠá¡áá¯á¶ážááŒá¯ááá¯ááºááŒááºážá
ááœáá·áºááŒá¯áá»ááºá¡áá°á¡á
á€á¡ááœá²á·áá»á¬ážááᯠáááºáá®ážáááºá áá»áœááºá¯ááºááá¯á·ááẠAuth0 ááœáá·áºááŒá¯áá»ááºááá¯ááºáᬠááá¯ážáá»á²á·ááŸá¯ááᯠá¡áá¯á¶ážááŒá¯ááŒá®áž áááºážááá¯á·á¡á¬áž ááœá²ááŒá¬ážááŒá¬ážáá¬ážáá±á¬ áááºáá±á¬ááºááœáá·áºá¡ááá·áºáá»á¬ážáá±ážá áœááºážááẠIstio ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá
Auth0 Authorization ááᯠáááºáááºááŒááºážááŸáá·áº ááœá²á·á ááºážááŸá¯
Auth0 portal ááœááºá extensions ááá¯á·ááœá¬ážáá« (extensions) ááŸáá·áº install áá¯ááºáá«á Auth0 ááœáá·áºááŒá¯áá»ááº. áááºáááºááŒá®ážáá±á¬ááºá ááá¯á·ááœá¬ážáá«á ááœáá·áºááŒá¯áá»áẠááá¯ážáá»á²á·ááŸá¯ááŸáá·áº á¡á²áá®ááŸá¬ - á¡áá±á«áºáá¬áááºá¡áá±á«áºááá¯ááŸáááºááŒá®áž ááá·áºáá»á±á¬áºáá±á¬áá®áá°ážááœá±ážáá»ááºááŸá¯ááᯠááœá±ážáá»ááºááŒááºážááŒáá·áº á¡áááºááŸá¬ážáááœá²á·á ááºážáá¯á¶ááá¯á· (ááŒááºáááºááŸá¯). á¡ááœá²á·áá»á¬ážááᯠá¡áááºááœááºážáá«á (á¡á¯ááºá á¯áá»á¬áž) ááŒá®ážáá»áŸáẠPublish rule ááá¯ááºááᯠááŸáááºáá«á (á ááºážáááºážáá¯ááºááŒááºááŒááºáž).
á¡ááœá²á·áá»á¬ážáááºáá®ážááŒááºážá
Authorization Extension ááŸá¬ ááœá¬ážááá¯ááºáá«á á¡ááœá²á·áá»á¬áž ááŸáá·áºá¡ááœá²á·áá áºáá¯áááºáá®ážáá«á áá±á¬áºá. áá»áœááºá¯ááºááá¯á·ááẠá á áºááŸááºáá±á¬á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡á¬ážáá¯á¶ážááᯠáá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯áá°áá»á¬ážá¡ááŒá Ạáááºáá¶áááºááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·á¡ááœáẠá¡ááá¯á¡ááœá²á·áá áºáá¯ááᯠáááºáá®ážááẠáááá¯á¡ááºáá«á
á¡ááœá²á·ááᯠááœá±ážáá«á áá±á¬áºááá á¬áááºáááºáž á¡áááºážáááºáá»á¬ážááá·áºáá«áááºááááºáá¡áá±á¬áá·áºááá¯ááá·áºáá«á áááºáá±á¬ááºááœáá·áº ááŒááºážáááºáá¶áááŒá±á¬ááºáž áá±áá»á¬á á±ááẠá¡áá»áá¯á·áá±á¬ áá¯á¶ážá áœá²áá°áá»á¬ážááᯠáááºááá·áºá¡ááœá²á·á០áá»ááºáá¬ážáá²á·áá«á (á¡áá¯á¶ážááŒá¯áá°á¡áá áºáá»á¬ážááŸáááá·áº ááá¯ááºááá¯ááºáááºáá®ážááá¯ááºáá«áááºá Auth0 Portal > á¡áá¯á¶ážááŒá¯áá°áá»á¬áž > á¡áá¯á¶ážááŒá¯áá°ááᯠáááºáá®ážáá«á.)
Access Token ááá¯á· á¡á¯ááºá á¯á¡áá±ážááá¯ááŸá¯ááᯠááá·áºáá«á
á¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠá¡ááœá²á·áá»á¬ážááá¯á· áá±á«ááºážááá·áºáá¬ážááŒá®ážááŒá
áºáá±á¬áºáááºáž á€á¡áá»ááºá¡áááºááᯠáááºáá±á¬ááºááœáá·áºááá¯áááºáá»á¬ážááœááºáááºáž áááºáááºá
á±ááá«áááºá OpenID Connect ááá¯ááá¯ááºáá¬áááºááŸáá·áº áá»áœááºá¯ááºááá¯á·ááá¯á¡ááºáá±á¬á¡ááœá²á·áá»á¬ážááᯠáá
áºáá»áááºáááºážááœááºááŒááºáá±ážáááºá ááá¯áááºááẠáááºážáááá¯ááºááá¯ááºááá·áºááẠááá¯á¡ááºáááºááŒá
áºáááºá
á ááºážáá»ááºážáá áºáá¯áááºáá®ážááẠAuth0 Portal ááá¯á·ááœá¬ážáá«á á ááºážáááºážáá»á¬ážáá á¬áááºáááºáž á ááºážáááºážáááºáá®ážáá«á ááá°áá¬áá¯á¶á á¶áá»á¬ážá០ááá¬á ááºážáá»ááºážáá áºáá¯ááᯠááœá±ážáá«á
á¡á±á¬ááºáá«áá¯ááºááᯠáá±á¬áºáá®áá°ážááŒá®áž á
ááºážáááºážá¡áá
áºá¡ááŒá
Ạááááºážáááºážáá«á á¡á¯ááºá
á¯á¡áá±ážááá¯ááŸá¯ááᯠááá·áºáá«á (
function (user, context, callback) {
context.accessToken['https://sa.io/group'] = user.groups[0];
return callback(null, user, context);
}
ááœá±á¬ááá¯: á€áá¯ááºááẠAuthorization ááá¯ážáá»á²á·ááŸá¯ááœáẠáááºááŸááºáá¬ážáá±á¬ ááááá¯á¶ážá¡áá¯á¶ážááŒá¯áá°á¡á¯ááºá á¯ááᯠáá°ááœá¬ážááŒá®áž á áááºááŒáá¯ááºá¡áá±ážááá¯ááŸá¯áá áºáá¯á¡ááŒá Ạ(Auth0 á០ááá¯á¡ááºááá·áºá¡ááá¯ááºáž áááºážáá¡áááºáá±áá¬á¡á±á¬ááºááœááº) á¡áá¯á¶ážááŒá¯ááœáá·áºááá¯áááºááá¯á· áá±á«ááºážááá·áºáááºá
á á¬áá»ááºááŸá¬ááá¯á· ááŒááºááœá¬ážááẠá ááºážáááºážáá»á¬áž ááá·áºááœáẠá¡á±á¬ááºáá«á¡á á®á¡á á¥áºá¡ááá¯ááºáž áá±ážáá¬ážáá±á¬ á ááºážáá»ááºážááŸá áºáá¯ááŸáááŒá±á¬ááºáž á á áºáá±ážáá«á
- auth0-authorization-extension
- á¡á¯ááºá á¯á¡áá±ážááá¯ááŸá¯ááᯠááá·áºáá«á
á¡ááœá²á·á¡ááœááºááẠá ááºážáá»ááºážááᯠáááŒáá¯ááºáááºáž áááºáá¶áááŸááá±á¬ááŒá±á¬áá·áº á¡áááá·áºááẠá¡áá±ážááŒá®ážáá«áááºá auth0-authorization-extension ááá¯á·áá±á¬áẠáááºážááᯠáá¯ááááááºážá¥ááá±ááŒáá·áº ááá¯ááºááŒá¬ážááŸá¯á¡ááŒá Ạááá·áºááœááºážáá¬ážáááºá ááááºááẠá€áá²á·ááá¯á·áá±á¬ áááºáá±á¬ááºááœáá·áº ááá¯áááºáá áºáá¯ááŒá áºáááº-
{
"https://sa.io/group": "Moderators",
"iss": "https://sentiment-analysis.eu.auth0.com/",
"sub": "google-oauth2|196405271625531691872"
// [ÑПкÑаÑеМП ÐŽÐ»Ñ ÐœÐ°Ð³Ð»ÑЎМПÑÑО]
}
ááá¯ááœáẠáááºááẠá¡áá¯á¶ážááŒá¯áá°áááºáá±á¬ááºááœáá·áºááᯠá
á
áºáá±ážááẠEnvoy proxy ááᯠááŒááºáááºáááºááŸááºááẠááá¯á¡ááºááŒá®áž áááºážááá¯á·ááẠá¡áá±ážááá¯ááŸá¯á០á¡á¯ááºá
á¯ááᯠáá¯ááºáá°ááẠ(https://sa.io/group
) ááŒááºáááºáááºáá±á¬ááºááœáá·áº ááá¯áááºááœááºá á€áááºááŸá¬ áá±á¬ááºážáá«ážá áá±á¬ááºá¡ááá¯ááºážá¡ááœáẠáá±á«ááºážá
ááºááŒá
áºáááºá
Istio ááŸá ááœáá·áºááŒá¯áá»ááºááœá²á·á ááºážááŸá¯
á¡áá¯ááºáá¯ááºáááºááœáá·áºááŒá¯áá»ááºá¡ááœááºá áááºááẠIstio á¡ááœáẠRBAC ááá¯ááœáá·áºááá«áááºá áá«ááá¯áá¯ááºááá¯á·á á¡á±á¬ááºáá« configuration ááá¯áá¯á¶ážáá«áááºá
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 â áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·ááááºáá±á¬ááºááŸá¯áá»á¬ážá á¬áááºážááᯠá á¬áááºážááŒá¯á á¯áá¬ážáá«áááºá
á¡á±á¬ááºáá« command ááŒáá·áº configuration ááá¯áá¯á¶ážááŒáá«á áá¯á·á
$ 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 WebApp ááá¯áááºáá±á¬ááºááœáá·áºááŸááááºáá¯ááá¯ááá¯áá«ááá¬ážá ááá¯ááºáá«á áá°áá«áááẠ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 ááŸáá·áº á áááºáááºá¡ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážááá·áº áááºááœá±á·áááºážááœáŸááºáá»ááºáá»á¬ážááᯠáá±ážáá¬ážáááºá
PS áá¬áá¬ááŒááºááŸ
áá»áœááºá¯ááºááá¯á·áááá±á¬á·ááºááœááºáááºážáááºáá«
- "Istio ááŒáá·áº á¡áá±ážá
á¬ážáááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á· ááŒááºááœá¬ážáááº"-
á¡ááá¯ááºáž 1 (á¡áááá¡ááºá¹áá«áááºáá»á¬ážááááºáááº) ,á¡ááá¯ááºáž 2 (áááºážááŒá±á¬ááºážá áá¬ááºááááºáž) ; - «
Conduit - Kubernetes á¡ááœáẠáá±á«á·áá«ážáá±á¬ áááºáá±á¬ááºááŸá¯ááœáẠ"; - «
áááºáá±á¬ááºááŸá¯ mesh ááá¯áᬠáá¬áá²á [ááá¯ááºáááá¯áááºáá±á¬ááºááŸá¯áá»á¬ážáá«áá±á¬ cloud application áá áºáá¯á¡ááœááº] áá¬ááŒá±á¬áá·áº ááá¯á¡ááºáá¬áá²á "á
source: www.habr.com