View a markdown version of this page

政策範例 - Amazon Bedrock AgentCore

政策範例

本節提供保險管理系統 Cedar 授權政策的完整範例。這些範例示範各種 Cedar 語言功能和授權模式,您可以針對自己的應用程式進行調整。

可用的工具

保險 API 提供五種工具來管理保險政策和索賠:

InsuranceAPI___get_policy

擷取保險政策詳細資訊。

參數:

  • policyId (字串,必要) - 政策識別符

InsuranceAPI___file_claim

提出保險索賠。

參數:

  • policyId (字串,必要) - 政策識別符

  • claimType (字串,必要) - 宣告類型 (例如 "health"、"property"、"auto")

  • amount (數目,必要) - 申請金額

  • description (字串,選用) - 宣告描述

InsuranceAPI___update_coverage

更新政策涵蓋範圍。

參數:

  • policyId (字串,必要) - 政策識別符

  • coverageType (字串,必要) - 涵蓋範圍類型 (例如「責任」、「碰撞」)

  • newLimit (數量,必要) - 新的涵蓋範圍限制

InsuranceAPI___get_claim_status

檢查宣告狀態。

參數:

  • claimId (字串,必要) - 宣告識別符

InsuranceAPI___calculate_premium

計算保險費。

參數:

  • coverageType (字串,必要) - 涵蓋範圍類型

  • coverageAmount (數字,必要) - 涵蓋金額

  • riskFactors (物件,選用) - 風險評估因素

授權政策

下列政策示範各種 Cedar 語言功能和授權模式。每個政策都包含自然語言描述、雪松程式碼和詳細說明。

政策 1:多動作許可

此政策示範如何使用單一政策陳述式授予對多個相關動作的存取權。

自然語言:允許所有主體取得政策並取得宣告狀態。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action in [ AgentCore::Action::"InsuranceAPI___get_policy", AgentCore::Action::"InsuranceAPI___get_claim_status" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" );

說明:此政策示範使用 in 運算子的多動作許可。單一政策會授予對多個相關動作的存取權,而不是為每個讀取操作撰寫個別政策。這對於分組具有相同授權需求的類似操作很有用。

政策 2:範圍型授權

此政策說明如何使用 OAuth 範圍來控制對特定操作的存取。

自然語言:允許範圍包含「保險:宣告」的主體提交宣告。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { principal.hasTag("scope") && principal.getTag("scope") like "*insurance:claim*" };

說明:此政策示範使用標籤進行 OAuth 範圍驗證。hasTag 方法會檢查標籤是否存在,並getTag擷取其值。使用萬用字元 (*) 的like運算子會執行模式比對,允許靈活的範圍格式,例如「保險:回收」、「保險:回收:寫入」或「管理保險:回收」。

政策 3:使用 的角色型授權,除非

此政策示範如何使用 unless子句來建立限制的例外狀況。

自然語言:封鎖主體更新涵蓋範圍,除非主體具有角色「資深調整器」或「管理員」。

Cedar 政策:

forbid( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) unless { principal.hasTag("role") && (principal.getTag("role") == "senior-adjuster" || principal.getTag("role") == "manager") };

說明:此政策示範 unless子句,這會反轉條件邏輯。除非使用者具有其中一個指定的角色,否則適用 禁止。這對於建立限制的例外狀況很有用。此政策也會顯示用於檢查多個可接受值的 OR 邏輯。

政策 4:字串與 OR 邏輯的相等性

此政策說明如何驗證輸入參數,並針對多個可接受的值使用 OR 邏輯。

自然語言:當宣告類型為運作狀態、屬性或自動時,允許主體提交宣告。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has claimType && (context.input.claimType == "health" || context.input.claimType == "property" || context.input.claimType == "auto") };

說明:此政策示範使用 OR 邏輯透過 context.input和字串相等性檢查來存取工具輸入參數。has 運算子會先驗證欄位是否存在,再存取該欄位,避免在缺少選用欄位時發生錯誤。

政策 5:欄位存在檢查

此政策示範如何透過要求選用欄位來強制執行業務規則。

自然語言:除非提供描述,否則封鎖主體提出宣告。

