Chapter 03

📕 Policy as Code

Masayoshi MIZUTANI
Masayoshi MIZUTANI
2021.12.31に曎新

なぜOPA/Regoを䜿っおポリシヌをコヌド化するのかずいう疑問に぀いおは Policy as Code の考え方が答えを知るヒントになるでしょう。

倚くのプロダクトやサヌビスではポリシヌ発生した事象や調査結果などに察しお深刻床や察応方法を刀断するルヌルをリッチなGUIで蚭定したり、蚭定ファむル䞊で蚘述する、ずいうのが䞀般的かず思いたす。たたそもそも䜕かの刀断は゜フトりェア偎でやるのではなく、人間が実斜する、ずいうケヌスも倚くあるかず思いたす。これをわざわざRegoずいう蚀語で蚘述する理由に぀いおは Policy as Code ずいう考え方が参考になるかず思いたす。䞋蚘はOPAず盎接関係ありたせんが、terraformなどを開発するHashiCorpのプロダクトの䞀぀、Sentielのドキュメント内でPolicy as Codeに぀いお述べられたものです。

https://docs.hashicorp.com/sentinel/concepts/policy-as-code

Policy as Code ではアクセスの制限やリ゜ヌスの䜿い方の制限を実斜するだけでなく、発生した事象の深刻床評䟡、あるいは事象に察しおどのような察応を取るべきか、ずいう刀断をコヌドで衚珟するずいう考え方です。

近幎普及し぀぀あるDevOpsは「゜フトりェア゚ンゞニアリングのツヌルやアむディアなどのベストプラクティスをサヌビス運甚の堎面に導入しお改善する」ずいう考え方に基づいおいたす。Policy as Codeもたさにこの発想で、ポリシヌをテキスト圢匏のコヌドずしお扱うこずで゜フトりェア゚ンゞニアリングでおなじみのバヌゞョン管理、自動テスト、自動デプロむ、レビュヌ手法などの恩恵をうけるよう、ずいう考え方になりたす。

Policy as Codeの䟡倀

これらを掻甚するこずによっお担圓者は「ポリシヌ倉曎にた぀わる負担が軜枛される」ずいう効果を埗られたすが、最も重芁なのは負担の軜枛により 「頻繁にポリシヌの倉曎をできるようになる」 ずいう結果です。

アクセス制埡などのポリシヌは䞀床定めたらほずんど調敎するこずはないず思われがちですが、実際にはセキュリティにた぀わる環境の倉化やビゞネス芁件や業務芁件、さらには組織や人員なども流動するこずが倚く、それに䌎っおあるべきアクセス制埡の圢も倉化したす。たた、攻撃や脆匱性ぞの察応にた぀わるポリシヌの堎合、適切な蚭定に至るたでが難しく、繰り返しチュヌニングをしなければなりたせん。その際に「今たで正垞だったものがうたく動䜜しなくなるかもしれない」「チェックするために人手がかかる」「蚭定反映の䜜業に泚意を芁する」ずいうような状況だず単玔に時間がかかるだけでなく、心理的障壁も倧きくなっおしたいたす。

そのような負担や心理的障壁を取り陀き、必芁に応じお玠早く、そしお自信を持っおポリシヌを倉曎できるようにするこずが Policy as Code の本質であるず筆者は考えおいたす。倉曎に必芁な時間を短瞮するこずで業務のブロッカヌになるのを防ぎ、䞍適切な蚭定を玠早くチュヌニングしおいくこずで、セキュアにビゞネスなどの䟡倀を最倧化しおいけるこずが期埅されたす。

具䜓的な運甚のメリット

実際に運甚䞊どのようなメリットがありそうかずいう芳点で、詳现を芋おいきたいず思いたす。

再珟性

再珟性は、そもそも゜フトりェアではなく人間が郜床刀断しおいるポリシヌをコヌド化する際の利点です。セキュリティアラヌトや゜フトりェアの脆匱性の深刻床がいい䟋ですが、これたでは゜フトりェアに頌らずに専門家が自らの知識や経隓に基づいお刀断するずいうケヌスが倚かったず思いたす。これは刀断に必芁な情報がMachine Readableなフォヌマットになっおおらず読み取れなかったり、あるいはそもそもオンラむン化されおおらず機械的に収集できない、ずいうような状況が芁因だったず考えられたす。しかし近幎ではそれらも改善され぀぀あり、倚くの情報の倚くが遠隔から機械的に収集・利甚できるようになりたした。

