ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื”ืขืจื”. ืชืจื’ื•ื: ื”ื—ืœืง ื”ืจืืฉื•ืŸ ืกื“ืจื” ื–ื• ื”ื•ืงื“ืฉื” ืœื”ื›ื™ืจ ืืช ื”ื™ื›ื•ืœื•ืช ืฉืœ ืื™ืกื˜ื™ื• ื•ืœื”ื“ื’ื™ื ืื•ืชืŸ ื‘ืคืขื•ืœื”, ืฉื ื™ - ื ื™ืชื•ื‘ ืžื›ื•ื•ืŸ ื•ื ื™ื”ื•ืœ ืชืขื‘ื•ืจืช ืจืฉืช. ื›ืขืช ื ื“ื‘ืจ ืขืœ ืื‘ื˜ื—ื”: ื›ื“ื™ ืœื”ื“ื’ื™ื ืืช ื”ืคื•ื ืงืฆื™ื•ืช ื”ื‘ืกื™ืกื™ื•ืช ื”ืงืฉื•ืจื•ืช ืืœื™ื•, ื”ืžื—ื‘ืจ ืžืฉืชืžืฉ ื‘ืฉื™ืจื•ืช ื”ื–ื”ื•ืช Auth0, ืืš ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ืกืคืงื™ื ืื—ืจื™ื ื‘ืฆื•ืจื” ื“ื•ืžื”.

ื”ืงืžื ื• ืืฉื›ื•ืœ Kubernetes ืฉื‘ื• ืคืจืกื ื• ืืช Istio ื•ื™ื™ืฉื•ื ืžื™ืงืจื•-ืฉื™ืจื•ืช ืœื“ื•ื’ืžื”, Sentiment Analysis, ื›ื“ื™ ืœื”ื“ื’ื™ื ืืช ื”ื™ื›ื•ืœื•ืช ืฉืœ Istio.

ืขื Istio, ื”ืฆืœื—ื ื• ืœืฉืžื•ืจ ืขืœ ื”ืฉื™ืจื•ืชื™ื ืฉืœื ื• ืงื˜ื ื™ื ืžื›ื™ื•ื•ืŸ ืฉื”ื ืœื ืฆืจื™ื›ื™ื ืœื™ื™ืฉื ืฉื›ื‘ื•ืช ื›ืžื• ื ื™ืกื™ื•ื ื•ืช ื—ื•ื–ืจื™ื, ืคืกืงื™ ื–ืžืŸ, ืžืคืกืงื™ื, ืžืขืงื‘, ื ื™ื˜ื•ืจ. . ื‘ื ื•ืกืฃ, ื”ืฉืชืžืฉื ื• ื‘ื˜ื›ื ื™ืงื•ืช ื‘ื“ื™ืงื” ื•ืคืจื™ืกื” ืžืชืงื“ืžื•ืช: ื‘ื“ื™ืงื•ืช A/B, ืฉื™ืงื•ืฃ ื•ื’ืœื’ื•ืœ ืงื ืจื™.

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื‘ื—ื•ืžืจ ื”ื—ื“ืฉ ื ืขืกื•ืง ื‘ืจื‘ื“ื™ื ื”ืื—ืจื•ื ื™ื ื‘ื“ืจืš ืœืขืจืš ืขืกืงื™: ืื™ืžื•ืช ื•ื”ืจืฉืื” - ื•ื‘ืื™ืกื˜ื™ื• ื–ื” ืชืขื ื•ื’ ืืžื™ืชื™!

ืื™ืžื•ืช ื•ื”ืจืฉืื” ื‘ืื™ืกื˜ื™ื•

ืœืขื•ืœื ืœื ื”ื™ื™ืชื™ ืžืืžื™ืŸ ืฉืืงื‘ืœ ื”ืฉืจืื” ืžืื™ืžื•ืช ื•ื”ืจืฉืื”. ืžื” ื™ื›ื•ืœื” ืื™ืกื˜ื™ื• ืœื”ืฆื™ืข ืžื ืงื•ื“ืช ืžื‘ื˜ ื˜ื›ื ื•ืœื•ื’ื™ืช ื›ื“ื™ ืœื”ืคื•ืš ืืช ื”ื ื•ืฉืื™ื ื”ืืœื” ืœืžื”ื ื™ื, ื•ื™ื•ืชืจ ืžื›ืš, ืžืขื•ืจืจื™ ื”ืฉืจืื” ืขื‘ื•ืจืš?