Cedar 政策:

forbid( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) unless { context.input has description };

說明:此政策示範強制執行選用參數的必要欄位。描述欄位在工具結構描述中是選用的,但此政策會禁止不包含它的請求,使其成為強制性的。這會顯示政策如何新增結構描述驗證以外的業務規則。

政策 6:以使用者名稱為基礎的授權

此政策說明如何根據特定使用者身分授予存取權。

自然語言:允許使用者名稱為 "Clare" 的主體更新涵蓋範圍。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { principal.hasTag("username") && principal.getTag("username") == "Clare" };

說明:此政策示範使用確切字串比對的使用者名稱型授權。結合政策 3,這會建立兩部分授權:使用者必須具有使用者名稱「保險代理程式」,並具有角色「資深調整器」或「管理員」來更新涵蓋範圍。

政策 7:與類似 的模式比對

此政策示範使用萬用字元進行類別型存取控制的彈性模式比對。

自然語言:當涵蓋範圍類型包含「自動」時,允許主體計算溢價。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___calculate_premium", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has coverageType && context.input.coverageType like "*auto*" };

說明:此政策示範與like運算子的彈性模式比對。萬用字元 * 符合任何字元,因此 "auto"、"auto-liability"、"comprehensive-auto" 或 "auto-collision" 都會符合。當您想要比對某個類別的值,而不是確切的字串時,這會很有用。

政策 8:合併條件與 AND

此政策說明如何結合多個條件來建立複雜的授權規則。

自然語言:當涵蓋範圍類型為責任或碰撞,並提供新的限制時,允許主體更新涵蓋範圍。

Cedar 政策:

permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has coverageType && context.input has newLimit && (context.input.coverageType == "liability" || context.input.coverageType == "collision") };

說明:此政策示範將多個條件與 AND 邏輯結合。所有三個條件都必須為 true: coverageType 必須存在, newLimit 必須存在,且 coverageType 必須「可靠性」或「碰撞」。這可與政策 6 搭配使用來建立分層授權:誰可以更新 (政策 6) 及其可以更新的內容 (政策 8)。

了解授權語意

這些政策示範關鍵的 Cedar 授權語意:

預設拒絕

如果沒有政策明確允許 動作,則會拒絕該動作。例如,即使沒有政策明確禁止,沒有「保險:宣告」範圍的使用者也無法提出宣告。

禁止獲勝

如果任何禁止政策相符,即使允許政策也相符,請求也會遭到拒絕。缺少描述時,政策 5 (禁止無描述) 會覆寫政策 2 (允許範圍)。

政策分層

多個政策可以套用至相同的請求:

  • 政策 6 允許保險代理更新涵蓋範圍

  • 政策 3 禁止更新,除非使用者具有資深調整人員或經理角色

  • 政策 8 僅允許針對責任或碰撞類型進行更新

若要讓請求成功,必須滿足以下三個條件:成為保險經紀人 (政策 6)、擁有資深調整者或經理角色 (政策 3),以及更新責任或衝突 (政策 8)。

測試情境

下列案例示範政策如何實際運作:

案例 1:一般使用者檢視政策

使用者:namename="john", scope="management:view"

動作:get_policy

預期:允許 (政策 1)

案例 2:使用者使用描述提交運作狀態宣告

使用者:namename="jane", scope="management:claim"

動作:file_claim with claimType="health", description="Medical expenses"

預期:允許 (政策 2、政策 4、政策 5 不禁止)

案例 3:使用者提交不帶描述的宣告

使用者:namename="jane", scope="management:claim"

動作:file_claim with claimType="health",無描述

預期:DENY (政策 5 禁止獲勝)

案例 4:保險代理更新涵蓋範圍

使用者:namename="management-agent", role="senior-adjuster"

動作:update_coverage with coverageType="liability"

預期:允許 (政策 6、政策 3 不禁止、政策 8)

案例 5:沒有資深角色的保險代理

使用者:namename="management-agent", role="agent"

動作:update_coverage with coverageType="liability"

預期:DENY (政策 3 禁止獲勝)

案例 6:自動涵蓋範圍的進階計算

使用者:namename="anyone", scope="any"

