Assunzione di un ruolo
Devi definire un utente IAM distinto per l'assunzione di ciascun ruolo creato in ogni account e assicurarti che ogni utente IAM disponga delle autorizzazioni appropriate.
Utenti e ruoli IAM
Dopo aver creato i ruoli e le policy necessari nell'account A per gli scenari 1 e 2, devi definire un utente IAM in ciascuno degli account B, C e Z. Ogni utente IAM assumerà il ruolo appropriato a livello di programmazione per accedere ai file di log. In altre parole, l'utente nell'account B assumerà il ruolo creato per l'account B, l'utente nell'account C assumerà il ruolo creato per l'account C, mentre l'utente nell'account Z assumerà il ruolo creato per l'account Z. Quando un utente assume un ruolo, AWS restituisce le credenziali di sicurezza temporanee che possono essere utilizzate per effettuare richieste per elencare, recuperare, copiare o eliminare i file di log in base alle autorizzazioni concesse dalla policy di accesso associata al ruolo specifico.
Per ulteriori informazioni sull'utilizzo degli utenti IAM, consulta Utilizzo di utenti e gruppi IAM.
La differenza principale tra gli scenari 1 e 2 risiede nella policy di accesso creata per ogni ruolo IAM in ogni scenario.
-
Nello scenario 1, le policy di accesso per gli account B e C limitano ogni account alle operazioni di lettura solo dei propri file di log. Per ulteriori informazioni, consulta . Creazione di una policy di accesso per concedere l'accesso ad account di proprietà.
-
Nello scenario 2, la policy di accesso per l'account Z permette di leggere tutti i file di log aggregati nel bucket Amazon S3. Per ulteriori informazioni, consulta . Creazione di una policy di accesso per concedere l'accesso a una terza parte.
Creazione delle policy di autorizzazione per gli utenti IAM
Per eseguire le operazioni consentite dai ruoli, l'utente IAM deve disporre dell'autorizzazione per eseguire chiamate all'API AWS STS AssumeRole
. Devi modificare la policy basata sull'utente per ogni utente IAM in modo da concedere le autorizzazioni appropriate. In altre parole, devi impostare un elemento Resource (Risorsa) nella policy allegata all'utente IAM. L'esempio seguente mostra una policy per un utente IAM nell'account B che permette all'utente di assumere un ruolo denominato "Test" creato in precedenza dall'account A.
Per allegare la policy richiesta al ruolo IAM
-
Accedi alla AWS Management Console e apri la console IAM.
-
Scegliere l'utente di cui si desidera modificare le autorizzazioni.
-
Scegliere la scheda Permissions (Autorizzazioni).
-
Scegliere Custom Policy (Personalizza policy).
-
Scegliere Use the policy editor to customize your own set of permissions (Usa l'editor policy per personalizzare un set di autorizzazioni specifico).
-
Digitare un nome per la policy.
-
Copiare la seguente policy nello spazio disponibile per il documento di policy.
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["sts:AssumeRole"], "Resource": "arn:aws:iam::
account-A-id
:role/Test" } ] }
Solo gli utenti IAM possono assumere un ruolo. Se tenti di utilizzare le credenziali dell'account root di AWS per assumere un ruolo, l'accesso verrà negato.
Chiamata dell'API AssumeRole
Un utente nell'account B, C o Z può assumere un ruolo mediante la creazione di un'applicazione che esegue una chiamata all'API AWS STS AssumeRole
. L'applicazione dovrà quindi passare il nome della sessione del ruolo, l'ARN (Amazon Resource Number) del ruolo da assumere e un ID esterno opzionale. Il nome della sessione del ruolo viene definita dall'account A quando crea il ruolo di assumere. L'eventuale ID esterno viene definito dall'account Z e passato all'account A per essere incluso durante la creazione del ruolo. Per ulteriori informazioni, consulta Utilizzo di un ID esterno quando si concede a una terza parte l'accesso alle proprie risorse AWS nella Guida per l'utente di IAM. Puoi recuperare l'ARN dall'account A aprendo la console IAM.
Per individuare il valore ARN nell'account A con la console IAM
-
Selezionare Roles (Ruoli).
-
Scegliere il ruolo da esaminare.
-
Cercare il valore in Role ARN (ARN ruolo) nella sezione Summary (Riepilogo).
L'API AssumeRole restituisce le credenziali temporanee che un utente nell'account B, C o Z può utilizzare per accedere alle risorse nell'account A. In questo esempio, le risorse a cui desideri accedere si trovano nel bucket Amazon S3 e nei file di log contenuti nel bucket. Le credenziali temporanee dispongono delle autorizzazioni definite nella policy di accesso del ruolo.
Il seguente esempio Python (che utilizza AWS SDK for Python (Boto)AssumeRole
e come utilizzare le credenziali di sicurezza temporanee restituite per elencare tutti i bucket Amazon S3 controllati dall'account A.
def list_buckets_from_assumed_role(user_key, assume_role_arn, session_name): """ Assumes a role that grants permission to list the Amazon S3 buckets in the account. Uses the temporary credentials from the role to list the buckets that are owned by the assumed role's account. :param user_key: The access key of a user that has permission to assume the role. :param assume_role_arn: The Amazon Resource Name (ARN) of the role that grants access to list the other account's buckets. :param session_name: The name of the STS session. """ sts_client = boto3.client( 'sts', aws_access_key_id=user_key.id, aws_secret_access_key=user_key.secret) try: response = sts_client.assume_role( RoleArn=assume_role_arn, RoleSessionName=session_name) temp_credentials = response['Credentials'] print(f"Assumed role {assume_role_arn} and got temporary credentials.") except ClientError as error: print(f"Couldn't assume role {assume_role_arn}. Here's why: " f"{error.response['Error']['Message']}") raise # Create an S3 resource that can access the account with the temporary credentials. s3_resource = boto3.resource( 's3', aws_access_key_id=temp_credentials['AccessKeyId'], aws_secret_access_key=temp_credentials['SecretAccessKey'], aws_session_token=temp_credentials['SessionToken']) print(f"Listing buckets for the assumed role's account:") try: for bucket in s3_resource.buckets.all(): print(bucket.name) except ClientError as error: print(f"Couldn't list buckets for the account. Here's why: " f"{error.response['Error']['Message']}") raise