Creating an AWS IAM Policy: AWS Security

However you choose to do it: your AWS IAM policy must be a good fit for your application’s actual access needs. We’ll discuss three ways to get it done.

Welcome to part six of our AWS Security Series. Last week I introduced Identity & Access Manager (IAM) and how you can control access to resources by using the predefined user, group, and role policy templates created and designed by AWS. This week, I want to show you how you can create your own custom IAM policy in the form of a JSON script and test it using the AWS Policy Simulator.

This article will cover the main elements, syntax, and structure of an IAM policy, and different ways to create your own IAM policy. Using a predefined IAM policy is more likely than not a perfect match for the permissions you actually need. However, now and again, you may want to tweak a small part of it to more exactly fit your requirements. Remember, when it comes to security, the more precisely you can define your controls, the better. You should avoid being lazy and deploying implementations that are “close enough” rather than hand crafting the perfect fit.

An IAM Policy is a JSON script made up of statements following a set syntax for allowing or denying permissions to an object within your AWS environment.

IAM Policy Syntax

Each policy has to have at least one statement whose structure might look like this:
IAM AWS policy statement
The ‘Effect’ element can be set to either ‘Allow’ or ‘Deny’. These are explicit. By default, access to your resources is denied and so therefore if this is set to ‘Allow’ it replaces the default ‘Deny’. Similarly, if this were set to ‘Deny’ it would override any previous ‘Allow’. The ‘Action’ Element corresponds to API calls to AWS Services that authenticate through IAM. For example, this example represents API calls to delete a bucket (the action) within S3 (the service):


You are able to list multiple actions, if required, by using a comma to separate them:


Wildcards (*) are also allowed. So, for example, you could create an action to carry out all APIs relating to S3, such as:


The ‘Resource’ element specifies the actual resource you wish the permission to be applied to. AWS uses unique identifiers known as ARNs (Amazon Resource Name) to specify resources. Typically ARNs follow a syntax of:

  • ‘Partition’ – This relates to the partition that the resource is found in. For standard AWS regions, this section would be ‘aws’.
  • ‘Service’ – This reflects the specific AWS service, for example ‘s3’ or ‘ec2’.
  • ‘Region’ – This is the region where the resource is located. Some services do not need a region specified, so this can sometimes be left blank.
  • ‘Account-ID’ – This is your AWS Account ID (without hyphens). Again, some services do not need this information, and so can be left blank.
  • ‘Resource’ – The value of this field will depend on the AWS service you are using. For example, if I were using the Action: “Action”:”s3:DeleteBucket”, then I could use the bucket name that I wanted the permission to delete:  arn:aws:s3:::cloudacademyblog.

The ‘Condition’ element of the IAM Policy is an optional element that allows you to specify when the permissions will be activated based upon set conditions. Conditions use key value pairs, and all conditions must be met for the permissions to be activated. Here’s a full listing of these conditions.
Now we have a basic understanding of how JSON scripts are put together and their general flow, let’s see how we can modify existing policies to tweak them to your needs.

Copying an existing AWS IAM Policy

There will be times when you may not need to create a policy completely from scratch. You may be able to get away with adapting one that already exists. This can potentially save you a lot of time and effort. Open up your AWS console and select ‘IAM > Policies > Create Policy’. You will be presented with these three options:
create AWS IAM policy
For this example, select “Copy an AWS Managed Policy”.

You will then be shown a list all existing AWS managed policies, and there are a LOT! You can narrow your search by using the search function at the top of the page. For this example, I am going to search for S3 policies.
copy an AWS managed policy
I will select the “AmazonS3FullAccess” IAM policy with the goal of modifying it to only allow full access to a specific bucket (cloudacademyblog).
Once selected, it displays the following JSON policy:
AWS IAM policy: allow

After reviewing this policy, I am happy with the ‘Effect’ and ‘Action’ elements, however I want to modify the ‘Resource’ section, which is currently set to “all” with the * wildcard. I will add the ARN for a specific bucket called ‘cloudacademyblog’. To do this, all I need to do is edit the policy and change the ‘Resource’ line to:

"Resource": "arn:aws:s3:::cloudacademyblog"

Once edited, I can give the policy a meaningful name and click Save. This policy will now appear in your list of the policies you can assign to your groups and users. Once assigned, it’s always a good idea to test your policy via the simulator by clicking on Simulate Policy.
AWS IAM policy: simulator permissions

