정책 예제
이 섹션에서는 보험 관리 시스템에 대한 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 언어 기능과 권한 부여 패턴을 보여줍니다. 각 정책에는 자연어 설명, 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 범위를 사용하여 특정 작업에 대한 액세스를 제어하는 방법을 보여줍니다.
자연어: 범위가 "insurance:claim"인 보안 주체가 클레임을 제출하도록 허용합니다.
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 연산자는 패턴 일치를 수행하여 "insurance:claim", "insurance:claim:write" 또는 "admin insurance:claim"과 같은 유연한 범위 형식을 허용합니다.
정책 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과 결합하면 두 부분으로 구성된 권한 부여가 생성됩니다. 적용 범위를 업데이트하려면 사용자에게 사용자 이름이 "insurance-agent"이고 역할이 "senior-adjuster" 또는 "manager"여야 합니다.
정책 7:와 패턴 일치 등
이 정책은 범주 기반 액세스 제어를 위해 와일드카드를 사용하는 유연한 패턴 일치를 보여줍니다.
자연어: 적용 범위 유형에 "auto"가 포함된 경우 보안 주체가 프리미엄을 계산하도록 허용합니다.
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 로직과 결합하는 방법을 보여줍니다. coverageType은 존재해야 하고, newLimit은 존재해야 하며, coverageType은 "신뢰성" 또는 "충돌"이어야 한다는 세 가지 조건이 모두 충족되어야 합니다. 이는 정책 6과 함께 작동하여 계층화된 권한 부여, 즉 업데이트할 수 있는 사용자(정책 6)와 업데이트할 수 있는 대상(정책 8)을 생성합니다.
권한 부여 의미 이해
이러한 정책은 주요 Cedar 권한 부여 의미 체계를 보여줍니다.
기본 거부
명시적으로 작업을 허용하는 정책이 없는 경우 작업이 거부됩니다. 예를 들어 "insurance:claim" 범위가 없는 사용자는 명시적으로 금지하는 정책이 없더라도 클레임을 제출할 수 없습니다.
금지 획득
금지 정책이 일치하면 허용 정책도 일치하더라도 요청이 거부됩니다. 정책 5(설명 없이 금지됨)는 설명이 누락된 경우 정책 2(범위가 있는 권한)를 재정의합니다.
정책 계층화
동일한 요청에 여러 정책을 적용할 수 있습니다.
-
정책 6은 보험 에이전트가 적용 범위를 업데이트하도록 허용합니다.
-
정책 3은 사용자에게 고위 관리자 또는 관리자 역할이 없는 한 업데이트를 금지합니다.
-
정책 8은 책임 또는 충돌 유형에 대해서만 업데이트를 허용합니다.
요청이 성공하려면 보험 에이전트(정책 6), 고위 관리자 또는 관리자 역할(정책 3), 책임 또는 충돌 업데이트(정책 8)의 세 가지를 모두 충족해야 합니다.
테스트 시나리오
다음 시나리오에서는 정책이 실제로 어떻게 함께 작동하는지 보여줍니다.
- 시나리오 1: 일반 사용자 보기 정책
-
사용자: username="john", scope="insurance:view"
작업: get_policy
예상: 허용(정책 1)
- 시나리오 2: 설명과 함께 상태 클레임을 제출하는 사용자
-
사용자: username="jane", scope="insurance:claim"
작업: claimType="health", description="Medical expenses"가 포함된 file_claim
예상: 허용(정책 2, 정책 4, 정책 5는 금지되지 않음)
- 시나리오 3: 설명 없이 클레임을 제출하는 사용자
-
사용자: username="jane", scope="insurance:claim"
작업: file_claim with claimType="health", 설명 없음
예상: 거부(정책 5 금지 성공)
- 시나리오 4: 보험 에이전트 업데이트 적용 범위
-
사용자: username="insurance-agent", role="senior-adjuster"
작업: coverageType="liability"인 update_coverage
예상: 허용(정책 6, 정책 3은 금지되지 않음, 정책 8)
- 시나리오 5: 고위 역할이 없는 보험 에이전트
-
사용자: username="insurance-agent", role="agent"
작업: coverageType="liability"인 update_coverage
예상: 거부(정책 3 금지 성공)
- 시나리오 6: 자동 적용 범위에 대한 프리미엄 계산
-
사용자: username="anyone", scope="any"
작업: calculate_premium with coverageType="auto-liability"
예상: 허용(정책 7, 패턴 일치 "auto")
IAM 기반 권한 부여 예제
AgentCore Gateway가 OAuth 대신 AWS_IAM 인증을 사용하는 경우 Cedar 정책의 보안 주체는 로 표시됩니다AgentCore::IamEntity. 수임된 역할을 통해 인증하는 호출자의 경우 Cedar 엔터티 ID는 형식을 사용하여 안정적인 principal == 일치 및 principal.id 패턴 일치를 arn:aws:sts::<account>:assumed-role/<role-name>활성화합니다.
기본 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 역할이 다르고 도구 액세스 수준이 다른 다중 에이전트 아키텍처에 유용합니다. 각 정책은를 특정 역할의 엔터티 IDprincipal ==와 함께 사용합니다. 각 에이전트에 대한 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에서를 수임하는 호출자만 환급 금액이 1,000 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-wins 의미론으로 인해 이는 모든 허용 정책보다 우선합니다.
민감한 작업에서 특정 역할 금지
읽기 전용 역할을 사용하는 호출자가 쓰기 작업을 수행하지 못하도록 차단합니다.
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 수행하지 못하도록 합니다.