Amazon has supported the IAM (Identity and Access Management) API for some time now. The new release of Eucalyptus adds IAM support and got me thinking of how somebody could backup IAM settings. What really got me going on an actual solution was the need to save a set of accounts/users/groups and policies in order to restore them to a new Eucalyptus cloud. My plan was to generate a data file which contains all of the information and can be parsed fairly easily to restore the information to the destination cloud. I considered writing JSON, but I had some time constraints and didn't feel like fiddling around getting the formatting just so. I chose to output some tokens followed by a colon. It looks like this:accounts: my account user: admin enduser user: testuser policy-name: testpolicy policy-val: { "Statement":[ { "Effect": "Allow", "Action": "*", "Resource": "*", } ] } enduser user: dev1 enduser user: dev2 enduser group: developers user: dev1 user: dev2 policy-name: allow_all policy_val: { "Statement":[ { "Effect": "Allow", "Action": "*", "Resource": "*", } ] } endgroup endaccountsI decided to write a bash script to run the commands and parse their output to produce the above tagged format. What you see below is what I came up with. It assumes you have environment variables set up properly (source the eucarc file). It loops through all accounts, then within each account, all users and groups. For users, it also looks for policies. For groups, it lists the users in the group and looks for policies.
#!/bin/bash echo "accounts:" for i in `euare-accountlist |awk '{ print $1 }'` do echo $i for u in `euare-userlistbypath --delegate=$i` do u2=`echo $u |cut -d/ -f2-` u3=`basename $u2` echo user: $u3 if [ `euare-userlistpolicies -u $u3 --delegate=$i|wc -l` > 0 ] then for p in `euare-userlistpolicies -u $u3 --delegate=$i` do echo policy-name: $p policy=`euare-usergetpolicy -u $u3 -p $p --delegate=$i` echo "policy-val: $policy" done fi echo enduser done for j in `euare-grouplistbypath --delegate=$i | tail -n +2` do k=`echo $j |cut -d/ -f2-` l=`basename $k` echo group: $l for gu in `euare-grouplistusers -g $l --delegate=$i | tail -n +3` do gu2=`echo $gu |cut -d/ -f2-` gu3=`basename $gu2` echo user: $gu3 done if [ `euare-grouplistpolicies -g $l --delegate=$i|wc -l` > 0 ] then for p in `euare-grouplistpolicies -g $l --delegate=$i` do echo policy-name: $p policy=`euare-groupgetpolicy -g $l -p $p --delegate=$i` echo "policy-val: $policy" done fi echo endgroup done done echo endaccountsIn the next post, I'll talk about how I used this backup data to restore accounts to a new cloud.
Very good post. I will be going through some of these
issues as well..