本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
身分來源是 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 Verified Permissions 搭配 Amazon Cognito 授權 API Gateway APIs,或在安全部落格上自攜身分提供者
主題
使用 Amazon Cognito 身分來源
已驗證的許可與 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
-
在執行時間新增的自訂宣告
-
OIDC 標準宣告,例如
sub
和email
我們會詳細說明這些宣告,以及如何在 的 Verified Permissions 政策中管理這些宣告將身分提供者字符映射至結構描述。
重要
雖然您可以在過期前撤銷 Amazon Cognito 權杖,但 JWTs被視為無狀態資源,這些資源會與簽章和有效性獨立。符合 JSON Web 權杖 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 中使用者集區身分來源的 Cedar 政策針對包含英數字元和底線 () 以外的字元的宣告名稱使用特殊語法_
。這包括包含:
字元的使用者集區字首宣告,例如 cognito:username
和 custom:department
。若要撰寫參考 cognito:username
或 custom:department
宣告的政策條件principal["custom:department"]
,請分別將它們寫入 principal["cognito:username"]
和 。
注意
如果權杖包含具有 cognito:
或 custom:
字首的宣告,以及具有常值 cognito
或 的宣告名稱custom
,IsAuthorizedWithToken 的授權請求將使用 失敗ValidationException
。
如需映射宣告的詳細資訊,請參閱將 ID 字符映射至結構描述。如需 Amazon Cognito 使用者授權的詳細資訊,請參閱《Amazon Amazon Cognito開發人員指南》中的使用 Amazon 驗證許可授權。
使用 OIDC 身分來源
您也可以將任何合規的 OpenID Connect (OIDC) IdP 設定為政策存放區的身分來源。OIDC 提供者類似於 Amazon Cognito 使用者集區:它們會產生 JWTs作為身分驗證產品。若要新增 OIDC 提供者,您必須提供發行者 URL
新的 OIDC 身分來源需要下列資訊:
-
發行者 URL。驗證的許可必須能夠在此 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 設定和身分提供者或引導式設定選項建立的政策存放區中,驗證許可會指派發行者名稱減 的字首
https://
,例如MyCorp::User::"auth.example.com|a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
。
如需使用 API 操作來授權來自 OIDC 來源請求的詳細資訊,請參閱 授權可用的 API 操作。
以下範例示範如何建立政策,允許會計部門員工存取年底報告、進行機密分類,而且不在衛星辦公室。已驗證的許可會從委託人的 ID 權杖中的宣告衍生這些屬性。
請注意,在主體中參考群組時,您必須使用 in
運算子才能正確評估政策。
permit(
principal in MyCorp::UserGroup::"MyOIDCProvider|Accounting",
action,
resource in MyCorp::Folder::"YearEnd2024"
) when {
principal.jobClassification == "Confidential" &&
!(principal.location like "SatelliteOffice*")
};
用戶端和對象驗證
當您將身分來源新增至政策存放區時,已驗證許可具有組態選項,可驗證 ID 和存取權杖是否如預期般使用。此驗證會在處理 IsAuthorizedWithToken
和 BatchIsAuthorizedWithToken
API 請求時發生。ID 和存取字符,以及 Amazon Cognito 和 OIDC 身分來源的行為有所不同。使用 Amazon Cognito 使用者集區提供者,驗證許可可以驗證 ID 和存取權杖中的用戶端 ID。使用 OIDC 提供者時,已驗證許可可以在 ID 字符中驗證用戶端 ID,並在存取字符中驗證對象。
用戶端 ID 是與您的應用程式使用的身分提供者執行個體相關聯的識別符,例如 1example23456789
。對象是與存取權杖的預期相依方或目的地相關聯的 URL 路徑,例如 https://mytoken.example.com
。使用存取權杖時,aud
宣告一律與對象相關聯。
Verified Permissions 會執行身分來源對象和用戶端驗證,如下所示:
Amazon Cognito ID 權杖具有包含應用程式用戶端 ID 的aud
宣告。存取權杖的client_id
宣告也包含應用程式用戶端 ID。
當您在身分來源中輸入一或多個用戶端應用程式驗證值時,驗證許可會將此應用程式用戶端 IDs 清單與 ID 字符aud
宣告或存取字符client_id
宣告進行比較。Verified Permissions 不會驗證 Amazon Cognito 身分來源的相依對象 URL。
JWTs的用戶端授權
您可能想要在應用程式中處理 JSON Web 字符,並將其宣告傳遞給驗證許可,而無需使用政策存放區身分來源。您可以從 JSON Web 權杖 (JWT) 擷取實體屬性,並將其剖析為驗證許可。
此範例示範如何使用 JWT.1 從應用程式呼叫 Verified Permissions。
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];
}
1 此程式碼範例使用 aws-jwt-verify