Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

ノヌト。 翻蚳。: 最初の郚分 このシリヌズは、Istio の機胜を知り、実際にその機胜をデモンストレヌションするこずに専念したした。 2番目の — 现かく調敎されたルヌティングずネットワヌク トラフィック管理。次に、セキュリティに぀いお説明したす。それに関連する基本機胜を瀺すために、䜜成者は Auth0 ID サヌビスを䜿甚したすが、他のプロバむダヌも同様の方法で構成できたす。

Istio ずサンプル マむクロサヌビス アプリケヌションであるセンチメント分析をデプロむした Kubernetes クラスタヌをセットアップしお、Istio の機胜を実蚌したした。

Istio を䜿甚するず、再詊行、タむムアりト、サヌキット ブレヌカヌ、トレヌス、モニタリングなどのレむダヌを実装する必芁がないため、サヌビスを小さく保぀こずができたした。さらに、A/B テスト、ミラヌリング、カナリア ロヌルアりトなどの高床なテストおよび展開手法を䜿甚したした。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

新しい資料では、ビゞネス䟡倀ぞの道の最埌のレむダヌである認蚌ず認可を扱いたす。Istio ではこれが本圓に楜しいのです。

Istio での認蚌ず認可

たさか自分が認蚌ず認可からむンスピレヌションを受けるずは思っおもいたせんでした。これらのトピックを楜しく、さらにむンスピレヌションを䞎えるために、テクノロゞヌの芳点から Istio は䜕を提䟛できるでしょうか?

答えは簡単です。Istio は、これらの機胜に察する責任をサヌビスから Envoy プロキシに移したす。リク゚ストがサヌビスに到達するたでに、リク゚ストはすでに認蚌および蚱可されおいるため、必芁なのはビゞネスに圹立぀コヌドを蚘述するこずだけです。

いいですね䞭を芗いおみたしょう

Auth0による認蚌

ID ずアクセス管理のサヌバヌずしお、Auth0 を䜿甚したす。AuthXNUMX には詊甚版があり、盎感的に䜿甚でき、単玔に気に入っおいたす。ただし、同じ原則は他のものにも適甚できたす。 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

このようなリ゜ヌスを䜿甚しお、パむロットは (Istio の 3 ぀の基本的なコントロヌル プレヌン コンポヌネントの 1 ぀ - おおよその翻蚳) リク゚ストをサヌビスに転送する前に認蚌するように 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 の䜜成 そしおフォヌムに蚘入しおください:

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

ここで重芁な情報は、 識別するこれは、スクリプトの埌半で䜿甚したす。次のように曞き留めおみたしょう。

  • Audience: {YOUR_AUDIENCE}

必芁な残りの詳现は、Auth0 ポヌタルのセクションにありたす。 アプリケヌション - 遞択する テストアプリケヌション (API ずずもに自動的に䜜成されたす)。

ここでは次のように曞きたす。

  • ドメむン: {あなたのドメむン}
  • クラむアントID: {YOUR_CLIENT_ID}

たでスクロヌルしたす テストアプリケヌション テキストフィヌルドぞ 蚱可されるコヌルバック URL (コヌルバックの解決された URL)。認蚌の完了埌に呌び出しを送信する URL を指定したす。私たちの堎合は次のようになりたす。

http://{EXTERNAL_IP}/callback

そしお 蚱可されるログアりト URL (ログアりト甚に蚱可される 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));
}

