API 연동 정책 저장소 - Amazon Verified Permissions

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

API 연동 정책 저장소

Amazon 검증 권한 콘솔에서 새 정책 스토어를 생성할 때 API Gateway로 설정 및 ID 소스 옵션을 선택할 수 있습니다. 이 옵션을 사용하면 Amazon Cognito 사용자 풀 또는 OIDC ID 공급자 (IdP) 로 인증하고 Amazon API Gateway API에서 데이터를 가져오는 애플리케이션을 위한 권한 부여 모델인 API 연결 정책 스토어를 구축할 수 있습니다. 시작하려면 연결된 API 및 ID 공급자를 사용하여 정책 저장소 생성 섹션을 참조하십시오.

중요

API Gateway 설정 및 검증된 권한 콘솔의 ID 소스 옵션을 사용하여 생성한 정책 스토어는 프로덕션에 즉시 배포하기 위한 것이 아닙니다. 초기 정책 저장소를 사용하여 권한 부여 모델을 마무리하고 정책 저장소 리소스를 로 CloudFormation 내보냅니다. AWS Cloud Development Kit (CDK) 를 사용하여 검증된 권한을 프로그래밍 방식으로 프로덕션에 배포하십시오. 자세한 정보는 다음을 사용하여 프로덕션으로 이동 AWS CloudFormation을 참조하세요.

API 및 자격 증명 소스에 연결된 정책 저장소에서 애플리케이션은 API에 요청을 보낼 때 권한 부여 헤더에 사용자 풀 토큰을 제공합니다. 정책 저장소의 ID 소스는 검증된 권한에 대한 토큰 검증을 제공합니다. 토큰은 principal IsAuthorizedWithTokenAPI와 함께 승인 요청을 생성합니다. 인증된 권한은 ID (ID) 및 액세스 토큰에 대한 그룹 클레임 (예: 사용자 풀) 에 명시된 바와 같이 사용자의 그룹 멤버십에 cognito:groups 대한 정책을 구축합니다. API는 Lambda 권한 부여자에서 애플리케이션의 토큰을 처리하고 인증 결정을 위해 이를 검증된 권한에 제출합니다. API가 Lambda 권한 부여자로부터 승인 결정을 받으면 요청을 데이터 소스로 전달하거나 요청을 거부합니다.

검증된 권한이 있는 ID 소스 및 API Gateway 권한 부여의 구성 요소
  • 사용자를 인증하고 그룹화하는 Amazon Cognito 사용자 풀 또는 OIDC IdP. 사용자 토큰은 검증 권한이 정책 저장소에서 평가하는 그룹 멤버십과 보안 주체 또는 컨텍스트를 채웁니다.

  • API 게이트웨이 REST API입니다. 검증된 권한은 예를 들어 API 경로와 API 메서드의 작업을 정의합니다MyAPI::Action::get /photo.

  • API를 위한 Lambda 함수 및 Lambda 권한 부여자. Lambda 함수는 사용자 풀에서 베어러 토큰을 받아 검증된 권한으로부터 승인을 요청하고 API Gateway에 결정을 반환합니다. Cognito 및 API Gateway로 설정 워크플로우는 이 Lambda 권한 부여자를 자동으로 생성합니다.

  • 검증된 권한 정책 스토어. 정책 저장소 ID 소스는 사용자 풀입니다. 정책 저장소 스키마는 API 구성을 반영하며 정책은 사용자 그룹을 허용된 API 작업에 연결합니다.

  • IdP로 사용자를 인증하고 API 요청에 토큰을 추가하는 애플리케이션입니다.

검증된 권한이 API 요청을 승인하는 방법

새 정책 저장소를 생성하고 Cognito 및 API Gateway로 설정 옵션을 선택하면 검증된 권한이 정책 저장소 스키마와 정책을 생성합니다. 스키마와 정책은 API 작업과 해당 작업을 수행하도록 승인하려는 사용자 풀 그룹을 반영합니다. 또한 검증된 권한은 Lambda 함수 및 권한 부여자를 생성합니다. API의 메서드에 새 권한 부여자를 구성해야 합니다.

