OPA と呼ばれる Open Policy Agent は、オープン ソースの汎用ポリシー エージェント エンジンであり、CNCF の卒業プロジェクトです。 OPA は、ポリシー ルールの定義を簡素化し、プログラム内のポリシーの意思決定の負担を軽減する高レベルの宣言型言語である Rego を提供します。 OPA は、マイクロサービス、Kubernetes、CI/CD、API ゲートウェイなどのシナリオでポリシーを定義するために使用できます。 ここでは主に、Kubernetes に OPA を統合する方法について説明します。 Kubernetes では、OPA は Admission Controller を通じてセキュリティ ポリシーを実装します。セキュリティ ポリシーを適用するために (非推奨の) Pod セキュリティ ポリシーを使用することは問題ありませんが、定義上、PSP は Pod にのみ適用できます。 Ingress、デプロイメント、サービスなどの他の Kubernetes リソースを処理することはできません。OPA の強みは、あらゆる Kubernetes リソースに適用できることです。 OPA は、APIServer に送信された API 呼び出しをインターセプトし、検証および/または変更するアドミッション コントローラーとして Kubernetes にデプロイされます。ポッドだけでなく、システムのさまざまなコンポーネントに適用される統合 OPA ポリシーを設定できます。たとえば、ユーザーにサービスで会社のドメインを使用するように強制し、ユーザーが会社のレジストリからのみイメージをプルするようにするポリシーなどです。 概要OPA はポリシーの決定とポリシーの実行を分離します。アプリケーションがポリシー決定を行う必要がある場合、OPA にクエリを実行し、構造化データ (JSON など) を入力として提供します。 OPA は任意の構造化データを入力として受け入れます。 OPA は、クエリ入力ポリシーとデータを評価してポリシー決定を生成します。次のような、ポリシー内のほぼすべての不変要素を記述できます。
ポリシーの決定は単純な「はい/いいえ」や「許可/拒否」に限定されません。クエリ入力だけでなく、ポリシーでは出力として任意の構造化データを生成できます。例を見てみましょう。 OPA ポリシーは、複雑な階層型データ構造のポリシーを表現するために特別に設計された、Rego と呼ばれる高レベルの宣言型言語を使用して宣言されます。 Kubernetes では、アドミッション コントローラーは、作成、更新、削除の操作中にオブジェクトに対してポリシーを適用します。アドミッション コントロールは、Kubernetes におけるポリシー適用の基礎となります。 OPA をアドミッション コントローラーとして導入すると、次のことが可能になります。
Kubernetes API サーバーは、オブジェクトの作成、更新、または削除時に、OPA にアドミッション コントロール ポリシーを照会するように構成されています。 APIServer は、Webhook リクエスト内のオブジェクト全体を OPA に送信します。OPA は、アドミッション レビューを入力として使用して、ロードしたポリシーを評価します。これは、コードを記述する必要がないことを除けば、実際にはアドミッション コントローラーを自分で実装するのと似ています。ポリシー ルールを記述するだけで、OPA はルールに従って入力オブジェクトを検証できます。 展開する次に、Kubernetes クラスターに OPA を統合する方法を紹介します。 OPA はアドミッション コントローラーを介して Kubernetes に統合されているため、クラスターで ValidatingAdmissionWebhook アドミッション コントローラーを有効にする必要があります。 まず、opa という名前空間を作成します。これにより、OPA は名前空間内の ConfigMap からポリシーをロードできるようになります。 ➜ kubectl 名前空間opa を作成します コンテキストを opa 名前空間に変更します。 ➜ kubectl config 現在のコンテキスト APIServer と OPA 間の通信を保護するには、TLS 証明書を構成する必要があります。 証明機関とキーを作成します。 ➜ openssl genrsa -out ca 。 キー2048 OPA のキーと証明書を生成します。 cat > サーバー。 conf << EOF OPA 資格情報を保存するための Kubernetes TLS シークレットを作成します。 ➜ kubectl create secret tls opa - server --cert = server 。 crt -- キー= サーバー。 鍵 証明書の準備ができたら、アドミッション コントローラーをデプロイできます。対応するリソース マニフェスト ファイルは次のとおりです。 # opa - アドミッション- コントローラ.yaml 上記のリソース リストでは、ConfigMap オブジェクト内のポリシーを OPA に動的にロードできる kube-mgmt Sidecar コンテナーを追加しました。 kube-mgmt コンテナは、他の Kubernetes オブジェクトを JSON データとして OPA にロードすることもできます。 もう 1 つ注意すべき点は、サービスの名前 (opa) が証明書に設定されている CN と一致する必要があることです。一致しないと、TLS 通信が失敗します。 kube-mgmt コンテナでは、次のコマンドライン パラメータも指定されます。
最初の 2 つのパラメータにより、サイドカー コンテナは名前空間と Ingress オブジェクトをコピーし、OPA エンジンに読み込むことができます。 enable-policies=true は、OPA ポリシーが Configmap を通じてロードされることを意味します。次の --policies=opa は、opa 名前空間の Configmap からポリシーをロードすることを意味します。 --require-policy-label=true パラメータも構成されている場合、Configmap には、自動的にロードされるラベル openpolicyagent.org/policy=rego が必要です。 上記のリソース リストを適用するだけです。 ➜ kubectl apply -f opa -admission - controller .yaml アドミッション コントローラーが機能するためには、アドミッション HTTP コールバックを受信して実行するためのアドミッション Webhook も必要です。以下に示すように、Webhook 構成ファイルを作成します。 ➜ cat > webhook - 構成.yaml << EOF 上記の Webhook では次のプロパティが構成されています。
ここで、構成を使用する前に、kube-system および opa 名前空間が webhook スコープ内に含まれないようにマークします。 ➜ kubectl label ns kube - system openpolicyagent 。 org / webhook = 無視 次に、上記の構成オブジェクトを適用して、OPA をアドミッション コントローラーとして登録します。 ➜ kubectl apply -f webhook - 構成.yaml ポリシーの例OPA はポリシーを記述するために Rego 言語を使用します。ここでは、公式ドキュメントに記載されている例を使用して、Ingress で使用できるホスト名を制限し、指定された正規表現に一致するホスト名のみを許可するホスト名ポリシーを説明および作成します。 次のような ingress-allowlist.rego という名前のポリシー ファイルを作成します。 パッケージkubernetes .admission Rego を初めて使用する場合は、上記のコードが少し奇妙に見えるかもしれませんが、Rego を使用するとポリシーの定義が非常に簡単になります。ホワイトリストの Ingress 名前空間を使用してこのポリシーがどのように適用されるかを分析してみましょう。 1 行目:パッケージは他の言語と同じように使用されます。 5 行目: CREATE と UPDATE の 2 つの操作でデータセットを定義します。 7 行目:これはポリシーの中核部分であり、deny で始まり、その後にポリシー本体が続きます。本文のステートメントの組み合わせが true と評価された場合、ポリシー違反となり、アクションはブロックされ、アクションがブロックされた理由を説明するメッセージがユーザーに返されます。 8 行目:入力オブジェクトを指定します。OPA に送信されるすべての JSON メッセージは入力オブジェクトのルートから開始され、問題のリソースが見つかるまで JSON オブジェクトを反復処理します。ポリシーを適用するには、そのリソースが Ingress である必要があります。 9 行目:リソースを作成または更新するには、ポリシーを適用する必要があります。 Rego では、operations[input.requset.operations] を使用してこれを実行できます。角括弧内のコードは、リクエストで指定された操作を抽出します。 5 行目の操作セットで定義された要素と一致する場合、ステートメントは true になります。 10 行目: Ingress オブジェクトのホスト情報を抽出するには、JSON オブジェクトのルール配列を反復処理する必要があります。ここでも、Rego は配列をループし、すべての要素をホスト変数に返す _ 文字を提供します。 11 行目:ホスト変数を取得したので、それがホワイトリストに登録されたホストではないことを確認する必要があります。ポリシーが true と評価された場合にのみポリシー違反となることに注意してください。ホストが有効かどうかを確認するには、21 行目に定義されている fqdn_matches_any 関数を使用します。 行 12: Ingress オブジェクトを作成できなかった理由を説明する、ユーザーに返されるメッセージを定義します。 15 行目から 19 行目:この部分では、Ingress 名前空間の注釈からホワイトリストに登録されたホスト名を抽出します。ホスト名はコンマ区切りのリストで追加されます。リストに変換するには、組み込み関数の split を使用します。最後に、_ を使用して抽出されたホスト リスト全体を反復処理し、結果を | 経由でホスト変数にパイプします。 (これは Python のリスト内包表記と非常によく似ています)。 21 行目:この関数は文字列のみを受け取り、2 番目の引数であるパターンのリスト内でそれを検索します。これは実際には、以下の fqdn_matches 関数を呼び出すことによって実現されます。 Rego では、すべて同じ出力を生成する限り、同じ名前で複数の関数を定義できます。また、複数回定義された関数が呼び出されると、その関数のすべてのインスタンスが呼び出されます。 25 行目〜 33 行目:最初の fqdn_matches 関数の定義。
35 行目から 38 行目: 2 番目の検証関数は、パターンが mycompany.mydomain.com と記述されている場合など、ワイルドカードなしでパターンを検証するために使用されます。
同じ名前の関数が 2 つある理由は、関数が複数の出力結果を生成できないという Rego 言語の制限によるものです。したがって、異なるロジックで複数の検証を同時に実行する場合は、同じ名前の複数の関数を使用する必要があります。 実稼働環境では、Rego コードをクラスターに適用する前に、ユニット テストの追加や Rego Playground を使用してコードを検証するなど、包括的なテストを必ず実行してください。 このポリシーをクラスターに適用するには、上記の Rego ファイルを Configmap として opa 名前空間に適用する必要があります。 ➜ kubectl create configmap ingress - allowlist --from - file = ingress - allowlist 。 登録 --require-policy-label パラメータを有効にしたので、対応するラベルも指定する必要があります。作成が完了したら、ポリシーが OPA によって取得され、構文エラーがないかどうかを確認することをお勧めします。 ConfigMap のステータスを確認できます: ➜ kubectl get cm ingress - allowlist - o json | jq '.metadata.annotations' 次に、QA 環境用と本番環境用の 2 つの名前空間を作成します。どちらにも ingress-allowlist アノテーションが含まれており、これには Ingress ホスト名が一致する必要があるパターンが含まれていることに注意してください。 # qa - 名前空間.yaml 上記の 2 つのリソース マニフェスト ファイルを適用するだけです。 ➜ kubectl apply -f qa -namespace 。 yaml -f プロダクション- 名前空間。 ヤム 次に、ポリシーで許可される Ingress オブジェクトを作成しましょう。 ➜ kubectl apply -f - << EOT 通常、上記のリソース オブジェクトは次のように作成できます。 ➜ kubectl の取得- n 本番環境 次に、ポリシーに準拠しない Ingress オブジェクトを作成します。 ➜ kubectl apply -f - << EOT 出力からわかるように、上記のオブジェクトは OPA ポリシー ルールに違反しているため、APIServer は Ingress オブジェクトの作成を拒否しました。 これで、Kubernetes コンポーネントを変更または再コンパイルすることなく、OPA を使用して Kubernetes クラスターにアドミッション コントロール ポリシーを実装できました。さらに、OPA のバンドル機能戦略により、変化する運用要件に合わせてリモート サーバーから定期的にダウンロードすることができます。 OPA のより高度な機能については、以降の記事を参照してください。 |
<<: 「Eastern Data and Western Computing」がクラウド市場の爆発的な成長を加速します。事業者はチャンスを掴むために「3つの軸」に頼る必要がある
状況の展開から判断すると、Gome が Gome Mall と Kuba.com を統合するのは時間...
Googleは設立以来、魔法に満ちたハイテク企業であり続けています。Googleの発展の歴史を見ると...
理由: 読みにくいので、引き続き作業を続けてくださいWordPress 初心者が知っておくべきいくつ...
ショートビデオ以外にテンセントが常に「懸念している」ビジネスがあるとすれば、それは情報の流れに違いな...
みなさんこんにちは。私は徐子宇です。 SEO コミュニティが Maibaobao を知ったのは、同社...
書き始める前に、基本的な状況を簡単に分析します。Enterprise Station Trophy ...
一般的に、頻繁にコンテンツのメンテナンスが必要なウェブサイトは、企業ウェブサイトだけではありません。...
chicagovps.net は、低価格の VPS を提供することで有名な、VPS 業界の英雄的な企...
Hostsolutions は、今回もプロモーションを実施しています。今回は、VPS と SSD ハ...
ウェブサイトの所有者として、毎日さまざまな手段を通じてウェブサイトのランキング、人気、トラフィックを...
キーワードランキングを向上させるために非常に重要なポイントは、記事の内容の独創性、元の記事の更新頻度...
ブロガーには多くの責任があります。読者があなたのコンテンツを読んでいないからといって、責任がないとい...
アリババクラウドは7月31日、南通、杭州、ウランチャブにある3つのスーパーデータセンターが正式に完成...
2019 年 4 月 23 日、中国市場で合法かつコンプライアンスに準拠して運営される唯一のグローバ...
百度はここ数日、また私たちを不安にさせています。そうです、百度はまたもや大規模なアップデートを開始し...