Get your copy of Security Service Edge (SSE) for Dummies. Get the eBook

Blog Threat Labs A Real-World Look at AWS Best Practices: IAM User Accounts
May 06 2021

A Real-World Look at AWS Best Practices: IAM User Accounts


Best practices for securing an AWS environment have been well-documented and generally accepted, such as AWS’s guidance. However, organizations may still find it challenging on how to begin applying this guidance to their specific environments.

  • Which controls should be applied out-of-the-box vs. customized?
  • What pitfalls exist in implementing the various controls or checks?
  • How do you prioritize remediation of the “sea of red” violations?

In this blog series, we’ll analyze anonymized data from Netskope customers that include security settings of 650,000 entities from 1,143 AWS accounts across several hundred organizations. We’ll look at the configuration from the perspective of the best practices, see what’s commonly occurring in the real world and:

  • Discuss specific risk areas that should be prioritized
  • Identify underlying root causes and potential pitfalls
  • Focus on practical guidance for applying the Benchmark to your specific environment

This blog post continues looking at real-world data for common IAM security controls for regular users. Based on the Netskope dataset analyzed, we will highlight six opportunities to improve security by making simple IAM changes:

  1. MFA is not consistently enforced with regular IAM User accounts, with 6% of users without MFA.
  1. Many IAM User accounts are unused and should be disabled. 40% of access keys are more than a year old.
  1. 11% of users had access keys set up at the time of user account setup, which can lead to unnecessary or unused access keys that can be compromised.
  1. 6.7% of IAM users have two access keys, leading to unnecessary access keys that can be compromised.
  1. 7,580 (60.8%) IAM Users have access keys that have not been rotated in 90d
  1. 6,211 (50%) IAM User accounts have not been used in the last 90d

IAM Users past

“I told you these were shadows of the things that have been. That they are what they are, do not blame me!”

— The Ghost, Christmas Carol by Charles Dickens

These five best practices relating to regular IAM Users were analyzed against 12,478 IAM Users in 1,143 accounts:

#Best Practice# Violations%
1Ensure multi-factor authentication (MFA) is enabled for all IAM users that have a console password7736.2
2Do not set up access keys during initial user setup for all IAM users that have a console password1,33110.7
3Ensure there is only one active access key available for any single IAM user8306.7
4Ensure access keys are rotated every 90 days or less7,58060.8
5Ensure credentials unused for 90 days or greater are disabled6,21149.8

1. MFA: IAM Users

Background: Multi-factor authentication is also recommended for regular IAM Users who have a Console login enabled.

Data: 773 (6.2%) IAM User accounts do not have MFA enabled. 

Analysis: We again need to look at the effective MFA policy for regular IAM Users, including SCP policies. As SCP policy data was not available in this dataset, we instead will focus on standalone AWS accounts: 178 accounts are not part of an AWS organization and do not have MFA enforced by an SCP. In these 178 accounts, 773 (6.2%) IAM User accounts definitively do not have MFA enabled. 


  • Detection/Audit
    • Detecting whether MFA is enabled or not can be done by checking the mfa_active field in the IAM credential report or via SCP settings at the AWS Organization/OU/root level:
      aws organizations list-policies|describe-policies
    • Using the AWS Config rule:  mfa-enabled-for-iam-console-access will also detect whether MFA is enabled for IAM Users’ Console access.
  • Preventing/Auditing
    • Best practices recommend MFA be enabled for all IAM Users. For multiple accounts, it is easier to apply MFA with a Service Control Policy within an AWS Organization or if using a federated identity system, to set MFA policy there.

2. No initial access key setup

Background: Best practices recommend not provisioning access keys during initial user setup, and instead enforce more strict requests via ticketing to minimize unused keys.

Data: Based on the creation time of the user account and the access key, 1331 or 10.7% of the IAM user accounts were set up with an access key by the customer at the same time (during provisioning of the user account).

Analysis: Setting up access keys at the same time as a user account, rather than when needed, leads to a larger attack surface of access keys that can remain unused and lead to compromise. We define “at the same time” if the user creation time and access key creation time are within 10 seconds of each other.


  • Detection/Audit
    • Detecting access key provisioning at the time of user provisioning can be done by auditing the IAM User credential report, checking on the user_creation_time against the last_rotation_time of both access keys if they are enabled.
    • If they exist, the users can be notified and their access key(s) could be disabled to enforce a separate change request process to clarify requirements for access keys.
  • Prevention/Mitigation
    • If you choose to enforce this, a process for opening up tickets or change requests to issue access keys can be implemented.

3. One access key

Background: For normal use, it is recommended to have only one access key for a given IAM User at a time, with the exception being during the key rotation period, when two active keys may exist for a short period of time. Two permanent access keys are unnecessary and increase the chance of compromised keys.

Data: Out of 12,478 total IAM Users in this dataset, 830 (6.7%) have two active access keys. 

Analysis: Since a valid scenario for having two keys is during a key rotation period, we look further into how long the keys have been in existence based on their last rotated time. Here is the breakdown of the 12,478 IAM Users in this dataset by age of the keys, normalized against the number of IAM Users that existed in that timeframe:

 # IAM
# IAM Users with two access key%
>30 days old12,1007996.6%
>90 days old11,3957206.3%
>365 days old8,0014455.6%

