Comment résoudre les erreurs d'accès aux autorisations IAM refusées ou non autorisées ?

Date de la dernière mise à jour : 20/12/2019

J’essaie d’accéder à une ressource AWS et j’ai reçu une erreur « accès refusé » ou « non autorisé ». Comment résoudre les problèmes d’autorisation pour un utilisateur AWS Identity and Access Management (IAM) ?

Brève description

Vous pouvez utiliser les requêtes Amazon Athena ou l’interface de ligne de commande AWS (AWS CLI) pour dépanner les échecs d'appel d’API d’autorisation IAM.

Solution

Option 1 : Utiliser des requêtes Athena pour résoudre les échecs d’appel d’API d'autorisation IAM en recherchant les journaux AWS CloudTrail

Remarque : avant de commencer, vous devez avoir un journal d’activité activé pour vous connecter à un compartiment Amazon Simple Storage Service (Amazon S3). Cela est dû au fait qu’Athena utilise les événements enregistrés dans les fichiers journaux CloudTrail qui sont livrés à un compartiment Amazon S3 pour ce suivi.

1.    Suivez les étapes de la section Création du tableau Athena de la section Comment créer automatiquement des tableaux dans Amazon Athena pour effectuer une recherche dans les journaux AWS CloudTrail ?

Remarque : les tableaux Athena qui sont créés automatiquement se trouvent dans la même région AWS que votre compartiment Amazon S3.

2.    Ouvrez la console Athena, sélectionnez New query (Nouvelle requête), puis sélectionnez la boîte de dialogue pour effacer l'exemple de requête.

3.    Entrez l’exemple de requête suivant, puis choisissez Run Query.

Dans cet exemple de requête, le format d'heure utilise le format de base ISO 8601 avec la variable Z pour UTC.

Remarque : Remplacez your-arn par les Amazon Resource Names (ARN) IAM de vos ressources et votre-tableau par le nom de votre tableau.

SELECT from_iso8601_timestamp(eventTime) AS "Time", useridentity.arn AS "Identity ARN", eventID AS "Event ID",
         eventsource AS "Service", eventname AS "Action", errorCode AS "Error", errorMessage AS "Message"
FROM your-table
WHERE from_iso8601_timestamp(eventtime) >= from_iso8601_timestamp('2019-10-29T06:40:00Z')
        AND from_iso8601_timestamp(eventtime) < from_iso8601_timestamp('2019-10-29T06:55:00Z')
        AND userIdentity.arn = 'your-arn'
        AND eventType = 'AwsApiCall'
        AND errorCode is not null
        AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')
ORDER BY eventTime desc

4.    Cet exemple de sortie de tableau répertorie les erreurs d’autorisations pour l’ARN d'identité :

| Time                        | Event ID                             | Service                  | Action       | Error        | Message                                                                                                              |
|-----------------------------|--------------------------------------|--------------------------|--------------|--------------|----------------------------------------------------------------------------------------------------------------------|
| 2019-10-29 06:52:45.000 UTC | 0406f0c1-47a8-4f71-8a94-18267b84042a | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny |
| 2019-10-29 06:41:48.000 UTC | 14e5e77c-f682-45e1-8c88-12d15af293dd | cloudtrail.amazonaws.com | LookupEvents | AccessDenied | User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents                       |

Remarque : les sorties d’événements CloudTrail peuvent prendre jusqu’à 15 minutes pour obtenir des résultats.

5.    Le cas échéant, obtenez des erreurs pour tous les utilisateurs en supprimant cette ligne de l’exemple de requête :

AND userIdentity.arn = 'your-arn'

6.    Le cas échéant, obtenez toutes les erreurs d’une période sélectionnée en supprimant cette ligne de l’exemple de requête :  

AND (lower(errorCode) LIKE '%accessdenied%' OR lower(errorCode) LIKE '%unauthorized%')

Option 2 : Utiliser l’interface de ligne de commande AWS pour résoudre les échecs d’appel d’API d’autorisation IAM

Important : avant de commencer, assurez-vous d’avoir installé et configuré la CLI AWS.

Remarque : ce script d’interface de ligne de commande AWS nécessite le processeur JSON de ligne de commande jq. Pour obtenir le didacticiel et les instructions de téléchargement, consultez Format de sortie JSON. Pour les distributions qui utilisent le package yum, exécutez la commande suivante :

$ sudo yum install jq

1.    Exécutez la commande de CLI AWS suivante :

Remarque : Remplacez your-arn par les ARN IAM de vos ressources.

( echo "Time,Identity ARN,Event ID,Service,Action,Error,Message";
  aws cloudtrail lookup-events --start-time "2019-10-29T06:40:00Z" --end-time "2019-10-29T06:55:00Z" --query "Events[*].CloudTrailEvent" --output text \
    | jq -r ". | select(.userIdentity.arn == \"your-arn\" and .eventType == \"AwsApiCall\" and .errorCode != null
    and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\"))))
    | [.eventTime, .userIdentity.arn, .eventID, .eventSource, .eventName, .errorCode, .errorMessage] | @csv"
) | column -t -s'",'

Remarque: Le taux de requêtes de recherche vers CloudTrail est limité à une requête par seconde et par compte. Si vous dépassez cette limite, une erreur de limitation se produit.

2.    Cet exemple de sortie de tableau répertorie les erreurs d’autorisation pour l’ARN d’identité au cours des 90 derniers jours :

Time                  Event ID                              Service                   Action        Error         Message
2019-10-29T06:52:45Z  0406f0c1-47a8-4f71-8a94-18267b84042a  cloudtrail.amazonaws.com  LookupEvents  AccessDenied  User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents with an explicit deny
2019-10-29T06:41:48Z  14e5e77c-f682-45e1-8c88-12d15af293dd  cloudtrail.amazonaws.com  LookupEvents  AccessDenied  User: arn:aws:iam::account:user/username is not authorized to perform: cloudtrail:LookupEvents

3.    Éventuellement, obtenez des erreurs pour tous les utilisateurs en supprimant cette ligne :

.userIdentity.arn == \"your-arn\" and 

4.    Éventuellement, obtenez toutes les erreurs de la période sélectionnée en supprimant cette ligne :

and (.errorCode | ascii_downcase | (contains(\"accessdenied\") or contains(\"unauthorized\")))

Résoudre les erreurs non autorisées

Les sorties Athena et l’exemple de l’interface de ligne de commande AWS concernent les appels à l’action LookupEvents dans le service CloudTrail.

Le cloudtrail : LookupEvents avec une sortie de refus explicite indique que la stratégie IAM est incorrecte. Tous les types de stratégie IAM peuvent renvoyer une erreur de refus explicite. Et les instructions de refus explicites remplacent toujours les instructions d’autorisation.

La sortie cloudtrail : LookupEvents indique que l’erreur est le résultat d’un refus implicite. Cette erreur de sortie peut se produire si :

  • La stratégie IAM autorise explicitement l’action cloudtrail : LookupEvents .
  • Le nombre maximal d’autorisations pour une identité est limité par une stratégie IAM.
  • La stratégie de contrôle de service (SCP) AWS Organizations pour le compte ne dispose pas d’une autorisation explicite.

Les types de stratégie évalués par IAM pour établir l’accès sont les suivants :

  • SCP AWS Organizations
  • Stratégies basées sur les ressources
  • Limites d’autorisations IAM
  • Stratégies de session
  • Stratégies basées sur une identité

Pour plus d'informations sur la façon dont les stratégies IAM sont évaluées et gérées, consultez Logique d'évaluation des stratégies et Gestion des stratégies IAM.