Contrôle d'accès basé sur les rôles - Amazon Cognito

Contrôle d'accès basé sur les rôles

Les groupes d'identités Amazon Cognito attribuent à vos utilisateurs authentifiés un ensemble d'informations d'identification temporaires aux privilèges limités pour accéder à vos ressources AWS. Les autorisations pour chaque utilisateur sont contrôlées via des rôles IAM que vous créez. Vous pouvez définir des règles pour choisir le rôle pour chaque utilisateur en fonction de demandes dans le jeton d'ID de l'utilisateur. Vous pouvez définir un rôle par défaut pour les utilisateurs authentifiés. Vous pouvez également définir un rôle IAM distinct avec des autorisations limitées pour les utilisateurs invités qui ne sont pas authentifiés.

Création de rôles pour le mappage de rôles

Il est important d'ajouter la politique d'approbation appropriée pour chaque rôle afin que celui-ci puisse uniquement être assumé par Amazon Cognito pour les utilisateurs authentifiés dans votre groupe d'identités. Voici un exemple d'une telle politique d'approbation :

{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Federated": "cognito-identity.amazonaws.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "cognito-identity.amazonaws.com:aud": "us-east-1:12345678-corner-cafe-123456790ab" }, "ForAnyValue:StringLike": { "cognito-identity.amazonaws.com:amr": "authenticated" } } } ] }

Cette politique autorise les utilisateurs fédérés à partir de cognito-identity.amazonaws.com (diffuseur du jeton OpenID Connect) à assumer ce rôle. En outre, la politique restreint le paramètre aud du jeton (dans ce cas, l'ID du groupe d'identités) pour qu'il corresponde au groupe d'identités. Enfin, la politique spécifie que l'un des membres du tableau de la revendication amr de valeur multiple du jeton émis par l'action API GetOpenIdToken Amazon Cognito possède la valeur authenticated.

Octroi d'une autorisation de transmission de rôle

Pour permettre à un utilisateur IAM de définir des rôles avec des autorisations dépassant les autorisations existantes de l'utilisateur sur un groupe d'identités, vous accordez à cet utilisateur l'autorisation iam:PassRole pour transmettre le rôle à l'API set-identity-pool-roles. Par exemple, si l'utilisateur ne peut pas écrire dans Amazon S3 mais que le rôle IAM que l'utilisateur définit sur le groupe d'identités accorde une autorisation en écriture dans Amazon S3, l'utilisateur peut définir ce rôle uniquement si une autorisation iam:PassRole est octroyée pour le rôle. L'exemple de politique suivant montre comment accorder l'autorisation iam:PassRole.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1", "Effect": "Allow", "Action": [ "iam:PassRole" ], "Resource": [ "arn:aws:iam::123456789012:role/myS3WriteAccessRole" ] } ] }

Dans cet exemple de politique, l'autorisation iam:PassRole est accordée pour le rôle myS3WriteAccessRole. Le rôle a été spécifié à l'aide de l'Amazon Resource Name (ARN) du rôle. Vous devez également attacher cette politique à votre utilisateur IAM ou au rôle auquel appartient votre utilisateur. Pour plus d'informations, consultez Utilisation des politiques gérées.

Note

Les fonctions Lambda utilisent des politiques basées sur des ressources, où la politique est attachée directement à la fonction Lambda. Lorsque vous créez une règle qui appelle une fonction Lambda, vous ne transmettez pas de rôle, et l'utilisateur qui crée la règle n'a donc pas besoin de l'autorisation iam:PassRole. Pour plus d'informations sur l'autorisation de fonctions Lambda, consultez Gestion des autorisations : utilisation d'une politique de fonction Lambda.

Utilisation de jetons pour attribuer des rôles aux utilisateurs

Pour les utilisateurs qui se connectent via les groupes d'utilisateurs Amazon Cognito, des rôles peuvent être transmis dans le jeton d'identification qui a été affecté par le groupe d'utilisateurs. Les rôles apparaissent dans les demandes suivantes dans le jeton d'ID :

  • La demande cognito:preferred_role est l'ARN du rôle.

  • La demande cognito:roles est une chaîne séparée par des virgules contenant un ensemble d'ARN de rôles autorisés.

