認可ポリシー

Istioの認可ポリシーは、メッシュ内のワークロードへのアクセス制御を可能にします。

認可ポリシーは、アクセス制御のためにCUSTOM、DENY、およびALLOWアクションをサポートしています。ワークロードでCUSTOM、DENY、およびALLOWアクションが同時に使用される場合、CUSTOMアクションが最初に評価され、次にDENYアクション、最後にALLOWアクションが評価されます。評価は、以下のルールによって決定されます。

  1. リクエストに一致するCUSTOMポリシーがある場合、評価を行い、評価結果が拒否の場合はリクエストを拒否します。
  2. リクエストに一致するDENYポリシーがある場合、リクエストを拒否します。
  3. ワークロードに対するALLOWポリシーがない場合、リクエストを許可します。
  4. いずれかのALLOWポリシーがリクエストに一致する場合、リクエストを許可します。
  5. リクエストを拒否します。

Istioの認可ポリシーは、リクエストをログに記録するかどうかを決定するAUDITアクションもサポートしています。AUDITポリシーは、リクエストがワークロードに対して許可されるか拒否されるかには影響しません。リクエストは、CUSTOM、DENY、およびALLOWアクションのみに基づいて許可または拒否されます。

リクエストに一致するAUDITポリシーがワークロードにある場合、リクエストは監査されるべきであると内部的にマークされます。監査の決定を実際に実行し、監査の動作を完了するためには、別のプラグインを設定し、有効にする必要があります。そのようなサポートプラグインが有効になっていない場合、リクエストは監査されません。

以下はIstioの認可ポリシーの例です。

actionALLOW に設定して、許可ポリシーを作成します。デフォルトのアクションは ALLOW ですが、ポリシーで明示的に指定することは有用です。

次のリクエストを許可します。

  • サービスアカウント cluster.local/ns/default/sa/sleep または
  • 名前空間 test

次のワークロードへのアクセス

  • /info のプレフィックスを持つパスに対する GET メソッド、または
  • /data パスの POST メソッド。

リクエストが https://# によって発行された有効なJWTトークンを持っている場合。

その他のリクエストはすべて拒否されます。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/sleep"]
    - source:
        namespaces: ["test"]
    to:
    - operation:
        methods: ["GET"]
        paths: ["/info*"]
    - operation:
        methods: ["POST"]
        paths: ["/data"]
    when:
    - key: request.auth.claims[iss]
      values: ["https://#"]

以下は、actionDENY に設定して拒否ポリシーを作成する別の例です。dev 名前空間からのリクエストを、foo 名前空間のすべてのワークロードへの POST メソッドに対して拒否します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - from:
    - source:
        namespaces: ["dev"]
    to:
    - operation:
        methods: ["POST"]

以下は、actionDENY に設定して拒否ポリシーを作成する別の例です。foo 名前空間のすべてのワークロードのポート 8080 での POST メソッドを持つすべてのリクエストを拒否します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: httpbin
  namespace: foo
spec:
  action: DENY
  rules:
  - to:
    - operation:
        methods: ["POST"]
        ports: ["8080"]

このルールがTCPトラフィックに適用される場合、method フィールド(すべてのHTTPベースの属性と同様に)を処理できません。DENY ルールの場合、欠落した属性は一致として扱われます。これは、上記の例ではポート 8080 のすべてのTCPトラフィックが拒否されることを意味します。ports の一致を削除すると、すべてのTCPトラフィックが拒否されます。したがって、特にHTTP属性を使用する場合は、常に DENY ポリシーを特定のポートにスコープすることを推奨します TCPポートの認可ポリシー

次の認可ポリシーは、actionAUDIT に設定します。/user/profile のプレフィックスを持つパスへの GET リクエストを監査します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  namespace: ns1
  name: anyname
spec:
  selector:
    matchLabels:
      app: myapi
  action: AUDIT
  rules:
  - to:
    - operation:
        methods: ["GET"]
        paths: ["/user/profile/*"]

認可ポリシーのスコープ(ターゲット)は、"metadata/namespace" とオプションの selector によって決定されます。

  • "metadata/namespace" は、ポリシーが適用される名前空間を示します。ルート名前空間に設定されている場合、ポリシーはメッシュ内のすべての名前空間に適用されます。
  • ワークロードの selector を使用して、ポリシーが適用される場所をさらに制限できます。

たとえば、次の認可ポリシーは、foo 名前空間のすべてのワークロードに適用されます。何も許可せず、事実上、foo 名前空間のワークロードへのすべてのリクエストを拒否します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: foo
spec:
  {}

