기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
자격 증명 소스는 Amazon Verified Permissions에서 외부 자격 증명 공급자(IdP)를 나타냅니다. 자격 증명 소스는 정책 스토어와 신뢰 관계가 있는 IdP로 인증된 사용자의 정보를 제공합니다. 애플리케이션이 자격 증명 소스의 토큰으로 권한 부여를 요청할 때 정책 스토어는 사용자 속성 및 액세스 권한에서 권한 부여를 결정할 수 있습니다. Amazon Cognito 사용자 풀 또는 사용자 지정 OpenID Connect(OIDC) IdP를 자격 증명 소스로 추가할 수 있습니다.
Verified Permissions와 함께 OpenID Connect(OIDC)groups
보안 주체 그룹에 매핑하고 역할 기반 액세스 제어(RBAC)를 평가하는 정책을 구축할 수 있습니다.
참고
Verified Permissions는 IdP 토큰의 정보를 기반으로 권한 부여 결정을 내리지만 어떤 방식으로도 IdP와 직접 상호 작용하지 않습니다.
Amazon Cognito 사용자 풀 또는 OIDC 자격 증명 공급자를 사용하여 Amazon API Gateway REST APIs에 대한 권한 부여 로직을 빌드하는 step-by-step 연습은 Amazon Amazon Cognito에서 Amazon Verified Permissions를 사용하여 API Gateway APIs 권한 부여를 참조하거나 보안 블로그에서 자체 자격 증명 공급자를 가져옵니다
주제
Amazon Cognito 자격 증명 소스 작업
Verified Permissions는 Amazon Cognito 사용자 풀과 밀접하게 작동합니다. Amazon Cognito JWTs 예측 가능한 구조를 갖습니다. Verified Permissions는이 구조를 인식하고 포함된 정보를 최대한 활용합니다. 예를 들어 ID 토큰 또는 액세스 토큰을 사용하여 역할 기반 액세스 제어(RBAC) 권한 부여 모델을 구현할 수 있습니다.
새 Amazon Cognito 사용자 풀 자격 증명 소스에는 다음 정보가 필요합니다.
-
AWS 리전.
-
사용자 풀 ID입니다.
-
자격 증명 소스와 연결할 보안 주체 엔터티 유형입니다. 예:
MyCorp::User
. -
자격 증명 소스와 연결할 보안 주체 그룹 개체 유형입니다. 예:
MyCorp::UserGroup
. -
가 정책 스토어에 요청할 수 있도록 승인하려는 사용자 풀의 클라이언트 IDs입니다.
Verified Permissions는 동일한의 Amazon Cognito 사용자 풀에서만 작동하므로 다른 계정에서 자격 증명 소스를 지정할 AWS 계정수 없습니다. Verified Permissions는 사용자 풀 보안 주체를 대상으로 하는 정책에서 참조해야 하는 자격 증명 소스 식별자인 엔터티 접두사를와 같은 사용자 풀의 ID로 설정합니다us-west-2_EXAMPLE
. 이 경우 ID가 인 해당 사용자 풀의 사용자를 참조a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
합니다. us-west-2_EXAMPLE|a1b2c3d4-5678-90ab-cdef-EXAMPLE22222
사용자 풀 토큰 클레임에는 속성, 범위, 그룹, 클라이언트 IDs 및 사용자 지정 데이터가 포함될 수 있습니다. Amazon Cognito JWTs Verified Permissions에서 권한 부여 결정에 기여할 수 있는 다양한 정보를 포함할 수 있습니다. 다음이 포함됩니다.
-
cognito:
접두사가 있는 사용자 이름 및 그룹 클레임 -
를 사용한 사용자 지정 사용자 속성
custom: prefix
-
런타임에 추가된 사용자 지정 클레임
-
sub
및와 같은 OIDC 표준 클레임email
이러한 클레임과의 Verified Permissions 정책에서 클레임을 관리하는 방법을 자세히 다룹니다스키마에 자격 증명 공급자 토큰 매핑.
중요
만료되기 전에 Amazon Cognito 토큰을 취소할 수 있지만, JWT는 서명과 유효성을 갖춘 독립형 상태 비저장 리소스로 간주됩니다. JSON 웹 토큰 RFC 7519
다음 예제에서는 보안 주체와 연결된 Amazon Cognito 사용자 풀 클레임 중 일부를 참조하는 정책을 생성하는 방법을 보여줍니다.
permit(
principal,
action,
resource == ExampleCo::Photo::"VacationPhoto94.jpg"
)
when {
principal["cognito:username"]) == "alice" &&
principal["custom:department"]) == "Finance"
};
다음 예제에서는 Cognito 사용자 풀의 사용자인 보안 주체를 참조하는 정책을 생성하는 방법을 보여줍니다. 보안 주체 ID는의 형식을 취합니다"<userpool-id>|<sub>"
.
permit(
principal == ExampleCo::User::"us-east-1_example|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
action,
resource == ExampleCo::Photo::"VacationPhoto94.jpg"
);
Verified Permissions의 사용자 풀 자격 증명 소스에 대한 시더 정책은 영숫자 및 밑줄() 이외의 문자가 포함된 클레임 이름에 특수 구문을 사용합니다_
. 여기에는 cognito:username
및와 같은 :
문자가 포함된 사용자 풀 접두사 클레임이 포함됩니다custom:department
. cognito:username
또는 custom:department
클레임을 참조하는 정책 조건을 작성하려면 principal["custom:department"]
각각 principal["cognito:username"]
및 로 작성합니다.
참고
토큰에 custom:
접두사가 cognito:
또는 이고 클레임 이름이 리터럴 값 cognito
또는 인 클레임이 포함된 경우 IsAuthorizedWithToken을 사용한 custom
권한 부여 요청은에서 실패합니다ValidationException
.
클레임 매핑에 대한 자세한 내용은 섹션을 참조하세요스키마에 ID 토큰 매핑. Amazon Cognito 사용자의 권한 부여에 대한 자세한 내용은 Amazon Amazon Cognito 개발자 안내서의 Amazon Verified Permissions 권한 부여를 참조하세요.
OIDC 자격 증명 소스 작업
규정 준수 OpenID Connect(OIDC) IdP를 정책 스토어의 자격 증명 소스로 구성할 수도 있습니다. OIDC 공급자는 Amazon Cognito 사용자 풀과 유사하며 인증의 결과로 JWTs를 생성합니다. OIDC 공급자를 추가하려면 발급자 URL을 제공해야 합니다.
새 OIDC 자격 증명 소스에는 다음 정보가 필요합니다.
-
발급자 URL입니다. Verified Permissions는이 URL에서
.well-known/openid-configuration
엔드포인트를 검색할 수 있어야 합니다. -
와일드카드가 포함되지 않은 CNAME 레코드입니다. 예를 들어는에 매핑할
a.example.com
수 없습니다*.example.net
. 반대로는에 매핑할*.example.com
수 없습니다a.example.net
. -
권한 부여 요청에 사용할 토큰 유형입니다. 이 경우 자격 증명 토큰을 선택합니다.
-
와 같이 자격 증명 소스와 연결할 사용자 엔터티 유형입니다
MyCorp::User
. -
와 같이 자격 증명 소스와 연결할 그룹 개체 유형입니다
MyCorp::UserGroup
. -
ID 토큰 예제 또는 ID 토큰의 클레임 정의.
-
사용자 및 그룹 개체 IDs. CLI 및 API에서이 접두사를 선택할 수 있습니다. API Gateway 설정 및 자격 증명 공급자 또는 안내 설정 옵션으로 생성한 정책 스토어에서 Verified Permissions는 발급자 이름에서를 뺀 접두사를 할당합니다. 예를 들면
https://
입니다MyCorp::User::"auth.example.com|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
.
API 작업을 사용하여 OIDC 소스의 요청을 승인하는 방법에 대한 자세한 내용은 섹션을 참조하세요권한 부여에 사용 가능한 API 작업.
다음 예제는 회계 부서의 직원에 대한 연말 보고서에 대한 액세스를 허용하고 기밀 분류를 보유하며 위성 사무실에 있지 않은 정책을 생성하는 방법을 보여줍니다. Verified Permissions는 보안 주체의 ID 토큰에 있는 클레임에서 이러한 속성을 파생합니다.
보안 주체의 그룹을 참조할 때 정책을 올바르게 평가하려면 in
연산자를 사용해야 합니다.
permit(
principal in MyCorp::UserGroup::"MyOIDCProvider|Accounting",
action,
resource in MyCorp::Folder::"YearEnd2024"
) when {
principal.jobClassification == "Confidential" &&
!(principal.location like "SatelliteOffice*")
};
클라이언트 및 대상 검증
정책 스토어에 자격 증명 소스를 추가하면 Verified Permissions에는 ID 및 액세스 토큰이 의도한 대로 사용되고 있는지 확인하는 구성 옵션이 있습니다. 이 검증은 IsAuthorizedWithToken
및 BatchIsAuthorizedWithToken
API 요청 처리에서 수행됩니다. 동작은 ID와 액세스 토큰 간에, 그리고 Amazon Cognito와 OIDC 자격 증명 소스 간에 다릅니다. Amazon Cognito 사용자 풀 공급자를 사용하면 Verified Permissions가 ID와 액세스 토큰 모두에서 클라이언트 ID를 검증할 수 있습니다. OIDC 공급자를 통해 Verified Permissions는 ID 토큰의 클라이언트 ID와 액세스 토큰의 대상을 검증할 수 있습니다.
클라이언트 ID는 애플리케이션이 사용하는 자격 증명 공급자 인스턴스와 연결된 식별자입니다. 예: 1example23456789
. 대상은와 같은 액세스 토큰의 의도한 신뢰 당사자 또는 대상과 연결된 URL 경로입니다https://mytoken.example.com
. 액세스 토큰을 사용할 때 aud
클레임은 항상 대상과 연결됩니다.
Verified Permissions는 다음과 같이 자격 증명 소스 대상 및 클라이언트 검증을 수행합니다.
Amazon Cognito ID 토큰에는 앱 클라이언트 ID가 포함된 aud
클레임이 있습니다. 액세스 토큰에는 앱 클라이언트 ID도 포함된 client_id
클레임이 있습니다.
자격 증명 소스에 클라이언트 애플리케이션 검증 값을 하나 이상 입력하면 Verified Permissions는이 앱 클라이언트 IDs 목록을 ID 토큰 aud
클레임 또는 액세스 토큰 client_id
클레임과 비교합니다. Verified Permissions는 Amazon Cognito 자격 증명 소스에 대한 신뢰 당사자 대상 URL을 검증하지 않습니다.
JWTs 대한 클라이언트 측 권한 부여
정책 스토어 자격 증명 소스를 사용하지 않고 애플리케이션에서 JSON 웹 토큰을 처리하고 해당 클레임을 Verified Permissions에 전달할 수 있습니다. JSON 웹 토큰(JWT)에서 개체 속성을 추출하여 Verified Permissions로 구문 분석할 수 있습니다.
이 예제는 JWT를 사용하여 애플리케이션에서 Verified Permissions를 호출하는 방법을 보여줍니다.1
async function authorizeUsingJwtToken(jwtToken) {
const payload = await verifier.verify(jwtToken);
let principalEntity = {
entityType: "PhotoFlash::User", // the application needs to fill in the relevant user type
entityId: payload["sub"], // the application need to use the claim that represents the user-id
};
let resourceEntity = {
entityType: "PhotoFlash::Photo", //the application needs to fill in the relevant resource type
entityId: "jane_photo_123.jpg", // the application needs to fill in the relevant resource id
};
let action = {
actionType: "PhotoFlash::Action", //the application needs to fill in the relevant action id
actionId: "GetPhoto", //the application needs to fill in the relevant action type
};
let entities = {
entityList: [],
};
entities.entityList.push(...getUserEntitiesFromToken(payload));
let policyStoreId = "PSEXAMPLEabcdefg111111"; // set your own policy store id
const authResult = await client
.isAuthorized({
policyStoreId: policyStoreId,
principal: principalEntity,
resource: resourceEntity,
action: action,
entities,
})
.promise();
return authResult;
}
function getUserEntitiesFromToken(payload) {
let attributes = {};
let claimsNotPassedInEntities = ['aud', 'sub', 'exp', 'jti', 'iss'];
Object.entries(payload).forEach(([key, value]) => {
if (claimsNotPassedInEntities.includes(key)) {
return;
}
if (Array.isArray(value)) {
var attibuteItem = [];
value.forEach((item) => {
attibuteItem.push({
string: item,
});
});
attributes[key] = {
set: attibuteItem,
};
} else if (typeof value === 'string') {
attributes[key] = {
string: value,
}
} else if (typeof value === 'bigint' || typeof value ==='number') {
attributes[key] = {
long: value,
}
} else if (typeof value === 'boolean') {
attributes[key] = {
boolean: value,
}
}
});
let entityItem = {
attributes: attributes,
identifier: {
entityType: "PhotoFlash::User",
entityId: payload["sub"], // the application needs to use the claim that represents the user-id
}
};
return [entityItem];
}
¹ 이 코드 예제는 aws-jwt-verify