Attribute-Based Access Control (ABAC) is an authorization strategy that defines permissions based on attributes (tags) rather than explicit resource ARNs. In AWS, ABAC uses tags on IAM principals (users, roles) and resources to control access.
Instead of writing a policy like "Role X can access S3 bucket Y", you write "Any principal tagged Project=Alpha can access any resource tagged Project=Alpha". The permissions scale automatically as new resources are created with matching tags. In the policy JSON, the resource tag condition is compared against a policy variable that references the principal's tag, so a single condition block covers every project without ever naming one.
aws:PrincipalTag/key: tag on the IAM principal making the requestaws:ResourceTag/key: tag on the target resourceaws:RequestTag/key: tag being applied in a tagging API callaws:TagKeys: list of tag keys in the requestABAC moves the security boundary from policies to tags, and teams routinely forget to protect the new boundary. The classic failure looks like this: an organization rolls out a clean ABAC policy where principals tagged Project=Alpha can manage resources tagged Project=Alpha. But the same developers also hold generic permissions like ec2:CreateTags, ec2:DeleteTags, or iam:TagRole with no conditions attached, often left over from a pre-ABAC policy. Anyone in that position can simply retag a production database from Project=Bravo to Project=Alpha and walk through the front door, or tag their own role into a scope it was never meant to have. The permissions model is working exactly as written; the write path to the attributes was never locked down. Under ABAC, tagging APIs are security-critical APIs. The fix is to treat tag mutation like privilege assignment: constrain tagging permissions with aws:RequestTag and aws:TagKeys conditions so principals can only apply the tag values they already carry, deny changes to the access-control tag keys through SCPs, and alert on tag changes for sensitive resources. A second common failure is silent drift: a resource gets created without the project tag (or with a typo like Project=alpha, since tag values are case-sensitive in policy conditions, although condition key names are not), nobody can access it, and someone "fixes" the outage by attaching a broad ARN-based policy that quietly undermines the whole model.
Start by confirming what tags a role actually carries, because ABAC decisions hinge on them:
aws iam list-role-tags --role-name alpha-dev-role
Then verify the effective result of your ABAC policies with the IAM policy simulator instead of guessing:
aws iam simulate-principal-policy --policy-source-arn arn:aws:iam::123456789012:role/alpha-dev-role --action-names s3:GetObject ec2:StartInstances
The output returns an EvalDecision of allowed, explicitDeny, or implicitDeny for each action, plus the matched statements, which makes it the quickest way to prove that a tag change has the access effect you expect before you rely on it in production.
Do all AWS services support ABAC?
No. Support for aws:ResourceTag conditions varies by service and by action. Before committing to ABAC for a workload, check the "AWS services that work with IAM" reference for each service you depend on, and design a fallback (ARN-scoped policies) for services that do not support tag-based authorization.
Can federated users get tags without being IAM users?
Yes. When employees federate through SAML or OIDC, the identity provider can pass session tags derived from directory attributes such as team or cost center. The resulting session principal carries those tags, so the same ABAC policies apply to federated sessions as to IAM roles.
Are there limits on tags I should plan around?
Tag keys are limited to 128 characters and tag values to 256 characters, and these limits apply to both IAM resource tags and session tags. Keep access-control tag keys short, standardized, and documented, and validate them at creation time with aws:RequestTag conditions so malformed tags never enter the environment.
Is ABAC a replacement for least privilege?
No, it is an implementation strategy for it. ABAC narrows access dynamically, but only if the tags are trustworthy. Tag governance, restricted tagging permissions, and monitoring of tag changes are what make an ABAC deployment actually least-privilege rather than just elegant.
A JSON document that defines permissions - which actions are allowed or denied on which AWS resources, and under what conditions.
Metadata labels (key-value pairs) applied to AWS resources for organization, cost allocation, access control (ABAC), and compliance tracking.
The security principle of granting only the minimum permissions needed to perform a task - no more, no less.
An AWS identity with temporary credentials that can be assumed by users, services, or applications to perform actions without long-term access keys.
Toc Consulting: AWS Security & Cloud Architecture
Our team helps engineering teams secure and architect AWS the right way: assessment in week one, a prioritized action plan in week two.