ื”ืชืฉื•ื‘ื” ืคืฉื•ื˜ื”: Istio ืžืขื‘ื™ืจื” ืืช ื”ืื—ืจื™ื•ืช ืขืœ ื”ื™ื›ื•ืœื•ืช ื”ืœืœื• ืžื”ืฉื™ืจื•ืชื™ื ืฉืœืš ืœ-Envoy proxy. ืขื“ ืฉื”ื‘ืงืฉื•ืช ืžื’ื™ืขื•ืช ืœืฉื™ืจื•ืชื™ื, ื”ืŸ ื›ื‘ืจ ืื•ืฉืจื• ื•ืื•ืฉืจื•, ื›ืš ืฉื›ืœ ืžื” ืฉืฆืจื™ืš ืœืขืฉื•ืช ื”ื•ื ืœื›ืชื•ื‘ ืงื•ื“ ืฉื™ืžื•ืฉื™ ืœืขืกืงื™ื.

ื ืฉืžืข ื˜ื•ื‘? ื‘ื•ืื• ื ืกืชื›ืœ ืคื ื™ืžื”!

ืื™ืžื•ืช ืขื Auth0

ื›ืฉืจืช ืœื ื™ื”ื•ืœ ื–ื”ื•ื™ื•ืช ื•ื’ื™ืฉื”, ื ืฉืชืžืฉ ื‘-Auth0, ืฉื™ืฉ ืœื• ื’ืจืกืช ื ื™ืกื™ื•ืŸ, ื”ื™ื ืื™ื ื˜ื•ืื™ื˜ื™ื‘ื™ืช ืœืฉื™ืžื•ืฉ ื•ืื ื™ ืคืฉื•ื˜ ืื•ื”ื‘ ืืช ื–ื”. ืขื ื–ืืช, ื ื™ืชืŸ ืœื™ื™ืฉื ืืช ืื•ืชื ืขืงืจื•ื ื•ืช ืขืœ ื›ืœ ืื—ื“ ืื—ืจ ื™ื™ืฉื•ืžื™ OpenID Connect: KeyCloak, IdentityServer ื•ืขื•ื“ ืจื‘ื™ื ืื—ืจื™ื.

ืจืืฉื™ืช, ืขื‘ื•ืจ ืืœ ืคื•ืจื˜ืœ Auth0 ืขื ื”ื—ืฉื‘ื•ืŸ ืฉืœืš, ืฆื•ืจ ื“ื™ื™ืจ (ื“ื™ื™ืจ - "ื“ื™ื™ืจ", ื™ื—ื™ื“ืช ื‘ื™ื“ื•ื“ ืœื•ื’ื™ืช, ืœืคืจื˜ื™ื ื ื•ืกืคื™ื ืจืื” ืชื™ืขื•ื“ - ืžืฉื•ืขืจ. ืชืจื’ื•ื) ื•ืœืœื›ืช ืœ ื™ื™ืฉื•ืžื™ื > ืืคืœื™ืงืฆื™ื™ืช ื‘ืจื™ืจืช ืžื—ื“ืœื‘ึผึฐื—ึดื™ืจึธื” ืชึฐื—ื•ึผื, ื›ืคื™ ืฉืžื•ืฆื’ ื‘ืฆื™ืœื•ื ื”ืžืกืš ืœืžื˜ื”:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ืฆื™ื™ืŸ ืืช ื”ื“ื•ืžื™ื™ืŸ ื”ื–ื” ื‘ืงื•ื‘ืฅ 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

ืขื ืžืฉืื‘ ื›ื–ื”, ื˜ื™ื™ืก (ืื—ื“ ืžืฉืœื•ืฉืช ืจื›ื™ื‘ื™ ืžื™ืฉื•ืจ ื”ื‘ืงืจื” ื”ื‘ืกื™ืกื™ื™ื ื‘ืื™ืกื˜ื™ื• - ืชืจื’ื•ื ื‘ืงื™ืจื•ื‘) ืžื’ื“ื™ืจ ืืช Envoy ืœืืžืช ื‘ืงืฉื•ืช ืœืคื ื™ ื”ืขื‘ืจืชืŸ ืœืฉื™ืจื•ืชื™ื: sa-web-app ะธ sa-feedback. ื™ื—ื“ ืขื ื–ืืช, ื”ืชืฆื•ืจื” ืื™ื ื” ืžื•ื—ืœืช ืขืœ ืฉืœื™ื—ื™ ืฉื™ืจื•ืช 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 Portal > APIs > Create API ื•ืžืœื ืืช ื”ื˜ื•ืคืก:

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื”ืžื™ื“ืข ื”ื—ืฉื•ื‘ ื›ืืŸ ื”ื•ื ืžื–ื”ื”, ืฉื‘ื• ื ืฉืชืžืฉ ื‘ื”ืžืฉืš ื”ืชืกืจื™ื˜. ื‘ื•ื ื ืจืฉื•ื ืืช ื–ื” ื›ื›ื”:

  • ืงื”ืœ: {YOUR_AUDIENCE}