Amazon API Gateway, Amazon Cognito 및 아마존 검증 권한을 사용한 권한 부여 요청의 흐름을 보여주는 다이어그램입니다.
  1. 사용자는 Amazon Cognito 또는 다른 OIDC IdP를 통해 애플리케이션에 로그인합니다. IdP는 사용자 정보와 함께 ID 및 액세스 토큰을 발급합니다.

  2. 애플리케이션은 JWT를 저장합니다. 자세한 내용은 Amazon Cognito 개발자 안내서의 사용자 풀과 함께 토큰 사용을 참조하십시오.

  3. 사용자는 애플리케이션이 외부 API에서 검색해야 하는 데이터를 요청합니다.

  4. 애플리케이션은 API Gateway의 REST API로부터 데이터를 요청합니다. ID 또는 액세스 토큰을 요청 헤더로 추가합니다.

  5. API에 권한 부여 결정을 위한 캐시가 있는 경우 이전 응답을 반환합니다. 캐싱이 비활성화되거나 API에 현재 캐시가 없는 경우, API Gateway는 요청 파라미터를 토큰 기반 Lambda 권한 부여자에게 전달합니다.

  6. Lambda 함수는 API와 함께 검증된 권한 정책 스토어에 권한 부여 요청을 보냅니다. IsAuthorizedWithToken Lambda 함수는 권한 부여 결정의 요소를 전달합니다.

    1. 사용자 토큰이 보안 주체입니다.

    2. API 경로와 결합된 API 메서드 (예: GetPhoto 작업)

    3. Application리소스로서의 용어.

  7. 검증된 권한은 토큰을 검증합니다. Amazon Cognito 토큰을 검증하는 방법에 대한 자세한 내용은 Amazon Cognito 개발자 안내서의 Amazon 검증 권한을 통한 권한 부여를 참조하십시오.

  8. 검증된 권한은 정책 스토어의 정책을 기준으로 권한 부여 요청을 평가하여 승인 결정을 반환합니다.

  9. Lambda 권한 부여자는 API Deny Gateway에 Allow 또는 응답을 반환합니다.

  10. API는 애플리케이션에 데이터 또는 ACCESS_DENIED 응답을 반환합니다. 애플리케이션은 API 요청 결과를 처리하고 표시합니다.

속성 기반 액세스 제어 (ABAC) 추가

IdP를 사용한 일반적인 인증 세션은 ID 및 액세스 토큰을 반환합니다. API에 대한 애플리케이션 요청에서 이러한 토큰 유형 중 하나를 베어러 토큰으로 전달할 수 있습니다. 정책 저장소를 생성할 때 선택한 사항에 따라 Verified Permissions에는 두 가지 유형의 토큰 중 하나가 필요합니다. 두 유형 모두 사용자의 그룹 구성원에 대한 정보를 담고 있습니다. Amazon Cognito의 토큰 유형에 대한 자세한 내용은 Amazon Cognito 개발자 안내서의 사용자 풀과 함께 토큰 사용을 참조하십시오.

정책 저장소를 생성한 후 정책을 추가하고 확장할 수 있습니다. 예를 들어 사용자 풀에 새 그룹을 추가할 때 정책에 새 그룹을 추가할 수 있습니다. 정책 저장소는 사용자 풀이 그룹을 토큰으로 표시하는 방식을 이미 알고 있으므로 새 정책을 사용하여 모든 새 그룹에 대해 일련의 작업을 허용할 수 있습니다.

그룹 기반 정책 평가 모델을 사용자 속성을 기반으로 하는 보다 정확한 모델로 확장할 수도 있습니다. 사용자 풀 토큰에는 권한 부여 결정에 기여할 수 있는 추가 사용자 정보가 포함되어 있습니다.

ID 토큰

ID 토큰은 사용자의 속성을 나타내며 최고 수준의 세분화된 액세스 제어를 제공합니다. 이메일 주소, 전화번호 또는 사용자 지정 특성 (예: 부서 및 관리자) 을 평가하려면 ID 토큰을 평가하세요.

액세스 토큰

액세스 토큰은 OAuth 2.0 범위의 사용자 권한을 나타냅니다. 권한 부여 계층을 추가하거나 추가 리소스 요청을 설정하려면 액세스 토큰을 평가하세요. 예를 들어, 사용자가 적절한 그룹에 속해 있고 일반적으로 API에 대한 액세스를 PetStore.read 승인하는 것과 같은 범위를 가지고 있는지 확인할 수 있습니다. 사용자 풀은 런타임 시 토큰 사용자 지정과 함께 리소스 서버가 있는 토큰에 사용자 지정 범위를 추가할 수 있습니다.

ID 및 액세스 토큰으로 클레임을 처리하는 정책의 스키마 및 정책에서 ID 소스 사용 예를 참조하십시오.

API 연결 정책 저장소에 대한 고려 사항