Les demandes sont définies comme suit :

  • La demande cognito:preferred_role est définie sur le rôle du groupe avec la meilleure valeur pour Precedence (la valeur la plus faible). S'il n'existe qu'un seul rôle autorisé, cognito:preferred_role est défini sur ce rôle. S'il existe plusieurs rôles et qu'aucun rôle ne dispose de la meilleure priorité, cette demande n'est pas définie.

  • La demande cognito:roles est définie, s'il existe a au moins un rôle.

Lorsque des jetons sont utilisés pour attribuer des rôles, s'il existe plusieurs rôles pouvant être affectés à l'utilisateur, la fonctionnalité de Groupes d'identités Amazon Cognito (identités fédérées) choisit le rôle comme suit :

  • Le paramètre GetCredentialsForIdentity CustomRoleArn est utilisé s'il est défini et s'il correspond à un rôle dans la demande cognito:roles. Si ce paramètre ne correspond pas à un rôle dans cognito:roles, l'accès est refusé.

  • Si la demande cognito:preferred_role est définie, elle est utilisée.

  • Si la revendication cognito:preferred_role n'est pas définie, si la revendication cognito:roles est définie et si CustomRoleArn n'est pas spécifié dans l'appel à GetCredentialsForIdentity, le paramètre Role resolution (Résolution de rôle) dans la console ou le champ AmbiguousRoleResolution (dans le paramètre RoleMappings de l'API SetIdentityPoolRoles) est utilisé pour déterminer le rôle à attribuer.

Utilisation du mappage basé sur des règles pour attribuer des rôles aux utilisateurs

Les règles vous permettent de mapper des revendications d'un jeton de fournisseur d'identité à des rôles IAM.

