Istio v1beta1 認証ポリシーの概要

Istio v1beta1 認証ポリシーの導入、動機、設計原則。

2019 年 11 月 14 日 | Google の Yangmin Zhu 著

Istio 1.4 では、これまでの v1alpha1 ロールベースのアクセス制御(RBAC)ポリシーを大幅に更新した v1beta1 認証ポリシー が導入されました。新しいポリシーでは、以下の向上点がもたらされています。

v1beta1 ポリシーは下位互換性がないため、一度の変換が必要です。このプロセスを自動化するツールが提供されています。以前の構成リソース ClusterRbacConfigServiceRoleServiceRoleBinding は Istio 1.6 以降ではサポートされません。

この記事では、新しい v1beta1 認証ポリシーモデル、その設計目標、v1alpha1 RBAC ポリシーからの移行について説明します。v1beta1 認証ポリシーの詳細な詳細な説明については、認証コンセプトページ を参照してください。

v1beta1 認証ポリシーに関するフィードバックは、discuss.istio.io でお待ちしております。

背景

これまで、Istio は サービス にアクセス制御を適用するために RBAC ポリシーを提供していました。 これは、ClusterRbacConfigServiceRoleServiceRoleBinding という 3 つ構成リソースを使用して行っていました。ユーザーは、この API を使用して、メッシュレベル、ネームスペースレベル、サービスレベルでアクセス制御を適用できました。他の RBAC ポリシーと同様に、Istio RBAC はロールとバインディングという同じコンセプトを使用してアイデンティティに権限を付与します。

Istio RBAC はこれまで確実に機能していましたが、多くの改良が可能であることがわかりました。

たとえば、ユーザーは、ServiceRoleがサービスを使用してポリシーを適用する場所を指定するため、アクセス制御の適用はサービスレベルで行われると誤解しがちです。ただし、ポリシーは実際にはワークロードに適用され、サービスは対応するワークロードを見つけるためにのみ使用されます。このニュアンスは、複数のサービスが同一のワークロードを参照している場合に重要です。サービスAに対するServiceRoleは、2つのサービスが同じワークロードを参照している場合、サービスBにも影響します。これにより混乱や誤った設定が生じる可能性があります。

もう1つの例は、3つの関連リソースを深く理解する必要があるため、ユーザーがIstio RBACの設定を保守および管理することが難しいことが実証されていることです。

デザインの目標

新しいv1beta1認証ポリシーには、いくつかのデザイン目標がありました。

認証ポリシー

AuthorizationPolicyカスタムリソースは、ワークロードに対するアクセス制御を可能にします。このセクションでは、v1beta1認証ポリシーの変更の概要を説明します。

AuthorizationPolicyには、selectorruleのリストが含まれます。selectorはポリシーを適用するワークロードを指定し、ruleのリストはワークロードの詳細なアクセス制御ルールの指定します。

ruleは加算されます。つまり、任意のruleが要求を許可する場合、要求が許可されます。各ruleにはfromto、およびwhenのリストが含まれます。これらは、誰がどのような条件何ができるかを指定します。

selectorClusterRbacConfigServiceRoleservicesフィールドで提供される機能を置き換えます。ruleServiceRoleServiceRoleBindingの他のフィールドを置き換えます。

次の認証ポリシーは、foo名前空間でapp: httpbinおよびversion: v1ラベルを持つワークロードに適用されます。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: httpbin
 namespace: foo
spec:
 selector:
   matchLabels:
     app: httpbin
     version: v1
 rules:
 - from:
   - source:
       principals: ["cluster.local/ns/default/sa/sleep"]
   to:
   - operation:
       methods: ["GET"]
   when:
   - key: request.headers[version]
     values: ["v1", "v2"]

このポリシーは、リクエストに値がv1またはv2versionヘッダーが含まれている場合、プリンシパルcluster.local/ns/default/sa/sleepGETメソッドを使用してワークロードにアクセスすることを許可します。ポリシーに一致しないリクエストは、すべてデフォルトで拒否されます。

httpbinサービスが次のように定義されていると仮定します。

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  namespace: foo
spec:
  selector:
    app: httpbin
    version: v1
  ports:
    # omitted

v1alpha1 で同じ結果を得るには、3 つのリソースを設定する必要があります。

apiVersion: "rbac.istio.io/v1alpha1"
kind: ClusterRbacConfig
metadata:
  name: default
spec:
  mode: 'ON_WITH_INCLUSION'
  inclusion:
    services: ["httpbin.foo.svc.cluster.local"]
---
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: httpbin
  namespace: foo