次の認可ポリシーは、foo 名前空間のワークロードへのすべてのリクエストを許可します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-all
 namespace: foo
spec:
 rules:
 - {}

次の認可ポリシーは、bar 名前空間のラベル app: httpbin を含むワークロードに適用されます。何も許可せず、選択したワークロードへのすべてのリクエストを事実上拒否します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: allow-nothing
  namespace: bar
spec:
  selector:
    matchLabels:
      app: httpbin

次の認可ポリシーは、メッシュ内のすべての名前空間でラベル version: v1 を含むワークロードに適用されます。(ルート名前空間が istio-system に構成されていると仮定します)。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
 name: allow-nothing
 namespace: istio-system
spec:
 selector:
   matchLabels:
     version: v1

次の例は、実験的なアノテーション istio.io/dry-run を使用して、ポリシーを実際に適用せずにドライランで認可ポリシーを設定する方法を示します。

ドライランアノテーションを使用すると、認可ポリシーを本番トラフィックに適用する前に、その効果をよりよく理解できます。これにより、間違った認可ポリシーによって引き起こされる本番トラフィックの中断のリスクを軽減できます。詳細については、ドライランタスクを参照してください。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: dry-run-example
  annotations:
    "istio.io/dry-run": "true"
spec:
  selector:
    matchLabels:
      app: httpbin
  action: DENY
  rules:
  - to:
    - operation:
        paths: ["/headers"]

AuthorizationPolicy

AuthorizationPolicyは、ワークロードへのアクセス制御を可能にします。

フィールドタイプ説明必須
selectorWorkloadSelector

オプション。セレクターは、認可ポリシーを適用する場所を決定します。セレクターは、認可ポリシーと同じ名前空間内のワークロードと一致します。認可ポリシーがルート名前空間にある場合、セレクターはさらにすべての名前空間内のワークロードと一致します。

セレクターとtargetRefが設定されていない場合、セレクターはすべてのワークロードと一致します。

特定のポリシーに対して、selector または targetRefs のうち最大1つを設定できます。

いいえ
targetRefsPolicyTargetReference[]

オプション。targetRefsは、ポリシーを適用する必要があるリソースのリストを指定します。指定されたターゲットリソースは、ポリシーが適用されるワークロードを決定します。

現在、次のリソースアタッチメントタイプがサポートされています。

  • kind: Gateway および group: gateway.networking.k8s.io (同じ名前空間内)。
  • kind: Service および group: "" または group: "core" (同じ名前空間内)。このタイプは、ウェイポイントでのみサポートされています。

設定されていない場合、ポリシーはセレクターによって定義されたように適用されます。セレクターとtargetRefsのうち最大1つを設定できます。

注:Istio 1.22より前のバージョンのマルチリビジョン環境で targetRefs フィールドを使用している場合、istio.io/rev ラベルを使用して、1.22以降を実行しているリビジョンにポリシーをピン留めすることを強くお勧めします。これは、(targetRefs フィールドを認識しない)古いコントロールプレーンに接続されたプロキシが、アップグレードプロセス中にポリシーを名前空間全体のものとして誤解釈するのを防ぐためです。

注:ポリシーを適用するには、ウェイポイントプロキシでこのフィールドを使用する必要があります。selector ポリシーは無視されます。

いいえ
rulesRule[]

オプション。リクエストに一致するルールのリスト。リクエストが少なくとも1つのルールに一致する場合に、一致が発生します。

設定されていない場合、一致は発生しません。これは、アクションがALLOWの場合、ターゲットワークロードに対してデフォルトで拒否を設定することと同じです。

いいえ
actionAction

オプション。リクエストがルールに一致した場合に実行するアクション。指定されていない場合、デフォルトはALLOWです。

いいえ
providerExtensionProvider (oneof)

CUSTOMアクションの詳細な構成を指定します。CUSTOMアクションでのみ使用する必要があります。

いいえ

Rule

ルールは、条件のリストに従って、リストされたソースから、リストされたオペレーションを実行するリクエストに一致します。リクエストが少なくとも1つのソース、1つのオペレーション、およびすべての条件に一致する場合に、一致が発生します。空のルールは常に一致します。

ルール内の任意の文字列フィールドは、完全一致、プレフィックス一致、サフィックス一致、および存在一致をサポートします。

  • 完全一致:abc は、値 abc と一致します。
  • プレフィックス一致:abc* は、値 abc および abcd と一致します。
  • サフィックス一致:*abc は、値 abc および xabc と一致します。
  • 存在一致:* は、値が空でない場合に一致します。
フィールドタイプ説明必須
fromFrom[]

オプション。from は、リクエストのソースを指定します。