ืฉืืจ ื”ืคืจื˜ื™ื ืฉืื ื• ืฆืจื™ื›ื™ื ื ืžืฆืื™ื ื‘ืคื•ืจื˜ืœ Auth0 ื‘ืงื˜ืข ื™ื™ืฉื•ืžื™ื - ื‘ื—ืจ ื™ื™ืฉื•ื ื‘ื“ื™ืงื” (ื ื•ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช ื™ื—ื“ ืขื ื”-API).

ื›ืืŸ ื ื›ืชื•ื‘:

  • ืชึฐื—ื•ึผื: {YOUR_DOMAIN}
  • ืžื–ื”ื” ืœืงื•ื—: {YOUR_CLIENT_ID}

ื’ืœื•ืœ ืืœ ื™ื™ืฉื•ื ื‘ื“ื™ืงื” ืœืฉื“ื” ื˜ืงืกื˜ ื›ืชื•ื‘ื•ืช URL ืžื•ืชืจื•ืช ืœื”ืชืงืฉืจื•ืช ื—ื•ื–ืจืช (ื›ืชื•ื‘ื•ืช URL ืคืชื•ืจื•ืช ืœื”ืชืงืฉืจื•ืช ื—ื•ื–ืจืช), ื‘ื”ืŸ ืื ื• ืžืฆื™ื™ื ื™ื ืืช ื›ืชื•ื‘ืช ื”ืืชืจ ืฉืืœื™ื” ื™ืฉ ืœืฉืœื•ื— ืืช ื”ืฉื™ื—ื” ืœืื—ืจ ื”ืฉืœืžืช ื”ืื™ืžื•ืช. ื‘ืžืงืจื” ืฉืœื ื• ื–ื”:

http://{EXTERNAL_IP}/callback

ื•ื‘ืฉื‘ื™ืœ ื›ืชื•ื‘ื•ืช ืืชืจื™ื ืžื•ืชืจื•ืช ืœื™ืฆื™ืื” (ื›ืชื•ื‘ื•ืช URL ืžื•ืชืจื•ืช ืœื™ืฆื™ืื”) ื”ื•ืกืฃ:

http://{EXTERNAL_IP}/logout

ื‘ื•ืื• ื ืขื‘ื•ืจ ืœื—ื–ื™ืช.

ืขื“ื›ื•ืŸ ื—ื–ื™ืชื™

ืขื‘ื•ืจ ืœืกื ื™ืฃ auth0 ืžืื’ืจ [istio-mastery]. ื‘ืกื ื™ืฃ ื–ื”, ืงื•ื“ ื”ืงืฆื” ืžืฉืชื ื” ื›ื“ื™ ืœื”ืคื ื•ืช ืžืฉืชืžืฉื™ื ืœ-Auth0 ืœืฆื•ืจืš ืื™ืžื•ืช ื•ืœื”ืฉืชืžืฉ ื‘ืืกื™ืžื•ืŸ JWT ื‘ื‘ืงืฉื•ืช ืœืฉื™ืจื•ืชื™ื ืื—ืจื™ื. ื”ืื—ืจื•ืŸ ืžื™ื•ืฉื ื‘ืื•ืคืŸ ื”ื‘ื (App.js):

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));
}

ื›ื“ื™ ืœืฉื ื•ืช ืืช ื”-frontend ืœืฉื™ืžื•ืฉ ื‘ื ืชื•ื ื™ ื“ื™ื™ืจื™ื ื‘-Auth0, ืคืชื— sa-frontend/src/services/Auth.js ื•ื”ื—ืœื™ืคื• ื‘ื• ืืช ื”ืขืจื›ื™ื ืฉื›ืชื‘ื ื• ืœืžืขืœื” (Auth.js):

