Open Policy Agent

前回のCasbinと同じ領域のOSSで、Open Policy Agentというものを試してみました。(手順の確認と疑問点の調査など)

参考)
https://qiita.com/KWS_0901/items/4ea7fb634a122d2baa13
https://www.openpolicyagent.org/docs/v0.16.2/http-api-authorization/ (original)

今回もDockerを使いますが、docker-composeで一気にサービスの起動までできるものが用意されています。

docker-compose.yml

docker-compose -f docker-compose.yml up

ポリシーはREGOという独自言語で書かれています。
example.rego

opaサーバとapiサーバが立ち上がります。

$ docker ps
61759fa0d6d6 openpolicyagent/demo-restful-api:0.2 “flask run –host=0.…” About an hour ago Up About an hour 0.0.0.0:5000->5000/tcp opa-api_server-1
e9bad5f0b420 openpolicyagent/opa:0.16.2 “/opa run –server -…” About an hour ago Up About an hour 0.0.0.0:8181->8181/tcp opa-opa-1

まずopaサーバに、ポリシーを登録。

$ curl -X PUT –data-binary @example.rego localhost:8181/v1/policies/example

apiサーバに認可の確認。あとopaサーバにユーザ情報の確認。

paswordはどこで管理しているのかと思いましたが、ここではあればなんでもよいようです。
理解を深めるためapiサーバアプリのコード(Flask FW/Python)をコンテナから抜き出してみました。

docker cp opa-api_server-1:/usr/src/app .

/usr/src/app/echo_server.py

opaサーバは、docker-composeのあと起動して以下のようにログを表示します。以下はapiサーバにaliceの認可確認と、opaサーバにユーザ情報を取得したところです。

また以下よりPlaygroundに移動すると、REGOのポリシーの確認が容易にできます。
https://www.openpolicyagent.org/

userとownwerが違うためfalseになっています。

あとpathについて、データの構造がちがったりkeyのpetsが違う文字列の場合falseになります。
このように直観的にポリシーを確認できるツールがあるのば便利です。

とりあえずここまで初めて使ったメモでした。

(以下2013/07/12追記)

https://www.openpolicyagent.org/docs/latest/#2-try-opa-eval
opaコマンドをつかった評価をするため、この環境で上記サイトのコマンドをためしてみました。(イメージ内コマンドを外部から実行)

input.json

example2.rego

$ docker run openpolicyagent/opa:0.16.2 eval “1*2+3”

ところが次のjsonファイルとregoファイルのがエラーがででうまくいきません。フォーマットなどがまずいようですが、調べていくとバージョンがかなり古いことに気づきました。
docker-compose.yml のopa imageを、0.16.22から0.54.0に書き換え、もう一度最初からやり直しました。

$ docker run -v $PWD:/tmp openpolicyagent/opa:0.54.0 eval -i /tmp/input.json -d /tmp/example2.rego “data.example.violation[x]”

–fail-defined オプションをつけると echo $? が1になります。

opaコマンドのテストでした。