Skip to content

Commit b3f58e3

Browse files
committed
add iam deletion script
1 parent 82ce54c commit b3f58e3

File tree

1 file changed

+87
-0
lines changed

1 file changed

+87
-0
lines changed

aws/reporting/iam.py

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)