ろーてくxyz blog

ローテクを駆使してIT関係でサヴァイヴしようとする人による備忘録

AWS APIでユーザ、グループ、MFA設定状況を抜く

今回の私のお題

AWSAPIを使って、
ユーザ名、参加しているグループ名、MFAの有効状況を取得しようと思います。
みんな大好き(?)エクセルやスプレッドシートにコピペできるようにしたいと思います。
また、ついでに存在しているグループにアタッチしているポリシー名も別途出力します。
(スプレッドシートに転記するならGASで組めばいいじゃんと思いますが・・・)

今回の中身

#!/usr/bin/env python3

import sys
import boto3
from boto3.session import Session

if(len(sys.argv) != 2):
  print(sys.argv[0] + ' [aws cli profile name]')
  sys.exit()

session = Session(profile_name=sys.argv[1])
iam = session.client('iam')

def get_users():
  user_lists = []
  res = iam.list_users()
  for lists in res['Users']:
    userlist = lists['UserName']
    user_lists.append(userlist)
  return user_lists

def get_groups(username):
  group_lists = []
  res = iam.list_groups_for_user(UserName=username)
  for lists in res['Groups']:
    groupnames = lists['GroupName']
    group_lists.append(groupnames)
  return group_lists

def get_mfa_stats(username):
  res = iam.list_mfa_devices(UserName=username)
  if not res['MFADevices']:
    mfa_stats = 'False'
  else:
    mfa_stats = 'True'
  return mfa_stats

def get_avail_groups():
  avail_groups = []
  res = iam.list_groups()
  for lists in res['Groups']:
    avail_group = lists['GroupName']
    avail_groups.append(avail_group)
  return avail_groups

def get_policies(groupname):
  avail_policies = []
  res = iam.list_attached_group_policies(GroupName=groupname)
  for lists in res['AttachedPolicies']:
    avail_policy = lists['PolicyName']
    avail_policies.append(avail_policy)
  return avail_policies

def main():
  print('### Userlists')
  for user_list in get_users():
    groupname = get_groups(user_list)
    mfa_stats = get_mfa_stats(user_list)
    print(user_list, ':'.join(groupname), mfa_stats, sep=',')
  print('\n### GroupLists')
  for group_list in get_avail_groups():
    policyname = get_policies(group_list)
    print(group_list, ':'.join(policyname), sep=',')

if __name__ == '__main__':
  main()

出力例

出力結果としては、カンマ区切りで各カラムは以下のような形。
###UsaerLists
UserName, GroupName, MFA Status

### GroupLists
GroupName, AttachPolicy
(複数のグループ所属の場合は「:」区切りで表示します。)

$ ./get_userlist.py [実行するaws cliのprofile名]
### Userlists
dev-user01,Adm:test1,True
read-user01,ReadOnly,False

### GroupLists
Adm,AdministratorAccess
ReadOnly,ReadOnlyAccess
test1,ReadOnlyAccess:BillingFullAccess

そもそもでクラウドを使ったり、どれだけ楽をするかと言われている中でユーザ情報を別途管理するような形はナンセンスと思いますが、
何かのドキュメント作成などに利用したりできればと。