const Config = {
    clientID: '{YOUR_CLIENT_ID}',
    domain:'{YOUR_DOMAIN}',
    audience: '{YOUR_AUDIENCE}',
    ingressIP: '{EXTERNAL_IP}' // ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ั€ะตะดะธั€ะตะบั‚ะฐ ะฟะพัะปะต ะฐัƒั‚ะตะฝั‚ะธั„ะธะบะฐั†ะธะธ
}

ื”ืืคืœื™ืงืฆื™ื” ืžื•ื›ื ื”. ืฆื™ื™ืŸ ืืช ืžื–ื”ื” ื”-Docker ืฉืœืš ื‘ืคืงื•ื“ื•ืช ืœืžื˜ื” ื‘ืขืช ื”ื‘ื ื™ื™ื” ื•ื”ืคืจื™ืกื” ืฉืœ ื”ืฉื™ื ื•ื™ื™ื ืฉื‘ื•ืฆืขื•:

$ 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;
  • ืžื ื—ื™ื (ืžื ื—ื™ื) - ืขื ื’ื™ืฉื” ืœื›ืœ ืฉืœื•ืฉืช ื”ืฉื™ืจื•ืชื™ื.

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3
ืžื•ืฉื’ ื”ืจืฉืื”

ื›ื“ื™ ืœื™ืฆื•ืจ ืงื‘ื•ืฆื•ืช ืืœื”, ื ืฉืชืžืฉ ื‘ืชื•ืกืฃ Auth0 Authorization ื•ื ืฉืชืžืฉ ื‘-Istio ื›ื“ื™ ืœืกืคืง ืœื”ืŸ ืจืžื•ืช ื’ื™ืฉื” ืฉื•ื ื•ืช.

ื”ืชืงื ื” ื•ืชืฆื•ืจื” ืฉืœ Auth0 Authorization

ื‘ืคื•ืจื˜ืœ Auth0, ืขื‘ื•ืจ ืืœ ื”ืจื—ื‘ื•ืช (ืจื—ื‘ื•ืช) ื•ื”ืชืงืŸ Auth0 Authorization. ืœืื—ืจ ื”ื”ืชืงื ื”, ืขื‘ื•ืจ ืืœ ื”ืืจื›ืช ื”ืจืฉืื”, ื•ืฉื - ืœืชืฆื•ืจืช ื”ื“ื™ื™ืจ ืขืœ ื™ื“ื™ ืœื—ื™ืฆื” ืขืœ ื”ืคื™ื ื” ื”ืฉืžืืœื™ืช ื”ืขืœื™ื•ื ื” ื•ื‘ื—ื™ืจื” ื‘ืืคืฉืจื•ืช ื”ืชืคืจื™ื˜ ื”ืžืชืื™ืžื” (ืชึฐืฆื•ึผืจึธื”). ื”ืคืขืœ ืงื‘ื•ืฆื•ืช (ืงื‘ื•ืฆื•ืช) ื•ืœื—ืฅ ืขืœ ื›ืคืชื•ืจ ืคืจืกื•ื ื”ื›ืœืœ (ื›ืœืœ ืคืจืกื•ื).

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื™ืฆื™ืจืช ืงื‘ื•ืฆื•ืช

ื‘-Extension Authorization ืขื‘ื•ืจ ืืœ ืงื‘ื•ืฆื•ืช ื•ืœื™ืฆื•ืจ ืงื‘ื•ืฆื” ืžื ื—ื™ื. ืžื›ื™ื•ื•ืŸ ืฉืื ื• ื ืชื™ื™ื—ืก ืœื›ืœ ื”ืžืฉืชืžืฉื™ื ื”ืžืื•ืžืชื™ื ื›ืืœ ืžืฉืชืžืฉื™ื ืจื’ื™ืœื™ื, ืื™ืŸ ืฆื•ืจืš ืœื™ืฆื•ืจ ืขื‘ื•ืจื ืงื‘ื•ืฆื” ื ื•ืกืคืช.