검증된 권한 콘솔에서 API 연결 정책 저장소를 구축하면 최종 프로덕션 배포를 위한 테스트가 생성됩니다. 프로덕션으로 전환하기 전에 API와 사용자 풀의 고정 구성을 설정하세요. 다음 요소를 고려하세요.

API Gateway는 응답을 캐싱합니다.

API 연결 정책 스토어에서 검증된 권한은 권한 부여 캐싱 TTL이 120초인 Lambda 권한 부여자를 생성합니다. 이 값을 조정하거나 권한 부여자에서 캐싱을 해제할 수 있습니다. 캐싱이 활성화된 권한 부여자에서는 TTL이 만료될 때까지 승인자가 매번 동일한 응답을 반환합니다. 이렇게 하면 요청된 단계의 캐싱 TTL과 동일한 기간까지 사용자 풀 토큰의 유효 수명을 연장할 수 있습니다.

Amazon Cognito 그룹은 재사용할 수 있습니다.

Amazon Verified Permissions는 사용자 ID 또는 액세스 토큰에 대한 cognito:groups 클레임을 기반으로 사용자 풀 사용자의 그룹 구성원 자격을 결정합니다. 이 클레임의 가치는 사용자가 속한 사용자 풀 그룹의 친숙한 이름의 배열입니다. 사용자 풀 그룹을 고유 식별자와 연결할 수 없습니다.

동일한 이름으로 삭제하고 다시 생성한 사용자 풀 그룹은 정책 저장소에 동일한 그룹으로 표시됩니다. 사용자 풀에서 그룹을 삭제하는 경우 해당 그룹에 대한 모든 참조를 정책 저장소에서 삭제하십시오.

API에서 파생된 네임스페이스와 스키마는 다음과 같습니다. point-in-time

검증된 권한은 특정 시점에서 API를 캡처합니다. 즉, 정책 저장소를 생성할 때만 API를 쿼리합니다. API의 스키마나 이름이 변경되면 정책 스토어와 Lambda 권한 부여자를 업데이트하거나 새로운 API 연결 정책 스토어를 생성해야 합니다. 검증된 권한은 API 이름에서 정책 스토어 네임스페이스를 가져옵니다.

Lambda 함수에는 VPC 구성이 없습니다.

검증된 권한이 API 권한 부여자를 위해 생성하는 Lambda 함수는 VPC에 연결되어 있지 않습니다. 기본값입니다. 네트워크 액세스가 프라이빗 VPC로 제한된 API는 검증된 권한으로 액세스 요청을 승인하는 Lambda 함수와 통신할 수 없습니다.

검증된 권한은 권한 부여자 리소스를 다음 위치에 배포합니다. CloudFormation

API 연결 정책 저장소를 생성하려면 권한이 높은 AWS 보안 주체를 Verified Permissions 콘솔에 로그인해야 합니다. 이 사용자는 여러 곳에 걸쳐 리소스를 생성하는 AWS CloudFormation 스택을 배포합니다. AWS 서비스이 보안 주체는 검증된 권한 IAM, Lambda 및 API Gateway에서 리소스를 추가하고 수정할 권한이 있어야 합니다. 가장 좋은 방법은 이러한 자격 증명을 조직의 다른 관리자와 공유하지 않는 것입니다.

검증된 권한이 생성하는 리소스의 개요는 를 다음을 사용하여 프로덕션으로 이동 AWS CloudFormation 참조하십시오.

다음을 사용하여 프로덕션으로 이동 AWS CloudFormation

API 연결 정책 저장소는 API Gateway API에 대한 권한 부여 모델을 빠르게 구축할 수 있는 방법입니다. 애플리케이션의 권한 부여 구성 요소에 대한 테스트 환경으로 사용할 수 있도록 설계되었습니다. 테스트 정책 스토어를 생성한 후에는 정책, 스키마 및 Lambda 권한 부여자를 개선하는 데 시간을 할애하십시오.

API 아키텍처를 조정하여 정책 스토어 스키마 및 정책을 동일하게 조정해야 할 수도 있습니다. API에 연결된 정책 저장소는 API 아키텍처에서 스키마를 자동으로 업데이트하지 않습니다. 검증된 권한은 정책 저장소를 생성할 때만 API를 폴링합니다. API가 충분히 변경되면 새 정책 저장소를 사용하여 프로세스를 반복해야 할 수도 있습니다.

애플리케이션 및 권한 부여 모델을 프로덕션에 배포할 준비가 되면 개발한 API 연결 정책 저장소를 자동화 프로세스와 통합하십시오. 가장 좋은 방법은 정책 저장소 스키마와 정책을 다른 AWS 계정 사이트에 배포할 수 있는 AWS CloudFormation 템플릿으로 내보내는 것입니다. AWS 리전

