OPA ポリシー管理に Gatekeeper を使用する

OPA ポリシー管理に Gatekeeper を使用する

先ほど、OPA ポリシーの自動同期を完了するために kube-mgmt サイドカー コンテナの使用を紹介しました。さらに、より高度なツールである Gatekeeper もあります。以前のモードと比較して、Gatekeeper (v3.0) アドミッション コントローラは OPA 制約フレームワークを統合して CRD ベースのポリシーを実行し、宣言的に構成されたポリシーを確実に共有できるようにします。これは、アドミッション制御と監査機能の検証と変更を提供する kubebuilder を使用して構築されています。これにより、Rego ポリシーのポリシー テンプレートを作成し、ポリシーを CRD として作成し、監査結果をポリシー CRD に保存できるようになります。このプロジェクトは、Google、Microsoft、Red Hat、Styra の共同プロジェクトです。

Gatekeeper をインストールするには、次のコマンドを使用します。

  kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.7/deploy/gatekeeper.yaml

デフォルトでは、Gatekeeper は gatekeeper-system 名前空間にインストールされ、関連する CRD もいくつかインストールされます。

  kubectl get pods - n ゲートキーパー- システム
名前準備完了ステータス再起動年齢
ゲートキーパー- 監査- 5 cf4b9686 - glndv 1 / 1 実行中0 2 m2s
ゲートキーパー- コントローラ- マネージャ- 77 b7dc99fb - dvkvp 1 / 1 実行中0 2 m2s
ゲートキーパー- コントローラー- マネージャー- 77 b7dc99fb - gk4gr 1 / 1 実行中0 2 m2s
ゲートキーパー- コントローラー- マネージャー- 77 b7dc99fb - mt5wn 1 / 1 実行中0 2 m2s
kubectl でcrd を取得します| grep ゲート
割り当てます 突然変異 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
メタデータを割り当てます 突然変異 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
設定 設定 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
制約ポッドステータス 状態 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
制約テンプレートポッドステータス 状態 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
制約テンプレート テンプレート ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
セットを変更します 突然変異 ゲートキーパー 2022-03-27 T06 : 47 : 24Z 午後
ミューテーターポッドステータス 状態 ゲートキーパー 2022-03-27 T06 : 47 : 25Z 午後
プロバイダー 外部データ ゲートキーパー 2022-03-27 T06 : 47 : 25Z 午後

Gatekeeper は、OPA 制約フレームワークを使用してポリシーを記述および適用します。制約を定義する前に、制約を適用する Rego と制約モードを記述する ConstraintTemplate オブジェクトをまず定義する必要があります。制約のスキーマを使用すると、管理者は関数のパラメータと同様に、制約の動作を微調整できます。

以下は、検証対象のオブジェクトに存在する必要があるラベルを記述する制約テンプレートです。

 # k8s 必須ラベルテンプレート.yaml
apiバージョン: テンプレートゲートキーパーsh / v1
種類: 制約テンプレート
メタデータ:
名前: k8srequiredlabels
仕様:
クレジット:
仕様:
名前:
種類: K8sRequiredLabels
検証:
openAPIV3Schema : # `parameters` フィールドスキーマ
タイプ: オブジェクト
説明: K8sRequiredLabels CRD パラメータを説明する
プロパティ:
ラベル:
タイプ: 配列
アイテム:
タイプ: 文字列
説明: ラベル文字
ターゲット:
- 対象入学k8sゲートキーパーシュ
登録: |
パッケージk8srequiredlabels

違反[{ "msg" : msg , "details" : { "missing_labels" : missing }}] {
提供: = { ラベル| 入力しますレビュー物体メタデータラベル[ ラベル]}
必須: = { ラベル| ラベル: = 入力パラメータラベル[ _ ]}
欠落: = 必須- 提供
カウント( 欠落) > 0
msg : = sprintf ( "ラベルを指定する必要があります: %v" 、[ 欠落])
}