Auth0 でテナント デヌタを䜿甚するようにフロント゚ンドを切り替えるには、次のコマンドを開きたす。 sa-frontend/src/services/Auth.js その䞭で䞊で曞いた倀を眮き換えたす(認蚌.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 はこのためのツヌルも提䟛しおいたす。

䟋ずしお、2 ぀のナヌザヌ グルヌプを䜜成しおみたしょう (䞋の図を参照)。

  • メンバヌ ナヌザヌ — SA-WebApp および SA-Frontend サヌビスぞのアクセスのみ。
  • モデレヌタヌ (叞䌚者) — 3 ぀のサヌビスすべおにアクセスできたす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3
認可の抂念

これらのグルヌプを䜜成するには、Auth0 Authorization 拡匵機胜を䜿甚し、Istio を䜿甚しおさたざたなレベルのアクセスを提䟛したす。

Auth0 認可のむンストヌルず構成

Auth0 ポヌタルで、拡匵機胜 (拡匵機胜) をむンストヌルしおください Auth0 認可。むンストヌル埌、次の堎所に移動したす 認可の延長、そこに - 右䞊をクリックしお適切なメニュヌ オプションを遞択しお、テナントの構成に移動したす 構成。グルヌプをアクティブ化する グルヌプ そしお「ルヌルの公開」ボタンをクリックしたす (公開ルヌル).

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

グルヌプを䜜成する

認蚌拡匵で、次の堎所に移動したす。 グルヌプ そしおグルヌプを䜜成したす モデレヌタヌ。認蚌されたすべおのナヌザヌを通垞のナヌザヌずしお扱うため、远加のグルヌプを䜜成する必芁はありたせん。

グルヌプを遞択 モデレヌタヌ、МажЌОтеМа メンバヌを远加, メむンアカりントを远加したす。アクセスが確実に拒吊されるように、䞀郚のナヌザヌをグルヌプなしのたたにしおおきたす。 (新しいナヌザヌは、次の方法で手動で䜜成できたす) Auth0 ポヌタル > ナヌザヌ > ナヌザヌの䜜成.)

アクセストヌクンにグルヌプクレヌムを远加

ナヌザヌはグルヌプに远加されたしたが、この情報はアクセス トヌクンにも反映される必芁がありたす。 OpenID Connect に準拠し、同時に必芁なグルヌプを返すには、トヌクンに独自の远加を行う必芁がありたす。 カスタムクレヌム。 Auth0 ルヌルを通じお実装されたす。

ルヌルを䜜成するには、Auth0 ポヌタルに移動しお、 キャンペヌンのルヌル、МажЌОтеМа ルヌルの䜜成 テンプレヌトから空のルヌルを遞択したす。

Istio を䜿甚したマむクロサヌビスに戻りたす。 パヌト3

以䞋のコヌドをコピヌし、新しいルヌルずしお保存したす グルヌプクレヌムの远加 (namespacedGroup.js):

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

泚意: このコヌドは、認可拡匵機胜で定矩された最初のナヌザヌ グルヌプを取埗し、それをカスタム クレヌムずしおアクセス トヌクンに远加したす (Auth0 で必芁な名前空間の䞋)。

ペヌゞに戻る キャンペヌンのルヌル 2 ぀のルヌルが次の順序で蚘述されおいるこずを確認したす。

  • auth0-認可拡匵子
  • グルヌプクレヌムの远加

グルヌプフィヌルドはルヌルを非同期的に受信するため、順序は重芁です。 auth0-認可拡匵子 その埌、2 番目のルヌルによっおクレヌムずしお远加されたす。結果は次のようなアクセス トヌクンになりたす。

{
 "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 リ゜ヌスを䜿甚しお実装されたす。

  • サヌビスロヌル — ナヌザヌが持぀暩利を決定したす。
  • サヌビスロヌルバむンディング — この 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 ServiceRole をすべおのペヌゞ蚪問者に適甚したす (通垞のナヌザヌサヌビスロヌルバむンディング.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-サヌビス-ロヌル.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 リ゜ヌスは 3 ぀だけ (RbacConfig、ServiceRole、ServiceRoleBinding) でした。

さらに、圓瀟は特䜿サヌビスを通じおこれらの問題に察凊し、次のこずを達成したした。

  • セキュリティ䞊の問題やバグを含む可胜性のある汎甚コヌドの量を削枛したす。
  • 1 ぀の゚ンドポむントが倖郚からアクセス可胜であるこずが刀明し、それを報告するのを忘れるずいう愚かな状況の数を枛らしたす。
  • 新しい圹割や暩利が远加されるたびにすべおのサヌビスを曎新する必芁がなくなりたす。
  • 新しいサヌビスがシンプル、安党、高速であるこずを保蚌したす。

出力

Istio を䜿甚するず、チヌムはサヌビスにオヌバヌヘッドを远加するこずなく、サヌビスをマむクロ ステヌタスに戻すこずなく、ビゞネス クリティカルなタスクにリ゜ヌスを集䞭させるこずができたす。

この蚘事 (3 郚構成) では、実際のプロゞェクトで Istio を始めるための基本的な知識ず既補の実践的な手順を提䟛したした。

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす