LASSIC Media らしくメディア
ポリシーアズコード(OPA)導入を外注で進める
LASSIC IT事業部|元請(プライムベンダー)としてシステム保守・運用を受託
この記事のポイント
- ポリシーアズコードとOPA(Open Policy Agent)・Rego言語の基本的な考え方を整理します。
- Kubernetes・CI/CD・API認可への適用範囲と、Gatekeeperなど周辺の仕組みを解説します。
- Rego習得やポリシーのテスト・バージョン管理といった導入の論点と、外注の委託範囲を確認します。
目次
ポリシーアズコードとOPAの基本
ポリシーアズコードとは、認可・構成・コンプライアンスといった組織のルールをコードとして宣言し、システムが自動的に評価・適用できる状態にする考え方を指します*1。この仕組みを実現する代表的な基盤が、オープンソースの汎用ポリシーエンジンであるOPA(Open Policy Agent)です*1。
OPAは、CNCF(Cloud Native Computing Foundation。クラウドネイティブ技術の普及を進める非営利団体)において2018年3月にプロジェクトとして受け入れられ、2021年1月に最上位の「卒業(Graduated)」ステータスに到達しています*2。特定のクラウドやミドルウェアに紐づかない汎用ポリシーエンジンとして、複数の実行環境で同じ考え方のルールを適用できる点が特徴です*1。
ルールがアプリと設定に散在する現状の課題
認可やガードレールのルールは、アプリケーションのコード・インフラの設定・CI/CDのスクリプトなど複数の場所に分散して実装されがちです。実装場所が分かれるほど、どこにどの条件が書かれているかを横断的に把握しにくくなります。
このような散在は、監査時に各システムを個別に確認する必要が生じる点、ルール変更時に修正漏れが起きやすい点で運用上の負担になります。承認プロセスやアクセス制御の要件が増えるほど、ルールの実装箇所を一元的に見渡せる仕組みの必要性が高まります。
OPAとRegoが分離するポリシー決定の仕組み
OPAの中核にあるのは、「ポリシーの決定」と「ポリシーの実装(適用箇所)」を分離する設計です*1。アプリケーションやインフラのコンポーネントは、何らかの判断が必要になった際に、対象となるデータを構造化データ(JSON等)としてOPAに送り、許可するか拒否するかの決定を問い合わせます*1。
このルールを記述する言語がRego(レゴ)です。Regoは、階層構造を持つデータに対するポリシー表現に特化した高水準の宣言型言語として設計されており*1、単純なyes/no判定だけでなく、構造化データを出力する形のルールも記述できます*1。
この分離によって、ルールの変更はOPAに登録したRegoファイルの更新だけで完結し、ルールを利用する側のアプリケーションコードを変更する必要がなくなります。ルールが一つの場所にまとまることで、変更履歴やレビューの対象も一元化されます。
Kubernetes・CI・API認可への適用範囲
OPAの公式ドキュメントでは、Kubernetes・CI/CDパイプライン・HTTP API/GraphQL APIといった複数の領域での利用が想定されています*1。
Kubernetesでは、OPAはAdmission Controller(リソース作成・変更時にルールを適用する仕組み)として組み込まれます*1。Kubernetes向けにOPAを利用しやすくしたサブプロジェクトがGatekeeperです。GatekeeperはValidating/Mutating Webhookとして動作し、ポリシーの型を定義する「ConstraintTemplate」と、それを具体的な条件に当てはめた「Constraint」という2種類のカスタムリソースでルールを管理します*3。違反時の挙動は拒否・警告・監査ログ記録などから選べます*3。
CI/CDパイプラインでは、デプロイ前にマニフェストやIaC(Infrastructure as Code)の定義がルールに適合しているかをOPAで検証するガードレールとして利用できます*1。API認可の領域では、マイクロサービス間の呼び出しやKafkaのようなメッセージング基盤に対しても、同じRegoベースのルールで認可判定を行う構成が紹介されています*1。
公開されている事例としては、通信事業者がKubernetes環境にOPAを組み合わせて運用コストの削減を図った例や、単一のマルチテナントクラスタで数百規模のアプリケーションプロジェクトを支える例がCNCF側で紹介されています*2。適用領域や効果は環境によって異なるため、自社の構成に当てはめて検証する工程が必要です。
Rego習得とテスト・バージョン管理という論点
ポリシーアズコードを検討する際に主要な論点になるのが、Regoという専用言語の習得コストです。Regoは階層データに対する宣言型の問い合わせ言語であり*1、一般的な手続き型言語とは書き方の発想が異なります。既存メンバーがゼロから習得する場合、基本文法だけでなく「集合に対する条件をどう表現するか」という宣言型特有の考え方に慣れる工程が必要です。
もう一つの論点はポリシー自体の品質担保です。OPAにはポリシー用のテストフレームワークが用意されており、test_という接頭辞を付けたルールをテストとして実行し、PASS/FAIL/ERRORといった結果を確認できます*4。ポリシーもアプリケーションコードと同様にテストを書き、変更時に既存の許可/拒否の判定が崩れていないかを検証する運用が推奨されています*4。
ポリシーのバージョン管理も検討事項です。Regoファイルをアプリケーションコードと同じリポジトリで管理し、変更履歴とレビュープロセスをコードと同水準で運用することが、ポリシーアズコードという考え方の前提になります。ポリシーをどの単位でリポジトリ分割するか、環境ごと(開発・検証・本番)にどう配布するかは、組織の既存のCI/CD構成に応じて設計が必要な部分です。
段階導入で進めるポリシーアズコードの拡大
OPAは適用範囲が広いため、最初からKubernetes・CI・API認可のすべてに同時導入するのではなく、対象領域を絞った段階導入が現実的な進め方になります。
例えばKubernetesのAdmission Controlから始める場合は、まず「監査(audit)モード」でルール違反を記録するだけの運用に留め、実際の拒否判定が意図通りかを確認したうえで拒否モードに切り替える進め方が、Gatekeeperの違反時挙動の選択肢として用意されています*3。既存システムを止めずに導入を進める観点では、この監査優先のステップが有効です。
CIへの適用やAPI認可への拡大は、Kubernetesでの運用実績とRegoのテスト資産が一定積み上がった後に着手する順序が、学習コストと移行リスクの両方を抑えるうえで妥当な進め方といえます。
外注の委託範囲と発注準備で確認すべき事項
ポリシーアズコードの導入を外部に委託する場合、委託範囲を「どこまで」「どの環境に対して」の2軸で切り分けて発注準備を進めることが大切です。
- 現状のルール(認可条件・構成基準・コンプライアンス要件)の棚卸しと、Regoで表現する対象の切り出し
- OPA/Gatekeeperの導入設計(監査モードでの試験運用を含む)と、対象クラスタ・パイプラインの選定
- Regoポリシーのテストコード整備と、既存のCI/CDへの組み込み方法
- 導入後の運用引き継ぎ(ポリシー変更のレビュー体制・障害時の切り分け手順)の設計
発注準備の段階では、社内にRegoの読み書きができる担当者を確保できるかどうかを確認しておく必要があります。外部委託で初期導入までを完了させても、その後のポリシー追加・改修を継続的に行う体制がなければ、ルールが更新されないまま形骸化する可能性があります。委託範囲に「運用開始後、何ヶ月かは改修を伴走する」工程を含めるかどうかも、発注段階で条件として詰めておくべき論点です。
ポリシーの適用対象がKubernetesクラスタや本番API認可など、システムの可用性に直結する箇所であるほど、監査モードでの検証期間を十分に取らずに拒否モードへ移行すると、意図しないリクエスト拒否が本番トラフィックに影響するリスクがあります。この切り替えタイミングの判断基準を、委託先とあらかじめ合意しておくことが欠かせません。
まとめ:ポリシーアズコード導入の3つの判断軸
本稿では、ポリシーアズコードとOPA/Regoの基本的な仕組み、Kubernetes・CI・API認可への適用範囲、導入時の論点と外注時の委託範囲を整理しました。判断軸を3つに集約すると、第一に、ルールの散在という自社の課題がOPAの適用対象に合致するかを見極めること、第二に、Regoの習得とテスト・バージョン管理を継続できる体制を用意すること、第三に、監査モードから拒否モードへ段階的に移行する進め方を委託先と合意することです。これらを発注前に整理しておくことで、導入後の運用が滞る事態を避けやすくなります。
よくある質問
OPAとGatekeeperは何が違いますか。
OPAは汎用のポリシーエンジン本体で、Kubernetes専用ではありません*1。Gatekeeperは、OPAをKubernetesで使いやすくしたサブプロジェクトで、CRD(カスタムリソース)ベースのポリシー定義や監査機能をネイティブに追加したものです*3。K8s環境限定であればGatekeeper、CIやAPI認可など複数領域に広げるならOPA本体を軸に検討します。
Regoの習得にはどの程度の期間がかかりますか。
公表された標準的な習得期間の統計は確認できていません。Regoは宣言型言語のため、基本文法に加えて「条件をどう表現するか」という考え方に慣れる工程が必要です*1。既存のテストコードやサンプルポリシーを読み解きながら小さなルールから書き始める進め方が、実務上は現実的です。
既存システムを止めずに導入できますか。
Gatekeeperには違反を記録するだけの監査モードが用意されており、拒否を発生させずに導入初期の検証を進められます*3。まず監査モードでルールの妥当性を確認し、問題がなければ拒否モードへ切り替える段階導入が可能です。
外注する場合、社内に何も知識がなくても任せられますか。
初期導入は委託できますが、その後のポリシー追加・改修を継続する社内体制がないと、ルールが更新されないまま形骸化する可能性があります。委託範囲に運用開始後の伴走期間を含めるかどうかを、発注段階で確認することが大切です。
ポリシーのテストはどのように行いますか。
OPAにはRego用のテストフレームワークがあり、test_という接頭辞のルールを実行してPASS/FAIL/ERRORを判定します*4。ポリシー変更時に既存の許可/拒否判定が崩れていないかを、このテストで継続的に確認する運用が推奨されています*4。
著者:テレリモ総研編集部 鈴木 亮佑
ご不明な点はお問い合わせフォームからもご連絡いただけます。
- *1 出典:Open Policy Agent「Introduction」https://www.openpolicyagent.org/docs/latest/(公式ドキュメント)
- *2 出典:CNCF「Open Policy Agent (OPA)」https://www.cncf.io/projects/open-policy-agent-opa/(プロジェクトページ)
- *3 出典:OPA Gatekeeper「Gatekeeper Documentation」https://open-policy-agent.github.io/gatekeeper/website/docs/(公式ドキュメント)
- *4 出典:Open Policy Agent「Policy Testing」https://www.openpolicyagent.org/docs/latest/policy-testing/(公式ドキュメント)