上記の ConstraintTemplate リソース リストを直接適用します。

  kubectl apply -f k8srequiredlabels_template .yaml
制約テンプレートテンプレートゲートキーパーsh / k8srequiredlabels が作成されました
kubectl 制約テンプレートを取得する
名前年齢
k8srequiredlabels 68

上記で定義した ConstraintTemplate オブジェクトはテンプレートです。 crd 部分は、定義した CRD テンプレートを記述します。たとえば、タイプは K8sRequiredLabels と呼ばれ、テンプレートの名前と一致する必要があります。次に、次の検証を通じて CRD の属性スキーマが定義されます。たとえば、文字列データ型に似た labels 属性パラメータがあります。

 クレジット:
仕様:
名前:
種類: K8sRequiredLabels
検証:
openAPIV3Schema : # `parameters` フィールドスキーマ
タイプ: オブジェクト
説明: K8sRequiredLabels CRD パラメータを説明する
プロパティ:
ラベル:
タイプ: 配列
アイテム:
タイプ: 文字列
説明: ラベル文字

次に、その下のターゲット セクションは、Rego を使用して記述された定義済みの制約ターゲットです。

  • まず、provided := {label | を通じて、作成されたオブジェクトのすべてのラベルを取得します。 input.review.object.metadata.labels[ラベル]}.
  • 次に、 required := {label | を通じて必要なラベルを取得します。ラベル:= input.parameters.labels[_]}.
  • 上記の 2 つのラベル セットを減算して (rego 言語はこの操作をサポートしています)、満たされていないラベルを取得します。
  • 満たされていないラベルの数が 0 より大きいことをアサートします。0 より大きい場合、条件が満たされ、違反が真となり、制約に違反していることが示され、エラーが返されます。

上記の制約テンプレートが作成されると、実際には、という名前の K8sRequiredLabels オブジェクトを作成することと同等になり、定義したプロパティは spec.parameters プロパティの下にあります。

  kubectlK8sRequiredLabels を取得する
リソースが見つかりません
kubectl でK8sRequiredLabels を説明しますスペックパラメータラベル
種類: K8sRequiredLabels
バージョン: 制約ゲートキーパーsh / v1beta1
フィールド: ラベル< [] 文字列>
説明
ラベル文字

これで、上記の K8sRequiredLabels 制約テンプレートを使用してポリシーを定義できます。たとえば、すべての名前空間でゲートキーパー ラベルを定義する必要がある場合は、次のようにオブジェクトを作成できます。

 # all_ns_must_have_gatekeeper .yaml
apiVersion : 制約ゲートキーパーsh / v1beta1
種類: K8sRequiredLabels
メタデータ:
名前: ns - 必須- gk
仕様:
マッチ
種類:
-apiグループ: [ "" ]
kind : [ "Namespace" ] #この制約は名前空間を作成するときに適用されます。 namespaceSelector、namespaces などを使用してフィルタリングできます
パラメータ:
ラベル: [ "gatekeeper" ] # スキーマ仕様に従って定義

指定された制約が適用されるオブジェクトの範囲を定義する一致フィールドに注意してください。 kind: ["Namespace"] は、名前空間を作成するときにこの制約が適用されることを意味します。他のマッチャーもサポートされています:

  • kind は、制約が適用されるオブジェクトのグループ/種類をリストする apiGroups および kind フィールドを持つオブジェクトのリストを受け入れます。複数のグループ/カテゴリ オブジェクトが指定されている場合、リソースのスコープ内での一致は 1 つだけ必要です。
  • スコープは Cluster または Namespaced のいずれかを受け入れ、クラスター スコープのリソースと名前空間スコープのリソースのどちらを選択するかを決定します。 (デフォルト)
  • namespaces は名前空間名のリストです。定義されている場合、制約はリストされた名前空間内のリソースにのみ適用されます。名前空間はプレフィックスベースのグロビングもサポートします。たとえば、namespaces: [kube-*] は kube-system と kube-public に一致します。
  • excludeNamespaces は名前空間名のリストです。定義されている場合、制約はリストされている名前空間にないリソースにのみ適用されます。 ExcludedNamespaces はプレフィックスベースの glob もサポートします。たとえば、excludedNamespaces: [kube-*] は kube-system と kube-public に一致します。
  • labelSelector は標準の Kubernetes ラベル セレクターです。
  • namespaceSelector は、オブジェクトを含む名前空間のラベル セレクターです。オブジェクトが名前空間である場合は、オブジェクト自体のラベル セレクターです。 name はオブジェクトの名前です。定義されている場合、指定された名前のオブジェクトと一致します。名前はプレフィックスベースのグロビングもサポートします。たとえば、name: pod-* は pod-a と pod-b に一致します。