spec:
  rules:
  - services: ["httpbin.foo.svc.cluster.local"]
    methods: ["GET"]
    constraints:
    - key: request.headers[version]
      values: ["v1", "v2"]
---
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: httpbin
  namespace: foo
spec:
  subjects:
  - user: "cluster.local/ns/default/sa/sleep"
  roleRef:
    kind: ServiceRole
    name: "httpbin"

ワークロードセレクター

v1beta1 認可ポリシーの大きな変更点は、ポリシーをどこで適用するかを指定するためにワークロードセレクターを使用することです。これは、GatewaySidecarEnvoyFilter 設定で使用されるワークロードセレクターと同じものです。

ワークロードセレクターは、ポリシーがサービスではなくワークロードに適用および強制されることを明確にします。ポリシーが複数の異なるサービスで使用されるワークロードに適用される場合、同じポリシーによってすべての異なるサービスへのトラフィックに影響が及びます。

名前空間内のすべてのワークロードにポリシーを適用するには、selector を空のままにしておくことができます。次のポリシーは、名前空間 bar 内のすべてのワークロードに適用されます。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: policy
 namespace: bar
spec:
 rules:
 # omitted

ルート名前空間

ルート名前空間のポリシーは、すべての名前空間に含まれるメッシュ内のすべてのワークロードに適用されます。ルート名前空間は、MeshConfigで構成でき、デフォルト値はistio-systemです。

たとえば、istio-system 名前空間に Istio をインストールし、defaultbookinfo 名前空間にワークロードをデプロイしました。ルート名前空間は、デフォルト値から istio-config に変更されます。次のポリシーは、defaultbookinfoistio-system を含むすべての名前空間内のワークロードに適用されます。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: policy
 namespace: istio-config
spec:
 rules:
 # omitted

イングレス/エグレスゲートウェイサポート

v1beta1 認可ポリシーは、イングレス/エグレスゲートウェイにも適用して、メッシュに出入りするトラフィックへのアクセス制御を強制できます。イングレス/エグレスワークロードを選択するようにselectorを変更するだけです。

次のポリシーは、app: istio-ingressgateway ラベルを持つワークロードに適用されます。

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
 name: ingress
 namespace: istio-system
spec:
 selector:
   matchLabels:
     app: istio-ingressgateway
 rules:
 # omitted

認可ポリシーは、ポリシーと同じ名前空間に含まれるワークロードにのみ適用されることに注意してください。ただし、ルート名前空間にポリシーが適用されている場合は除きます。

比較

次の表は、古い v1alpha1 RBAC ポリシーと新しい v1beta1 認可ポリシーの主な違いを示しています。

機能

機能v1alpha1 RBAC ポリシーv1beta1 認可ポリシー
API の安定性alpha: 下位互換性がありませんbeta: 下位互換性が 保証されています
CRD の数3 つ: ClusterRbacConfigServiceRoleServiceRoleBinding1 つのみ: AuthorizationPolicy
ポリシーのターゲットサービスワークロード
デフォルトでの拒否の動作ClusterRbacConfig を設定することによって 明示的に有効にします。AuthorizationPolicy とともに 暗黙的に有効にします。
イングレス/エグレスゲートウェイサポートサポートされていませんサポートされています
ポリシー内の "*" の値すべてのコンテンツ(空と非空)に一致します。非空コンテンツにのみ一致します。

次の表は、v1alpha1v1beta1 API の関係を示しています。

ClusterRbacConfig

ClusterRbacConfig.Mode認証ポリシー
OFF適用されるポリシーなし
有効ルート名前空間に適用された全拒否ポリシー
ON_WITH_INCLUSIONポリシーは、ClusterRbacConfigによって含まれる名前空間またはワークロードに適用される必要があります
ON_WITH_EXCLUSIONポリシーは、ClusterRbacConfigによって除外される名前空間またはワークロードに適用される必要があります

サービスロール

サービスロール認証ポリシー
サービスセレクター
パスto内のパス
メソッドto内のメソッド
制約内のdestination.ipサポートされていません
制約内のdestination.portto内のポート
制約内のdestination.labelsセレクター
制約内のdestination.namespaceポリシーの名前空間、つまりメタデータ内のnamespaceに置き換える
制約内のdestination.userサポートされていません
制約内のexperimental.envoy.filterswhen内のexperimental.envoy.filters
制約内のrequest.headerswhen内のrequest.headers

サービスロールバインディング

