Skip to content

Commit e84418a

Browse files
committed
Patch scan.py, scan_ips.py, and utils_aws.py to reuse the generated route53 clients
Relates To: SECENG-1648
1 parent 32e0c2f commit e84418a

File tree

3 files changed

+44
-50
lines changed

3 files changed

+44
-50
lines changed

lambda_code/scan/scan.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -292,13 +292,17 @@ def lambda_handler(event, context): # pylint:disable=unused-argument
292292
account_name = event["Name"]
293293

294294
aws_session = assume_role(account_id)
295-
296-
hosted_zones = list_hosted_zones(event)
295+
try:
296+
r53client = aws_session.client("route53")
297+
except Exception:
298+
print(f"ERROR: unable to assume role in {account_name} account {account_id}")
299+
300+
hosted_zones = list_hosted_zones(r53client, event)
297301

298302
for hosted_zone in hosted_zones:
299303
print(f"Searching for vulnerable domain records in hosted zone {hosted_zone['Name']}")
300304

301-
record_sets = list_resource_record_sets(account_id, account_name, hosted_zone["Id"])
305+
record_sets = list_resource_record_sets(r53client, account_name, hosted_zone["Id"])
302306
record_sets = sanitise_wildcards(record_sets)
303307

304308
alias_cloudfront_s3(account_name, record_sets, account_id)

lambda_code/scan_ips/scan_ips.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import json
33
import os
44

5+
from utils.utils_aws import assume_role
56
from utils.utils_aws import list_hosted_zones
67
from utils.utils_aws import list_resource_record_sets
78
from utils.utils_aws import publish_to_sns
@@ -166,13 +167,19 @@ def lambda_handler(event, context): # pylint:disable=unused-argument
166167

167168
get_ips(account_id, account_name)
168169

169-
hosted_zones = list_hosted_zones(event)
170+
aws_session = assume_role(account_id)
171+
try:
172+
r53client = aws_session.client("route53")
173+
except Exception:
174+
print(f"ERROR: unable to assume role in {account_name} account {account_id}")
175+
176+
hosted_zones = list_hosted_zones(r53client, event)
170177

171178
if item_count > 0: # don't test for vulnerabilities until DynamoDB table is populated across organisation
172179
for hosted_zone in hosted_zones:
173180
print(f"Searching for vulnerable A records in hosted zone {hosted_zone['Name']}")
174181

175-
record_sets = list_resource_record_sets(account_id, account_name, hosted_zone["Id"])
182+
record_sets = list_resource_record_sets(r53client, account_name, hosted_zone["Id"])
176183
record_sets = sanitise_wildcards(record_sets)
177184

178185
a_record(account_name, record_sets, ip_prefixes)

utils/utils_aws.py

+28-45
Original file line numberDiff line numberDiff line change
@@ -86,70 +86,53 @@ def list_accounts():
8686
return []
8787

8888

89-
def list_hosted_zones(account):
89+
def list_hosted_zones(route53, account):
9090

91-
account_id = account["Id"]
9291
account_name = account["Name"]
9392

94-
try:
95-
boto3_session = assume_role(account_id)
96-
route53 = boto3_session.client("route53")
97-
98-
hosted_zones_list = []
99-
100-
try:
101-
paginator_zones = route53.get_paginator("list_hosted_zones")
102-
pages_zones = paginator_zones.paginate()
103-
for page_zones in pages_zones:
104-
hosted_zones = [h for h in page_zones["HostedZones"] if not h["Config"]["PrivateZone"]]
93+
hosted_zones_list = []
10594

106-
hosted_zones_list = hosted_zones_list + hosted_zones
95+
try:
96+
paginator_zones = route53.get_paginator("list_hosted_zones")
97+
pages_zones = paginator_zones.paginate()
98+
for page_zones in pages_zones:
99+
hosted_zones = [h for h in page_zones["HostedZones"] if not h["Config"]["PrivateZone"]]
107100

108-
return hosted_zones_list
101+
hosted_zones_list = hosted_zones_list + hosted_zones
109102

110-
except Exception:
111-
logging.error(
112-
"ERROR: Lambda execution role requires route53:ListHostedZones permission in %a account",
113-
account_name,
114-
)
103+
return hosted_zones_list
115104

116105
except Exception:
117-
logging.error("ERROR: unable to assume role in %a account %s", account_name, account_id)
106+
logging.error(
107+
"ERROR: Lambda execution role requires route53:ListHostedZones permission in %a account",
108+
account_name,
109+
)
118110

119111
return []
120112

121113

122-
def list_resource_record_sets(account_id, account_name, hosted_zone_id):
114+
def list_resource_record_sets(route53, account_name, hosted_zone_id):
123115

124116
try:
125-
boto3_session = assume_role(account_id)
126-
route53 = boto3_session.client("route53")
127-
128-
record_set_list = []
129-
130-
try:
131-
paginator_records = route53.get_paginator("list_resource_record_sets")
132-
pages_records = paginator_records.paginate(
133-
HostedZoneId=hosted_zone_id,
134-
StartRecordName="_",
135-
StartRecordType="NS",
136-
)
117+
paginator_records = route53.get_paginator("list_resource_record_sets")
118+
pages_records = paginator_records.paginate(
119+
HostedZoneId=hosted_zone_id,
120+
StartRecordName="_",
121+
StartRecordType="NS",
122+
)
137123

138-
for page_records in pages_records:
139-
record_sets = page_records["ResourceRecordSets"]
124+
for page_records in pages_records:
125+
record_sets = page_records["ResourceRecordSets"]
140126

141-
record_set_list = record_set_list + record_sets
127+
record_set_list = record_set_list + record_sets
142128

143-
return record_set_list
144-
145-
except Exception:
146-
logging.exception(
147-
"ERROR: Lambda execution role requires route53:ListResourceRecordSets permission in %a account",
148-
account_name,
149-
)
129+
return record_set_list
150130

151131
except Exception:
152-
logging.error("ERROR: unable to assume role in %a account %s", account_name, account_id)
132+
logging.exception(
133+
"ERROR: Lambda execution role requires route53:ListResourceRecordSets permission in %a account",
134+
account_name,
135+
)
153136

154137
return []
155138

0 commit comments

Comments
 (0)