Index syndication
comment syndication

Powershell: AWS and IAM policy retrieval

August 5, 2014 at 17:19 · Filed under AWS

I’ve recently been working more day to day on Amazon Web Services, and I found it a little unwieldy to navigate around policy documents assigned to IAM groups.

Sometimes you just want to have a local copy of the policies to edit/play with/look at.

Therefore, I came up with a quick script to solve this. Enjoy…
Of course, the AWS SDK for Powershell is required.

Glenn Russo said,

November 6, 2014 @ 10:22

Any chance you could share the powershell script. 🙂

lantrix said,

November 8, 2014 @ 12:27

It’s embedded in the post as a github gist; which you can find here: https://gist.github.com/lantrix/23a6de9d82fc31a6115b/raw/dumpIamPolicies.ps1

Jamin said,

March 10, 2015 @ 08:56

Nice script. Very helpful. I extended it to do roles as well. Thank you for your help.

#===============================================================================================
# Script to output all the IAM polcies
#===============================================================================================

Import-Module AWSPowerShell
# For URL Decode of Policy document
[System.Reflection.Assembly]::LoadWithPartialName("System.web") | out-null
#Form Output for script
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | out-null

#Current Path
$path = (Get-Item -Path ".\" -Verbose).FullName

#Notify User
$caption = "Warning!"
$message = "This Script will override all current policies in:`n$path\Groups`nand`n$path\Roles`n with current AWS Policies! Do you want to proceed"
$yesNoButtons = 4

if ([System.Windows.Forms.MessageBox]::Show($message, $caption, $yesNoButtons) -eq "NO") {
    Write "Script Terminated"
    Break
}
else {
    #delete existing policies stored locally
    if (Test-Path -LiteralPath $path\Groups -PathType Container) {
        Remove-Item -Recurse -Force $path\Groups
    }
    if (Test-Path -LiteralPath $path\Roles -PathType Container) {
        Remove-Item -Recurse -Force $path\Roles
    }
    $searchGroup = @()
    $searchRole = @()
    $groups = Get-IAMGroups
    $roles = Get-IAMRoles
    for ($i=0; $i -lt $groups.Count; $i++) {
        Write-Host -NoNewline "Creating Dir: "
        Write-Host $groups[$i].GroupName
        #create new dir
        New-Item -ItemType directory -Path $path\Groups\$($groups[$i].GroupName) | out-null
        #Add this group to search array
        $searchGroup += $groups[$i].GroupName
    }
     for ($i=0; $i -lt $roles.Count; $i++) {
        Write-Host -NoNewline "Creating Dir: "
        Write-Host $roles[$i].RoleName
        #create new dir
        New-Item -ItemType directory -Path $path\Roles\$($roles[$i].RoleName) | out-null
        #Add this role to search array
        $searchRole += $roles[$i].RoleName
    }
    #Get policies for each group and role and write out to directories
    foreach ($searchtype in $searchGroup) {
        Write-Host -NoNewline "Saving Policies for: "
        Write-Host $searchtype
        $a = Get-IAMGroupPolicies -GroupName  $searchtype
        foreach ($this in $a) {
            $b = Get-IAMGroupPolicy -GroupName $searchtype -PolicyName $this
            $c = $b.PolicyDocument
            [system.web.httputility]::urldecode($c) > $path\Groups\$searchtype\$($b.PolicyName).json
        }
    }
    foreach ($searchtype in $searchRole) {
        Write-Host -NoNewline "Saving Policies for: "
        Write-Host $searchtype
        $a = Get-IAMRolePolicies -RoleName  $searchtype
        foreach ($this in $a) {
            $b = Get-IAMRolePolicy -RoleName $searchtype -PolicyName $this
            $c = $b.PolicyDocument
            [system.web.httputility]::urldecode($c) > $path\Roles\$searchtype\$($b.PolicyName).json
        }
    }
    Write-Host "Script Finished"
}

RSS feed for comments on this post · TrackBack URI

Leave a Comment