SAP-C03 Identity Security Architecture: Identity Center Federation, Cognito, EKS Pod Identity, Least Privilege, ABAC and Data Perimeters
Identity security architecture on AWS is the design of who and what can authenticate, which temporary credentials they receive, and which guardrails limit what those credentials can reach. For SAP-C03 that spans workforce federation through IAM Identity Center with SAML 2.0 and SCIM, application sign-in with Amazon Cognito and OAuth 2.0, workload identities for EKS pods, CI/CD pipelines, other clouds and on-premises servers, least-privilege controls (cross-account roles, external IDs, permissions boundaries, session policies and ABAC), and data perimeters validated with IAM Access Analyzer and enforced for private apps with AWS Verified Access. This lesson explains how each mechanism behaves and how to choose between near-identical designs.
On this page10 sections
- How does IAM Identity Center federate a workforce with an external identity provider?
- How do permission sets, assignments and delegated administration work in IAM Identity Center?
- When should an application use a Cognito user pool, an identity pool or OAuth 2.0 scopes?
- How should pods on Amazon EKS get AWS permissions?
- How do workloads outside AWS get temporary AWS credentials?
- How do you design cross-account and third-party role access safely?
- How do permissions boundaries and session policies limit what a role can do?
- How does attribute-based access control (ABAC) work with session and resource tags?
- How do you build and validate a data perimeter?
- What is AWS Verified Access and when does it replace a VPN?
- Design workforce federation with IAM Identity Center, an external SAML 2.0 IdP and SCIM provisioning, including permission sets, customer managed policy references, delegated administration and attributes for access control
- Choose between Cognito user pools, identity pools, ALB authentication and OAuth 2.0 client credentials with scopes for application authentication and authorization
- Give EKS pods, CI/CD pipelines, other clouds and on-premises servers temporary credentials with EKS Pod Identity, IRSA, IAM OIDC federation, IAM Roles Anywhere and outbound identity federation
- Design least-privilege cross-account access with external IDs, durable trust policies, permissions boundaries, session policies and the role-chaining session limit
- Build ABAC on session and resource tags, including tag protection and transitive session tags
- Design identity, resource and network data perimeters with endpoint and resource policies, and validate them with IAM Access Analyzer
- Replace VPN access to private applications with AWS Verified Access group and endpoint policies
How does IAM Identity Center federate a workforce with an external identity provider?
IAM Identity Center federates a workforce by trusting an external identity provider (IdP) such as Okta, Microsoft Entra ID or Ping for sign-in through SAML 2.0, and by receiving the IdP's users and groups through SCIM provisioning. Users sign in once at the IdP and see every account and permission set they are assigned. Identity Center is enabled once per organization (in the management account, or as an account instance for a single account), and it replaces per-account IAM users and per-account IAM SAML providers for human access.
The two protocols do different jobs, and an external-IdP design needs both:
| Protocol | What it does | What breaks without it |
|---|---|---|
| SAML 2.0 | Authenticates the user: the IdP sends a signed assertion to Identity Center at sign-in | Nobody can sign in through the IdP |
| SCIM (automatic provisioning) | Creates, updates and removes users and groups in the Identity Center identity store, and keeps group membership in sync | Users or group members added in the IdP do not exist in Identity Center, so they authenticate at the IdP and then fail with no accounts; people disabled in the IdP stay in Identity Center |
Identity Center does not create users just in time from a SAML assertion: a user must already exist in the identity store, matched by user name, before sign-in succeeds. Turning on automatic provisioning gives you an SCIM endpoint and an access token that you configure in the IdP. With SCIM in place, disabling or removing someone in the IdP removes their AWS access with no AWS-side work, which is the usual joiner-mover-leaver requirement. (You can instead keep users in the Identity Center identity store or connect AWS Managed Microsoft AD or a self-managed AD through AD Connector; only one identity source is active at a time.)
Compare the older pattern: an IAM SAML identity provider created in each account, with IdP groups mapped to IAM roles per account. It works, but every account needs its own provider, roles and mappings, and there is no central assignment view. An IAM SAML provider remains the right tool for a single account or for an application that needs it, but for many accounts in AWS Organizations, Identity Center is the managed answer. Amazon Cognito is for your application's customers, not for workforce access to AWS accounts.
How do permission sets, assignments and delegated administration work in IAM Identity Center?
A permission set defines what access looks like; an assignment gives a user or group that permission set in a chosen account. When you assign it, Identity Center provisions an IAM role (named AWSReservedSSO_<name>_…, under the /aws-reserved/sso.amazonaws.com/ path) in each target account, and it updates every copy when you change and reprovision the permission set. This gives one definition, maintained in one place, that applies to many accounts and cannot drift account by account.
A permission set can contain:
- AWS managed policies and one inline policy, copied into every provisioned role.
- Customer managed policy references: a name and path only. Each assigned account must already contain a customer managed policy with that exact name and path, and Identity Center attaches that account's own copy. This lets one permission set name account-specific resources (each account's buckets, for example). If the policy is missing in an account, provisioning to that account fails; deploy the policies first, for example with CloudFormation StackSets.
- A permissions boundary, given as an AWS managed policy or a customer managed policy reference (same rule: the policy must exist in each account).
- A session duration and an optional relay state (the console page users land on).
Administering Identity Center outside the management account
The Identity Center organization instance lives in the management account and cannot be moved. To keep daily administrators out of the management account, register a member account (often a security tooling account) as the delegated administrator; most administration then happens there. AWS keeps one protection in place: a permission set provisioned to the management account can be changed only from the management account, so management-account access stays under management-account control. Best practice is to use dedicated permission sets for the management account and to assign them to individual users rather than IdP groups, because anyone who controls group membership in the IdP could otherwise grant themselves management-account access.
Attributes for access control
Identity Center can pass user attributes into every session as session tags (principal tags), so one permission set supports attribute-based access control (ABAC) across accounts. Enable attributes for access control, then either send the attribute from the external IdP in the SAML assertion (attribute name https://aws.amazon.com/SAML/Attributes/AccessControl:<key>) or, when users live in the identity store or come through SCIM, map a key to an identity store attribute with path syntax such as ${path:enterprise.department}. Policies in the permission set then compare aws:PrincipalTag/<key> with resource tags. Tagging the shared provisioned role itself does not help: every user of that role would carry the same tag. Identity store users cannot carry IAM tags.
When should an application use a Cognito user pool, an identity pool or OAuth 2.0 scopes?
Use an Amazon Cognito user pool when your application needs to know who the user is: it is a managed user directory and OpenID Connect / OAuth 2.0 authorization server that handles sign-up, sign-in, MFA and federation, and issues JSON Web Tokens. Use an Amazon Cognito identity pool when the app must call AWS services directly and needs temporary AWS credentials. Many apps use both: the user pool authenticates, and the identity pool exchanges the user pool token for credentials.
| Need | Use | Output |
|---|---|---|
| Customer sign-up and sign-in, social sign-in (Google, Apple, Facebook, Amazon), corporate SAML or OIDC sign-in for an app | Cognito user pool with external identity providers | ID, access and refresh tokens from one issuer |
| Protect an API without writing token code | User pool + API Gateway Cognito user pool authorizer | API Gateway validates the token |
| App calls S3 or DynamoDB directly, including guests | Identity pool (optionally fed by a user pool) | Temporary AWS credentials for an IAM role |
| Workforce access to AWS accounts | IAM Identity Center, not Cognito | Role sessions in accounts |
Federation through a user pool
A user pool can add many SAML 2.0 and OIDC identity providers and still issue tokens from one issuer, so the application validates a single token format. For a B2B SaaS with many enterprise customers, add each customer's IdP as a SAML provider in one user pool, enable it on the app client, and set the provider's identifiers to the customer's email domains so managed login routes each user to the right IdP from their email address, with no company picker and no pool per customer.
Load balancer authentication
An Application Load Balancer can authenticate users before forwarding requests: put an authenticate-cognito or authenticate-oidc action before the forward action in an HTTPS listener rule, and unauthenticated requests never reach the targets. The ALB speaks only OIDC (directly or through Cognito); it cannot talk SAML. For a SAML-only corporate IdP, put a user pool in between (SAML provider in the pool, an app client for the ALB, then authenticate-cognito).
OAuth 2.0 for machine-to-machine APIs
When no human is involved, use the client credentials grant: define a resource server in the user pool with custom scopes (for example invoices/read and invoices/write), create one app client with a client secret per partner, and allow each client only the scopes it should have. Each client is revocable on its own. On API Gateway, a Cognito authorizer plus OAuth scopes on each method enforces this with no custom code. API keys and usage plans are for throttling and quotas, not authorization.
Know which token goes where. The ID token describes the user (for the app); the access token carries the granted scopes (for APIs). If a method has OAuth scopes configured, the Cognito authorizer accepts only an access token that contains a required scope; without scopes, it accepts the ID token. Adding scopes to a method and still sending ID tokens yields 401 Unauthorized.
Scoped AWS credentials from an identity pool
An identity pool turns an identity token (from a user pool, a social provider, SAML or OIDC) into temporary AWS credentials for an IAM role, so a mobile or web app can call S3, DynamoDB or other services directly without long-term keys and without a backend that signs requests. Each user gets a stable identity ID.
- Guest access: enabling unauthenticated identities gives visitors who have not signed in credentials for a separate, narrowly scoped guest role (read-only browsing, for example), while signed-in users get the authenticated role.
- Per-user scoping: the policy variable
${cognito-identity.amazonaws.com:sub}is the caller's identity ID, so a resource ARN such asarn:aws:s3:::bucket/${cognito-identity.amazonaws.com:sub}/*lets each user reach only their own prefix with one role. - Role selection: use the default authenticated role, choose the role from the token (user pool groups carry IAM roles, which appear as
cognito:rolesandcognito:preferred_roleclaims), or choose the role with rules that match claim values. Rules work but grow with every value you add. - Attributes for access control: map token claims (for example a custom
departmentattribute) to principal tags on the session, then use${aws:PrincipalTag/department}in policies. Combined with token-based role selection, groups decide which actions and tags decide which data, with no role, rule or group per attribute value.
A user pool token sent straight to S3 or DynamoDB is not an AWS credential and is rejected; S3 access points and bucket policies cannot validate Cognito tokens. Presigned URLs also work for uploads, but they need a backend service that holds credentials and signs each URL; an identity pool needs no such service.
How should pods on Amazon EKS get AWS permissions?
Give each Kubernetes service account its own IAM role through EKS Pod Identity or IAM roles for service accounts (IRSA); never rely on the node instance role, which every pod on the node can use, and never mount access keys into pods.
| EKS Pod Identity | IRSA | |
|---|---|---|
| Setup | Install the EKS Pod Identity Agent add-on; create a Pod Identity association (cluster, namespace, service account, role) through the EKS API | Create an IAM OIDC identity provider for each cluster; annotate the service account with eks.amazonaws.com/role-arn |
| Role trust policy | Trusts the service principal pods.eks.amazonaws.com for sts:AssumeRole and sts:TagSession, identical for every cluster | Trusts each cluster's OIDC provider, with a sub condition such as system:serviceaccount:<namespace>:<name>; a new cluster means a trust-policy edit |
| Reuse across clusters | One role in any number of clusters, no trust-policy change | Per-cluster providers and trust entries |
| Session tags | Adds tags such as eks-cluster-name, kubernetes-namespace and kubernetes-service-account | No such session tags |
| Where it runs | Linux EC2 worker nodes; not on AWS Fargate or Windows nodes | EC2 nodes and Fargate |
Pod Identity also separates duties: the IAM team owns roles and policies, the cluster team owns associations, and nobody has to create OIDC providers. Its session tags enable ABAC: one role whose S3 resource is bucket/${aws:PrincipalTag/kubernetes-namespace}/* isolates every namespace, including namespaces created later. For pods that must run on Fargate, use IRSA. The Fargate pod execution role is for pulling images and writing logs, not for the application's own AWS calls.
How do workloads outside AWS get temporary AWS credentials?
A workload outside AWS gets temporary credentials by federating the identity it already has: an OpenID Connect token goes through an IAM OIDC identity provider, and an X.509 certificate goes through IAM Roles Anywhere. Long-term IAM user access keys, even when rotated or stored in a secrets manager, are the pattern these replace.
| The workload has | Use | AWS call |
|---|---|---|
| OIDC tokens from a CI/CD platform (GitHub Actions, GitLab) or another cloud's workload identity (Google service account, Azure managed identity) | IAM OIDC identity provider + role | AssumeRoleWithWebIdentity |
| X.509 certificates from your own or a private CA (on-premises servers, devices) | IAM Roles Anywhere | CreateSession (through the credential helper) |
| Nothing, but it is an AWS workload that must prove its identity to an external service | IAM outbound identity federation | sts:GetWebIdentityToken |
Scoping OIDC trust
The role trust policy must check both claims. aud says the token was issued for AWS (for GitHub, sts.amazonaws.com); sub says which workload is asking. For GitHub Actions, sub looks like repo:<org>/<repo>:ref:refs/heads/<branch> (or …:environment:<name> when environments are used). A trust policy that checks only aud lets any repository on the platform assume the role; a wildcard across the organization's repositories is broader than "only this repo's main branch". Use StringEquals on the exact sub when one workload should qualify.
IAM Roles Anywhere
Register the CA as a trust anchor (AWS Private CA or an external CA's certificate bundle), create a profile that lists the roles that can be assumed (with optional session policies and duration), and give the role a trust policy for rolesanywhere.amazonaws.com allowing sts:AssumeRole, sts:TagSession and sts:SetSourceIdentity, ideally limited with aws:SourceArn to the trust anchor. Certificate fields become session principal tags, so a trust policy can require, for example, aws:PrincipalTag/x509Subject/OU to equal a specific organizational unit. The certificate's common name becomes the source identity. For revocation, Roles Anywhere checks only CRLs that you import into it (and update by re-importing); it never calls CRL distribution points or OCSP responders. Shortening sessions does not stop a stolen, valid certificate from creating new sessions.
Outbound identity federation
The reverse direction: an AWS workload calling a third-party API that accepts bearer JWTs. With outbound identity federation enabled in an account, a role calls sts:GetWebIdentityToken for a chosen audience and receives a short-lived JWT signed by the account's issuer, which the external service verifies against the issuer's published keys. IAM policies control which roles may request tokens and for which audiences, and no shared client secret exists anywhere. An IAM OIDC provider for the partner would be inbound federation, the opposite direction.
How do you design cross-account and third-party role access safely?
Cross-account access uses an IAM role in the target account whose trust policy names who may assume it, plus an identity policy in the caller's account that allows sts:AssumeRole on it. Both sides must allow the call. The caller receives temporary credentials; no keys are shared.
Same-account versus cross-account evaluation
Within one account, an allow in either the principal's identity-based policies or the resource's resource-based policy is enough (when nothing denies it): a role whose identity policy allows sqs:SendMessage can send to a queue in its own account even though the queue has no queue policy. Across accounts, both sides must allow: the caller's identity policy and the resource policy (or role trust policy) in the other account. So a missing resource policy explains a cross-account denial, never a same-account one; for a same-account denial, look for an explicit deny or a limit such as a permissions boundary, session policy or SCP.
External IDs and the confused deputy
When a third party (a SaaS vendor) assumes roles in many customers' accounts, a malicious customer could give the vendor another customer's role ARN and have the vendor fetch that customer's data: the confused deputy problem. The defence is an external ID that the vendor generates, unique per customer, shows to the customer as a value they cannot edit, and always sends with AssumeRole; each customer's trust policy requires sts:ExternalId to equal it. An external ID chosen by the customer fails, because a second customer could type the same value. An external ID is not a secret; its value lies in being assigned by the vendor and unique.
Trusting a role that might be recreated
When a trust policy names a role ARN as principal, IAM stores that role's unique principal ID. If the role is deleted and recreated with the same name, the ID changes, the trust policy shows an AROA… ID and assumption fails. To survive rebuilds while still trusting only that role, set the principal to the vendor's account and add a condition on aws:PrincipalArn for the role's ARN (plus the external ID). aws:SourceArn describes a resource on whose behalf a service acts, so it is not the key for role-to-role trust.
Session duration and role chaining
A role's maximum session duration can be set from 1 to 12 hours, and callers request up to that with DurationSeconds. Role chaining (using one role's session to assume another role) is capped at one hour: a chained AssumeRole that requests more than 3,600 seconds fails rather than being shortened, whatever either role's maximum is. Long jobs that chain roles must request an hour or less and refresh credentials through the first role before they expire.
How do permissions boundaries and session policies limit what a role can do?
Both are limits, never grants: the effective permissions are the intersection of the identity-based policies and the boundary or session policy. Anything the limit does not allow is denied, even if an attached policy such as AdministratorAccess allows it; anything the identity policies do not allow is denied, even if the limit allows it.
| Permissions boundary | Session policy | |
|---|---|---|
| Attached to | An IAM user or role, persistently | One session, passed at AssumeRole, AssumeRoleWithSAML, AssumeRoleWithWebIdentity or GetFederationToken |
| Typical use | Safe delegation: developers may create roles, but no role can exceed the boundary | One shared role, a narrower scope per session (per tenant, per job) with no IAM resource per tenant |
| Form | A managed policy | An inline JSON policy and/or up to 10 managed policy ARNs |
Delegating role creation without privilege escalation
To let developers create roles for their own functions without opening an escalation path, combine these controls in the developers' policy:
- Allow
iam:CreateRole,iam:PutRolePolicy,iam:AttachRolePolicy(and similar) only when the condition keyiam:PermissionsBoundaryequals the boundary's ARN. - Deny
iam:DeleteRolePermissionsBoundary, and denyiam:CreatePolicyVersion,iam:SetDefaultPolicyVersionandiam:DeletePolicyon the boundary policy itself, so nobody can remove or rewrite the cap. - Require a path (for example
/dev/) on created roles and allowiam:PassRoleonly on roles under that path, optionally withiam:PassedToService.iam:PermissionsBoundarydoes not apply toiam:PassRole, so without this a developer can pass an existing privileged role to a new function and act through it.
Putting the boundary on the developers' own role limits the developers, not the roles they create. An SCP that blocks role creation also blocks developer self-service: it prevents escalation by removing the delegation altogether (SCP design is covered in the multi-account governance lesson).
Session policies for multi-tenant brokers
A token broker that assumes one broad role can pass a session policy limited to one tenant's prefix on each call, so the credentials handed to a worker allow only that tenant's data. This scales to thousands of tenants because no per-tenant role or policy exists. A permissions boundary is a poor fit here: it belongs to the role, so changing it per call would affect every session at once.
How do you build and validate a data perimeter?
A data perimeter is a set of preventive guardrails that ensures only trusted identities access trusted resources from expected networks. It is built from resource-based policies, VPC endpoint policies and organization policies, each using global condition keys; IAM Access Analyzer then checks continuously that nothing is shared beyond it.
| Perimeter | Question it answers | Where to enforce | Key |
|---|---|---|---|
| Identity | Is the caller one of ours? | Resource-based policies (bucket, key, queue) and resource control policies; also VPC endpoint policies (only our identities through our network) | aws:PrincipalOrgID |
| Resource | Is the target one of ours? | VPC endpoint policies, service control policies | aws:ResourceOrgID |
| Network | Is the request coming from our network? | Resource-based policies and resource control policies; also service control policies (our identities may call only from our network) | aws:SourceVpce, aws:SourceVpc, aws:SourceIp |
Each perimeter can be enforced in more than one place; the table names the controls that each one most often relies on, and a mature perimeter layers several.
VPC endpoint policies apply to every request through the endpoint whatever credentials are used, so an endpoint policy that allows S3 only when aws:ResourceOrgID equals your organization ID stops someone in your VPC from copying data to a personal bucket with personal keys. An SCP cannot do that: SCPs constrain only your organization's own principals. Pair it with bucket policies on sensitive buckets that deny requests not arriving through your endpoints (aws:SourceVpce). SCPs and RCPs themselves are designed in the multi-account governance lesson.
The two service exceptions
aws:PrincipalIsAWSServiceis true when an AWS service principal acts on its own (AWS Config delivering configuration snapshots, VPC Flow Logs or CloudTrail delivering log files). An identity-perimeter deny onaws:PrincipalOrgIDblocks those services unless the deny adds"BoolIfExists": {"aws:PrincipalIsAWSService": "false"}.aws:ViaAWSServiceis true when a service makes a request with the caller's credentials on their behalf (forward access sessions), such as Amazon S3 calling AWS KMS to decrypt an SSE-KMS object for the reader, or CloudFormation creating resources with the caller's credentials. Those calls come from AWS's network, so a network-perimeter deny onaws:SourceVpceblocks them unless it adds"BoolIfExists": {"aws:ViaAWSService": "false"}. This adds no new network path.
Validating external access with IAM Access Analyzer
| Capability | What it does |
|---|---|
| External access analyzer | Finds resources (S3 buckets, KMS keys, IAM role trust policies, SQS queues, Secrets Manager secrets, Lambda functions and more) whose policies grant access to principals outside the zone of trust (an account or the organization), including public access. Regional: create one per Region in use, usually from a delegated administrator account. |
| Internal access analyzer | Shows which principals inside the organization can reach chosen critical resources. Also Regional: enable it in each Region independently. |
| Unused access analyzer | Reports unused roles, access keys, passwords and permissions for right-sizing; findings are not Region-specific. |
| Policy validation | Checks a policy against grammar and best practices (errors, security warnings, suggestions). |
| Custom policy checks | CheckAccessNotGranted fails if a policy allows any listed actions (or resources); CheckNoNewAccess fails if a policy grants more than a reference policy; CheckNoPublicAccess fails if a resource policy allows public access. Built for CI/CD gates. |
| Policy generation | Drafts a least-privilege policy from CloudTrail activity. |
For a pipeline rule such as "never allow these specific actions", CheckAccessNotGranted is the precise check; general validation warnings do not target named actions, and CheckNoNewAccess answers "did this change widen access compared with before".
What is AWS Verified Access and when does it replace a VPN?
AWS Verified Access provides VPN-less, zero-trust access to private applications: it evaluates every request against the user's identity and, optionally, the device's security posture, and forwards only allowed requests to the application, which stays internal. It suits employees and contractors who need specific internal web apps, not the whole network.
- Instance: the top-level resource. It has trust providers: a user identity trust provider (IAM Identity Center or an OIDC-compatible IdP) and optionally device trust providers (for example CrowdStrike, Jamf or JumpCloud). An instance takes one user identity provider and can take several device providers.
- Group: a collection of endpoints that share security requirements, with a group policy written in Cedar that tests identity and device claims (group membership, email domain, posture score).
- Endpoint: one application, typically an internal Application or Network Load Balancer or a network interface, with an optional endpoint policy.
When an endpoint has a policy, both the group policy and the endpoint policy must allow the request. So put shared requirements in the group policy and app-specific requirements (for example, membership of a Finance-Admins group for a ledger app) in that app's endpoint policy; a forbid in the group policy would hit every app in the group, and another permit adds nothing restrictive. Trust providers belong to the instance, not to individual apps.
Compared with alternatives: a client VPN grants network-level access to a VPC; an ALB with authenticate-oidc or Cognito checks identity but needs a reachable (usually internet-facing) load balancer and checks no device posture; PrivateLink connects networks, not users. Verified Access is the design that combines all three properties: no network-level access or VPN client, an identity (and optionally device) decision on every request, and an application that is never exposed to the internet.
Tip. SAP-C03 tests identity security with long multi-account scenarios that state constraints such as no new permission set or role per project, no OIDC providers or trust-policy edits per cluster, no long-term credentials outside AWS, no backend signing service, no custom code, no VPN, or access that must vanish when HR disables someone. Many items are Select TWO, pairing two mechanisms that each solve half the requirement (sign-in plus provisioning, role selection plus principal tags, require-the-boundary plus protect-the-boundary). Wrong options are workable designs that break one stated constraint or confuse near-twins: user pools and identity pools, ID and access tokens, IRSA and Pod Identity, RequestTag and ResourceTag, PrincipalOrgID and ResourceOrgID, PrincipalIsAWSService and ViaAWSService, external and unused access analyzers, group and endpoint policies. Symptom-led items describe what is observed after a change (a sign-in or access failure, a broken delivery, a missing finding) and ask for the root-cause fix, so know how each mechanism fails as well as how it works.
- With an external IdP, IAM Identity Center needs SAML 2.0 for sign-in and SCIM for provisioning; it never creates users just in time from an assertion.
- A permission set is defined once and provisioned as a role in every assigned account; customer managed policy references need a same-named policy on the same path in each account.
- Delegate Identity Center administration to a member account, but keep management-account access on dedicated permission sets assigned to individual users.
- Cognito user pools say who the user is (tokens); identity pools hand out temporary AWS credentials; scoped API methods need the access token, not the ID token.
- EKS Pod Identity reuses one role across clusters with no OIDC provider and adds namespace session tags, but it does not run on Fargate, where IRSA is the choice.
- OIDC tokens federate through an IAM OIDC provider (always restrict sub), X.509 certificates through IAM Roles Anywhere (imported CRLs only), and outbound JWTs come from sts:GetWebIdentityToken.
- External IDs must be generated by the vendor and unique per customer; trusting the vendor account plus aws:PrincipalArn survives a role rebuild.
- Permissions boundaries and session policies only limit, and role chaining caps sessions at one hour; delegated role creation also needs a protected boundary and PassRole restricted to the developers' own roles.
- ABAC compares PrincipalTag with ResourceTag (RequestTag on create), is only safe when tagging is locked down, and needs TransitiveTagKeys to cross a role chain.
- VPC endpoint policies with aws:ResourceOrgID stop exfiltration whatever credentials are used; exempt service principals with aws:PrincipalIsAWSService and forward access sessions with aws:ViaAWSService; external access analyzers are Regional.
Frequently asked questions
Why do new users fail to sign in to IAM Identity Center even though the IdP authenticates them?
IAM Identity Center does not create users just in time from a SAML assertion. A user must already exist in the Identity Center identity store, which with an external identity provider means it must be provisioned through SCIM. Enable automatic provisioning in Identity Center and configure the IdP to push users and groups, and new users and group members will then appear and receive their account assignments.
What is the difference between a Cognito user pool and a Cognito identity pool?
A Cognito user pool is a user directory and OAuth 2.0 / OpenID Connect authorization server: it signs users up and in, federates social, SAML and OIDC providers, and issues ID and access tokens that apps and APIs validate. A Cognito identity pool exchanges an identity token for temporary AWS credentials for an IAM role, including guest credentials, so an app can call AWS services such as S3 or DynamoDB directly. Many apps use a user pool for sign-in and an identity pool for AWS access.
Should I use EKS Pod Identity or IAM roles for service accounts (IRSA)?
Use EKS Pod Identity for pods on Linux EC2 nodes when you want one IAM role reused across many clusters without creating an IAM OIDC provider per cluster or editing trust policies; its roles trust pods.eks.amazonaws.com, and it adds session tags such as kubernetes-namespace for ABAC. Use IRSA for pods on AWS Fargate or Windows nodes, which Pod Identity does not support. Neither the node instance role nor the Fargate pod execution role should carry application permissions.
How does an external ID prevent the confused deputy problem?
A third party that assumes roles in many customer accounts could be tricked into using its access on behalf of the wrong customer if a customer supplies someone else's role ARN. When the third party generates a unique external ID for each customer, always sends it with AssumeRole, and each customer's trust policy requires that sts:ExternalId, a customer cannot make the third party assume another customer's role. If customers choose their own external IDs, two customers could pick the same value, so the protection fails.
Why does a chained AssumeRole fail when I request a two-hour session?
Role chaining, which means assuming a role with credentials from another role session, limits the new session to a maximum of one hour. A chained AssumeRole call that requests more than 3,600 seconds fails rather than being shortened, regardless of the maximum session duration configured on either role. Request one hour or less and refresh the credentials before they expire.
What do permissions boundaries actually do?
A permissions boundary is a managed policy that sets the maximum permissions an IAM user or role can have from its identity-based policies. The effective permissions are the intersection of the boundary and the attached policies, so a boundary never grants anything: a role with an identity policy that allows all of Lambda, SNS and EC2 and a boundary that allows only Lambda and SNS can use only Lambda and SNS. To delegate role creation safely, also require the boundary on create, protect the boundary policy from edits and removal, and restrict iam:PassRole to the roles developers create.
When should a data perimeter use aws:PrincipalIsAWSService versus aws:ViaAWSService?
Use aws:PrincipalIsAWSService to exempt AWS service principals acting on their own behalf, such as AWS Config delivering configuration snapshots to a bucket, from an identity-perimeter deny on aws:PrincipalOrgID. Use aws:ViaAWSService to exempt requests that an AWS service makes with a caller's own credentials, such as Amazon S3 calling AWS KMS to decrypt an SSE-KMS object for the reader, from a network-perimeter deny on aws:SourceVpce. Both are added to the deny with BoolIfExists set to false.
Is IAM Access Analyzer Regional?
External and internal access analyzers are Regional: an analyzer reports only resources in the Region where it was created, so an organization enables one in each Region it uses, typically created from a delegated administrator account. Unused access findings are not Region-specific. Policy validation and custom policy checks such as CheckAccessNotGranted and CheckNoNewAccess are API calls you run on a policy, often in a CI/CD pipeline.
Source
This lesson covers the "Security, Compliance, and Governance" domain of the official SAP-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Solutions Architect – Professional (SAP-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.