Verified Permissions / Verified Access の Cedar ポリシー作成時に役に立ちそうな Visual Studio Code 拡張と Cedar CLI を試してみた

2024.01.11

いわさです。

少し前のアップデートで AWS Verified Access のポータル上でポリシーアシスタントという機能が使えるようになり、Cedar ポリシーの実装がしやすくなりました。

ただし、普段の開発時にはもう少し Cedar の実装をサポートしてくれる機能が欲しいと思っていました。
そんな中、昨日次の AWS 公式ブログが公開されました。

ここでは Cedar ポリシーの検証を CI/CD パイプラインで行う仕組みが紹介されています。
その中でいくつかのツールに触れられていまして、Visual Studio Cdoe の Cedar 拡張と Cedar CLI については普段の開発でも利用が出来そうだなと思いました。

本日はこちらを少し触って見ましたのでどんなものなのか紹介したいと思います。

Visual Studio Code 拡張

以下から入手が可能です。
注意点としてこちらはまだ Preview となっています。パブリックな初回リリースは 2023 年 7 月末なので登場して半年ほど経っているようです。

有効化していると、まずは拡張子cedarのファイルを Cedar ポリシー用のファイルだと認識されるようになりました。

ポリシーを作り始めようとすると、Cedar 用のインテリセンスが効いている。
ただ、あまりキーワード自体が無いので、インテリセンス自体の旨味はそこまで無いかもしれません。どちらかというと後述のスキーマ検証関係がすごい良いと思います。

コマンドから Cedar の機能にアクセス出来ます。次の 4 つが表示されました。
実装を見ていないのですが、挙動を見た感じだと後述の Cider CLI と似た動きをしています。

Validate Cedar policy / Clear problems

試しに予約後の入力誤りの状態にしてみると Validate のタイミングで構文エラーが検出されました。
Clear problems するとエラーが解消されます。ちょっと使い方がわからないですねこれは。
常に ON でも良いと思いましたが私の設定がおかしいかも。

Export Cedar policy as JSON

Cedar: Export Cedar policy as JSONはおもしろいと思いました。
なんで Cedar と JSON を変換する必要あるのかなと思ったのですが、Cedar ってアプリケーションからアクセスするにはあまり使いやすいフォーマットではないのですよね。

なのでプログラムからアクセスする際は JSON に変換してから操作するというのが一般的なようです。知らなかった。

ポリシースキーマーにも対応

Cedar ではポリシーを使ってエンティティに対して検査を行いますが、構造がそもそも一致していない場合があります。
スキーマはエンティティ構造を示すもので、これを使って作成したポリシーがエンティティ構造と仕様が一致しているのかをチェックすることが出来ます。

スキーマファイルは*.cedarschema.json拡張子で定義されます。
次は GitHub で公開されている AWS 公式サンプルリポジトリである「Implement custom authorization policy provider for ASP.NET Core apps using Amazon Verified Permissions」に含まれているポリシースキーマです。

そして、このスキーマを使って以下のサンプルポリシーを評価してみたいと思います。
どちらも TinyTodo ということで似ているのですが、実は微妙に構造が異なっており、目視だとすぐには気が付きません。

構文エラーの内容を見てみると検出結果がスキーマとあっておらず、候補が表示されていますね。
先程までは基本構文のみのエラー内容でしたが、独自のエンティティ仕様にあわせたバリデーションが出来るようになりました。

Cedar CLI

通常ローカルで開発する分には Visual Studio Code の拡張で十分だと思います。
ただし、Visual Studio Code 拡張が使えないエディターだったり、あるいは CI/CD パイプラインなんかがユースケースなのですが CLI ベースで先程の機能を「Cedar CLI」から使うことが出来ます。

ちなみに VS Code 拡張をインストールしただけでは Cedar CLI を使うことは出来ません。

% cedar --version
zsh: command not found: cedar

cargo install する必要があります。

% cargo install cedar-policy-cli@2.4.2
    Updating crates.io index
  Downloaded cedar-policy-cli v2.4.2
  Downloaded 1 crate (35.7 KB) in 0.57s
  Installing cedar-policy-cli v2.4.2
    Updating crates.io index
  Downloaded backtrace-ext v0.2.1
  Downloaded deranged v0.3.11
  Downloaded anstyle-query v1.0.2
  Downloaded petgraph v0.6.4

:

   Compiling cedar-policy-validator v2.4.2
   Compiling cedar-policy-formatter v2.4.2
   Compiling cedar-policy v2.4.2
   Compiling cedar-policy-cli v2.4.2
    Finished release [optimized] target(s) in 52.61s
  Installing /Users/iwasa.takahito/.cargo/bin/cedar
   Installed package `cedar-policy-cli v2.4.2` (executable `cedar`)

% cedar --version
cedar-policy-cli 2.4.2

インストール出来たようです。
コマンドを見てみると、先程使った validate があります。他にも format なんかも用意されています。
また、CLI 上で仮想のリクエスト内容を評価することも出来るみたいですね。これはローカル開発する際に結構使えそうな気がしますね。

% cedar
CLI interface for the Cedar Policy language.

Usage: cedar [OPTIONS] <COMMAND>

Commands:
  authorize    Evaluate an authorization request
  evaluate     Evaluate a Cedar expression
  validate     Validate a policy set against a schema
  check-parse  Check that policies successfully parse
  link         Link a template
  format       Format a policy set
  help         Print this message or the help of the given subcommand(s)

Options:
  -f, --error-format <ERR_FMT>  The output format to use for error reporting [env: CEDAR_ERROR_FORMAT=] [default: human] [possible values: human, plain, json]
  -h, --help                    Print help (see more with '--help')
  -V, --version                 Print version

試しに先程作成したスキーマとポリシーを使って validate をしてみました。
Visual Studio Code 拡張で検出されたものと同じエラーが出力されましたね。

% cedar validate --schema hoge.cedarschema.json --policies hoge.cedar
Validation Results:
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"DeleteTask"`, did you mean `TinyTodoList::Action::"DeleteTodoList"`?
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"UpdateTask"`, did you mean `TinyTodoList::Action::"UserAdmin"`?
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"CreateTask"`, did you mean `TinyTodoList::Action::"CreateTodoList"`?
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"ListTasks"`, did you mean `TinyTodoList::Action::"UserAdmin"`?
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"UpdateList"`, did you mean `TinyTodoList::Action::"GetTodoLists"`?
Validation error on policy policy0: unrecognized action `TinyTodoList::Action::"ReadList"`, did you mean `TinyTodoList::Action::"UserAdmin"`?
Validation error on policy policy0: unable to find an applicable action given the policy head constraints

冒頭のブログでは CI/CD パイプラインの中でポリシーの検証を行っているのですが、次のリポジトリで実装を確認してみると内部では Cedar CLI の validate コマンドを CodeBuild から使っていることが確認出来ます。

さいごに

本日は Verified Permissions / Verified Access の Cedar ポリシー作成時に役に立ちそうな Visual Studio Code 拡張と Cedar CLI を試してみました。

簡単なポリシーだと使う機会が無いかもしれませんが、実装するポリシーがちょっと複雑になりそうであればかなり役立つツールだと思います。
Cedar を触る機会はまだそう多くないと思いますが、ツールの存在だけでも覚えておきましょう。