設定されていない場合、任意のソースが許可されます。

いいえ
toTo[]

オプション。to は、リクエストのオペレーションを指定します。

設定されていない場合、任意のオペレーションが許可されます。

いいえ
whenCondition[]

オプション。when は、リクエストの追加条件のリストを指定します。

設定されていない場合、任意の条件が許可されます。

いいえ

ソース

ソースは、リクエストのソースIDを指定します。ソース内のフィールドはANDで結合されます。

たとえば、次のソースは、プリンシパルが admin または dev であり、名前空間が prod または test であり、IPが 203.0.113.4 でない場合に一致します。

principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["203.0.113.4"]
フィールドタイプ説明必須
principalsstring[]

オプション。ピア証明書から派生したピアIDのリスト。ピアIDの形式は、"<TRUST_DOMAIN>/ns/<NAMESPACE>/sa/<SERVICE_ACCOUNT>" です。たとえば、"cluster.local/ns/default/sa/productpage" です。このフィールドにはmTLSが有効になっている必要があり、source.principal 属性と同じです。

設定されていない場合、任意のプリンシパルが許可されます。

いいえ
notPrincipalsstring[]

オプション。ピアIDの否定一致のリスト。

いいえ
requestPrincipalsstring[]

オプション。JWTから派生したリクエストIDのリスト。リクエストIDの形式は、"<ISS>/<SUB>" です。たとえば、"example.com/sub-1" です。このフィールドにはリクエスト認証が有効になっている必要があり、request.auth.principal 属性と同じです。

設定されていない場合、任意のリクエストプリンシパルが許可されます。

いいえ
notRequestPrincipalsstring[]

オプション。リクエストIDの否定一致のリスト。

いいえ
namespacesstring[]

オプション。ピア証明書から派生した名前空間のリスト。このフィールドにはmTLSが有効になっている必要があり、source.namespace 属性と同じです。

設定されていない場合、任意の名前空間が許可されます。

いいえ
notNamespacesstring[]

オプション。名前空間の否定一致のリスト。

いいえ
ipBlocksstring[]

オプション。IPパケットの送信元アドレスから設定されたIPブロックのリスト。単一のIP(例:203.0.113.4)とCIDR(例:203.0.113.0/24)がサポートされています。これは、source.ip 属性と同じです。

設定されていない場合、任意のIPが許可されます。

いいえ
notIpBlocksstring[]

オプション。IPブロックの否定一致のリスト。

いいえ
remoteIpBlocksstring[]

オプション。X-Forwarded-For ヘッダーまたはプロキシプロトコルから設定されたIPブロックのリスト。このフィールドを使用するには、Istioをインストールするときに、meshConfig の下の gatewayTopologynumTrustedProxies フィールドを構成するか、イングレスゲートウェイのアノテーションを使用する必要があります。ドキュメントについては、こちらを参照してください:ゲートウェイネットワークトポロジの構成。単一のIP(例:203.0.113.4)とCIDR(例:203.0.113.0/24)がサポートされています。これは、remote.ip 属性と同じです。

設定されていない場合、任意のIPが許可されます。

いいえ
notRemoteIpBlocksstring[]

オプション。リモートIPブロックの否定一致のリスト。

いいえ

オペレーション

オペレーションは、リクエストのオペレーションを指定します。オペレーションのフィールドはANDで結合されます。

たとえば、次のオペレーションは、ホストのサフィックスが .example.com であり、メソッドが GET または HEAD であり、パスのプレフィックスが /admin でない場合に一致します。

hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
フィールドタイプ説明必須
hostsstring[]

オプション。HTTPリクエストで指定されたホストのリスト。一致は大文字と小文字を区別しません。このフィールドの推奨される使用方法については、セキュリティのベストプラクティスを参照してください。

設定されていない場合、任意のホストが許可されます。HTTPでのみ使用する必要があります。

いいえ
notHostsstring[]

オプション。HTTPリクエストで指定されたホストの否定一致リスト。マッチングは大文字と小文字を区別しません。

いいえ
portsstring[]

オプション。接続で指定されたポートのリスト。

設定されていない場合、すべてのポートが許可されます。

いいえ
notPortsstring[]

オプション。接続で指定されたポートの否定一致リスト。

いいえ
methodsstring[]

オプション。HTTPリクエストで指定されたメソッドのリスト。gRPCサービスの場合、これは常にPOSTになります。

設定されていない場合、すべてのメソッドが許可されます。HTTPでのみ使用する必要があります。

いいえ
notMethodsstring[]

オプション。HTTPリクエストで指定されたメソッドの否定一致リスト。

いいえ
pathsstring[]

