1.1 IAM Fundamentals — Users, Groups, Roles, and Policies
Key Takeaways
- IAM is a global service — users, groups, roles, and policies are not Region-specific.
- Follow the principle of least privilege: grant only the permissions needed to perform a task.
- Use IAM roles (not access keys) for EC2 instances, Lambda functions, and cross-account access.
- IAM policies are JSON documents with Effect, Action, Resource, and optional Condition elements.
- The root user should be secured with MFA and never used for day-to-day operations.
Quick Answer: AWS Identity and Access Management (IAM) controls WHO can do WHAT on WHICH resources. Use users for human identities, groups to organize users, roles for temporary credentials (EC2, Lambda, cross-account), and policies to define permissions. Always apply least privilege and never use the root user for daily operations.
IAM Overview
AWS Identity and Access Management (IAM) is a global service that controls authentication (who are you?) and authorization (what may you do?) for every AWS Application Programming Interface (API) call. IAM itself is free — you pay only for the resources your identities consume. On the SAA-C03 exam (65 questions, 130 minutes, 720/1000 to pass), Domain 1 is the single largest block at 30%, so IAM mechanics are worth memorizing cold.
Key Characteristics
| Property | Detail |
|---|---|
| Scope | Global — one IAM namespace spans all Regions |
| Cost | Free; charges come only from the resources accessed |
| Consistency | Eventually consistent — policy edits propagate in seconds |
| Coverage | Every signed AWS API request is authorized through IAM |
IAM Users vs. Groups
An IAM user is a long-lived identity for one person or application. A group is a container that attaches the same policies to many users at once.
| Concept | Rules to Memorize |
|---|---|
| User credentials | Console password and/or access keys (Access Key ID + Secret Access Key) |
| Group membership | A user can belong to up to 10 groups; groups cannot be nested |
| Group as principal | Groups cannot be referenced in resource-based policies or assume roles |
| MFA | Multi-Factor Authentication is per-user and strongly recommended |
IAM Roles
An IAM role is an identity with permissions that a trusted principal assumes to receive temporary credentials from the AWS Security Token Service (STS). Roles are the secure-by-default answer whenever a workload — not a human — needs access.
When to Use Roles (high-yield)
| Scenario | Mechanism |
|---|---|
| EC2 needs S3/DynamoDB | Attach an instance profile (role) to the instance |
| Lambda needs other services | Lambda execution role |
| Cross-account access | Role in the target account, assumed via sts:AssumeRole |
| Corporate single sign-on | Federated role via SAML 2.0 or OIDC |
How Assumption Works
- A principal calls
sts:AssumeRole. - STS checks the role's trust policy (who may assume it).
- STS returns temporary credentials (access key, secret key, session token).
- Credentials expire after 15 minutes to 12 hours (configurable).
On the Exam: When an EC2 instance must reach S3, DynamoDB, or any AWS service, the answer is almost always "attach an IAM role." Storing long-term access keys on an instance is always wrong.
IAM Policies
Policies are JSON documents. Memorize the elements and evaluation order.
{
"Version": "2012-10-17",
"Statement": [{
"Sid": "AllowS3Read",
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"],
"Condition": { "IpAddress": { "aws:SourceIp": "203.0.113.0/24" } }
}]
}
| Element | Meaning | Required |
|---|---|---|
| Version | Always 2012-10-17 | Yes |
| Effect | Allow or Deny | Yes |
| Action | API actions such as s3:GetObject | Yes |
| Resource | Amazon Resource Names (ARNs) | Yes |
| Condition | Optional keys (IP, MFA, tag, time) | No |
Policy Types
- AWS managed — prebuilt (e.g.,
ReadOnlyAccess). - Customer managed — your reusable policies.
- Inline — embedded in one entity (1:1).
- Resource-based — attached to a resource (S3 bucket policy, KMS key policy).
- Permission boundary — caps the maximum an identity can ever have.
Evaluation Logic (memorize)
- Explicit
Denyanywhere → request denied. Deny always wins. - Service Control Policy (SCP) must allow (if in an Organization).
- Permission boundary must allow (if set).
- Identity-based policy must allow (at least one).
- Resource-based policy can grant access independently.
Key Rule: If nothing explicitly allows an action, it is implicitly denied. An explicit Deny overrides every Allow.
The Root User
The root user is the account's founding email identity with unrestricted power. Best practices: enable MFA immediately, create no access keys for root, and reserve it for the handful of root-only tasks (changing account settings, closing the account). Use IAM Access Analyzer to surface unintended external access and CloudTrail to audit every call.
Identity-Based vs. Resource-Based Policies
The exam repeatedly tests the difference between the two policy attachment styles. An identity-based policy attaches to a user, group, or role and says "this identity may do X." A resource-based policy attaches to a resource — an S3 bucket policy, an SQS queue policy, a KMS key policy, or a Lambda function policy — and names a Principal that may act on that resource. Resource-based policies are the only practical way to grant cross-account access without first creating a role, and an S3 bucket policy is the standard answer when a question says "allow another AWS account to read this bucket."
When the request and the resource live in the same account, access is granted if either the identity-based policy or the resource-based policy allows it (and nothing denies it). When they live in different accounts, both sides must allow: the resource policy must name the external principal, and that principal's identity policy must permit the action. Memorizing this dual-allow rule prevents the classic mistake of fixing only one side of a cross-account grant.
IAM Identity Center and Federation
For human access at scale, AWS now steers customers toward IAM Identity Center (formerly AWS Single Sign-On) instead of individual IAM users. Identity Center connects an external identity provider — Active Directory, Okta, or any SAML 2.0 / OIDC source — and maps groups to permission sets that become roles in each account. The result is centralized, short-lived, MFA-protected console and CLI access with no long-lived keys to leak. On the exam, "hundreds of employees need least-privilege access across many accounts" points to IAM Identity Center with permission sets, not to creating an IAM user per person in every account.
Common IAM Exam Traps
- Long-lived access keys on EC2 — always replaced by an instance-profile role.
- Making a bucket public to solve an access problem — almost never correct; use a bucket policy or VPC endpoint policy instead.
- Assuming an SCP grants access — it only caps; IAM still must allow.
- Forgetting that Deny wins — an explicit Deny in any policy layer cannot be overridden by any Allow.
- Believing IAM is Regional — it is global; a role works in every Region without duplication.
An EC2 instance needs to read objects from an S3 bucket. What is the MOST secure way to grant this access?
An IAM identity-based policy explicitly allows s3:PutObject, but an SCP attached to the account's OU denies s3:PutObject. What happens when the user uploads to S3?
Which IAM construct issues TEMPORARY security credentials through STS?