【コピペOK】Open Policy AgentとPythonを連携する手順

 

★悩み★
・Open Policy AgentのRego(レゴ)で作ったポリシーをPythonで利用したい。
・Open Policy AgentとPythonを連携する手順を知りたい。
・PythonのFastAPIから、Open Policy Agentのポリシーを利用したいな。


こういった「悩み」に答えます。
 

★本記事の内容★
① Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備
② Open Policy AgentのポリシーをPythonのFastAPIから利用する手順を紹介



これからご紹介する「【コピペOK】Open Policy AgentとPythonを連携する手順」を実践したことで、30分以内で「PythonのFastAPIからOpen Policy Agentのポリシーを利用」できました。

記事の前半では「PythonのFastAPIからOpen Policy Agentのポリシーを利用するための準備」を解説しつつ、記事の後半では「PythonのFastAPIからOpen Policy Agentのポリシーを利用する手順」を紹介します。

この記事を読み終えることで、「PythonのFastAPIからOpen Policy Agentのポリシーを利用できる」状態になります。
 


ちなみに、「Open Policy Agentとは何か?」に関しては、以下の記事をご覧ください。



また、「Open Policy AgentのRego(レゴ)言語でポリシーを作成する手順は?」に関しては、以下の記事をご覧ください。
 


 

Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備


「Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備」に関してご紹介します。

★Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備★
手順1:Open Policy Agentをインストール
手順2:Pythonをインストール
手順3:Pythonのライブラリ「FastAPI」をインストール



上記の流れで、「Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備」ができます。
 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年7月7日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備」の各手順に関してご説明します。
 

手順1:Open Policy Agentをインストール

「手順1:Open Policy Agentをインストール」に関してご説明します。
 

Python(FastAPI)からOpen Policy Agentのポリシーを利用するためにも、Open Policy Agentをインストールしましょう。



「Open Policy Agentのインストール手順」に関しては、以下の記事「手順1と手順2」をご覧ください。
 


 

既にOpen Policy Agentをインストール済みである場合、本手順を省略してください。 



以上で、「手順1:Open Policy Agentをインストール」は完了です。
 

手順2:Pythonをインストール

「手順2:Pythonをインストール」に関してご説明します。
 

FastAPIをインストールするためにもPythonをインストールしましょう。



以下の記事を参考にし、お使いのパソコンやサーバーにPythonをインストールしましょう。

>> 【ubuntu向け】pyenvでPythonをインストールする手順【簡単】

>> 【コピペOK】pyenvでPythonをインストールする手順【Linux用】

>> 【最短5分】PyAutoGUIをWindowsにインストールする手順の「手順1:Pythonのインストール」を参照

>> 【環境構築】インストーラーでMacOSにPythonをインストール


 

既にPythonをインストールされている方は、本手順を省略してください。



以上で、「手順2:Pythonをインストール」は完了です。
 

手順3:Pythonのライブラリ「FastAPI」をインストール

「手順3:Pythonのライブラリ「FastAPI」をインストール」に関してご説明します。
 

PythonからOpen Policy Agentのポリシーを利用するためにも、Pythonのライブラリ「FastAPI」をインストールしましょう。



「FastAPIのインストール手順」に関しては、以下の記事をご覧ください。
 


 

既にFastAPIをインストールされている方は、本手順を省略してください。



以上で、「手順3:Pythonのライブラリ「FastAPI」をインストール」は完了です。
 

上記の流れで、Open Policy AgentのポリシーをPython(FastAPI)から利用する為の準備ができました。


 

Open Policy AgentのポリシーをPythonのFastAPIから利用する手順


「Open Policy AgentのポリシーをPythonのFastAPIから利用する手順」に関してご紹介します。

★Open Policy AgentのポリシーをPythonのFastAPIから利用する流れ★
手順1:Open Policy AgentのRego(レゴ)言語でポリシーを作成
手順2:PythonでOpen Policy Agentのポリシーを利用するプログラムを作成
手順3:「Open Policy Agentのポリシーを利用するプログラム」の動作確認



上記の流れで、「Open Policy AgentのポリシーをPythonのFastAPIから利用」できます。
 

上記の各手順は、以下の日時と環境で動作確認済みです。
動作確認済み日時:2021年7月7日
動作確認済み環境:CentOS Linux release 7.7.1908 (Core)



以降で、上記「Open Policy AgentのポリシーをPythonのFastAPIから利用する流れ」の各手順に関してご説明します。
 

手順1:Open Policy AgentのRego(レゴ)言語でポリシーを作成

「手順1:Open Policy AgentのRego(レゴ)言語でポリシーを作成」に関してご説明します。
 

簡単なポリシーをOpen Policy AgentのRego(レゴ)言語で作成しましょう。



