This episode dissects IAM: authentication vs authorization, the principle of least privilege and zero trust, AWS, GCP, and Azure IAM components, JSON policy anatomy, and IAM CLI practice on all three providers.

In episode 2, you understood the shared responsibility model: "security IN the cloud" — the data and access layers — is your responsibility. Episode 3 covers the primary tool for that responsibility: Identity & Access Management (IAM).
IAM is the system that decides who can access what in the cloud. It sounds simple, but it's the leading cause of data breaches — not application bugs, but overly permissive entitlements. This episode dissects the concepts, components, and IAM practices across AWS, GCP, and Azure side by side.
Two words that are often mixed up, even though they are different stages:
Authentication without authorization is like having the building key but being free to enter every room — unsafe. Authorization without authentication is like having a permission list but not knowing who's coming in — useless. The cloud needs both.
Two principles drive all modern IAM design:
Use an analogy: at an airport, baggage technicians have access to the baggage area, not automatically to the pilot's cabin. If one permission leaks, the damage possible is limited to that permission's area. This is the blast radius concept — the smaller the permission, the smaller the area that can be blown up if credentials leak.
AWS builds IAM from five components:
developers group.The AWS model: permissions are attached to users, groups, or roles through policies; the final evaluation is the union of all applicable policies.
GCP uses a different approach: service accounts and policy bindings.
roles/storage.objectViewer).GCP doesn't follow an explicit-deny model at the base policy level: anyone without a binding has no access — access only exists because a binding exists.
Azure separates two things that are often treated as one:
On Azure, you log in via Entra ID, then access is checked by RBAC. Managed identity is an automatic identity for Azure applications that needs no stored secrets at all — analogous to GCP's service account.
On AWS, permissions are written as JSON policies. Understand the basic structure because all providers use similar patterns:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ReadOnlyBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::assets",
"arn:aws:s3:::assets/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": "203.0.113.0/24"
}
}
}
]
}Four key elements:
Allow or Deny. Deny always wins over Allow.service:Operation format.Tip
Notice the pattern above: you don't need to write a policy to "deny everything" — deny is the default. Policies only explicitly add permissions. Always start from empty, then add the minimum permissions possible (least privilege).
Let's look at the practical form in the CLI. On AWS, manage users and attach policies:
aws iam list-users
aws iam create-user --user-name dev
aws iam attach-user-policy \
--user-name dev \
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
aws iam list-attached-user-policies --user-name devThe command aws iam list-users lists all users in the account — a quick way to verify who has access. On GCP and Azure, the authorization pattern is assignment-based:
gcloud projects get-iam-policy my-project \
--flatten="bindings[].members" \
--format="table(bindings.role, bindings.members)"The patterns above highlight a philosophical difference: AWS is oriented around policies attached to identities; GCP and Azure are oriented around bindings between who and role on a scope. The end result is the same — granular access control — but the vocabulary differs.
| Aspect | AWS IAM | GCP IAM | Azure Entra ID + RBAC |
|---|---|---|---|
| Primary identity | User, group, role | Service account, user, group | User, service principal, managed identity |
| Permission mechanism | JSON policy (identity-based) | Roles + policy binding | Role assignment |
| Role definition | Fully custom policies | Curated + custom roles | Curated + custom roles |
| Temporary credentials | STS AssumeRole | Service account impersonation | Managed identity / workload identity |
| Permission scope | AWS account | Project / organization | Subscription / resource group |
The takeaway: whatever the component names, the thought process is the same — who (principal) + what permission (role/policy) + where (scope). Master these three questions, and IAM at any provider becomes easy to understand.
Episode 3 gives you the language to control cloud access:
In episode 4, you'll learn to practice all of this safely: why the root account shouldn't be used for daily work, the dangers of API keys that live forever, and using temporary credentials and audit logging to minimize risk.