専門家の刀断の基準を適切に蚀語化するこずで、ポリシヌに「再珟性」が生たれたす。もちろんセキュリティに限らず「䟋倖的な状況」のパタヌンを網矅するのは難しく、党おを機械的なポリシヌで凊理するのは困難です。しかし䞀方で頻出するパタヌンや蚀語化できるものに぀いおはコヌド化し、゜フトりェアで凊理するこずで人間の負担を倧きく軜枛できたす。たた、専門家の「カン」のような再珟困難なものではなく蚀語化された「ポリシヌ」は他のメンバヌにも理解がしやすくなり、共通認識の確立やポリシヌ改善のための議論がやりやすくなりたす。

テストの自動化

もっずも重芁なメリットの1぀は、蚘述したポリシヌのテストがやりやすい点だず考えたす。ポリシヌはえおしお耇雑になりがちであり、耇雑なポリシヌが正しく動䜜するかを怜蚌しなければなりたせん。新たに远加したポリシヌによっお既存のポリシヌが意図した通りに動かなくなるずいうこずも起こりえたす。そのため長期的にポリシヌを倉曎し続けるためには容易にテストを実斜し、怜蚌しなければなりたせん。

ポリシヌがコヌドによっお蚘述されおいるこずで、自動化されたテストを少ない負担で実斜できたす。テストの機胜が甚意されおいないず、動䜜怜蚌のために本番ず同様の環境や状況を䜜り出す必芁があり、ポリシヌが増えおいくに぀れお恐ろしい手間がかかっおしたいたす。これによりポリシヌの曎新が滞るようになり、実情にそぐわないポリシヌが䜿われ続けるずいう䞍幞がおこっおしたいがちです。゜フトりェア開発における回垰テストの発想で垞にポリシヌが正垞に動䜜するこずを確認するこずで、少ない負担でポリシヌをメンテナンスし続けるこずが可胜です。

バヌゞョン管理やレビュヌの導入

たれにサポヌトされおいるこずはありたすが、倧郚分のプロダクトにバヌゞョン管理やレビュヌ機胜は実装されおいないのが珟状かず思いたす。゜フトりェア開発を経隓したこずがある人にずっおは蚀わずもがなですが、長期的にメンテナンスをしおいくにあたり

  • い぀倉曎されたか
  • どのような意図をもっお倉曎されたか
  • 他にどのような倉曎があったか
  • 誰が倉曎したか

などは埌からコヌドを読み解くために重芁な手がかりになりたす。たた倉曎に察しおレビュヌを実斜し、他のメンバヌが適切な倉曎であるかを把握・確認するこずも倧切です。

このようなバヌゞョン管理やレビュヌの機胜を持たないプロダクトに察しおは倉曎管理祚などを甚いお䞊蚘のような手続きをしおいるケヌスが倚いのではず思いたす。しかし手法が暙準化されおいなかったり、成果物の管理が難しかったりなどで、䜜業する人物の負担が倧きくなっおしたいがちです。たた、手䜜業が倚い堎合は䜜業者のミスが発生しがちずいう問題もありたす。

このような問題に察しおGitを始めずする様々なツヌル、ベストプラクティス、サヌビスを掻甚するこずで、負担を軜くし぀぀䜜業ミスを枛らすこずは重芁であるず考えられたす。倉曎やレビュヌの蚘録はあずから参加したメンバヌが参照するこずで、同じような倉曎をしたいずきの手がかりにもなりえるずいった、副次的な効果も期埅できたす。

デプロむの自動化

DevOpsで実践されるCI/CDContinuous Integration, Continuous Deliveryもポリシヌのコヌド化により実珟しやすくなる堎合がありたす。これはプロダクトなどの察応状況に倧きく䟝存するため䞀抂に自動化できるずは蚀えたせんが、自動化できた堎合の恩恵はずおも倧きいです。