「Open Policy AgentのRego(レゴ)言語でポリシーを作成する手順」に関しては、以下の記事をご覧ください。
 



以降の手順では、「以下のポリシーを作成し、test.repoのファイル名で保存した」を想定として手順を解説します。

package system

main = allow

default allow = false

allow {
	input.method = "GET"
	input.path = ["test"]
	input.user = "hero"
}



以上で、「手順1:Open Policy AgentのRego(レゴ)言語でポリシーを作成」は完了です。
 

手順2:PythonでOpen Policy Agentのポリシーを利用するプログラムを作成

「手順2:PythonでOpen Policy Agentのポリシーを利用するプログラムを作成」に関してご説明します。
 

PythonのFastAPIでOpen Policy Agentのポリシーを利用するプログラムを作成しましょう。



「PythonのFastAPIでOpen Policy Agentのポリシーを利用する」プログラムは、以下となります。プログラム中の「適宜変更」と書いてある部分は、自分用に書き換えてください。

from fastapi import FastAPI, Request
import json
import requests

app = FastAPI()

@app.get('/test')
async def hello(request: Request):
    allowed = check_authorization(request)
    if allowed == True:
      return {"text": "hello world!"}
    else:
      return {}

'''
RequestからAuthorizationの値を取得する関数
'''
def get_authentication(request):
    return request.headers.get("Authorization", "")

'''
Open Policy Agentのポリシーで、適切なRequestかを判定する関数
'''
def check_authorization(request):
    user =  get_authentication(request)
    input = json.dumps({
            "method": request.method,
            "path": request.url.path.strip().split("/")[1:],
            "user": user,
        }, indent=2)
    url = "http://localhost:8181" # Open Policy AgentのURL(適宜変更)
    response = requests.post(url, data=input)

    allowed = response.json()
    print("-----")
    print("user:" + user)
    print("allowed:" + str(allowed))
    print("-----")
    return allowed



上記のプログラムを「python-fastapi-opa.py」というファイル名で保存しましょう。

以上で、「手順2:PythonでOpen Policy Agentのポリシーを利用するプログラムを作成」は完了です。
 

手順3:「Open Policy Agentのポリシーを利用するプログラム」の動作確認

「手順3:「Open Policy Agentのポリシーを利用するプログラム」の動作確認」に関してご説明します。
 

Pythonで作成した「FastAPIでOpen Policy Agentのポリシーを利用する」プログラムの動作を確認しましょう。



Pythonで作成した「FastAPIでOpen Policy Agentのポリシーを利用する」プログラムを起動するために、以下のコマンドを起動しましょう。

# ls
python-fastapi-opa.py
#  uvicorn main:app --reload
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [5272] using statreload
INFO:     Started server process [5306]
INFO:     Waiting for application startup.
INFO:     Application startup complete.



コマンド実行後、「Application startup complete.」が表示された場合、「正常にPythonで作成したFastAPIでOpen Policy Agentのポリシーを利用するプログラムを起動できた」と判断できます。
 

続いて、Rego(レゴ)言語で作成したポリシーを使うために、Open Policy Agentを以下のコマンドで起動してください。

# ./opa run --server ./test.repo
{"addrs":[":8181"],"diagnostic-addrs":[],"level":"info","msg":"Initializing server.","time":"2021-07-07T20:47:57+09:00"}



コマンド実行後、「Initializing」が表示された場合、「正常にOpen Policy Agentを起動できた」と判断できます。
 

最後に、起動したプログラムの動作を確認するために、以下のcurlコマンドを順に実行してください。

# curl http://127.0.0.1:8000/test -H 'Authorization: admin'
{}
# curl http://127.0.0.1:8000/test -H 'Authorization: hero'
{"text":"hello world!"}



コマンド実行後、「’Authorization: hero’」の場合のみ、「{“text”:”hello world!”}」が表示された場合、「正常に起動したプログラムが動作した」と判断できます。
 

以上で、「手順3:「Open Policy Agentのポリシーを利用するプログラム」の動作確認」は完了です。
 

上記の流れで、Open Policy AgentのポリシーをPythonのFastAPIから利用できました。


 

【まとめ】Open Policy AgentとPythonを連携する手順


今回の記事を通して、「Open Policy AgentとPythonを連携する手順」をご紹介することで、以下の悩みを解消しました。

★悩み★
・Open Policy AgentのRego(レゴ)で作ったポリシーをPythonで利用したい。
・Open Policy AgentとPythonを連携する手順を知りたい。
・PythonのFastAPIから、Open Policy Agentのポリシーを利用したいな。



「Open Policy AgentのRego(レゴ)で作ったポリシーをPythonでどうやって利用するの?」で悩んでいるあなたにこの記事が少しでも役に立てれば幸いです。

コメント