Chapter 02

📕 OPA/Regoずはなんなのか

Masayoshi MIZUTANI
Masayoshi MIZUTANI
2021.12.31に曎新

OPAはサヌビスや゜フトりェアの意思決定機胜を本䜓ず分離するために䜜られた゚ンゞンです。ここで蚀う「意思決定」ずはいわゆる認可の話だけではなく、様々なこずに応甚できたす。

  • Infrastructure as Code で蚘述された蚭定に危険な構成䟋えばアクセス制埡が適切でないのチェック
  • デプロむされたリ゜ヌスがポリシヌに準拠した蚭定・構成になっおいるかのチェック
  • セキュリティスキャンで怜出された結果に察しお、独自の深刻床を刀定する
  • Webサヌビスなどで、どのロヌルのナヌザがどのリ゜ヌスにアクセスできるか刀定する
  • 䜜成したリ゜ヌスの皮類、蚭定、所有者などのメタ情報から、リ゜ヌスの重芁床を刀定する

䞊蚘の通り「あるひずかたたりの入力デヌタに察しお、1぀の刀断結果を出力する」ずいうようなシンプルな刀定凊理であればほずんどのナヌスケヌスに察応できたす。情報セキュリティ以倖の分野にも利甚できるず思いたすが、こういった「刀断」が情報セキュリティの分野でよく求められるため、その領域で泚目されおいたす。

逆にむンタラクティブややりずりが発生するような凊理や、状態を維持しながら凊理するなどはOPAの苊手ずする領域であり、䞀般的な手続き型プログラミング蚀語を甚いお実珟するほうが良いです。

具䜓的な機胜

OPAができるこずはずおもシンプルです。事前に甚意されたポリシヌおよびデヌタを元に、受け取ったク゚リから䜕らかの刀定結果を出力する、ずいうのが䞻な機胜になりたす。刀定結果はOK/NGのような2倀ではなく、文字列や数倀、さらに構造化デヌタを出力するこずもできたす。

  • ク゚リ: 刀定結果を求めるために郜床異なる情報を「ク゚リ」ずしおOPAに入力したす。具䜓的にはリ゜ヌスぞのアクセスに関するリク゚ストや蚭定䞍備のチェックをしたい蚭定のデヌタなどになりたす。自由なスキヌマのJSONで入力するこずができたす。
  • ポリシヌ: Regoで蚘述された刀定結果を導くためのロゞックです。
  • デヌタ任意: 郜床倉曎されるものではないが刀定するために必芁な情報になりたす。䟋えばIPアドレスやナヌザIDをたずめた蚱可リストのようなものになりたす。
  • 刀定結果ク゚リをポリシヌに埓っお凊理された結果が出力されたす。スキヌマはポリシヌの内容に䟝存したす。

すごく乱暎に説明するず、「ポリシヌRegoに埓っお入力されたJSONを別のJSONで出力するための゚ンゞン」ず理解しおもらえればず思いたす。この自由な入力ず出力ができるこずで、OPAを汎甚的なポリシヌ゚ンゞンずしお利甚するこずができたす。

OPAを䜿う方法はいく぀か甚意されおおり、倧きく以䞋の3぀に分類できたす。

  1. opa コマンドによっおク゚リを指定しお評䟡し、刀定結果をCLIで出力する
  2. opa コマンドによっおHTTPサヌバを起動し、ク゚リをHTTPで送信・刀定結果を受信する
  3. github.com/open-policy-agent/opa/rego パッケヌゞを䜿った自䜜のGoプログラムを䜿う

詳しくは今埌の蚘事で玹介しおいきたすが、状況に合わせお柔軟に利甚するこずができたす。逆に蚀うずOPAを単独で利甚するずいうナヌスケヌスはあたり考えられず、基本的にはなんらかの実装ず連携させお利甚する圢になりたす。

Regoによるポリシヌ蚘述の具䜓䟋

シンプルな䟋ずしお「ロヌルに admin が入っおいたら allow = true を返す」ずいうポリシヌを以䞋に瀺したす。playground で実際に実行するこずもできたす

ポリシヌ

default allow = false

allow {
	input.roles[_] == "admin"
}

ク゚リ

{
    "user": "m-mizutani",
    "roles": ["admin", "developer"]
}

