Crib-Notes: Tracing Permissions for an Instance Role That Uses Inline Policies
Tags: aws, iam, permissions
Published: 2019-04-06 19:56:07

---
title: Crib-Notes: Tracing Permissions for an Instance Role That Uses Inline Policies
published: true
tags: AWS,iam,permissions
canonical_url: https://thjones2.blogspot.com/2019/04/crib-notes-tracing-permissions-for_6.html
---

The rationale for this crib-note is essentially identical to that for the [previous topic](https://dev.to/ferricoxide/crib-notes-tracing-permissions-for-an-instance-role-2joo) on tracing IAM permissions in instance-roles that use managed-policies. So I'm just going to crib the rest of the intro...  
  
When working with AWS EC2 instances – particularly when automating the deployments and lifecycles thereof – it's common to make use of the AWS IAM system's Instance Role Policy feature. Occasionally, you might get asked, "what permissions have been given to that instance." To answer, you might use AWS's IAM web console or the IAM CLI. In the former case, to get the information to the requestor, you're left with the options of either taking screen-shots or trying to copy and paste the text from the UI to your email/slack/etc. reply. In the latter case, you can just dump out the JSON-formatted policy-document that enumerates the permissions.  
  
Generally, I prefer the CLI option since I don't have to worry "what does the recipient need to do with the results". Just dumping a text file, I needn't worry about being yelled at that the contents of a screen-shot can't be used to easily create another, similar policy. It's also easy to simply redirect the output to a file and attach it to whatever media I'm responding to ...or, if mail is enabled within the CLI environment, simply pipe the output directly to a CLI-based email tool and save a step in the process (laziness for the win!).  
  
But, how to go from "there's an instance in this account: what privileges does it have" to "here's what it can do?". Basically, it's a three-step process:

1. Get the name of the Instance Role attached to the EC2 instance. This can be done with a method similar to:
```
$ aws ec2 describe-instances --instance-id <INSTANCE_ID> \
   --query 'Reservations[].Instances[].IamInstanceProfile[].Arn[]' --out text | \
  sed 's/^.\*arn:.\*profile\///'
```
2. Get the list of inline policies attached to role. This can be done with a method similar to:
```
$ aws iam list-role-policies --role-name <OUPUT_FROM_PREVIOUS>
```
3. Get the list of permissions associated with the instance role's inline policy/policies. This can be done with a method similar to:
```
$ aws iam get-role-policy --role-name INSTANCE --policy-name <OUPUT_FROM_PREVIOUS>
```
The above steps will dump out the full IAM policy/permissions of the _queried_ inline policy:  
  

- If the inline policy was the _only_ policy attached to the role, the output will show _all_ of the permissions the instance role grants any EC2s it is attached to.
- If the inline policy was the _not_ the only inline policy attached to the role, it will be necessary to iterate over the remaining policies attached to the role to get the aggregated permission-set.

To facilitate the iteration, one can use a script similar to the following to encapsulate the second and third steps from prior process description: 
  
  

```
#!/bin/bash
#
# Script to dump out all permissions granted through an IAM role with multiple
# inline IAM policies attached.
###########################################################################

if [[ $# -eq 0 ]]
then
   echo "Usage: ${0} <instance-id>" >&2
   exit 1
fi

PROFILE_NAME=$( aws ec2 describe-instances --instance-id "${1}" \
   --query 'Reservations[].Instances[].IamInstanceProfile[].Arn' --out text | \
  tr '\t' '\n' | sort -u | sed 's/^.*arn:.*profile\///' )

POLICY_LIST_RAW=$( aws iam list-role-policies --role-name ${PROFILE_NAME} )
POLICY_LIST_CLN=($( echo ${POLICY_LIST_RAW} | jq .PolicyNames[] | sed 's/"//g' ))

for ITER in $( seq 0 $(( ${#POLICY_LIST_CLN[@]} - 1 )) )
do
  aws iam get-role-policy --role-name "${PROFILE_NAME}" \
    --policy-name "${POLICY_LIST_CLN[${ITER}]}"
done

```