翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
一時ポリシーの作成
Dogwood ポリシー言語で一時ポリシーを作成し、AgentCore でポリシーの他のポリシーを作成するのと同じ方法で、ポリシーエンジンに追加します。一時ポリシーは、セッション対応条件がtemporalブロックに配置される permitまたは forbidルールです。ルールが適用されるプリンシパル、アクション、リソースは、他のポリシーと同じ標準(principal, action, resource)スコープを使用して記述されます。以下のセクションでは、一時ポリシーを作成し、表現できる一般的なパターンについて説明します。
一時ポリシーを作成する
オペレーション、他のポリシーに使用するcreate-policyのと同じオペレーションを使用して一時ポリシーを作成し、ポリシーエンジンにアタッチします。一時ポリシーのステートメントは、ステートレス Cedar ポリシーの cedar ではなく、 定義policyで になります。
次の CLI AWS の例では、ポリシーエンジンに一時ポリシーを作成します。
aws bedrock-agentcore-control create-policy \ --policy-engine-id my-policy-engine-id \ --name TransferToLookedUpAccount \ --validation-mode FAIL_ON_ANY_FINDINGS \ --definition '{ "policy": { "statement": "permit (principal, action == AgentCore::Action::\"FundsTarget___transfer_funds\", resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway\") when temporal { formerly within 1h AgentCore::Action::\"FundsTarget___get_account_balance\"::response{ eventResource: resource, output.accountId: context.input.toAccount } };" } }'
Dogwood ステートメントを自分で記述するのではなく、自然言語で記述することで、一時的なポリシーを作成することもできます。
イベントスキーマ: 参照できるフィールド
temporal { } ブロック内の条件は、一時的なイベント述語を使用して、これまでにセッションに記録された特定のイベント (現在承認されているアクションまで) に一致します。述語は、時間枠、アクションとイベントの種類、および一致するイベントの一連のフィールド制約に名前を付けます。前のセクションのcreate-policy例では、1 つの述語 を使用していました。これはformerly within 1h AgentCore::Action::"FundsTarget___get_account_balance"::response{ eventResource: resource, output.accountId: context.input.toAccount }、過去 1 時間以内にget_account_balanceresponse記録された と一致し、 は現在のリクエストの output.accountIdに等しくなりますtoAccount。
述語を記述するには、述語が制約および相関できるフィールドであるため、アクションが生成するイベントと各イベントが保持するフィールドを知る必要があります。このセクションでは、そのイベントスキーマについて説明します。
各アクションは、述語のイベントタイプ (、::request、) にちなんで命名された最大 3 ::response種類のイベントを生成します::error。
-
request— 承認されたリクエストごとに記録されます。アクションの入力フィールドを実行します。 -
response— ツールが正常に戻ると記録されます。アクションの入力フィールドと出力フィールドを実行します。 -
error— リクエストが拒否されたとき、またはツールがエラーを返したときに記録されます。アクションの入力フィールドを実行します。このイベントは履歴専用です。
一時イベントスキーマは、アクション ごとにこれらのイベントを定義しますA。 …inputs(A)と は、アクションの宣言された入力フィールドと出力フィールドに…outputs(A)展開します。
// Recorded for each authorized request. decision event <A>::request { ...inputs(A), eventPrincipal: principalType(A), eventResource: resourceType(A), requestId: String, pin sessionId: String = context.sessionId, } // Recorded when the tool returns successfully; carries inputs and outputs. event <A>::response { ...inputs(A), ...outputs(A), eventPrincipal: principalType(A), eventResource: resourceType(A), requestId: String, pin sessionId: String = context.sessionId, } // Recorded when the request is denied or the tool returns an error; history-only. event <A>::error { ...inputs(A), eventPrincipal: principalType(A), eventResource: resourceType(A), requestId: String, pin sessionId: String = context.sessionId, }
述語本文内では、一致イベントの次のフィールドを参照できます。
| フィールド | 説明 |
|---|---|
|
|
アクションの入力フィールド。 |
|
|
アクションの出力フィールド。 |
|
|
記録されたリクエストを行ったプリンシパル。 |
|
|
ポリシースコープのリソース、つまり |
記録されたイベントを現在のリクエストに関連付けるには、これらのフィールドの 1 つを などの現在のリクエストの値と比較しますcontext.input.<name>。
ユースケース
以下は、一時ポリシーの例です。
使用可能なツール
このセクションの例では、3 つのツールを公開FundsTargetする という名前のゲートウェイターゲットを使用します。ポリシーでは、各ツールはアクション名、、FundsTarget___<tool-name>およびここにリストされている入力フィールドと出力フィールドによって参照されます。
-
FundsTarget___get_account_balance -
顧客の現在のアカウント残高を取得します。
-
入力:
customerId(文字列、必須)。 -
出力:
status(文字列)、customerId(文字列)、accountId(文字列)、balance(整数)。
-
-
FundsTarget___transfer_funds -
アカウント間で資金を送金します。
-
入力:
fromAccount(文字列、必須)、toAccount(文字列、必須)、amount(整数、必須)。 -
出力:
status(文字列)、fromAccount(文字列)、toAccount(文字列)、amount(整数)。
-
-
FundsTarget___get_transaction_history -
アカウントのトランザクション履歴を取得します。
-
入力:
accountId(文字列、必須)、startDate(文字列、オプション)、endDate(文字列、オプション)。 -
出力:
status(文字列)、accountId(文字列)。
-
例: output-to-input の整合性
この例では、エージェントが同じセッションの前半で検索したアカウントにのみ資金を送金できるようにし、偽造したアカウントへの送金を防止します。ポリシーは、セッションの前半のget_account_balanceレスポンスが同じアカウントを返したtransfer_funds場合にのみ許可します。
permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 1h AgentCore::Action::"FundsTarget___get_account_balance"::response{ eventResource: resource, output.accountId: context.input.toAccount } };
::response 述語は、以前の の記録されたレスポンスと一致しますget_account_balance。 output.accountIdは、ツールが返すフィールドであり、現在のtransfer_fundsリクエストの送信先アカウントcontext.input.toAccountです。転送を以前の検索と等しいものにする必要があります。
ポリシーエンジンはデフォルトで拒否するため、アクションは許可されたresponse場合にのみ として記録されるため、 permitにプレーンを付与してget_account_balance、ルックアップを許可し、セッションのレスポンスとして記録します。
permit ( principal, action == AgentCore::Action::"FundsTarget___get_account_balance", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" );
両方のポリシーが設定されている場合、セッション内のリクエストは次のように決定されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
|
許可 |
|
|
DENY |
例: ツールシーケンス
この例では、同じセッションの前半で実行された前提条件アクションの後にのみアクションを許可します。次のポリシーでは、transfer_fundsリクエストが過去 5 分以内に発生したget_account_balance場合にのみ を許可します。
permit ( principal, action == AgentCore::Action::"FundsTarget___get_account_balance", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 5m AgentCore::Action::"FundsTarget___transfer_funds"::request{ eventResource: resource } };
::request 述語は、セッション内の以前のtransfer_fundsリクエストと一致します。これを permit for とペアリングtransfer_fundsして、アクションが許可され、記録されるようにします。両方のポリシーが設定されていると、 get_account_balanceはセッションで transfer_funds が実行されるまで拒否されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
|
許可 |
例: データ鮮度
この例では、前提条件が厳しい期間内に正常に完了した場合にのみアクションを許可し、古い結果がアクセス許可を期限切れにします。が過去 5 分以内にtransfer_funds完了したget_account_balance場合にのみ許可されます。
permit ( principal, action == AgentCore::Action::"FundsTarget___get_account_balance", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 5m AgentCore::Action::"FundsTarget___transfer_funds"::response{ eventResource: resource } };
::response ではなく を一致させること::requestはツールシーケンスとの違いです。responseイベントはアクションが正常に完了した場合にのみ記録されるため、このポリシーでは、前のリクエストだけでなく、最近正常に完了する必要があります。ウィンドウの長さは、その完了の鮮度を設定します。ウィンドウが経過すると、アクセス許可は前提条件が再度実行されるまで経過します。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
|
許可 |
|
|
DENY |
例: セッションベースのレート制限
この例では、セッション内の一定数の呼び出しにツールを上限します。次のポリシーは、セッションで 5 分以内に transfer_funds 3 回以上呼び出されると禁止します。
forbid ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { exists (n: Long). (count for (t: Timepoint). where (formerly within 5m (AgentCore::Action::"FundsTarget___transfer_funds"::request{ eventResource: resource } && tp(t)))) == n && n > 3 };
count 式は、現在のtransfer_fundsリクエストを含め、過去 5 分以内にセッションに記録されたリクエストをカウントします。その数が 3 を超えると、禁止が適用されます。permit を for とペアリングtransfer_fundsすると、呼び出しは制限まで許可されます。両方のポリシーが設定されている場合、5 分以内の最初の 3 回のtransfer_funds呼び出しが許可され、そのウィンドウの 4 回目 (またはそれ以降) の呼び出しは拒否されます。
重要
この制限は 1 つのセッション内のみに適用されるため、決定された発信者に対するセキュリティコントロールではありません。呼び出し元はセッション ID を指定するため、新しいセッションを開始することでカウントをリセットできます。このパターンを使用して、自分のセッション ID を制御する発信者にハード制限を適用するのではなく、協調セッション内の動作を形成します。詳細については、「セキュリティに関する考慮事項」を参照してください。
例: one-time-use
この例では、各承認を 1 回の使用に適しています。transfer_funds は、セッションの最新の get_account_balance (承認) 以降に transfer_funds が完了していない場合にのみ許可されます。移管が完了すると、承認が消費され、次の移管は新しい承認が行われるまで拒否されます。
permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { !AgentCore::Action::"FundsTarget___transfer_funds"::response{ eventResource: resource } since within 1h AgentCore::Action::"FundsTarget___get_account_balance"::response{ eventResource: resource } };
このsince条件は、完了した get_account_balance (承認) transfer_fundsが過去 1 時間以内に発生し、その承認以降に完了していないときを保持します。での一致::responseが不可欠です。転送は成功した後にのみ完了としてカウントされるため、承認されるリクエスト自体はブロックされません。これを permit for とペアリングget_account_balanceして、承認が記録されるようにします。
セッション内のリクエストは次のように決定されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
許可 |
|
新しい承認 |
DENY |
|
新しい |
許可 |
注記
ツールのresponseイベントは、呼び出しが完了した直後に記録されます。(get_account_balance承認) リクエストが完了し、そのリクエストが記録されresponseるまで待ってからtransfer_funds、次の を発行し直します。詳細については、「以前のレスポンスに依存するアクションの順序付け」を参照してください。
例: 累積予算
この例では、ウィンドウ内のアクションの合計値を上限します。次のポリシーではtransfer_funds、過去 5 分間のセッション転送全体のamount入力の合計が 3000 に達すると禁止されます。
forbid ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { exists (total: Long). (sum amt for (amt: Long), (t: Timepoint). where (formerly within 5m (AgentCore::Action::"FundsTarget___transfer_funds"::request{ eventResource: resource, input.amount: amt } && tp(t)))) == total && total >= 3000 };
sum 式は、現在のtransfer_fundsリクエストを含む、ウィンドウ内の一致するリクエスト全体でamount入力フィールドを加算します。合計がしきい値に達すると、禁止が適用されます。合計フィールドは、 アクションの入力フィールドです。ポリシーを permitの とペアリングしますtransfer_funds。たとえば、しきい値が 3000 で転送が 1000 の場合、最初の 2 つが許可され、3000 に達する 3 つ目は拒否されます。
レート制限と同様に、合計は現在のセッションに限定され、セッション間で集計されません。
例: クールダウン
この例では、クールダウンを適用します。最後の完了の固定期間内にアクションを繰り返すことはできません。過去 1 分以内に transfer_fundsが完了したtransfer_funds場合は禁止されます。
forbid ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 1m AgentCore::Action::"FundsTarget___transfer_funds"::response{ eventResource: resource } };
この条件は自己参照型です。承認されているのと同じアクションと一致します。一致させること::responseで機能します。これは、承認されているリクエストがまだレスポンスを生成していないため、それ自体には一致しないためです。::request ここで一致させると、現在のリクエストが独自のイベントと一致し、アクションは完全に禁止されます。ウィンドウが新しい完了なしで経過すると、アクションは再度許可されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
最初の |
許可 |
|
1 分以内にもう |
DENY |
|
|
許可 |
例: 連続前提条件
この例では、前提条件が保持されている場合にのみアクションを許可します。肯定的な確認が最近発生し、それ以後何も無効にしていません。これは、 get_account_balance (確認) が過去 5 分以内に完了し、以下以降 get_transaction_history (無効化) が完了していないtransfer_funds場合にのみ許可します。
permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { !AgentCore::Action::"FundsTarget___get_transaction_history"::response{ eventResource: resource } since within 5m AgentCore::Action::"FundsTarget___get_account_balance"::response{ eventResource: resource } };
このsince条件は、完了した get_transaction_historyが過去 5 分以内にget_account_balance発生し、それ以降完了していないときに保持されます。完了した は前提条件get_account_balanceを確認し、 からget_transaction_history何も発生していないことを要求して、後で無効にすることはありません。get_account_balance と の両方に許可を付与get_transaction_historyして、記録します。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
|
許可 |
|
|
DENY |
|
新しい |
許可 |
例: マルチホップチェーン
複数のシーケンスポリシーを作成して一連のアクションを要求できます。各アクションは、前のアクションの完了後にのみ許可されます。この例では、2 つのポリシー (リンクごとに 1 つ) を使用してtransfer_funds、チェーン get_account_balance → get_transaction_history → が必要です。
// Link 1: permit get_transaction_history only after get_account_balance completed permit ( principal, action == AgentCore::Action::"FundsTarget___get_transaction_history", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 5m AgentCore::Action::"FundsTarget___get_account_balance"::response{ eventResource: resource } }; // Link 2: permit transfer_funds only after get_transaction_history completed permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 5m AgentCore::Action::"FundsTarget___get_transaction_history"::response{ eventResource: resource } };
各ポリシーは 1 つのリンクを強制し、チェーンは構成から出現します。 transfer_fundsには が必要でget_transaction_history、これには が必要ですget_account_balance。チェーン内の最初のアクションpermitに を付与して、開始できるようにします。順不同で試行されたステップは、前提条件が完了するまで拒否されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
|
各ステップで許可する |
例: 相互除外
この例では、ウィンドウ内で 2 つのアクションを相互に除外します。どちらか一方が最初に実行すると、もう一方のアクションがブロックされます。2 つの対称禁止ポリシーを使用するため、除外は両方向に保持されます。ここでは、 transfer_fundsと の両方を 2 分以内に実行get_transaction_historyすることはできません。
// Forbid get_transaction_history if a transfer_funds was requested within 2m forbid ( principal, action == AgentCore::Action::"FundsTarget___get_transaction_history", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 2m AgentCore::Action::"FundsTarget___transfer_funds"::request{ eventResource: resource } }; // Forbid transfer_funds if a get_transaction_history was requested within 2m forbid ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 2m AgentCore::Action::"FundsTarget___get_transaction_history"::request{ eventResource: resource } };
各ポリシーは で一致するため::request、1 つのアクションをリクエストしても、ブロックは最初のアクションが完了するまで待機しません。2 つの対称forbidポリシーが必要です。1 つはリクエストget_transaction_history後に禁止されtransfer_funds、もう 1 つはget_transaction_historyリクエストtransfer_funds後に禁止されます。1 つの禁止は 1 つの注文のみをブロックします。両方を 2 つのアクションの許可とペアリングします。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
Transfer ALLOW、履歴 DENY |
|
|
履歴 許可、転送 DENY |
例: 一時的な条件、ガードレール条件、Cedar 条件の組み合わせ
1 つのポリシーは、一時的な条件をガードレールおよび標準の Cedar 条件と組み合わせることができます。ポリシーを適用するには、それらをすべて満たす必要があります。この例では、累積転送量が上限 (一時) にとどまり、リクエストに機密情報 (ガードレール) が含まれておらず、発信者がブロックされたグループ (Cedar) にない場合transfer_fundsのみ、 を許可します。
permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { exists (total: Long). (sum amt for (amt: Long), (t: Timepoint). where (formerly within 24h (AgentCore::Action::"FundsTarget___transfer_funds"::request{ eventResource: resource, input.amount: amt } && tp(t)))) == total && total < 60000 } when { BedrockGuardrails::SensitiveInformation(["ACCOUNT_NUMBER"], [context.input.body]).count() == 0 } unless { principal in Group::"blocked_users" };
テンポラルブロックは累積上限を適用し、ガードレールブロックはリストされた機密情報を含むリクエストをブロックし、Cedar unlessブロックはブロックされたプリンシパルを除外します。各条件タイプは個別に評価され、許可はすべての条件タイプが保持されている場合にのみ適用されます。ガードレール条件構文については、ポリシーの「ガードレール」を参照してください。一時ブロックは、前の例で説明したように動作します。
例: 並列前提条件
この例では、アクションを許可する前に、任意の順序で 2 つの前提条件を完了する必要があります。と の両方が過去 1 時間以内にget_transaction_history完了したget_account_balance場合にのみ許可transfer_fundsされ、2 つのformerly条件を と組み合わせます&&。
permit ( principal, action == AgentCore::Action::"FundsTarget___get_account_balance", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 1h AgentCore::Action::"FundsTarget___transfer_funds"::response{ eventResource: resource } && formerly within 1h AgentCore::Action::"FundsTarget___get_transaction_history"::response{ eventResource: resource } };
どちらの前提条件もウィンドウ内で (::response) を完了している必要があり、順序は関係ありません。両方の前提条件アクションが記録されるように許可を付与します。一方だけを完了すると、もう一方のアクションも完了するまでアクションが拒否されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
DENY |
|
完了した前提条件は 1 つだけです。 |
DENY |
|
両方の前提条件が完了し、 |
許可 |
例: 承認しきい値
この例では、対象となるイベントのしきい値数後にのみアクションを許可します。これは、少なくとも 2 つの がその顧客のアカウントに対してtransfer_funds完了し、移管の を残高リクエストの toAccountと関連付けている場合にのみ、顧客get_account_balanceに対して を許可しますcustomerId。
permit ( principal, action == AgentCore::Action::"FundsTarget___get_account_balance", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { exists (n: Long). (count for (t: Timepoint). where (formerly within 5m (AgentCore::Action::"FundsTarget___transfer_funds"::response{ eventResource: resource, input.toAccount: context.input.customerId } && tp(t)))) == n && n >= 2 };
count 式は、一致する完了したイベントをウィンドウにカウントし、カウントがしきい値に達するとアクションが許可されます。
注記
count は、個別のプリンシパルではなく、一致するイベントをカウントします。イベントが異なる発信者からのものであることを強制することはできないため、N つの異なる当事者による複数当事者の承認ではなく、「N イベント」のしきい値を表します。
| アカウントへの完了した転送の一致 |
get_account_balance
|
|---|---|
|
2 未満 |
DENY |
|
2 以上 |
許可 |
例: 前の拒否後にアクションをブロックする
この例では、同じセッション内の以前のツール呼び出しが拒否されたときに、機密アクションをブロックします。拒否されたリクエストはerrorイベントとして記録され、::error述語はそのようなイベントと一致します。次のポリシーでは、セッションget_account_balance内の が過去 3 分以内に拒否されるtransfer_fundsたびに が禁止されます。
forbid ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" ) when temporal { formerly within 3m AgentCore::Action::"FundsTarget___get_account_balance"::error{ eventResource: resource } };
forbid ルールは を上書きするためpermit、transfer_funds通常の条件下で permitを許可する とペアリングします。
permit ( principal, action == AgentCore::Action::"FundsTarget___transfer_funds", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway" );
両方のポリシーが設定されている場合、セッション内のリクエストは次のように決定されます。
| セッションのリクエストシーケンス | 決定 |
|---|---|
|
|
許可 |
|
|
DENY |