認可ポリシー
Istioの認可ポリシーは、メッシュ内のワークロードへのアクセス制御を可能にします。
認可ポリシーは、アクセス制御のためにCUSTOM、DENY、およびALLOWアクションをサポートしています。ワークロードでCUSTOM、DENY、およびALLOWアクションが同時に使用される場合、CUSTOMアクションが最初に評価され、次にDENYアクション、最後にALLOWアクションが評価されます。評価は、以下のルールによって決定されます。
- リクエストに一致するCUSTOMポリシーがある場合、評価を行い、評価結果が拒否の場合はリクエストを拒否します。
- リクエストに一致するDENYポリシーがある場合、リクエストを拒否します。
- ワークロードに対するALLOWポリシーがない場合、リクエストを許可します。
- いずれかのALLOWポリシーがリクエストに一致する場合、リクエストを許可します。
- リクエストを拒否します。
Istioの認可ポリシーは、リクエストをログに記録するかどうかを決定するAUDITアクションもサポートしています。AUDITポリシーは、リクエストがワークロードに対して許可されるか拒否されるかには影響しません。リクエストは、CUSTOM、DENY、およびALLOWアクションのみに基づいて許可または拒否されます。
リクエストに一致するAUDITポリシーがワークロードにある場合、リクエストは監査されるべきであると内部的にマークされます。監査の決定を実際に実行し、監査の動作を完了するためには、別のプラグインを設定し、有効にする必要があります。そのようなサポートプラグインが有効になっていない場合、リクエストは監査されません。
以下はIstioの認可ポリシーの例です。
action
を ALLOW
に設定して、許可ポリシーを作成します。デフォルトのアクションは 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://#"]
以下は、action
を DENY
に設定して拒否ポリシーを作成する別の例です。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"]
以下は、action
を DENY
に設定して拒否ポリシーを作成する別の例です。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ポートの認可ポリシー。
次の認可ポリシーは、action
を AUDIT
に設定します。/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は、ワークロードへのアクセス制御を可能にします。
Rule
ルールは、条件のリストに従って、リストされたソースから、リストされたオペレーションを実行するリクエストに一致します。リクエストが少なくとも1つのソース、1つのオペレーション、およびすべての条件に一致する場合に、一致が発生します。空のルールは常に一致します。
ルール内の任意の文字列フィールドは、完全一致、プレフィックス一致、サフィックス一致、および存在一致をサポートします。
- 完全一致:
abc
は、値abc
と一致します。 - プレフィックス一致:
abc*
は、値abc
およびabcd
と一致します。 - サフィックス一致:
*abc
は、値abc
およびxabc
と一致します。 - 存在一致:
*
は、値が空でない場合に一致します。
ソース
ソースは、リクエストのソースIDを指定します。ソース内のフィールドはANDで結合されます。
たとえば、次のソースは、プリンシパルが admin
または dev
であり、名前空間が prod
または test
であり、IPが 203.0.113.4
でない場合に一致します。
principals: ["admin", "dev"]
namespaces: ["prod", "test"]
notIpBlocks: ["203.0.113.4"]
オペレーション
オペレーションは、リクエストのオペレーションを指定します。オペレーションのフィールドはANDで結合されます。
たとえば、次のオペレーションは、ホストのサフィックスが .example.com
であり、メソッドが GET
または HEAD
であり、パスのプレフィックスが /admin
でない場合に一致します。
hosts: ["*.example.com"]
methods: ["GET", "HEAD"]
notPaths: ["/admin*"]
条件
Condition は、追加の必須属性を指定します。
AuthorizationPolicy.ExtensionProvider
Rule.From
From には、ソースのリストが含まれます。
Rule.To
To には、操作のリストが含まれます。
AuthorizationPolicy.Action
Action は、実行する操作を指定します。
Name | 説明 |
---|---|
ALLOW | ルールに一致する場合にのみリクエストを許可します。これはデフォルトのタイプです。 |
DENY | ルールに一致するリクエストを拒否します。 |
AUDIT | ルールに一致するリクエストを監査します。 |
CUSTOM | CUSTOMアクションを使用すると、一致するルールがtrueと評価された場合、拡張機能がユーザーリクエストを処理できます。拡張機能は独立して評価され、ネイティブのALLOWおよびDENYアクションの前に評価されます。一緒に使用する場合、すべての操作が許可を返す場合にのみリクエストが許可されます。つまり、拡張機能はALLOWおよびDENYアクションによって行われた承認決定をバイパスできません。拡張機能の動作は、MeshConfigで宣言された名前付きプロバイダーによって定義されます。承認ポリシーは、プロバイダーの名前を指定することで拡張機能を参照します。拡張機能のユースケースの1つは、カスタムの外部承認システムと統合して承認決定を委任することです。 次の承認ポリシーは、ingressゲートウェイに適用され、リクエストパスにプレフィックス
|