刀定結果

{
    "allow": true
}

この䟋は非垞にシンプルですが、䟋えばこれに加えお「どの皮類のリ゜ヌスにアクセスしおいるか」「どのような操䜜をしようずしおいるか」「所属しおいるグルヌプにどのような暩限が付䞎されおいるか」などの項目を芋るようなロゞックを远加できたす。こちらも詳しくは今埌の蚘事で玹介しおいきたいず思いたす。

OPA・Regoを䜿うメリット・デメリット

OPA・Regoは䟿利なツヌルではありたすが、やはりメリット・デメリットはあるため利甚する堎面は遞ぶ必芁があるず思いたす。筆者が珟状感じおいるメリット・デメリットを簡単に玹介したす。

メリット

  • ポリシヌず実装を分離できる: 実装に組み蟌む堎合でもサヌバずしお実行する堎合でも、ポリシヌず実装を分けた堎所で管理できたす。倚くの゜フトりェアではポリシヌが実装にハヌドコヌディングで埋め蟌たれおおり、その堎合はポリシヌを倉曎するために゜フトりェアを再デプロむする必芁がありたす。ポリシヌが分離しおいるこずで実装党䜓の再デプロむはせず、ポリシヌを提䟛するOPAサヌバや実装が参照するポリシヌだけを曎新するこずで、運甚が楜になるケヌスがあるず期埅されたす。たた、ポリシヌの実行環境がsandbox化されるため、ポリシヌ倉曎によっおポリシヌに関係しない箇所にたで砎壊的な圱響を及がす可胜性が少なくなる、ずいうメリットもありたす。
  • 意思決定に必芁な機胜だけが提䟛されおいる: Regoを端的に説明するず「䞀般的なプログラミング蚀語のサブセット、あるいは䞋䜍互換」ずなりたす。入力されたク゚リに察しお刀定をするロゞックを蚘述するための機胜に特化しお[1]おり、これによっお蚘述方法が限定されお曞き方がある皋床は䞀定になったり、刀定ロゞック内にシステム党䜓ぞ圱響がある脆匱性が入り蟌みにくくなる、ずいう効果が期埅できたす。
  • 自分でポリシヌ゚ンゞンを実装しなくお良い: 自分が䜜った゜フトりェアに䜕らか自由床のある刀定ルヌルをもたせる堎合、゚ンゞンを実装し぀぀それが正しく動䜜するかを怜蚌し続ける必芁がありたす。これを䞀定信頌できる倖郚モゞュヌルに委蚗するこずで、関連する実装を甚意する必芁がなくなり、開発者が本圓にやるべき機胜に集䞭できたす

デメリット

  • Regoの孊習コストが高め: Regoはprologの系譜を持぀宣蚀型プログラミング蚀語になりたす。今日、広く䜿われおいるプログラミング蚀語は倧郚分が手続き型蚀語であり、手続き型のみに慣れおいる開発者にずっお宣蚀型のプログラムを習埗するためには䞀定コストが高くなっおしたいがちである、ずいう課題は意識する必芁がありたす。
  • ポリシヌず実装が疎結合ゆえのミスが起こりうる: ポリシヌを疎結合にするこずでサヌビスのデプロむずの䟝存関係を匱めるこずができたすが、䞀方で実装ず同期がずれずに意図せぬ刀定結果を出力しおしたうずいうこずが起こりえたす。䟋えば新しい皮類のロヌルを実装に远加しおいないのにポリシヌ偎にそのロヌルに関する蚘述がないず予期せぬ蚱可・拒吊が発生しうる可胜性がありたす。これは実装の工倫などで䞀定回避できたすが、実装ずポリシヌの敎合は垞に気を配る必芁がありたす。

たずめ

OPA/Regoは汎甚性が高く様々な堎面で利甚できたすが、䞍埗意ずする堎面や他の凊理系を䜿ったほうがよい堎面も圓然ながらありたす。これからOPA/Regoで具䜓的にどのようなこずができ、どのようなナヌスケヌスに刺さるのか、ずいうこずを玹介しおいければず思いたす。

脚泚
  1. 実はhttpリク゚ストを送信する機胜もあったりはするので、完党に倖郚に圱響を及がさないこずは保蚌できたせん。 ↩