以下のparameters.labelsは、上記のCRD仕様に従って定義されたプロパティです。値は opa に渡されるパラメータです。ここでは、キーラベルと値をリストとして持つ辞書を表します。 ConstraintTemplate のプロパティと一致する必要があります。ここでは、作成するオブジェクトにゲートキーパー ラベルが含まれている必要があることを意味します。

上記のリソース オブジェクトを直接適用するだけです。

  kubectl apply -f all_ns_must_have_gatekeeper .yaml 
k8s 必須ラベル制約ゲートキーパーsh / ns - 必須- gk 作成済み

作成後、制約オブジェクトを表示できます。

  kubectl でk8s の必須ラベルを取得します
名前年齢
ns - 必須- gk 73 s
kubectl get constraints # 上記のオブジェクトと同じ
名前年齢
ns - 必須- gk 81 s

Gatekeeper には監査機能があるため、クラスター内で強制されている制約に従ってリソースを定期的に評価し、既存の誤った構成を検出できます。 Gatekeeper は、監査結果を、関連する制約のステータス フィールドにリストされた違反として保存します。 K8sRequiredLabels オブジェクトのステータス フィールドを表示して、制約を満たさない動作を確認できます。

  kubectl は制約ns - must - have - gk - o yaml を取得します
apiVersion : 制約ゲートキーパーsh / v1beta1
種類: K8sRequiredLabels
……
状態
監査タイムスタンプ: "2022-03-27T07:42:38Z"
……
違反合計: 11
違反:
-enforcementAction : 拒否
種類: 名前空間
メッセージ: 'ラベルを指定する必要があります: {"gatekeeper"}'
名前: アピシックス
-enforcementAction : 拒否
種類: 名前空間
メッセージ: 'ラベルを指定する必要があります: {"gatekeeper"}'
名前: デフォルト
……

たとえば、次のように名前空間を作成します。

 # テスト- namespace.yaml
APIバージョン: v1
種類: 名前空間
メタデータ:
名前: ns - テスト
ラベル:

#ゲートキーパー: abc

キー gatekeeper を含むラベルを名前空間に追加しないと、作成時にエラーが報告されます。

 サーバーからのエラー([ ns - must - have - gk ] ラベルを指定する必要があります: { "gatekeeper" }): "test-namespace.yaml" の作成中にエラーが発生しました: アドミッションWebhook "validation.gatekeeper.sh" がリクエスト拒否しました: [ ns - must - have - gk ] ラベルを指定する必要があります: { "gatekeeper" }

次に、gatekeeper: abc の行のコメントを解除すると、正常に作成されます。これが Gatekeeper の基本的な使い方です。

上記から、制約テンプレートを定義する戦略では、多くの場合、入力オブジェクトからデータを取得することがわかりますが、独自の制約を作成する必要があり、渡される入力パラメータがわからない場合は、すべてのリクエストを拒否し、リクエスト オブジェクトを拒否メッセージとして出力する制約/テンプレートを使用するのが簡単な方法です。テンプレートを作成するときに、違反する行は 1 行だけ残すことができます: msg := sprintf("input: %v", [input])。この場合、オブジェクトの作成は失敗し、すべての入力情報を含む出力エラー メッセージが取得されます。その後、Rego 構文を通じて必要なデータを取得できます。

 apiバージョン: テンプレートゲートキーパーsh / v1