API 연결 정책 저장소 프로세스의 결과는 초기 정책 저장소와 Lambda 권한 부여자입니다. Lambda 권한 부여자에는 여러 종속 리소스가 있습니다. 검증된 권한은 이러한 리소스를 자동으로 생성된 스택에 배포합니다. CloudFormation 프로덕션에 배포하려면 정책 스토어와 Lambda 권한 부여자 리소스를 템플릿으로 수집해야 합니다. API 연결 정책 스토어는 다음 리소스로 구성됩니다.

  1. AWS::VerifiedPermissions::PolicyStore: 스키마를 객체에 복사합니다. SchemaDefinition 이스케이프 " 문자는 다음과 같습니다\".

  2. AWS::VerifiedPermissions::IdentitySource: 테스트 정책 저장소의 GetIdentitySource 출력에서 값을 복사하고 필요에 따라 수정합니다.

  3. 하나 이상 AWS::VerifiedPermissions::Policy: 정책 설명을 Definition 객체에 복사합니다. 이스케이프 " 문자는 다음과 같습니다\".

  4. AWS: :Lambda: :함수, AWS::IAM: :역할, AWS::IAM: :Policy, AWS::ApiGateway: Authorizer, AWS::Lambda::Permission: 정책 저장소를 생성할 때 검증된 권한이 배포한 스택의 템플릿 탭에서 템플릿을 복사합니다.

다음 템플릿은 정책 저장소의 예시입니다. 기존 스택의 Lambda 권한 부여자 리소스를 이 템플릿에 추가할 수 있습니다.

{ "AWSTemplateFormatVersion": "2010-09-09", "Resources": { "MyExamplePolicyStore": { "Type": "AWS::VerifiedPermissions::PolicyStore", "Properties": { "ValidationSettings": { "Mode": "STRICT" }, "Description": "ApiGateway: PetStore/test", "Schema": { "CedarJson": "{\"PetStore\":{\"actions\":{\"get /pets\":{\"appliesTo\":{\"principalTypes\":[\"User\"],\"resourceTypes\":[\"Application\"],\"context\":{\"type\":\"Record\",\"attributes\":{}}}},\"get /\":{\"appliesTo\":{\"principalTypes\":[\"User\"],\"resourceTypes\":[\"Application\"],\"context\":{\"type\":\"Record\",\"attributes\":{}}}},\"get /pets/{petId}\":{\"appliesTo\":{\"context\":{\"type\":\"Record\",\"attributes\":{}},\"resourceTypes\":[\"Application\"],\"principalTypes\":[\"User\"]}},\"post /pets\":{\"appliesTo\":{\"principalTypes\":[\"User\"],\"resourceTypes\":[\"Application\"],\"context\":{\"type\":\"Record\",\"attributes\":{}}}}},\"entityTypes\":{\"Application\":{\"shape\":{\"type\":\"Record\",\"attributes\":{}}},\"User\":{\"memberOfTypes\":[\"UserGroup\"],\"shape\":{\"attributes\":{},\"type\":\"Record\"}},\"UserGroup\":{\"shape\":{\"type\":\"Record\",\"attributes\":{}}}}}}" } } }, "MyExamplePolicy": { "Type": "AWS::VerifiedPermissions::Policy", "Properties": { "Definition": { "Static": { "Description": "Policy defining permissions for testgroup cognito group", "Statement": "permit(\nprincipal in PetStore::UserGroup::\"us-east-1_EXAMPLE|testgroup\",\naction in [\n PetStore::Action::\"get /\",\n PetStore::Action::\"post /pets\",\n PetStore::Action::\"get /pets\",\n PetStore::Action::\"get /pets/{petId}\"\n],\nresource);" } }, "PolicyStoreId": { "Ref": "MyExamplePolicyStore" } }, "DependsOn": [ "MyExamplePolicyStore" ] }, "MyExampleIdentitySource": { "Type": "AWS::VerifiedPermissions::IdentitySource", "Properties": { "Configuration": { "CognitoUserPoolConfiguration": { "ClientIds": [ "1example23456789" ], "GroupConfiguration": { "GroupEntityType": "PetStore::UserGroup" }, "UserPoolArn": "arn:aws:cognito-idp:us-east-1:123456789012:userpool/us-east-1_EXAMPLE" } }, "PolicyStoreId": { "Ref": "MyExamplePolicyStore" }, "PrincipalEntityType": "PetStore::User" }, "DependsOn": [ "MyExamplePolicyStore" ] } } }