forked from jasonbellack/Python_Scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathageOfAccessKeyAlert.py
144 lines (107 loc) · 3.99 KB
/
ageOfAccessKeyAlert.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import boto3
from datetime import datetime, timezone
import csv
from csv import DictWriter
from time import sleep
client = boto3.client('iam')
response = client.list_users()
#Create lists to populate with information from credential report
userInformation = []
passwordAge = []
passDays = []
mfaStatus = []
userActivity = []
loginDays = []
accessKeyAge = []
keyDaysAge = []
credential_info = []
#Generate and pull down IAM credential report into .csv file for parsing
resp1 = client.generate_credential_report()
if resp1['State'] == 'COMPLETE':
response = client.get_credential_report()
reportText=response['Content'].decode("utf-8").splitlines()
reader = csv.DictReader(reportText, delimiter=',')
credential_report = []
for row in reader:
credential_report.append(row)
else:
sleep(2)
response = client.get_credential_report()
reportText=response['Content'].decode("utf-8").splitlines()
reader = csv.DictReader(reportText, delimiter=',')
credential_report = []
for row in reader:
credential_report.append(row)
#Populate lists from credential report dictionary
for data in credential_report:
lastPassDate = data['password_last_changed']
passwordAge.append(lastPassDate)
mfaEnabled = data['mfa_active']
mfaStatus.append(mfaEnabled)
lastLogin = data['password_last_used']
userActivity.append(lastLogin)
keyAge = data['access_key_1_last_rotated']
accessKeyAge.append(keyAge)
#Populate lists with number of days since credentials have changed. Using 91 for invalid entries in order to disable login profile.
for i in passwordAge:
if i == 'not_supported' or i == 'N/A':
passAge = 91
else:
i = i[:-6]
date_time_obj = datetime.strptime(i, '%Y-%m-%dT%H:%M:%S')
age_of_password = datetime.now() - date_time_obj
passAge = age_of_password.days
passDays.append(passAge)
for i in userActivity:
if i == 'no_information' or i == 'N/A':
loginAge = 91
else:
i = i[:-6]
date_time_obj = datetime.strptime(i, '%Y-%m-%dT%H:%M:%S')
age_of_login = datetime.now() - date_time_obj
loginAge = age_of_login.days
loginDays.append(loginAge)
for i in accessKeyAge:
if i == 'N/A':
keyDays = 91
else:
i = i[:-6]
date_time_obj = datetime.strptime(i, '%Y-%m-%dT%H:%M:%S')
age_of_key = datetime.now() - date_time_obj
keyDays = age_of_key.days
keyDaysAge.append(keyDays)
#Remove default user information from lists
del loginDays[0]
del passDays[0]
del mfaStatus[0]
del keyDaysAge[0]
#Remove unneeded information from IAM Credential report
user_client = boto3.client('iam')
userResponse = user_client.list_users()
for userInfo in userResponse['Users']:
userName = userInfo['UserName']
userInfo.pop('Path')
userInfo.pop('Arn')
userInfo.pop('CreateDate')
if 'PasswordLastUsed' in userInfo:
userInfo.pop('PasswordLastUsed')
#Create key/value pairs for userInfo dictionary to be sent to csv writer.
userInfo['Access_Key_Age'] = keyDaysAge[0]
userInfo['Password_Age'] = passDays[0]
userInfo['User_Last_Login'] = loginDays[0]
userInfo['MFA_Active'] = mfaStatus[0]
del passDays[0]
del loginDays[0]
del mfaStatus[0]
del keyDaysAge[0]
userInformation.append(userInfo)
#Check age of credentials and send alert to SNS topic if Access Key age exceeds 90 days.
for userData in userInformation:
if userData['Access_Key_Age'] > 90:
# Send notification to SNS topic
sns = boto3.client('sns')
response = sns.publish(
TopicArn='<topic ARN>',
Message="The Access Key for user " + userData['UserName'] + " is older than 90 days. Please rotate the users access key and notify them of the change."
)
print(response)