MFA
MFA using AWS access keys
Using the AWS CLI on accounts with MFA enabled requires the user to obtain temporary credentials from STS. For this, we've created a script creating a 12 hour session within the current shell, automatically creating an authenticator code.
Usage
$ awsauth
Installing dependencies if needed...
Removing existing env variables...
Obtaining AWS session credentials for user: <aws_iam_username>
Success
Install
Create a function calling the script in your shell configuration file - .zshrc
, .bash_profile
etc.
function authaws() {
. ./authaws.sh <aws_master_account_id> <aws_iam_username> <aws_totp_secret>
}
Create the script file - e.g. authaws.sh
#!/bin/bash
AWS_IAM_USERNAME=""
AWS_TOTP_SECRET=""
AWS_ACCOUNT_ID=""
function __clear_env() {
echo "Removing existing env variables..."
# Unset existing environment variables
unset AWS_SESSION_TOKEN
unset AWS_SECRET_ACCESS_KEY
unset AWS_ACCESS_KEY_ID
}
function __get_aws_credentials() {
echo "Obtaining AWS session credentials for user: $AWS_IAM_USERNAME"
code=$(oathtool --base32 --totp $AWS_TOTP_SECRET)
mfa="arn:aws:iam::$AWS_ACCOUNT_ID:mfa/$AWS_IAM_USERNAME"
# Get the credentials from AWS and store the response in a variable
creds=`aws sts get-session-token --duration-seconds 43200 --serial-number $mfa --token-code $code`
# Parse the response
access_key=`echo $creds | jq .Credentials.AccessKeyId`
secret_key=`echo $creds | jq .Credentials.SecretAccessKey`
session_token=`echo $creds | jq .Credentials.SessionToken`
# Set environment variables -- sed statement strips the quotation marks
export AWS_ACCESS_KEY_ID=`echo $access_key | sed -e 's/^"//' -e 's/"$//'`
export AWS_SECRET_ACCESS_KEY=`echo $secret_key | sed -e 's/^"//' -e 's/"$//'`
export AWS_SESSION_TOKEN=`echo $session_token | sed -e 's/^"//' -e 's/"$//'`
echo "Success"
}
function __install_dependancies() {
echo "Installing dependencies if needed..."
# Check if jq is installed, else install - required to parse the response from aws sts
type jq >/dev/null 2>&1 || brew install jq
# Check if oauthtool is installed, else install - required for MFA TOTP code generation
type oathtool >/dev/null 2>&1 || brew install oath-toolkit
}
if [[ -z $1 ]] || [[ -z $2 ]] || [[ -z $3 ]] ; then
echo "Ivalid args: aws_account_id aws_iam_username aws_totp_secret"
else
AWS_ACCOUNT_ID=$1
AWS_IAM_USERNAME=$2
AWS_TOTP_SECRET=$3
__install_dependancies
__clear_env
__get_aws_credentials
fi
You'll find the TOTP secret in the "Add MFA device" menu.
Last updated
Was this helpful?