Overview of IAM Policies
This section provides an overview of IAM policies. A policy is a document that formally states one or more permissions.
For a complete reference to the IAM policy syntax and grammar, see AWS IAM Policy Reference.
Topics
- Managed Policies and Inline Policies
- Versioning for Managed Policies
- Deprecated AWS Managed Policies
- Controlling Access to Managed Policies
- Creating a New Policy
- Working with Policies
- Testing IAM Policies with the IAM Policy Simulator
- Using Policy Validator
- Service Last Accessed Data
- Example Policies for Administering AWS Resources
To assign permissions to a user, group, role, or resource, you create a policy, which is a document that explicitly lists permissions. In its most basic sense, a policy lets you specify the following:
Actions: what actions you will allow. Each AWS service has its own set of actions. For example, you might allow a user to use the Amazon S3
ListBucketaction, which returns information about the items in a bucket. Any actions that you don't explicitly allow are denied.Resources: which resources you allow the action on. For example, what specific Amazon S3 buckets will you allow the user to perform the
ListBucketaction on? Users cannot access any resources that you have not explicitly granted permissions to.Effect: what the effect will be when the user requests access—either allow or deny. Because the default is that resources are denied to users, you typically specify that you will allow users access to resource.
Policies are documents that are created using JSON. A policy consists of one or more statements, each of which describes one set of permissions. Here's an example of a simple policy.
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example_bucket"
}
}You can attach this policy to an IAM user or group. If that's the only policy for the user
or group, the user or group is allowed to perform only this one action (ListBucket)
on one Amazon S3 bucket (example_bucket).
To specify resource-based permissions, you can attach a policy to the resource, such as an Amazon SNS topic, an Amazon S3 bucket, or an Amazon Glacier vault. In that case, the policy has to include information about who is allowed to access the resource, known as the principal. (For user-based policies, the principal is the IAM user that the policy is attached to, or the user who gets the policy from a group.)
The following example shows a policy that might be attached to an Amazon S3 bucket and that
grants permission to a specific AWS account to perform any Amazon S3 actions in
mybucket. This includes both working with the bucket and with the objects in it.
(Because the policy grants trust only to the account, individual users in the account must still
be granted permissions for the specified Amazon S3 actions.)
{
"Version": "2012-10-17",
"Id": "S3-Account-Permissions",
"Statement": [{
"Sid": "1",
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:root"]},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::mybucket",
"arn:aws:s3:::mybucket/*"
]
}]
}IAM policies control access regardless of the interface. For example, you could provide a user with a password to access the AWS Management Console, and the policies for that user (or any groups the user belongs to) would control what the user can do in the AWS Management Console. Or, you could provide the user with AWS access keys for making API calls to AWS, and the policies would control what actions the user could call through a library or client that uses those access keys for authentication.
For basic example policies that cover common scenarios, see Example Policies for Administering AWS Resources, AWS Services That Work with IAM, and the AWS Policy Examples page in the AWS Sample Code & Libraries section of the AWS website.
AWS managed policies and the Policy Generator are available from the IAM console in the AWS Management Console. For more information about creating policies in the console, see Working with Policies. Also, you can use the AWS Policy Generator online to create policies for AWS products without accessing the console.
Important
You cannot save any policy that does not comply with the established policy syntax. You can use Policy Validator to detect and correct invalid policies. One click takes you to an editor that shows both the existing policy and a copy with the recommended changes. You can accept the changes or make further modifications. For more information, see Using Policy Validator.
Note
When you apply a custom policy, IAM checks its syntax. However, because IAM evaluates policies at run time using a specific request context (in which multiple policies might be in effect), it cannot check the validity of all resources, actions, and permissions in a custom policy at the time that you apply the policy. If you need help in creating a policy, we recommend using an AWS managed policy or the Policy Generator. For help testing the effects of your IAM policies, see Testing IAM Policies with the IAM Policy Simulator.
Multiple Statements and Multiple Policies
You can attach more than one policy to an entity. If you have multiple permissions to grant to an entity, you can put them in separate policies, or you can put them all in one policy.
Generally, each statement in a policy includes information about a single permission. If your policy includes multiple statements, a logical OR is applied across the statements at evaluation time. Similarly, if multiple policies are applicable to a request, a logical OR is applied across the policies at evaluation time.
Users often have multiple policies that apply to them (but aren't necessarily attached to them). For example, IAM user Bob could have policies attached to him, and other policies attached to the groups he's in. In addition, he might be accessing an Amazon S3 bucket that has its own bucket policy (resource-based policy). All applicable policies are evaluated and the result is always that access is either granted or denied. For more information about the evaluation logic we use, see IAM Policy Evaluation Logic.
Each policy is a JSON document. As illustrated in the following figure, a policy includes:
Optional policy-wide information (at the top of the document)
One or more individual statements
Each statement includes the core information about a single permission. If a policy includes
multiple statements, AWS applies a logical OR across the statements at evaluation
time. If multiple policies are applicable to a request, AWS applies a logical OR
across the policies at evaluation time.

The information in a statement is contained within a series of elements. For information about these elements, see IAM Policy Elements Reference.
Example Policy with Multiple Statements
Policies often include multiple statements, where each statement grants permissions to a
different set of resources or grants permissions under a specific condition. For example, the
following policy has three statements, each of which grants a separate set of permissions.
Assume that the user or group that the policy is attached to is in AWS account
123456789012. (Policies can't reference resources in other accounts.) The
statements do the following:
The first statement, with a
Sid(Statement ID) element set toFirstStatement, lets users manage their own passwords. TheResourceelement in this statement is "*" (which means "all resources"), but in practice, theChangePasswordAPI (or equivalentchange-passwordCLI command) affects only the password for the user who makes the request.The second statement (
"Sid": "SecondStatement") lets the user list all the Amazon S3 buckets in their AWS account. TheResourceelement in this statement is"*"(which means "all resources"), but because policies don't grant access to resources in other accounts, the user can list only the buckets in their own AWS account. (This permission is necessary for the user to access a bucket from the AWS Management Console.)The third statement (
"Sid": "ThirdStatement") lets the user list and retrieve any object that is in a bucket calledconfidential-data, but only when the user has authenticated with a multi-factor authentication (MFA) device. TheConditionelement in the policy checks whether the user is MFA-authenticated, and if so, the user can list and retrieve objects in the bucket.When a policy statement contains a
Conditionelement, the statement is only in effect when theConditionelement evaluates to true. In this case, theConditionevaluates to true when the user is MFA-authenticated. If the user is not MFA-authenticated, thisConditionevaluates to false. In that case, the third statement in this policy will not take effect, so the user will not have access to theconfidential-databucket.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FirstStatement",
"Effect": "Allow",
"Action": ["iam:ChangePassword"],
"Resource": "*"
},
{
"Sid": "SecondStatement",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "ThirdStatement",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::confidential-data",
"arn:aws:s3:::confidential-data/*"
],
"Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
}
]
}


