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 言語を学ぶための良い例でもあります。

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

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

推薦する

最適化されたウェブマスターの垂直思考をお持ちですか?

ウェブサイトの最適化は、もはや神秘的なものではありません。多くのウェブマスターは、大量の外部リンクを...

短期的にインクルージョンと重量の利点を改善する方法

インクルージョンはウェブサイトの最適化において非常に重要な要素です。私たちが作成したコンテンツは、ユ...

クラウド コンピューティングが 2020 年に政府の IT イノベーションを推進する理由

2020 年には、さらに多くの政府機関がクラウド コンピューティングの可能性を最大限に活用するでしょ...

NodeServ - $3.99/512m メモリ/150g ハードディスク/1T トラフィック/G ポート/フロリダ

フロリダのホスティングサービスは安いらしいと言われていますが?クリスシックなどの商品もとても安く販売...

ウェブサイトのSEO運用に関する簡単なチュートリアル

私は1年以上ウェブサイトの企画とSEO技術に携わってきました。この長くて短い1年間は、私にとっては学...

分散機械学習用パラメータサーバー

導入多くの機械学習の問題は、トレーニングと推論に大量のデータに依存しています。インターネット規模の大...

現在のソーシャルツールの分析:実際にはお金にならない

SNSやWeibo(WEB2.0)の台頭により、数多くのソーシャルツールが登場。その年は毎月のように...

現段階でのSEOソフト記事とウェブサイトランキングの関係

Lian Xingchen が最近、ウェブマスターの友人たちとチャットしていたとき、友人たちが「ウェ...

ユーザーはコンテンツを投稿するときに何を考えているのでしょうか? (弱いつながりネットワーク)

以前、「ユーザーはコンテンツを投稿するときに何を考えているのか?(強い関係性ネットワーク)」という記...

ウェブサイトのユーザーエクスペリエンスを反映する4つの側面

ユーザー エクスペリエンスは、Baidu が Web サイトに与える最も重要な要素となっているため、...

合心創天:次世代クラウドデスクトップ市場を争う未来の巨人

最近、「十年の塵と土、遥かに白雲に達する」をテーマにした和信創天の次世代クラウドデスクトップVENG...

草の根ウェブマスターがインターネットに挑戦し、何度も失敗:メンタリティが成功と失敗を決める

序文:草の根ウェブマスターとして、A5 のようなウェブマスター プラットフォームで自分の経験を共有す...

SEO初心者のためのブログ外部リンク運用方法

多くの初心者の SEO の友人は、このタイトルを見ると、ブログの外部リンクについて長々と話す必要はな...

A5 マーケティング: B2B サイトにおけるモイスチャー マーケティングの影響はどの程度ですか?

B2Bを運営するウェブマスターにとって、B2Bの存続状況と将来は、さまざまなB2B業界の発展における...