動作:Calculate_premium with coverageType="auto-liability"

預期:允許 (政策 7,模式符合「自動」)

IAM 型授權範例

當您的 AgentCore Gateway 使用 AWS_IAM 身分驗證而非 OAuth 時,Cedar 政策中的主體會顯示為 AgentCore::IamEntity。對於透過擔任的角色進行身分驗證的發起人,Cedar 實體 ID 會使用 格式arn:aws:sts::<account>:assumed-role/<role-name>,從而實現穩定的principal ==比對和principal.id模式比對。

基本 IAM 實體許可

此政策允許任何經 IAM 驗證的發起人使用特定工具:

permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___get_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );

說明:這是最簡單的 IAM 政策形式。它允許透過 AWS_IAM 驗證的任何發起人呼叫 get_order 工具。當您只需要驗證來電者是否經過 IAM 驗證,且沒有其他限制時,請使用此選項。

具有完全主體相符的角色型限制

使用 使用特定 IAM 角色限制呼叫者的工具存取principal ==

permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/MyServiceRole", action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );

說明:擔任角色的 Cedar 實體 ID 為 arn:aws:sts::<account>:assumed-role/<role-name>。這允許穩定principal ==比對,無論驗證期間使用的工作階段名稱為何。

具有模式比對的角色型限制

您也可以將 principal.id like 用於更廣泛的比對模式:

permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ) when { principal.id like "arn:aws:sts::111122223333:assumed-role/MyServiceRole" };

說明:這可達到與 相同的結果,principal ==但使用 when子句。當您需要更廣泛的比對時,模式比對很有用,例如比對帳戶中的任何角色 (principal.id like "arn:aws:sts::111122223333:assumed-role/*")。

以帳戶為基礎的限制

限制來自特定 AWS 帳戶的呼叫者存取工具:

permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ) when { principal.id like "*:111122223333:*" };

說明:模式 *:111122223333:* 符合任何包含該帳戶 ID 的 ARN。這只會限制來自指定 AWS 帳戶的呼叫者存取。

多代理聯合

當具有不同 IAM 角色的多個客服人員存取相同的閘道時,請建立個別政策來控制每個客服人員可以使用哪些工具:

// Agent A can only read orders permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/AgentA-Role", action == AgentCore::Action::"OrderAPI___get_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ); // Agent B can read and process orders permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/AgentB-Role", action in [ AgentCore::Action::"OrderAPI___get_order", AgentCore::Action::"OrderAPI___process_order" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );

說明:此模式適用於多代理程式架構,其中不同的代理程式具有不同的 IAM 角色,且應具有不同層級的工具存取。每個政策使用 principal ==搭配特定角色的實體 ID。每個代理程式的tools/list回應僅包含他們獲授權使用的工具。

具有輸入驗證的 IAM

結合 IAM 主體比對與工具輸入驗證:

permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/RefundProcessorRole", action == AgentCore::Action::"RefundAPI___process_refund", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/refund-gateway" ) when { context.input has amount && context.input.amount < 1000 };

說明:此政策結合了確切的委託人比對與輸入驗證。只有RefundProcessorRole從指定帳戶假設 的來電者才能處理退款,而且只有在退款金額低於 1000 USD 時。

禁止特定帳戶

封鎖來自特定 AWS 帳戶的發起人存取敏感工具:

forbid( principal is AgentCore::IamEntity, action == AgentCore::Action::"AdminAPI___delete_resource", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/admin-gateway" ) when { principal.id like "*:444455556666:*" };

說明:此禁止政策會封鎖來自第三方供應商帳戶 ((444455556666) 的所有發起人執行管理刪除。由於禁止雙語語義,這優先於任何許可政策。

禁止敏感操作的特定角色

使用唯讀角色封鎖發起人執行寫入操作:

forbid( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/ReadOnlyAgentRole", action in [ AgentCore::Action::"OrderAPI___process_order", AgentCore::Action::"OrderAPI___cancel_order" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );

說明:此禁止政策可防止使用 的呼叫者ReadOnlyAgentRole執行寫入操作,無論可能以其他方式允許的任何允許政策為何。