例 1: OPA と Rego を使用した基本的な ABAC - AWS 規範ガイダンス

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

例 1: OPA と Rego を使用した基本的な ABAC

このセクションでは、架空のペイロールマイクロサービス内の情報へのアクセスをどのユーザーに許可するかについて、OPA を使用してアクセスを決定するシナリオについて説明します。Rego コードスニペットは、Rego を使用してアクセスコントロールの決定をレンダリングする方法を示すために提供されています。これらの例は、Rego および OPA 機能の網羅的な調査でも、完全な調査でもありません。Rego の詳細については、OPA ウェブサイトの Rego ドキュメントを参照することをお勧めします。

OPA と Rego を使用した基本的な ABAC

基本的な OPA ルールの例

前の図では、ペイロールマイクロサービスに対して OPA によって適用されるアクセスコントロールルールの 1 つを以下に示します。

従業員は自分の給与を読み取ることができます。

Bob が給与マイクロサービスにアクセスして自分の給与を確認しようとすると、給与マイクロサービスは API コールを OPA RESTful API にリダイレクトしてアクセスを決定できます。ペイロールサービスは、次の JSON 入力を使用して OPA に決定をクエリします。

{ "user": "bob", "method": "GET", "path": ["getSalary", "bob"] }

OPA は、クエリに基づいてポリシーを選択します。この場合、次のポリシーは Rego で記述され、JSON 入力を評価します。

default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user }

このポリシーは、デフォルトでアクセスを拒否します。次に、クエリ内の入力をグローバル変数 にバインドして評価しますinput。ドット演算子は、変数の値にアクセスするためにこの変数とともに使用されます。ルールの式も true の場合、Rego ルールは true allowを返します。Rego ルールは、入力method の が GET と等しいことを確認します。次に、リスト内の 2 番目の要素を変数 に割り当てるgetSalary前に、リスト内の最初の要素path が であることを確認しますuser。最後に、アクセスするパスが、リクエストuserを行う が user変数input.userと一致することを確認する/getSalary/bob ことによって であることを確認します。このルールallowは if-then ロジックを適用して、出力に示すようにブール値を返します。

{ "allow": true }

外部データを使用した部分的なルール

追加の OPA 機能を実証するために、適用するアクセスルールに要件を追加できます。前の図のコンテキストでこのアクセスコントロール要件を適用するとします。 

従業員は、自分の部下の給与を読み取ることができます。

この例では、OPA は、アクセス決定を行うためにインポートできる外部データにアクセスできます。

"managers": { "bob": ["dave", "john"], "carol": ["alice"] }

OPA で部分的なルールを作成することで、任意の JSON レスポンスを生成できます。このルールは、固定レスポンスの代わりに値のセットを返します。これは部分的なルールの例です。

direct_report[user_ids] { user_ids = data.managers[input.user][_] }

このルールは、 の値に報告するすべてのユーザーのセットを返します。この場合input.user、 は ですbob。ルールの [_]コンストラクトは、セットの値を繰り返し処理するために使用されます。これはルールの出力です。

{ "direct_report": [ "dave", "john" ] }

この情報を取得すると、ユーザーがマネージャーの直属部下であるかどうかを判断できます。一部のアプリケーションでは、シンプルなブールレスポンスを返すよりも動的 JSON を返すことをお勧めします。

まとめ

最後のアクセス要件は、両方の要件で指定された条件を組み合わせるため、最初の 2 つよりも複雑です。

従業員は、自分の給与と自分の部下の給与を読み取ることができます。

この要件を満たすには、次の Rego ポリシーを使用できます。

default allow = false allow = true { input.method == "GET" input.path = ["getSalary", user] input.user == user } allow = true { input.method == "GET" input.path = ["getSalary", user] managers := data.managers[input.user][_] contains(managers, user) }

ポリシーの最初のルールでは、前述のように、自分の給与情報を表示しようとするすべてのユーザーが にアクセスできます。同じ名前の 2 つのルールを持つ はallow、Rego の論理または演算子として機能します。2 番目のルールは、 input.user (前の図のデータから) に関連付けられているすべてのダイレクトレポートのリストを取得し、このリストを managers変数に割り当てます。最後に、ルールは、自分の名前が managers変数に含まれていることを確認input.userして、給与を確認しようとしているユーザーが の直接レポートであるかどうかをチェックします。

このセクションの例は非常に基本的なものであり、Rego と OPA の機能を完全にまたは徹底的に調べることはできません。詳細については、OPA ドキュメントを参照し、OPA GitHub README ファイルを参照し、Rego プレイグラウンドで実験してください。