種類: 制約テンプレート
メタデータ:
名前: k8sdenyall
仕様:
クレジット:
仕様:
名前:
種類: K8sDenyAll
ターゲット:
- 対象入学k8sゲートキーパーシュ
登録: |
パッケージk8sdenyall

違反[{ "msg" : msg }]
msg : = sprintf ( "入力: %v" , [ 入力])
}
-- -
apiVersion : 制約ゲートキーパーsh / v1beta1
種類: K8sDenyAll
メタデータ:
名前: 拒否- すべての- 名前空間
仕様:
マッチ
種類:
-apiグループ: [ "" ]
種類: [ "名前空間" ]

制約テンプレートまたはポリシー ライブラリにはある程度の普遍性があるため、OPA Gatekeeper コミュニティは、多数のユニバーサル制約テンプレートを含むユニバーサル ポリシー ライブラリ (https://github.com/open-policy-agent/gatekeeper-library) を提供しています。

各テンプレート ライブラリには、制約テンプレートを記述する template.yaml ファイルが含まれています。サンプル ディレクトリには、特定の制約オブジェクトとサンプル リソース リストが含まれています。これらの戦略は、Rego 言語を学ぶための良い例でもあります。

<<:  エッジ コンピューティングはクラウド コンピューティングよりも優れている点は何ですか?ついに誰かが明らかにした

>>:  クラウド ネイティブ戦略を拡大するための手順は何ですか?

推薦する

123systems VPS がまた大ヒット、年間支払いが超格安!

123systemsの年間プロモーションが始まりました。年間VPSが非常に安いだけでなく、足りないと...

それはまるで存在しなかったかのようにゆっくりと消えていきました。

数年前、私はテクノロジー業界の大物に笑いかけました。当時彼はこう言っていた。「おそらく 1990 年...

ウェブサイト SEO 最適化スペシャリストは具体的に何をするのでしょうか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO に...

ランキングの誘惑: ページの品質がウェブサイトの信頼性を決定する

ウェブサイトの信頼性は、ユーザー エクスペリエンスと、SEO 担当者による最新の検索エンジン アルゴ...

ブログを使用してウェブサイトの重量を増やす方法をご存知ですか?

通常、ウェブマスターの主な仕事は、ウェブサイトの構築、ウェブサイトの内部最適化、ウェブサイトの外部リ...

Youku Tudouは結婚するか、著作権と広告価格を変更するしかなかった

王維が再びビジネスを始めることを選択するか、それとも完全に文系の若者でいることを選択するかに関わらず...

キーワードレイアウトはどうすればいいですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO レ...

Weiboマーケティングの真実を語る

最近、李二仔思と喬石桂子堅の対戦を見てきました。私もソーシャルメディアマーケティングを試してみました...

半分の労力で2倍の結果を得るための最適化方法

世の中にはさまざまなタイプのウェブサイトがあります。どのようなタイプのウェブサイトであっても、オンサ...

0から1へ:モバイルインターネット広告の基礎知識

昨年末より広告を担当しています。長く携わっているわけではないのですが、会社の広告は基本的にゼロからの...

地方第二人材サイトの代替運用方法の共有

二流のローカルタレントサイトは比較的小規模で、実力があります。一流都市のタレントサイトとの激しい競争...

百度のトラフィックの大きさが百度の重みを決定する

実際、多くの友人が、ウェブサイトの Baidu の重みは大きく変わると言います。私が最もよく聞くのは...

独創性と外部リンクにより、ウェブサイトの最適化が迅速に改善されます

Baidu の突然の不具合により、ウェブサイトのランキングが一瞬で消えてしまう可能性があるため、ネッ...

電子商取引ウェブサイトが単一ページを通じてどのようにマーケティングを行うことができるかについての簡単な分析

長い間、マーケティングに関する記事を書いていませんでした。今日は、eコマースサイトのシングルページマ...