DEV Community

Cover image for Using AWS CLI Securely with IAM Roles and MFA
Alfredo Baldoceda
Alfredo Baldoceda

Posted on

Using AWS CLI Securely with IAM Roles and MFA

Summary

This quick and easy guide provides step-by-step instructions on securely using AWS CLI with IAM roles and Multi-Factor Authentication (MFA). Learn how to set up AWS CLI securely by assuming IAM roles and enabling MFA.


Introduction

As AWS developers, it's crucial to prioritize security when accessing AWS resources. Instead of relying on permanent access keys, which pose risks like exposure and misuse, AWS offers a more secure approach using IAM roles. IAM roles provide fine-grained permissions and generate temporary security credentials, eliminating the need for permanent access keys. Additionally, enabling MFA adds an extra layer of protection to AWS CLI usage.


Prerequisites

Before getting started, make sure you have the following prerequisites:

  • An active AWS account and access to the AWS Management Console.
  • Basic understanding of the command line interface (CLI) or shell scripting.
  • A virtual MFA device (e.g., Google Authenticator) set up on your smartphone.

Part I - AWS Console Setup

Step 1: Creating an IAM User with Programmatic Access

1. Open the AWS Management Console and sign in with your credentials.
2. Search for IAM in the search bar and open the IAM console.
3. In the left navigation pane, click on Users and then the Add user button.
4. Provide a name for the user and select Programmatic access under Access type.
5. Choose an existing IAM group or attach policies directly to the user for permissions.
6. Review the user details and add tags if necessary.
7. Create the user and securely download the access key and secret access key.

IAM User

Note: If you have an existing user that you want to provide programmatic access, just select the user and go to the "Security Credentials" tab and create a new access key.

Access Key


Step 2: Setting Up MFA on AWS Console

1. Go to the IAM service in the AWS Management Console and select your IAM user.
2. In the "Security credentials" tab, click on "Manage" in the "Multi-factor authentication (MFA)" section.
3. Choose "Virtual MFA device" and follow the on-screen instructions to set up your MFA device.
4. Use the authenticator app to scan the QR code or enter the secret key to link the virtual MFA device.

MFA Device


Step 3: Creating an IAM Role with MFA Condition

1. Go to the IAM service in the AWS Management Console and click on "Roles".
2. Click on "Create role" and select the appropriate service or use case.
3. Attach the necessary policies to the role and skip the permissions boundary section.
4. Scroll down to the "IAM role trust relationship" section and click on "Edit trust relationship".
5. Replace the existing trust policy with the provided JSON policy, replacing <YOUR_ACCOUNT_ID> with your AWS account ID.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect":

 "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<YOUR_ACCOUNT_ID>:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "Bool": {
          "aws:MultiFactorAuthPresent": "true"
        }
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

6. Save the changes to update the trust relationship.


Part II - Command Line Setup

Step 1: Installing AWS CLI

1. Check if Python 3 (version 3.6 or later) is installed by running python3 --version.
2. Install AWS CLI using pip with the command: pip install awscli --upgrade --user.
3. Verify the installation by running aws --version.

aws --version
aws-cli/2.11.26 Python/3.11.4 Darwin/22.5.0 source/x86_64 prompt/off
Enter fullscreen mode Exit fullscreen mode

Step 2: Initial Configuration with IAM User Credentials

1. Obtain the access key ID and secret access key for your IAM user from the AWS Management Console.
2. Configure AWS CLI with your IAM user credentials by running aws configure.
3. Enter the access key ID, secret access key, default region, and output format as prompted.

$ aws configure
AWS Access Key ID [xxx]:
...
Enter fullscreen mode Exit fullscreen mode

This command prompts you to enter the access key ID, secret access key, default region, and output format. Provide the IAM user credentials and other details as prompted.

  • The access key ID and secret access key are the credentials obtained for your IAM user.
  • The default region is the AWS region where you want to operate. For example, us-west-2 for US West (Oregon) region.
  • The output format specifies how AWS CLI should display the command output. You can choose json, text, or table.

4. Verify Initial Configuration: To verify that AWS CLI is configured correctly with your IAM user credentials, run the following command:

   $ aws sts get-caller-identity --no-cli-pager
Enter fullscreen mode Exit fullscreen mode

Note: The aws sts get-caller-identity --no-cli-pager command is useful in the context of assuming IAM roles, as it allows you to verify the identity of the user or role associated with the temporary credentials.

This command will return information about the AWS account ID, IAM entity ARN, and other details associated with the current credentials.


Step 3: Assume Roles with MFA Configuration

In this step, we'll configure AWS CLI to assume roles using the named profiles specified in the configuration file. Follow the instructions below:

1. Add Assume Role with MFA Configuration: Add the following configuration block to the file located at ~/.aws/config (Linux/Mac) or %USERPROFILE%\.aws\config (Windows) , specifying the details for the IAM role you want to assume and mfa parameters:

   [default]
   region = us-west-2

   [profile mfa]
   region = us-west-2
   output = json
   role_arn = arn:aws:iam::123456789012:role/MyRole
   source_profile = default
   mfa_serial = arn:aws:iam::123456789012:mfa/MyMFADevice
Enter fullscreen mode Exit fullscreen mode

In this example:

  • [default] represents the default profile used for general AWS CLI operations.
  • [profile mfa] represents a named profile that will be used to assume the IAM role with MFA.
  • region specifies the AWS region you want to use.
  • output specifies the output format for AWS CLI commands.
  • role_arn is the ARN of the IAM role you want to assume. (This is role created on the 1st part of this article)
  • source_profile is the profile name used to retrieve the initial temporary credentials (usually the default profile).
  • mfa_serial is the ARN of the MFA device associated with your IAM user.

Note that the role here is the one we created with the trust policy with MFA condition.

The mfa_serial can be obtained when selecting the MFA serial created in the 1st part of this article, under the user, security credentials tab.

MFA ARN

2. After configuring the AWS CLI, run the following command to assume the IAM role with MFA:

$ aws sts assume-role --profile mfa --role-session-name MySessionName --duration-seconds 3600
Enter fullscreen mode Exit fullscreen mode

Replace mfa with the profile name you specified in the AWS CLI configuration file. MySessionName can be any descriptive name for your session. 3600 represents the duration for which the temporary security credentials will be valid (in this example, 1 hour).

This command generates temporary security credentials that you can use for AWS operations.

3. Run the following command to retrieve the caller identity after assuming the IAM role:

$ aws --profile devadmin sts get-caller-identity --no-cli-pager                                                                   Enter MFA code for arn:aws:iam::XXXXXX:mfa/user1:
Enter fullscreen mode Exit fullscreen mode

Conclusion

Setting up AWS CLI to assume IAM roles with MFA as a condition enhances the security and control of your AWS environment. By following the steps outlined in this article, DevOps and experienced AWS developers can securely configure AWS CLI for their day-to-day operations, ensuring temporary credentials, an additional authentication factor, and an MFA condition are used.

Remember to regularly rotate IAM roles, update policies, and review user access permissions to maintain a strong security posture within your AWS infrastructure.


Top comments (0)