Overall, between 5-6% of IAM Users in this dataset have two access keys regardless of age. 31 out of 830 users have access keys that are newer than 30d and this may be due to key rotation, but the majority of users appear to have two permanent access keys e.g. 8,001 (5.6%) IAM Users have two access keys over a year old.


  • Detection/Audit
    • Detecting two access keys can be done by auditing the IAM User credential report on a regular basis, incorporating last_key_rotation time to filter out potential false positives due to key rotation.
  • Prevention/Mitigation
    • Remediating the issue can be done at the same time by generating appropriate alerts and/or disabling one of the access keys.

4. Access key rotation

Background: Regular key rotation is recommended in order to mitigate the effects of compromised credentials, especially in the case of access keys where the key secrets may be stored externally on various client endpoints.

Data: Out of the 12,478 access keys in this dataset, 7,580 (60.8%) IAM Users have access keys that have not been rotated in 90d.

Of these users, 4,931 (40%) IAM Users have access keys that are over a year old, 245 IAM Users have access keys over five years old, with the oldest key being from August 2011.

Analysis: Clearly, at some point, the lack of key rotation equates to “never rotates.” The percentage of users with access keys over 90d is 60.8% and with keys over year old is 40%. The older age of access keys leads to more exposure once a key is compromised as the time window for use is that much longer. When looking at year-long timeframes, it is likely that the keys are not under any key rotation policy (which is typically recommended as 90d or less).


  • Detection/Audit
    • Auditing of key access age can be done by checking last_rotated_time in the IAM User Credential report or by using the AWS Config rule: access-keys-rotated
    • It is useful to break down the access key age into tiers to prioritize risk and address underlying causes more effectively. This can reduce false positives due to key rotation, identify “permanent” keys (and users), and help affect change in policies to minimize future problems.
  • Prevention/Mitigation
    • To remediate the situation, key rotations should be enforced with communication and coordination to all involved users.

5. Unused IAM accounts

Background: Unused accounts significantly increase the risk for compromised accounts and increase the administrative overhead for securing the environment.

Data: Out of a total of 12,478 IAM User accounts in this dataset, 6,211 (50%) IAM User accounts have not been used in the last 90d (i.e. no Console login and no API key use).

Of these user accounts, 3,549 (28.4%) user accounts have not been used in the past year, and the oldest, unused IAM User Console account was last used in March 2014, and the oldest, unused active access key was last used in April 2015.

Analysis: Half (50%) of IAM User accounts are not used regularly (last 90d), and over 28% have not been used in 365d. The latter category should be the immediate priority for remediation as it reduces account risk proportionally. Best practices would recommend culling (disabling) user accounts that have been unused for 90d or more.


  • Detection/Audit
    • Regular auditing of unused access keys or console logins should be done, and those keys and user accounts should be disabled. 
    • Unused accounts can be done by auditing the IAM credential report. Care should be taken to perform the check properly in case the access key or console login has never been used. In these cases, the password_last_used or access_key_last_used_date will not be set, and the password_last_changed or access_key_last_rotated fields must be used from the credential report.
    • Using the AWS Config Rule: iam-user-unused-credentials-check will also identify unused credentials.
  • Prevention/Mitigation
    • Unnecessary creation of IAM User accounts should be avoided in the first place. In some cases, it may make sense to use roles (AssumeRole), which use temporary credentials and avoid creation of a separate IAM User account.


Many best practices have been codified but many AWS environments lag behind in implementing these best practices. Remediating the issues is straightforward for many of the security settings, and there exists specific prescriptive guidance on auditing and remediating your configurations in these areas, which can result in a large reduction in risk.

Here are some basic measures that can be done to address some of the common risk areas due to IAM configuration in your AWS environment:

  1. MFA should be enabled on regular IAM User accounts using account-level policies or Service Control Policies and enforced using resource or IAM policies or SCPs.
  1. Audit and disable unused IAM User accounts and access keys to reduce credential attack surface.
  1. Access keys should not be set up during user account provisioning. Instead utilize an explicit request on the need for access keys.
  1. IAM Users should only have at most one access key. Disable unnecessary access keys.
  1. Rotate access keys within 90 days.
  1. Disable any IAM User accounts that have been unused for over 90 days.

In upcoming blogs, we’ll continue to explore other best practices and how individual organizations can apply these best practices specifically to their environment.

Additionally, Netskope’s Public Cloud Security platform also can automate configuration checking of your AWS environment, implementing both compliance standards, as well as custom configuration checks.

Dataset and Methodology

Time Period: Data was sampled/analyzed from January 24, 2021. 

Source: The analysis presented in this blog post is based on anonymized usage data collected by the Netskope Security Cloud platform relating to a subset of Netskope customers with prior authorization.

Data Scope: The data included 1143 AWS accounts and several hundred organizations. 

The data was composed of configuration settings across tens of thousands of AWS entities including IAM Users, IAM policies, password policy, buckets, databases, CloudTrail logs, compute instances, and security groups.

Logic: The analysis followed the logic of core root account security checks found in best practices regarding AWS configuration settings with a few adjustments for the dataset and methodology. Some best practices might define “recent usage” for the root account as a last logged in time occurring within the past 24 hours to determine whether the root account has been used recently. Because this dataset comes from a point-in-time snapshot, this was changed to within the past 7 days prior to the audit date.

author image
About the author
Jenko has 15+ years of experience in research, product management, and engineering in cloud security, AV/AS, routers/appliances, threat intel, Windows security, vulnerability scanning and compliance. At Netskope, he researches new cloud attacks.
Jenko has 15+ years of experience in research, product management, and engineering in cloud security, AV/AS, routers/appliances, threat intel, Windows security, vulnerability scanning and compliance. At Netskope, he researches new cloud attacks.