· 1 min read

AWS CLI & MFA

AWS CLI & MFA

A complete guide to assuming AWS roles across accounts with MFA enabled, including step-by-step commands and a practical bash script.

The steps outlined below define the procedure for assuming roles across accounts. These steps assume that the user has MFA enabled, is in the appropriate role on the trusted account, and has the appropriate trust policy attached to the role being assumed.

Assume Role

Environment variables may need to be unset before calling aws sts assume-role

aws sts assume-role \
--role-arn arn:aws:iam::<account-id>:role/<name> \
--serial-number arn:aws:iam::<account-id>:mfa/<user-name> \
--role-session-name <some-name> \
--token-code <some-token>
  • --role-arn : Amazon Resource Number for role being assumed
  • --serial-number : Amazon Resource Number of user’s MFA device *--role-session-name : Temporary session identifier *--token-code : Token code from user’s MFA device

The --duration-seconds parameter is used to specify the duration of the role session, from 900 seconds (15 minutes) up to the Maximum CLI/API session duration setting for the role. If you specify a value for the DurationSeconds parameter that is higher than the maximum setting, the operation fails. The default session duration is 3600 (1 hour).

Response:

{
  "Credentials": {
    "AccessKeyId": "some-id",
      "SecretAccessKey": "some-key",
      "SessionToken": "some-token",
      "Expiration": "1990-03-30T00:00:00Z"
  },
  "AssumedRoleUser": {
    "AssumedRoleId": "some-id:some-name",
    "Arn": "arn:aws:sts::<account-id>:assumed-role/<role-name>/<session-name>"
  }
}

Export environment variables from the response:

export AWS_ACCESS_KEY_ID=<AccessKeyId>
export AWS_SECRET_ACCESS_KEY=<SecretAccessKey>
export AWS_SESSION_TOKEN=<SessionToken>

Validate identity

aws sts get-caller-identity

Response:

{
  "UserId": "AccessKeyId",
  "Account": "AccountId",
  "Arn": "arn:aws:iam::<account-id>:user/<user-name>"
}

Script:

Tested on BSD systems. Requires jq

https://stedolan.github.io/jq/download/

#!/bin/bash

#usage source ./assume-role.sh role-arn mfa-arn session-name token-code

unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

credentials=$(aws sts assume-role \
--role-arn $1 \
--serial-number $2 \
--role-session-name $3 \
--token-code $4)

export AWS_ACCESS_KEY_ID=$(echo $credentials \
| jq '.Credentials.AccessKeyId' \
| xargs)

export AWS_SECRET_ACCESS_KEY=$(echo $credentials \
| jq '.Credentials.SecretAccessKey' \
| xargs)

export AWS_SESSION_TOKEN=$(echo $credentials \
| jq '.Credentials.SessionToken' \
| xargs)
Tags:#AWS