In our first article, we established that the AWS Account is a hard boundary for security.
We also discovered a major hurdle for architects: every AWS account has its own isolated IAM database.
If every account has its own IAM database, does that mean my users need a separate login for every account? If I have 50 accounts, does an engineer need 50 sets of credentials?
The answer is No.
While you could create individual IAM Users in every account, that is a major security anti-pattern for an enterprise. Instead, you use the Identity Store within AWS IAM Identity Center.
1. The AWS Identity Store : Your Native Source of Truth
Instead of relying on an external provider like Azure or Okta, AWS provides a built-in directory called the Identity Store. It lives within the IAM Identity Center and serves as your single source of truth for the entire Organization.
-
- Centralized Management: You create your users and groups once in this central store. You no longer touch the “IAM Users” section in individual accounts.
-
- Groups are Everything: In an enterprise, you don’t manage permissions for “John Doe.” You create a group in the Identity Store—like
Platform-EngineersorSecurity-Audit—and add John to it.
- Groups are Everything: In an enterprise, you don’t manage permissions for “John Doe.” You create a group in the Identity Store—like
-
- The Access Portal: Users get a single, unique URL (the AWS Access Portal). They log in there once and see every account they are authorized to enter.
Okay, I have a central list of users and groups. But how do I actually give those groups permission to do things in the member accounts?
2. Permission Sets : The Policy Templates
This is where AWS separates “who you are” from “what you can do.” In the Identity Center, you create Permission Sets.
-
- What they are: A Permission Set is essentially a template for an IAM Role. It contains the standard IAM policies (either AWS-managed or your own custom JSON) that define access.
-
- Provisioning: When you assign a Permission Set to a group for a specific account, the Identity Center “provisions” that role into the target account automatically.
-
- The “Magic” of Managed Roles: You don’t have to manually create roles in your target accounts. AWS handles the “plumbing” of injecting the role and attaching the policies for you.
In Azure, if I assign a role at the Top Level, it inherits down. Does AWS work the same way?
3. Account Assignments : Explicit vs. Inherited
This is a critical “Deep Dive” fact: AWS does not have RBAC inheritance. *
The Explicit Rule: Even if you have 10 accounts in a “Production” OU, assigning a group to the OU doesn’t automatically grant access. You must create an Assignment that links the [User/Group] + [Permission Set] + [Specific Account].
Why IaC tool like Terraform is recommended : Because there is no native inheritance, managing these assignments manually in the console is impossible at scale. You should use IaC tool like Terraform to define your assignments as code, ensuring that every time a new account is “vended” into the Org, the right groups are mapped to it automatically.
4. Cross-Account Roles : Handling the “Non-Humans”
Identity Center handles your people, but what about your automation? Your CI/CD pipelines or third-party monitoring tools also need to move between accounts.
-
- Trust Relationships: You create a role in your “Production” account that “trusts” your “Tooling” account.
-
- Assuming the Role: Your automation server in the Tooling account uses the
AssumeRoleAPI call to temporarily act as an admin in the Production account. It gets short-lived security tokens that expire automatically, which is far more secure than using static keys.
- Assuming the Role: Your automation server in the Tooling account uses the
Recommended Best Practices for Enterprise Identity
1. Shift to Group-Based Access : Never assign Permission Sets to individual users. By mapping permissions to Groups within the Identity Store, you ensure that onboarding and offboarding are handled at the directory level. When a user leaves a team, removing them from one group instantly revokes their access across the entire AWS Organization.
2. Use Identity Store over Local IAM Users : Eliminate the use of individual IAM users within member accounts. Local IAM users often rely on static, long-lived access keys which are a primary security risk. By using the Identity Store, you force all human traffic through a centralized portal that provides temporary, short-lived credentials.
3. Create Reusable Permission Sets : Avoid writing unique inline policies for every account. Define standardized Permission Sets (e.g., ReadOnly, SecurityAudit, Developer) at the Organization level. These templates can be reused across hundreds of accounts, ensuring that a “Developer” has the exact same guardrails in the Network account as they do in the App account.
4. Leverage Trust Relationships for Non-Human Identities : For automation, such as CI/CD pipelines or monitoring tools, use IAM Roles with Trust Relationships. Instead of hardcoding credentials, the “Tooling” account is “trusted” to assume a role in a “Target” account. This allows for seamless cross-account movement using temporary security tokens.
5. Implement Least Privilege via Permission Boundaries : While Permission Sets define what a user can do, use IAM Permission Boundaries for power users. This allows you to delegate the ability to create roles to developers without allowing them to escalate their own privileges or bypass security controls.
This video provides a practical look at the difference between the old way (IAM Users) and the modern enterprise way (Identity Center). AWS IAM vs IAM Identity Center
What’s Next ?
Now that we’ve solved Identity—our users are in the Identity Store and they can log into their accounts securely—we have a new problem. How do we prevent an “Account Admin” from doing something dangerous, like opening a database to the public or deleting the central audit logs?
In our next article, we will deep dive into Guardrails and SCPs. We’ll look at how Service Control Policies act as the ultimate “Deny” filter that sits above all the permissions we just discussed.