1
+ import re
2
+ import sys
3
+ import boto3
4
+ import datetime
5
+ from common import save_to_file , load_from_file
6
+
7
+ def get_all_users ():
8
+ users = []
9
+ isTruncated = True
10
+ marker = ''
11
+ while isTruncated :
12
+ if marker :
13
+ response = boto3 .client ('iam' ).list_users (Marker = marker )
14
+ else :
15
+ response = boto3 .client ('iam' ).list_users ()
16
+ paginatedUsers = response ['Users' ]
17
+ users .extend (paginatedUsers )
18
+ isTruncated = response .get ('IsTruncated' , False )
19
+ marker = response .get ('Marker' , '' )
20
+ return users
21
+
22
+ # returns old users based on threshold values
23
+ # users : all users
24
+ # createdThreshold : user creation date threshold
25
+ # lastUsedThreshold : user last active threshold
26
+ def get_old_users (users , createdThreshold = 60 , lastUsedThreshold = 120 ):
27
+ old_users = []
28
+ i = 1
29
+ for user in users :
30
+ print ("{} Analyzing user {}" .format (i , user ['UserName' ]))
31
+ userResource = boto3 .resource ('iam' ).User (user ['UserName' ])
32
+ allUsageDates = []
33
+ if isinstance (userResource .password_last_used , datetime .date ):
34
+ allUsageDates .append (userResource .password_last_used )
35
+ for key in userResource .access_keys .all ():
36
+ res = boto3 .client ('iam' ).get_access_key_last_used (AccessKeyId = key .id )
37
+ d = res .get ('AccessKeyLastUsed' , {}).get ('LastUsedDate' )
38
+ if isinstance (d , datetime .date ):
39
+ allUsageDates .append (d )
40
+ createdThresholdAgo = (datetime .datetime .now () - userResource .create_date .replace (tzinfo = None )).days > createdThreshold
41
+ if allUsageDates :
42
+ usedThresholdAgo = (datetime .datetime .now () - max (allUsageDates ).replace (tzinfo = None )).days > lastUsedThreshold
43
+ else :
44
+ usedThresholdAgo = False
45
+ if createdThresholdAgo and usedThresholdAgo and not re .match (r'[^@]+@[^@]+\.[^@]+' , user ['UserName' ]):
46
+ old_users .append (user )
47
+ print ("User {} is old" .format (user ["UserName" ]))
48
+ i += 1
49
+ return old_users
50
+
51
+ def delete_user (user ):
52
+ print ("Attempting to delete user {}" .format (user ['UserName' ]))
53
+ iamRes = boto3 .resource ('iam' )
54
+ userRes = iamRes .User (user ['UserName' ])
55
+ try :
56
+ login_profile = userRes .LoginProfile ()
57
+ login_profile .delete ()
58
+ except Exception as e :
59
+ print ("Failed deleting login profile {}" .format (str (e )))
60
+ for key in userRes .access_keys .all ():
61
+ try :
62
+ key .delete ()
63
+ except :
64
+ print ("Failed deleting key" )
65
+ for policy in userRes .policies .all ():
66
+ try :
67
+ policy .delete ()
68
+ except :
69
+ print ("Failed deleting policy" )
70
+ for policy in userRes .attached_policies .all ():
71
+ try :
72
+ policy .delete ()
73
+ except :
74
+ print ("Failed deleting policy" )
75
+ try :
76
+ userRes .delete ()
77
+ print ("Deleted user" )
78
+ except :
79
+ print ("Failed deleting user" )
80
+
81
+ users = get_all_users ()
82
+ old_users = get_old_users (users )
83
+ for user in old_users :
84
+ try :
85
+ delete_user (user )
86
+ except :
87
+ print ("Failed deleting user {}" .format (user ['UserName' ]))
0 commit comments