サービスロールバインディング認証ポリシー
ユーザーfrom内のprincipals
グループwhen内のrequest.auth.claims[group]
プロパティ内のsource.ipfrom内のipBlocks
プロパティ内のsource.namespacefrom内のnamespaces
プロパティ内のsource.principalfrom内のprincipals
プロパティ内のrequest.headerswhen内のrequest.headers
プロパティ内のrequest.auth.principalfrom内のrequestPrincipalsまたはwhen内のrequest.auth.principal
プロパティ内のrequest.auth.audienceswhen内のrequest.auth.audiences
プロパティ内のrequest.auth.presenterwhen内のrequest.auth.presenter
プロパティ内のrequest.auth.claimswhen内のrequest.auth.claims

多様な違いに関係なく、v1beta1ポリシーはEnvoy内の同じエンジンによって適用され、v1alpha1ポリシーと同じ認証済みID(相互TLSまたはJWT)、条件、その他の基本要素(IP、ポートなど)をサポートします。

v1alpha1ポリシーの将来

v1alpha1 RBACポリシー(ClusterRbacConfigServiceRoleServiceRoleBinding)は、v1beta1認証ポリシーによって非推奨になりました。

Istio 1.4は、アルファポリシーから離れるために十分な時間を確保するために、v1alpha1 RBACポリシーを引き続きサポートします。

v1alpha1ポリシーからの移行

Istioは特定のワークロードに対して2つのバージョンのいずれかをサポートしています。

一般的なガイドライン

v1beta1ポリシーに移行する一般的な流れは、RBACが有効になっている名前空間またはサービスを決定するために、ClusterRbacConfigを確認することから始めます。

RBACが有効になっているサービスごとに

  1. サービス定義からワークロードセレクターを取得します。
  2. ワークロードセレクターを使用してv1beta1ポリシーを作成します。
  3. サービスに適用されている各ServiceRoleServiceRoleBindingに対してv1beta1ポリシーを更新します。
  4. v1beta1 ポリシーを適用してトラフィックを監視し、ポリシーが期待通りに機能していることを確認します。
  5. RBAC が有効になっている次のサービスに対してプロセスを繰り返します。

RBAC が有効になっている各名前空間について

  1. 対象の名前空間へのすべてのトラフィックを拒否する v1beta1 ポリシーを適用します。

移行例

foo 名前空間に httpbin サービスについて以下の v1alpha1 ポリシーがあるとします。

apiVersion: "rbac.istio.io/v1alpha1"
kind: ClusterRbacConfig
metadata:
  name: default
spec:
  mode: 'ON_WITH_INCLUSION'
  inclusion:
    namespaces: ["foo"]
---
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRole
metadata:
  name: httpbin
  namespace: foo
spec:
  rules:
  - services: ["httpbin.foo.svc.cluster.local"]
    methods: ["GET"]
---
apiVersion: "rbac.istio.io/v1alpha1"
kind: ServiceRoleBinding
metadata:
  name: httpbin
  namespace: foo
spec:
  subjects:
  - user: "cluster.local/ns/default/sa/sleep"
  roleRef:
    kind: ServiceRole
    name: "httpbin"

次のようにして上記のポリシーを v1beta1 に移行します。

  1. httpbin サービスに次のワークロードセレクターがあるとします。

    selector:
      app: httpbin
      version: v1
    
  2. ワークロードセレクターで v1beta1 ポリシーを作成します。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: httpbin
     namespace: foo
    spec:
     selector:
       matchLabels:
         app: httpbin
         version: v1
    
  3. ServiceRole とサービスに適用された ServiceRoleBinding のそれぞれで v1beta1 ポリシーを更新します。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: httpbin
     namespace: foo
    spec:
     selector:
       matchLabels:
         app: httpbin
         version: v1
     rules:
     - from:
       - source:
           principals: ["cluster.local/ns/default/sa/sleep"]
       to:
       - operation:
           methods: ["GET"]
    
  4. v1beta1 ポリシーを適用し、期待通りに機能することを確認するためにトラフィックを監視します。

  5. foo 名前空間は RBAC が有効になっているため、foo 名前空間へのすべてのトラフィックを拒否する以下の v1beta1 ポリシーを適用します。

    apiVersion: security.istio.io/v1beta1
    kind: AuthorizationPolicy
    metadata:
     name: deny-all
     namespace: foo
    spec:
     {}
    

v1beta1 ポリシーが期待通りに機能することを確認してから、クラスタから v1alpha1 ポリシーを削除できます。

移行の自動化

移行を容易にするために、istioctl experimental authz convert コマンドが提供され、v1alpha1 ポリシーを v1beta1 ポリシーに自動的に変換します。

コマンドを評価できますが、Istio 1.4 では実験的であり、このブログ記事の時点で v1alpha1 セマンティクスを完全にサポートしていません。

v1alpha1 セマンティクスを完全にサポートするコマンドは、Istio 1.4 に続くパッチリリースで期待されています。

この投稿を共有する