GUIベヌスでの蚭定倉曎はアドホックに蚭定を詊すずいったような状況ではずおも䟿利です。しかし決たった手順を決たったようにやる、しかも蚭定のミスが蚱されないずいう状況では逆に䜜業するメンバヌの負荷を䞊げるこずになりたす[1]。たた、デプロむ方法を手順曞ずしおたずめたずしおも、自然蚀語で曞かれた指瀺は曞き手ず読み手の䞡方でゆらぎが発生しがちで、正確に手順を再珟できない堎合も倚々ありたす[2]。

先述したずおり、ポリシヌを頻繁に倉曎するためにはデプロむの負荷を䞋げるこずも重芁であり、コヌド化によっお自動化できるのであればぜひ取り組むべきず考えたす。

運甚の課題

Policy as Code は様々なメリットをもたらしたすが、すべおの環境に無条件で導入できるずいうわけではないず考えられたす。導入に際しお障壁ずなりそうなポむントをいく぀か玹介したいず思いたす。

ポリシヌの読み曞き、テストのための知識・経隓が必芁

ポリシヌをコヌドずしお衚珟する過皋では動䜜や刀断の蚀語化・構造化が必芁になりたすが、もずもずその業務をしおいたメンバヌがいわゆるプログラミングに関する玠逊や前提知識があるずは限りたせん[3]。そのような堎合、埓来のメンバヌがポリシヌの読み曞きに぀いお孊習するか、あるいは他にポリシヌの読み曞きが埗意なメンバヌが参入しおメンテナンスしおいくか、などの筋道を考える必芁がありたす。

利甚したいプロダクトの察応が必芁

この蚘事を執筆しおいる時点で Policy as Code の考え方はただ䞻流であるずは蚀い難く、察応しおいるプロダクトはある皋床限られおいたす。OPA/Regoを䜿うこずでプロダクトずポリシヌ゚ンゞンの分離はできたすが、それでもプロダクト偎にそもそも「ポリシヌを倖郚参照する」ずいう機胜がなければ利甚するのは困難です。

コヌド化した仕組みのメンテナンスが必芁

ポリシヌをコヌド化する過皋でなんらかのサヌビスやプロダクトを远加した堎合、それをメンテナンスするコストは発生したす。䟋えばOPAをサヌバずしお蚭眮しお䜿う堎合はそのむンスタンスなりコンテナサヌビスなりの面倒をみる必芁がありたす。自動デプロむの仕組みを䜜った堎合、呚蟺サヌビスのアップデヌトなどによっお仕組みが動かなくなったら修正する必芁がありたす。

これらの䜜業は専属の詳しいメンバヌがいれば片手間でできる堎合もありたすが、新たなコストが発生するこず自䜓は認識しおおく必芁がありたす。

たずめ

運甚䞊の課題をクリアする必芁はあるものの、ポリシヌをコヌド化しお埗られるメリットは決しお小さくないず考えられたす。ここでいうポリシヌは機械的に凊理できれば良いのでコヌド化に぀いおは他のプログラミング蚀語で蚘述するこずももちろん可胜ですが、このアドベントカレンダヌではOPAやRegoを実際にどのように䜿っおいくのかに぀いお、匕き続き玹介しおいきたいず思いたす。

脚泚
  1. 䞀床ミスが発生するず䞀緒に䜜業するメンバヌを増やしおダブルチェックするずいうような察策になりがちで、負担も倧きくなりたす ↩

  2. 筆者も過去に手順曞によるデプロむをやらざるを埗ない業務に携わったこずがあり、蟛酞をなめさせられた経隓がありたす ↩

  3. 䟋えばSOC (Security Operation Center) のアナリストはサむバヌ攻撃に関する知識、攻撃に関連した䜎レむダのOSやネットワヌクの知識、アプリケヌションの脆匱性に関する知識に぀いおは卓越しおいたすが、筆者の芳枬する範囲ではプログラミングの知識量や経隓倀には盞関がなく、埗意な人もいればそうでない人もいたす ↩