web-dev-qa-db-fra.com

Comment puis-je déduire l'ID de compte AWS de BasicAWSCredentials disponible?

Je n'arrive pas à trouver cela n'importe où dans la documentation; si je suis authentifié avec BasicAWSCredentials, par ex. AccessKeyId et SecretKey, est-il possible d'obtenir l'ID de compte AWS? 

34
user375566

Mettre à jour

AWS vient de combler silencieusement cette lacune en introduisant l'action dédiée de l'API STS GetCallerIdentity , qui renvoie des détails sur l'identité IAM dont les informations d'identification sont utilisées pour appeler l'API, y compris l'identifiant de compte AWS - il y a quelques exemples de réponses , par exemple:

<GetCallerIdentityResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
  <GetCallerIdentityResult>
   <Arn>arn:aws:iam::123456789012:user/Alice</Arn>
    <UserId>AKIAI44QH8DHBEXAMPLE</UserId>
    <Account>123456789012</Account>
  </GetCallerIdentityResult>
  <ResponseMetadata>
    <RequestId>01234567-89ab-cdef-0123-456789abcdef</RequestId>
  </ResponseMetadata>
</GetCallerIdentityResponse>

Vous pouvez utiliser interface de ligne de commande AWS pour obtenir uniquement l'ID de compte. En voici un exemple: 

$ aws sts get-caller-identity --output text --query Account
121371349383

Réponse initiale

Ceci est au moins indirectement possible via IAM au moyen de l'action GetUser (disponible via getUser () } dans le AWS SDK for Java ):

Récupère les informations sur l'utilisateur spécifié, y compris l'utilisateur chemin, GUID et ARN.

Si vous ne spécifiez pas de nom d'utilisateur, IAM détermine le nom d'utilisateur implicitement basé sur l’ID de clé d’accès AWS signant la demande.

Le type de données Utilisateur renvoyé ( Utilisateur de classe ) contient un élément Arn ( getArn () ), qui est le Nom de la ressource Amazon ( ARN) spécifiant l'utilisateur. Ceci est décrit plus en détail dans Identifiants pour les entités IAM) en particulier dans la section ARN , qui décrit le format du type de ressource User:

arn:aws:iam::{account_ID}:user/{path/to/user/UserName}

Example: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
29
Steffen Opel

Si vous avez les outils AWS CLI, vous pouvez:

aws iam get-user | awk '/arn:aws:/{print $2}'
10
AXE-Labs

C'est une vieille question, mais pour les pauvres âmes qui sont dehors. La réponse basée sur l'ARN est la réponse la plus correcte que nous ayons trouvée. Il existe également un champ OwnerId lors de l'appel de DescribeInstances, mais il peut ne pas y avoir d'instance.

Cependant, la réalité est un peu plus complexe. Parfois, l'utilisateur IAM n'a pas l'autorisation d'émettre getUser (), puis il obtient AmazonServiceException avec 

getErrorCode() = "AccessDenied"

Dans ce cas, l'ARN fait partie du message d'erreur AWS:

User: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob is not authorized to perform: 
iam:GetUser on resource: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob

La situation est donc encore pire: nous devons analyser un message d'erreur en texte libre, puis extraire le numéro de compte:

try {
    ... iam.getUser(); ...
} catch (AmazonServiceException e) {
    if (e.getErrorCode().compareTo("AccessDenied") == 0) {
        String arn = null;
        String msg = e.getMessage();
        // User: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob is not authorized to perform: iam:GetUser on resource: arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/Bob
        int arnIdx = msg.indexOf("arn:aws");
        if (arnIdx != -1) {
            int arnSpace = msg.indexOf(" ", arnIdx);
            arn = msg.substring(arnIdx, arnSpace);
        }
        System.out.println("ARN: " + arn);
}
10
tavvit

Avec la dernière API, il existe un moyen direct de trouver l'ID utilisateur:

BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials("your access key", "your secret key");
AmazonIdentityManagementClient iamClient = new AmazonIdentityManagementClient(basicAWSCredentials);
String userId = iamClient.getUser().getUser().getUserId();
7
Michael Yakobi

En ajoutant ceci ici, parce que c'est le résultat SO le plus élevé pour "trouver le numéro de compte aws", et parce que c'est une mauvaise pratique que d'utiliser des clés plutôt que des rôles IAM pour les applications déployées ...

Si vous exécutez à partir d'une instance AWS comportant un rôle IAM, vous pouvez créer curl -s http://169.254.169.254/latest/meta-data/iam/info et obtenir l'ARN du rôle de l'instance à partir de la clé InstanceProfileArn des résultats, sans avoir à vous soucier d'analyser un message d'exception ou d'accorder Autorisations IAM pour une instance qui n'en a pas besoin.

Ensuite, il vous suffit d'analyser l'ARN du numéro de compte.

5
Josh Hancock

Voici le code permettant de faire fonctionner les nouveaux éléments STS getCallerIdentity (en Java):

private String getAccountIDUsingAccessKey(String accessKey, String secretKey) {
    AWSSecurityTokenService stsService = AWSSecurityTokenServiceClientBuilder.standard().withCredentials(
            new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))).build();

    GetCallerIdentityResult callerIdentity = stsService.getCallerIdentity(new GetCallerIdentityRequest());
    return callerIdentity.getAccount();
}

Des accessoires à @SteffenOpel pour avoir fourni les indices nécessaires, bien sûr.

5
Ryan Shillington

J'ai fait une découverte amusante - si vous appelez GetRole avec un nom de rôle inexistant, le message d'erreur que vous recevez renvoie l'ARN du compte appelant. Il vous suffit donc d'analyser le numéro de compte à partir de celui-ci. C'est bien parce que cela fonctionne dans tous les cas auxquels je peux penser, même si l'appelant n'a pas l'autorisation d'appeler GetRole.

Voici le message d'erreur que je reçois:

User: arn:aws:sts::669916120315:assumed-role/CloudMail_Server/i-31dd19cd is not authorized to perform: iam:GetRole on resource: role _no_such_role_

La partie '669916120315' du message d'erreur est l'ID de compte AWS.

1
Jesse Barnum

Bien que je ne considère pas cela comme un scénario idéal, le travail est fait. Ceci utilise le AWSSDK 3.0. 

public string GetUserId()
{
    AmazonIdentityManagementServiceClient c = 
        new AmazonIdentityManagementServiceClient();

    GetUserRequest request = new GetUserRequest();
    GetUserResponse response = c.GetUser(request);

    //parse it from the ARN
    //should be similar to "arn:aws:iam::111111111111:user/username"
    string[] arnParts = response.User.Arn.Split(new char[] { ':' });
    return arnParts[4];
}
1
Michael

ElasticTranscoder ListPresets retourne une structure de données comprenant des ARN incluant l'ID de compte AWS.

Contrairement à de nombreuses autres suggestions courantes, cette commande aws-cli fonctionne pour les informations d'identification de base, l'utilisateur IAM, les rôles IAM, les rôles d'instance et l'hypothèse de rôle entre plusieurs comptes:

aws elastictranscoder list-presets --query 'Presets[0].Arn' | 
  cut -d: -f5

Bien sûr, vous aurez besoin d'une autorisation pour passer l'appel d'API ListPresets, mais c'est le cas pour toute réponse.

0
Eric Hammond

Le propriétaire du groupe de sécurité par défaut est "l'ID de compte".

0
dkavanagh