(10.2.0-ja) クーバネティスポリシー YAML コード構文
このドキュメントは、QueryPie バージョン 10.2.2 に基づいています。
QueryPie アクセス制御ポリシーの概要
QueryPie で定義されたアクセス制御ポリシーは、拡張属性ベースアクセス制御 (EABAC) に基づいて動作します。EABAC は、QueryPie ユーザーの役割と属性に基づいて、QueryPie に登録されたリソースへのアクセスを制御し、権限の包括的な管理を可能にします。役割ベースのアクセス制御 (RBAC) と属性ベースのアクセス制御 (ABAC) の機能を組み合わせ、柔軟で洗練されたアクセス制御を提供します。すべてのポリシーは、All Deny の原則の下で運用されます。
EABAC は 2つのコンポーネントを通じて機能します: ロールは GUI で設定され、ポリシーは YAML コードで定義・管理されます。
クーバネティスポリシーについては、クーバネティスに存在する Namespace に限定されたロールベースの制限と、Namespace のスコープを超えたリソースをサポートする ClusterRole の両方に対応する包括的なモデルが開発されています。
クーバネティスポリシーの YAML 基本構造
全体的なポリシーコード構造は、いくつかの例外を除いて、ほとんどのポリシー項目でワイルドカード("*")と正規表現 (RE2 形式: ^$
を指定する必要があります) パターンをサポートしています。
カテゴリ | プロパティ | 必須 | 説明 | 有効な値 |
---|---|---|---|---|
| - | O | 記述された YAML コードのバージョン。この値はシステムによって管理され、変更する必要はありません。 |
|
| - | O | 記述された YAML コードの種類。この値はシステムによって管理され、変更する必要はありません。 |
|
| - | O | ポリシーの特定のルールを許可するか拒否するかを指定します。
|
|
|
| O | アクセスを許可/拒否するリソースを指定します。 ワイルドカードと正規表現を許可する |
|
|
| O | クーバネティスコマンドをなりすますクーバネティスユーザー/グループを指定します。
|
|
|
| O | クーバネティスクラスター API サーバ内で許可/拒否するリソース API を指定します。 ワイルドカードと正規表現を許可する
|
|
|
|
| リソースアクセスポリシーの適用など、条件に基づいた詳細な制御を行う。
|
|
リソースの仕様
resources
フィールドは、クーバネティスリソースそのものではなく、QueryPieに登録されているクーバネティスクラスターを定義します。
resources
フィールドの定義は必須です。 必須クーバネティスクラスター名に基づく必要があります。
フォーマット
"cluster:{QueryPieにおけるクーバネティスクラスタ名}"
クーバネティスクラスター名は以下のような構造になっています:
最大100文字
英数字 (大文字と小文字を区別) 、数字、および以下の特殊文字が使用できます:
アンダースコア (_)
ハイフン (-)
名前は英数字または数字で始まり、数字で終わる必要があります。
クラスター名は一意でなければならない
1つのポリシー内で複数のクーバネティスクラスターを指定できます。
- "cluster:kubepie-dev-1"
- "cluster:kubepie-dev-2"
["cluster:kubepie-dev-1", "cluster:kubepie-dev-2"]
ワイルドカードでの書き込みが可能です。
"cluster:kubepie-dev-*"
正規表現で記述可能です。
"cluster:^kubepie-dev-.*$"
サブジェクトの指定
subjectsは
、クーバネティスコマンド内でなりすますためのクーバネティスユーザ/グループを定義します。spec:allow
にのみ適用され、spec:deny
では構文的に許可されません。
kubernetesGroups
: 必須リソースに対して API アクションを実行するために QueryPie プロキシーがなりすますクーバネティスグループアカウントを定義します。
これらのサブジェクトはポリシー全体のレベルで定義する必要があり、少なくとも1つの割り当てが必要です。
これらのサブジェクトを使用したなりすましは、異なるポリシー間で単一のロール内に入れ子にすることができます。
Resources
で指定したリソースに対してアクションを実行する権限を持つクーバネティスグループ (単一または複数) を指定します。kubernetesGroups: - system:masters - default-group-account
impersonation
: オプションクライアント側で
--as
および--as-group
パラメータを持つkubectl
のようなクーバネティスコマンドで、なりすましを許可するユーザーまたはグループを指定します。users
: as パラメーターによるなりすましが許可される、クラスター内に存在するクーバネティスユーザーまたはサービスアカウントを一覧表示します。groups
: "--as-group " パラメータによるなりすましが許可される、クラスタ内に存在するクーバネティスグループをリストアップします。impersonation: users: - "system:serviceaccount:argocd" groups: - "system:admin"
ワイルドカードが許可されます(
"*"
)。
アクション指定
クーバネティスクラスター API サーバ内で許可または拒否するリソース APIリストを指定します。各アクションには、apiGroups
、resources
、namespace
、name
、verbsの
エントリが必要です。
apiGroups
: クーバネティス API グループのリストを定義します。API グループを定義することで、API グループごとにきめ細かいアクセス制御が可能になる。
カスタムリソースの制御が必要な場合は、
apiGroups
で指定する。参考文献
ワイルドカード "*" を使用することで、API グループ全体を包括的に指定することができます。
apiGroups: ["*"]
resources
: クーバネティスリソースのリストを定義します。よく使われるリソースは以下の通りです:
pods
,pods/exec
,pods/log
,pods/portforward
,services
,ingresses
,deployments
,replicasets
,statefulsets
,daemonsets
,configmaps
,secrets
,namespaces
,nodes
,persistentvolumes
,persistentvolumeclaims
,jobs
,cronjobs
,serviceaccounts
,endpoints
,roles
,rolebindings
,clusterroles
,clusterrolebindings
リストにないリソースもポリシーに含めることができます。
Namespace 固有のリソースにのみ権限を付与する場合、Namespace への読み取り専用アクセスが自動的に含まれます。したがって、リソース API 呼び出しのたびに Namespace を指定する必要はありません。特定の Namespace へのアクセス許可を与えないようにするには、
spec:deny
でNamespace ・リソースに対するアクセス拒否を設定します。1つのポリシーアクション内で複数のリソースを指定できます:
resources: - "pods" - "deployments" - "configmaps"
ワイルドカードを使用できます。(
"*"
)
namespace
: 対象の名前空間を定義します。クラスタ内の指定された Namespace へのアクセスを制御するために、アクションで Namespace を指定します。
ワイルドカードと正規表現の両方がサポートされます。
名前空間を指定します:"*"
Namespace 以外の Namespace で永続化しないリソースの場合は、Namespace を指定する必要はありません。
例えば、
persistentvolumes
,persistentvolumeclaims
,serviceaccounts
,customresourcedefinitions
,endpoints
,node
,clusterroles
,clusterrolebindings
などです。
name
: クラスタ内のリソース命名規則に基づいて制御を有効にするターゲット・リソース名を定義します。ワイルドカードと正規表現の両方をサポートしています。
name: "pods-*"
verbs
: 操作を許可または拒否するクーバネティス API パーミッションを指定します。一般的に使用される動詞は以下のとおりです:
get
: リソース情報を取得するlist
: リソースをリストアップするwatch
:リソースの変更を監視するcreate
: 新しいリソースを作成するupdate
: 既存のリソースを更新するpatch
: リソースを部分的に変更するdelete
: リソースを削除するdeletecollection
: 一度の操作で複数のリソースを削除する
リストにない特殊な動詞も、ポリシーで指定および適用できます。
サードパーティクライアントをサポートする場合、以下の動詞は必須であり、提供されるべきです:
表示権限 :
get
,list
,watch
編集権限 :
get
,list
,watch
+create
,update
,patch
,delete
,deletecollection
pod exec
コマンドでコンテナシェルにアクセスするセッションを作成する場合は、通常、get
,create
verb を指定する必要があります。ワイルドカードも使用できます。
verbs:["*"]
条件の指定
conditions
セクションで、resourceTags
, userAttributes
, ipAddresses
を使って条件を定義することができます。 オプション
resourceTags
: リソースタグを使用して、キーと値のペアに基づいてリソースをフィルタリングします。resourceTags: "region": "ap-northeast-1" "Owner": "Brant"
userAttributes
: ユーザー属性を定義して、指定された条件に一致する属性を持つユーザーにポリシーの許可を制限します。userAttributes: "countryCode": "KR" "department": "Infra"
ipAddresses
: IP アドレスまたは CIDR ブロックを指定して、ソース IP に基づいてリソースへのアクセスを制御します。ipAddresses: ["10.10.0.0/24", "10.11.10.1"]
KACポリシーの例
apiVersion: kubernetes.rbac.querypie.com/v1
kind: KacPolicy
spec:
allow:
resources:
- "cluster:*"
subjects:
kubernetesGroups:
- "system:masters"
impersonation:
users: ["system:serviceaccount:argocd"]
groups: ["system:admin"]
actions:
- apiGroups: ["*"]
resources:
- "pods"
namespace: "*"
name: "*"
verbs: ["get", "list", "watch"]
conditions:
resourceTags:
"Owner": ["Kenny", "Brant"]
"Team": "DevSecOps"
userAttributes:
"countryCode": "KR"
"department": "Infra"
ipAddresses: ["10.10.0.0/24", "10.11.10.1"]
deny:
resources:
- "cluster:kubepie-*"
actions:
- apiGroups: ["*"]
resources:
- "*"
namespace: "production"
name: "*"
verbs: ["*"]
conditions:
resourceTags:
"Owner": "Brant"