This will load the policy simulator for the policy I just created:
AWS IAM policy: simulator
This shows the policy’s JSON script on the left and, on the right hand side, I can select specific Services and Actions. The image below shows that I have selected ‘S3’ as the Service and ‘Create Bucket’ and ‘Delete Bucket’ as the Actions. I have also added the ARN for the cloudacademyblog bucket in the ‘Resource Type’ field.
AWS IAM policy: Settings
Once all the information you want to test is there, click ‘Run Simulation
AWS IAM policy allowed settings
The simulator results show that this IAM policy allows those actions to be carried out on the cloudacademyblog bucket. To confirm these actions are not possible on other buckets, I ran the following simulation with the ‘Resource’ set to all (checking all buckets) with the * wildcard:
AWS IAM policy - status denied
As you can see, this was denied by the policy as the policy only states that we have full access to the arn:aws:s3:::cloudacademyblog bucket.

Using the IAM Policy Generator

If you do not yet feel confident enough to edit existing policies, then AWS provides the IAM Policy Generator. From with the AWS Console select ‘IAM > Policies > Create Policy’ and this time select ‘Policy Generator’.

From here, via drop down boxes, you can select the Effect, Service, Action, and Resource. Additionally, if required, you can also set up conditions. Once all your options are set, click the ‘Add Statement’ button.

The image below shows that I have simply replicated the IAM policy I created in the last section, but this time via the Policy Generator:
AWS IAM policy - Generator
When you are happy with your new IAM policy, select ‘Next Step’. From there, you can give your new IAM policy a name and description, and view it as a JSON script. Click ‘Create Policy’ and then attach it to any groups or users as needed.

Writing your own IAM policy

If you’re ready to write your own IAM policy from scratch, there’s nothing stopping you. From the AWS Console, select ‘IAM > Policies > Create Policy’, and this time select ‘Create your own policy’.
AWS IAM Review policy
Here you are presented with a blank canvas allowing you to give your policy a name and description…but most importantly, a blank policy document where you can write your JSON document adhering to the policy syntax rules discussed at the beginning of this article.

Once you are happy with your policy, use the ‘Validate Policy’ button at the bottom to determine if there are any errors with your policy. Again, when you are finished click ‘Create Policy’.

As you can see there are a number of methods available to help you refine your IAM policies, and you aren’t forced to use predefined policies. Once you get used to the syntax – and benefits – of writing your own policies, you will be able to effectively and efficiently lock down access to your resources to ensure they are only accessed by authorized API calls.

There are many,  many specific commands that can be controlled through an IAM policy, but they’re a bit beyond the scope of this post. AWS provides great API listings for the different services through their extensive documentation for advanced policy writers.

What are the key elements we have we learned this week?

  • It is always best to refine your IAM Policy down to an API call level for the tightest level of security.
  • Policies can be created in a number of ways via IAM: from writing your own JSON script to assisted creation via drop-down menus.
  • Testing your policies via the Simulator is a very important part of ensuring they only allow or deny exactly what they were designed for.

In my next AWS Security article, I will be taking a look at Federated access with IAM, Trusted Advisor, AWS Billing restrictions and AWS Linked accounts. Until then I hope you all have a Happy New year!
Thank you for taking the time to read my article. If you have any feedback please leave a comment below.


Written by

Stuart Scott

Stuart is the AWS content lead at Cloud Academy where he has created over 40 courses reaching tens of thousands of students. His content focuses heavily on cloud security and compliance, specifically on how to implement and configure AWS services to protect, monitor and secure customer data and their AWS environment.

Related Posts

Jeremy Cook
— September 17, 2019

Cloud Migration Risks & Benefits

If you’re like most businesses, you already have at least one workload running in the cloud. However, that doesn’t mean that cloud migration is right for everyone. While cloud environments are generally scalable, reliable, and highly available, those won’t be the only considerations dri...

Read more
  • AWS
  • Azure
  • Cloud Migration
Joe Nemer
Joe Nemer
— September 12, 2019

Real-Time Application Monitoring with Amazon Kinesis

Amazon Kinesis is a real-time data streaming service that makes it easy to collect, process, and analyze data so you can get quick insights and react as fast as possible to new information.  With Amazon Kinesis you can ingest real-time data such as application logs, website clickstre...

Read more
  • amazon kinesis
  • AWS
  • Stream Analytics
  • Streaming data
Joe Nemer
Joe Nemer
— September 6, 2019

Google Cloud Functions vs. AWS Lambda: The Fight for Serverless Cloud Domination