オプション。HTTPリクエストで指定されたパスのリスト。パスの正規化の詳細については、Authorization Policy Normalizationを参照してください。gRPCサービスの場合、これは/package.service/method形式の完全修飾名になります。

リスト内のパスに{*}または{**}パス・テンプレート演算子が含まれている場合、それはEnvoy Uri Templateとして解釈されます。有効なパス・テンプレートにするには、パスにサポートされている演算子以外の*{、または}を含めることはできません。パス・テンプレート演算子を持つパス・セグメントでは、他の文字は許可されません。

  • {*} は、パス・セグメントを超えて拡張できない単一のグロブに一致します。
  • {**} は、ゼロ個以上のグロブに一致します。パスに {**} が含まれる場合、それは最後の演算子である必要があります。

  • /foo/{*}/foo/bar に一致しますが、/foo/bar/baz には一致しません。
  • /foo/{**}//foo/bar//foo/bar/baz.txt、および /foo// に一致しますが、/foo/bar には一致しません。
  • /foo/{*}/bar/{**}/foo/buzz/bar//foo/buzz/bar/baz に一致します。
  • /*/baz/{*} は、サポートされている演算子の外に * が含まれているため、有効なパス・テンプレートではありません。
  • /**/baz/{*} は、サポートされている演算子の外に ** が含まれているため、有効なパス・テンプレートではありません。
  • /{**}/foo/{*} は、{**} が最後の演算子ではないため、有効なパス・テンプレートではありません。
  • /foo/{*}.txt は、パス・セグメントに {*} 以外の文字が含まれているため無効です。

設定されていない場合、すべてのパスが許可されます。HTTPでのみ使用する必要があります。

いいえ
notPathsstring[]

オプション。パスの否定一致リスト。

いいえ

条件

Condition は、追加の必須属性を指定します。

フィールドタイプ説明必須
keystring

Istio属性の名前。サポートされている属性の完全なリストを参照してください。

はい
valuesstring[]

オプション。属性に対して許可される値のリスト。注:valuesまたはnotValuesの少なくとも1つを設定する必要があります。

いいえ
notValuesstring[]

オプション。属性の値の否定一致リスト。注:valuesまたはnotValuesの少なくとも1つを設定する必要があります。

いいえ

AuthorizationPolicy.ExtensionProvider

フィールドタイプ説明必須
namestring

拡張プロバイダーの名前を指定します。利用可能なプロバイダーのリストはMeshConfigで定義されています。現在、ワークロードごとに最大1つの拡張プロバイダーが許可されていることに注意してください。異なるワークロードは、異なる拡張プロバイダーを使用できます。

いいえ

Rule.From

From には、ソースのリストが含まれます。

フィールドタイプ説明必須
sourceソース

Source は、リクエストのソースを指定します。

いいえ

Rule.To

To には、操作のリストが含まれます。

フィールドタイプ説明必須
operationオペレーション

Operation は、リクエストの操作を指定します。

いいえ

AuthorizationPolicy.Action

Action は、実行する操作を指定します。

Name説明
ALLOW

ルールに一致する場合にのみリクエストを許可します。これはデフォルトのタイプです。

DENY

ルールに一致するリクエストを拒否します。

AUDIT

ルールに一致するリクエストを監査します。

CUSTOM

CUSTOMアクションを使用すると、一致するルールがtrueと評価された場合、拡張機能がユーザーリクエストを処理できます。拡張機能は独立して評価され、ネイティブのALLOWおよびDENYアクションの前に評価されます。一緒に使用する場合、すべての操作が許可を返す場合にのみリクエストが許可されます。つまり、拡張機能はALLOWおよびDENYアクションによって行われた承認決定をバイパスできません。拡張機能の動作は、MeshConfigで宣言された名前付きプロバイダーによって定義されます。承認ポリシーは、プロバイダーの名前を指定することで拡張機能を参照します。拡張機能のユースケースの1つは、カスタムの外部承認システムと統合して承認決定を委任することです。

次の承認ポリシーは、ingressゲートウェイに適用され、リクエストパスにプレフィックス/admin/がある場合、承認チェックを名前付き拡張機能my-custom-authzに委任します。

apiVersion: security.istio.io/v1
kind: AuthorizationPolicy
metadata:
  name: ext-authz
  namespace: istio-system
spec:
  selector:
    matchLabels:
      app: istio-ingressgateway
  action: CUSTOM
  provider:
    name: "my-custom-authz"
  rules:
  - to:
    - operation:
        paths: ["/admin/*"]
この情報は役に立ちましたか?
改善のためのご提案はありますか?

フィードバックありがとうございます!