Chaque règle spécifie une demande de jeton (par exemple, un attribut utilisateur dans le jeton d'ID d'un groupe d'utilisateurs Amazon Cognito), un type de correspondance, une valeur et un rôle IAM. Le type de correspondance peut être Equals, NotEqual, StartsWith ou Contains. Si un utilisateur a une valeur correspondante pour la demande, il peut assumer ce rôle lorsqu'il obtient les informations d'identification. Par exemple, vous pouvez créer une règle qui accorde un rôle IAM spécifique pour les utilisateurs avec une valeur d'attribut personnalisé custom:dept Sales.

Note

Dans les paramètres de la règle, les attributs personnalisés ont besoin du préfixe custom: pour se distinguer des attributs standard.

Les règles sont évaluées dans l'ordre, et le rôle IAM pour la première règle correspondante est utilisé, sauf si CustomRoleArn a été spécifié pour modifier l'ordre. Pour plus d'informations sur les attributs utilisateur dans les groupes d'utilisateurs Amazon Cognito, consultez Attributs de groupe d'utilisateurs.

Vous pouvez définir plusieurs règles pour un fournisseur d'authentification dans la console de groupe d'identités (Identités fédérées). Les règles sont appliquées dans l'ordre. Vous pouvez faire glisser les règles pour changer leur ordre. La première règle correspondante a la priorité. Si le type de correspondance est NotEqual et que la demande n'existe pas, la règle n'est pas évaluée. Si aucune règle ne correspond, le paramètre Role resolution (Résolution de rôle) est appliqué à Use default Authenticated role (Utiliser le rôle authentifié par défaut) ou DENY (REFUSER).

Dans l'API et l'interface de ligne de commande, vous pouvez spécifier le rôle à attribuer lorsque aucune règle ne correspond au champ AmbiguousRoleResolution du type RoleMapping qui a été spécifié dans le paramètre RoleMappings de l'API SetIdentityPoolRoles.

Vous pouvez configurer un mappage basé sur des règles pour les fournisseurs d'identité OpenID Connect (OIDC) et SAML dans l'interface AWS CLI ou l'API avec le champ RulesConfiguration du type RoleMapping. Vous pouvez spécifier ce champ dans le paramètre RoleMappings de l'API SetIdentityPoolRoles. La AWS Management Console ne vous autorise pas actuellement à ajouter des règles pour les fournisseurs OIDC ou SAML.

Par exemple, la commande suivante de l'interface AWS CLI ajoute une règle qui attribue le rôle arn:aws:iam::123456789012:role/Sacramento_team_S3_admin aux utilisateurs sur votre site de Sacramento qui ont été authentifiés par le fournisseur d'identité OIDC arn:aws:iam::123456789012:oidc-provider/myOIDCIdP :

aws cognito-identity set-identity-pool-roles --region us-east-1 --cli-input-json file://role-mapping.json

Contenu de role-mapping.json :

{ "IdentityPoolId": "us-east-1:12345678-corner-cafe-123456790ab", "Roles": { "authenticated": "arn:aws:iam::123456789012:role/myS3WriteAccessRole", "unauthenticated": "arn:aws:iam::123456789012:role/myS3ReadAccessRole" }, "RoleMappings": { "arn:aws:iam::123456789012:oidc-provider/myOIDCIdP": { "Type": "Rules", "AmbiguousRoleResolution": "AuthenticatedRole", "RulesConfiguration": { "Rules": [ { "Claim": "locale", "MatchType": "Equals", "Value": "Sacramento", "RoleARN": "arn:aws:iam::123456789012:role/Sacramento_team_S3_admin" } ] } } } }

Pour chaque groupe d'utilisateurs ou autre fournisseur d'authentification que vous configurez pour un groupe d'identités, vous pouvez créer jusqu'à 25 règles. Cette limite n'est pas réglable. Pour plus d'informations, consultez Quotas dans Amazon Cognito.

Demandes de jetons à utiliser dans le mappage basé sur des règles

Amazon Cognito

Un jeton d'identification Amazon Cognito est représenté comme un jeton web JSON (JSON Web Token, JWT). Il contient les demandes sur l'identité de l'utilisateur authentifié, par exemple name, family_name et phone_number. Pour plus d'informations sur les demandes standard, consultez la spécification OpenID Connect. Hormis les revendications standard, les revendications suivantes sont spécifiques d'Amazon Cognito: :

  • cognito:groups

  • cognito:roles

  • cognito:preferred_role

Amazon

Les demandes suivantes, ainsi que les valeurs possibles pour ces demandes, peuvent être utilisées avec Login with Amazon :

  • iss : www.amazon.com

  • aud : ID d'application

  • sub : sub du jeton Login with Amazon

Facebook

Les demandes suivantes, ainsi que les valeurs possibles pour ces demandes, peuvent être utilisées avec Facebook :

  • iss : graph.facebook.com

  • aud : ID d'application

  • sub : sub du jeton Facebook

Google

Jeton Google contenant les demandes standard émanant de la spécification OpenID Connect. Toutes les demandes contenues dans le jeton OpenID sont disponibles pour le mappage basé sur des règles. Consultez le site OpenID Connect de Google pour connaître les demandes disponibles grâce au jeton Google.

Apple

Jeton Apple contenant les demandes standards émanant de la spécification OpenID Connect. Veuillez consulter Authenticating Users with Sign in with Apple dans la documentation Apple pour en savoir plus sur la demande disponible avec le jeton Apple. Le jeton Apple ne contient pas toujours email.

OpenID

Toutes les demandes contenues dans le jeton Open Id sont disponibles pour le mappage basé sur des règles. Pour plus d'informations sur les demandes standard, consultez la spécification OpenID Connect. Consultez la documentation de votre fournisseur OpenID pour connaître les demandes supplémentaires disponibles.

SAML

Les demandes sont analysées à partir de l'assertion SAML. Toutes les demandes disponibles dans l'assertion SAML peuvent être utilisées pour le mappage basé sur des règles.

Bonnes pratiques pour le contrôle d'accès basé sur les rôles

Important

Si la demande qui vous mappez à un rôle peut être modifiée par l'utilisateur final, tout utilisateur final peut assumer votre rôle et définir la politique en conséquence. Mappez uniquement les demandes qui ne peuvent pas être définies directement par l'utilisateur final à des rôles avec des autorisations de niveau élevé. Dans un groupe d'utilisateurs Amazon Cognito, vous pouvez définir des autorisations de lecture et d'écriture par application pour chaque attribut utilisateur.

Important

Si vous définissez des rôles pour des groupes dans un groupe d'utilisateurs Amazon Cognito, ces rôles sont transmis via le jeton d'identification de l'utilisateur. Pour utiliser ces rôles, vous devez également définir Choose role from token (Choisir un rôle à partir d'un jeton) pour la sélection de rôle authentifié pour le groupe d'identités.

Vous pouvez utiliser le paramètre Role resolution (Résolution de rôle) dans la console et le paramètre RoleMappings de l'API SetIdentityPoolRoles pour spécifier le comportement par défaut lorsque le rôle approprié ne peut pas être déterminé à partir du jeton.