Serverless computing: What is it and why is it important? A quick background The general concept of serverless computing was introduced to the market by Amazon Web Services (AWS) around 2014 with the release of AWS Lambda. As we know, cloud computing has made it possible for users to ...

Read more
  • AWS
  • Azure
  • Google Cloud Platform
Joe Nemer
Joe Nemer
— September 3, 2019

Google Vision vs. Amazon Rekognition: A Vendor-Neutral Comparison

Google Cloud Vision and Amazon Rekognition offer a broad spectrum of solutions, some of which are comparable in terms of functional details, quality, performance, and costs. This post is a fact-based comparative analysis on Google Vision vs. Amazon Rekognition and will focus on the tech...

Read more
  • Amazon Rekognition
  • AWS
  • Google Cloud Platform
  • Google Vision
Alisha Reyes
Alisha Reyes
— August 30, 2019

New on Cloud Academy: CISSP, AWS, Azure, & DevOps Labs, Python for Beginners, and more…

As Hurricane Dorian intensifies, it looks like Floridians across the entire state might have to hunker down for another big one. If you've gone through a hurricane, you know that preparing for one is no joke. You'll need a survival kit with plenty of water, flashlights, batteries, and n...

Read more
  • AWS
  • Azure
  • Google Cloud Platform
  • New content
  • Product Feature
  • Python programming
Joe Nemer
Joe Nemer
— August 27, 2019

Amazon Route 53: Why You Should Consider DNS Migration

What Amazon Route 53 brings to the DNS table Amazon Route 53 is a highly available and scalable Domain Name System (DNS) service offered by AWS. It is named by the TCP or UDP port 53, which is where DNS server requests are addressed. Like any DNS service, Route 53 handles domain regist...

Read more
  • Amazon
  • AWS
  • Cloud Migration
  • DNS
  • Route 53
Alisha Reyes
Alisha Reyes
— August 22, 2019

How to Unlock Complimentary Access to Cloud Academy

Are you looking to get trained or certified on AWS, Azure, Google Cloud Platform, DevOps, Cloud Security, Python, Java, or another technical skill? Then you'll want to mark your calendars for August 23, 2019. Starting Friday at 12:00 a.m. PDT (3:00 a.m. EDT), Cloud Academy is offering c...

Read more
  • AWS
  • Azure
  • cloud academy content
  • complimentary access
  • GCP
  • on the house
Michael Sheehy
— August 19, 2019

What Exactly Is a Cloud Architect and How Do You Become One?

One of the buzzwords surrounding the cloud that I'm sure you've heard is "Cloud Architect." In this article, I will outline my understanding of what a cloud architect does and I'll analyze the skills and certifications necessary to become one. I will also list some of the types of jobs ...

Read more
  • AWS
  • Cloud Computing
Nitheesh Poojary
— August 19, 2019

Boto: Using Python to Automate AWS Services

Boto allows you to write scripts to automate things like starting AWS EC2 instances Boto is a Python package that provides programmatic connectivity to Amazon Web Services (AWS). AWS offers a range of services for dynamically scaling servers including the core compute service, Elastic...

Read more
  • Automated AWS Services
  • AWS
  • Boto
  • Python
Andrew Larkin
— August 13, 2019

Content Roadmap: AZ-500, ITIL 4, MS-100, Google Cloud Associate Engineer, and More

Last month, Cloud Academy joined forces with QA, the UK’s largest B2B skills provider, and it put us in an excellent position to solve a massive skills gap problem. As a result of this collaboration, you will see our training library grow with additions from QA’s massive catalog of 500+...

Read more
  • AWS
  • Azure
  • content roadmap
  • Google Cloud Platform
Adam Hawkins
— August 9, 2019

DevSecOps: How to Secure DevOps Environments

Security has been a friction point when discussing DevOps. This stems from the assumption that DevOps teams move too fast to handle security concerns. This makes sense if Information Security (InfoSec) is separate from the DevOps value stream, or if development velocity exceeds the band...

Read more
  • AWS
  • cloud security
  • DevOps
  • DevSecOps
  • Security
Stefano Giacone
— August 8, 2019

Test Your Cloud Knowledge on AWS, Azure, or Google Cloud Platform

Cloud skills are in demand | In today's digital era, employers are constantly seeking skilled professionals with working knowledge of AWS, Azure, and Google Cloud Platform. According to the 2019 Trends in Cloud Transformation report by 451 Research: Business and IT transformations re...

Read more
  • AWS
  • Cloud skills
  • Google Cloud
  • Microsoft Azure