政策範例
本節提供保險管理系統 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執行寫入操作,無論可能以其他方式允許的任何允許政策為何。