ื‘ื—ืจ ืงื‘ื•ืฆื” ืžื ื—ื™ื, ืœืœื—ื•ืฅ ื”ื•ืกืฃ ื—ื‘ืจื™ื, ื”ื•ืกืฃ ืืช ื”ื—ืฉื‘ื•ืŸ ื”ืจืืฉื™ ืฉืœืš. ื”ืฉืืจ ื—ืœืง ืžื”ืžืฉืชืžืฉื™ื ืœืœื ื›ืœ ืงื‘ื•ืฆื” ื›ื“ื™ ืœื•ื•ื“ื ืฉื”ื’ื™ืฉื” ืžื•ื ืขืช ืžื”ื. (ื ื™ืชืŸ ืœื™ืฆื•ืจ ืžืฉืชืžืฉื™ื ื—ื“ืฉื™ื ื‘ืื•ืคืŸ ื™ื“ื ื™ ื‘ืืžืฆืขื•ืช Auth0 Portal > ืžืฉืชืžืฉื™ื > ืฆื•ืจ ืžืฉืชืžืฉ.)

ื”ื•ืกืฃ ืชื‘ื™ืขื” ืงื‘ื•ืฆืชื™ืช ืœ-Access Token

ืžืฉืชืžืฉื™ื ื ื•ืกืคื• ืœืงื‘ื•ืฆื•ืช, ืืš ืžื™ื“ืข ื–ื” ื—ื™ื™ื‘ ืœื‘ื•ื ืœื™ื“ื™ ื‘ื™ื˜ื•ื™ ื’ื ื‘ืืกื™ืžื•ื ื™ ื’ื™ืฉื”. ื›ื“ื™ ืœืขืžื•ื“ ื‘-OpenID Connect ื•ื‘ืžืงื‘ื™ืœ ืœื”ื—ื–ื™ืจ ืืช ื”ืงื‘ื•ืฆื•ืช ืฉืื ื• ืฆืจื™ื›ื™ื, ื”ืืกื™ืžื•ืŸ ื™ืฆื˜ืจืš ืœื”ื•ืกื™ืฃ ืžืฉืœื• ืชื‘ื™ืขื” ืžื•ืชืืžืช ืื™ืฉื™ืช. ืžื™ื•ืฉื ื‘ืืžืฆืขื•ืช ื›ืœืœื™ Auth0.

ื›ื“ื™ ืœื™ืฆื•ืจ ื›ืœืœ, ืขื‘ื•ืจ ืืœ Auth0 Portal to ื—ื•ืงื™, ืœืœื—ื•ืฅ ืฆื•ืจ ื›ืœืœ ื•ื‘ื—ืจื• ื›ืœืœ ืจื™ืง ืžื”ืชื‘ื ื™ื•ืช.

ื—ื–ืจื” ืœืฉื™ืจื•ืชื™ ืžื™ืงืจื• ืขื Istio. ื—ืœืง 3

ื”ืขืชืง ืืช ื”ืงื•ื“ ืœืžื˜ื” ื•ืฉืžื•ืจ ืื•ืชื• ื›ื›ืœืœ ื—ื“ืฉ ื”ื•ืกืฃ ืชื‘ื™ืขื” ืงื‘ื•ืฆืชื™ืช (namespacedGroup.js):

function (user, context, callback) {
    context.accessToken['https://sa.io/group'] = user.groups[0];
    return callback(null, user, context);
}

ืฉื™ื ืœื‘: ืงื•ื“ ื–ื” ืœื•ืงื— ืืช ืงื‘ื•ืฆืช ื”ืžืฉืชืžืฉื™ื ื”ืจืืฉื•ื ื” ืฉื”ื•ื’ื“ืจื” ื‘ื”ืจื—ื‘ืช ื”ื”ืจืฉืื” ื•ืžื•ืกื™ืฃ ืื•ืชื” ืœืืกื™ืžื•ืŸ ื”ื’ื™ืฉื” ื›ืชื‘ื™ืขื” ืžื•ืชืืžืช ืื™ืฉื™ืช (ืชื—ืช ืžืจื—ื‘ ื”ืฉืžื•ืช ืฉืœื•, ื›ื ื“ืจืฉ ืขืœ ื™ื“ื™ Auth0).

ื—ื–ื•ืจ ืœืขืžื•ื“ ื—ื•ืงื™ ื•ื‘ื“ืงื• ืฉื™ืฉ ืœื›ื ืฉื ื™ ื›ืœืœื™ื ื›ืชื•ื‘ื™ื ื‘ืกื“ืจ ื”ื‘ื:

  • auth0-autorization-extension
  • ื”ื•ืกืฃ ืชื‘ื™ืขื” ืงื‘ื•ืฆืชื™ืช

ื”ืกื“ืจ ื—ืฉื•ื‘ ืžื›ื™ื•ื•ืŸ ืฉืฉื“ื” ื”ืงื‘ื•ืฆื” ืžืงื‘ืœ ืืช ื”ื›ืœืœ ื‘ืื•ืคืŸ ืืกื™ื ื›ืจื•ื ื™ auth0-autorization-extension ื•ืื—ืจื™ ื–ื” ืžืชื•ื•ืกืฃ ื›ื˜ืขื ื” ืขืœ ื™ื“ื™ ื”ื›ืœืœ ื”ืฉื ื™. ื”ืชื•ืฆืื” ื”ื™ื ืืกื™ืžื•ืŸ ื’ื™ืฉื” ื›ื–ื”:

{
 "https://sa.io/group": "Moderators",
 "iss": "https://sentiment-analysis.eu.auth0.com/",
 "sub": "google-oauth2|196405271625531691872"
 // [ัะพะบั€ะฐั‰ะตะฝะพ ะดะปั ะฝะฐะณะปัะดะฝะพัั‚ะธ]
}

ื›ืขืช ืขืœื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”-proxy ืฉืœ Envoy ืœื‘ื“ื•ืง ื’ื™ืฉืช ืžืฉืชืžืฉ, ืฉืขื‘ื•ืจื” ื”ืงื‘ื•ืฆื” ืชื™ืžืฉืš ืžื”ืชื‘ื™ืขื” (https://sa.io/group) ื‘ืืกื™ืžื•ืŸ ื”ื’ื™ืฉื” ืฉื”ื•ื—ื–ืจ. ื–ื” ื”ื ื•ืฉื ืœื—ืœืง ื”ื‘ื ืฉืœ ื”ืžืืžืจ.

ืชืฆื•ืจืช ื”ืจืฉืื” ื‘-Istio

ื›ื“ื™ ืฉื”ืจืฉืื” ืชืคืขืœ, ืขืœื™ืš ืœื”ืคืขื™ืœ ืืช RBAC ืขื‘ื•ืจ Istio. ืœืฉื ื›ืš, ื ืฉืชืžืฉ ื‘ืชืฆื•ืจื” ื”ื‘ืื”:

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 ื”ื‘ืื™ื:

  • ืชืคืงื™ื“ ืฉื™ืจื•ืช - ืงื•ื‘ืข ืืช ื”ื–ื›ื•ื™ื•ืช ืฉื™ืฉ ืœืžืฉืชืžืฉ;
  • ืฉื™ืจื•ืช RolleBinding - ืงื•ื‘ืข ืœืžื™ ืฉื™ื™ืš ืชืคืงื™ื“ ืฉื™ืจื•ืช ื–ื”.

ืœืžืฉืชืžืฉื™ื ืจื’ื™ืœื™ื ื ืืคืฉืจ ื’ื™ืฉื” ืœืฉื™ืจื•ืชื™ื ืžืกื•ื™ืžื™ื (servicerole.yaml):

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 ื”ื—ืœ ืืช ืชืคืงื™ื“ ื”ืฉื™ืจื•ืช ืขืœ ื›ืœ ื”ืžื‘ืงืจื™ื ื‘ื“ืฃ (ืจื’ื™ืœ-user-service-role-binding.yaml):

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

ื’ื™ืฉื” ืœืชืฆื•ืจืช ืžื ื”ืœื™ื

ืœืžื ื—ื™ื, ืื ื• ืจื•ืฆื™ื ืœืืคืฉืจ ื’ื™ืฉื” ืœื›ืœ ื”ืฉื™ืจื•ืชื™ื (mod-service-role.yaml):

apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: mod-user
  namespace: default
spec:
  rules:
  - services: ["*"]
    paths: ["*"]
    methods: ["*"]

ืื‘ืœ ืื ื—ื ื• ืจื•ืฆื™ื ื–ื›ื•ื™ื•ืช ื›ืืœื” ืจืง ืขื‘ื•ืจ ืื•ืชื ืžืฉืชืžืฉื™ื ืฉืืกื™ืžื•ืŸ ื”ื’ื™ืฉื” ืฉืœื”ื ืžื›ื™ืœ ืชื‘ื™ืขื” https://sa.io/group ืขื ืžืฉืžืขื•ืช Moderators (mod-service-role-binding.yaml):

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 ื‘ืคืจื•ื™ืงื˜ื™ื ืืžื™ืชื™ื™ื.

ื .ื‘ ืžื”ืžืชืจื’ื

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”