sraverify 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. sraverify/__init__.py +36 -0
  2. sraverify/checks/__init__.py +56 -0
  3. sraverify/checks/accessanalyzer/SRA_IAA_1.py +188 -0
  4. sraverify/checks/accessanalyzer/SRA_IAA_2.py +162 -0
  5. sraverify/checks/accessanalyzer/SRA_IAA_3.py +260 -0
  6. sraverify/checks/accessanalyzer/SRA_IAA_4.py +207 -0
  7. sraverify/checks/accessanalyzer/__init__.py +3 -0
  8. sraverify/checks/cloudtrail/SRA-CT-1.py +220 -0
  9. sraverify/checks/cloudtrail/SRA-CT-10.py +229 -0
  10. sraverify/checks/cloudtrail/SRA-CT-11.py +242 -0
  11. sraverify/checks/cloudtrail/SRA-CT-12.py +163 -0
  12. sraverify/checks/cloudtrail/SRA-CT-13.py +279 -0
  13. sraverify/checks/cloudtrail/SRA-CT-2.py +218 -0
  14. sraverify/checks/cloudtrail/SRA-CT-3.py +196 -0
  15. sraverify/checks/cloudtrail/SRA-CT-4.py +161 -0
  16. sraverify/checks/cloudtrail/SRA-CT-5.py +200 -0
  17. sraverify/checks/cloudtrail/SRA-CT-6.py +161 -0
  18. sraverify/checks/cloudtrail/SRA-CT-7.py +194 -0
  19. sraverify/checks/cloudtrail/SRA-CT-8.py +226 -0
  20. sraverify/checks/cloudtrail/SRA-CT-9.py +226 -0
  21. sraverify/checks/cloudtrail/__init__.py +3 -0
  22. sraverify/checks/config/SRA-CONFIG-1.py +197 -0
  23. sraverify/checks/config/__init__.py +3 -0
  24. sraverify/core/__init__.py +3 -0
  25. sraverify/core/check.py +227 -0
  26. sraverify/core/logging.py +37 -0
  27. sraverify/core/session.py +47 -0
  28. sraverify/lib/__init__.py +4 -0
  29. sraverify/lib/audit_info.py +37 -0
  30. sraverify/lib/banner.py +42 -0
  31. sraverify/lib/check_loader.py +80 -0
  32. sraverify/lib/org_mgmt_checker.py +86 -0
  33. sraverify/lib/outputs.py +46 -0
  34. sraverify/lib/progress.py +75 -0
  35. sraverify/lib/regions.py +27 -0
  36. sraverify/lib/session.py +23 -0
  37. sraverify/main.py +350 -0
  38. sraverify/services/__init__.py +3 -0
  39. sraverify/services/accessanalyzer/__init__.py +15 -0
  40. sraverify/services/accessanalyzer/base.py +123 -0
  41. sraverify/services/accessanalyzer/checks/__init__.py +3 -0
  42. sraverify/services/accessanalyzer/checks/sra_accessanalyzer_01.py +82 -0
  43. sraverify/services/accessanalyzer/checks/sra_accessanalyzer_02.py +82 -0
  44. sraverify/services/accessanalyzer/checks/sra_accessanalyzer_03.py +103 -0
  45. sraverify/services/accessanalyzer/checks/sra_accessanalyzer_04.py +139 -0
  46. sraverify/services/accessanalyzer/client.py +123 -0
  47. sraverify/services/account/__init__.py +9 -0
  48. sraverify/services/account/base.py +56 -0
  49. sraverify/services/account/checks/__init__.py +1 -0
  50. sraverify/services/account/checks/sra_account_01.py +65 -0
  51. sraverify/services/account/checks/sra_account_02.py +63 -0
  52. sraverify/services/account/checks/sra_account_03.py +63 -0
  53. sraverify/services/account/client.py +51 -0
  54. sraverify/services/auditmanager/__init__.py +10 -0
  55. sraverify/services/auditmanager/base.py +72 -0
  56. sraverify/services/auditmanager/checks/__init__.py +1 -0
  57. sraverify/services/auditmanager/checks/sra_auditmanager_01.py +58 -0
  58. sraverify/services/auditmanager/checks/sra_auditmanager_02.py +80 -0
  59. sraverify/services/auditmanager/client.py +58 -0
  60. sraverify/services/cloudtrail/__init__.py +33 -0
  61. sraverify/services/cloudtrail/base.py +167 -0
  62. sraverify/services/cloudtrail/checks/__init__.py +1 -0
  63. sraverify/services/cloudtrail/checks/sra_cloudtrail_01.py +83 -0
  64. sraverify/services/cloudtrail/checks/sra_cloudtrail_02.py +99 -0
  65. sraverify/services/cloudtrail/checks/sra_cloudtrail_03.py +94 -0
  66. sraverify/services/cloudtrail/checks/sra_cloudtrail_04.py +92 -0
  67. sraverify/services/cloudtrail/checks/sra_cloudtrail_05.py +106 -0
  68. sraverify/services/cloudtrail/checks/sra_cloudtrail_06.py +93 -0
  69. sraverify/services/cloudtrail/checks/sra_cloudtrail_07.py +96 -0
  70. sraverify/services/cloudtrail/checks/sra_cloudtrail_08.py +145 -0
  71. sraverify/services/cloudtrail/checks/sra_cloudtrail_09.py +167 -0
  72. sraverify/services/cloudtrail/checks/sra_cloudtrail_10.py +162 -0
  73. sraverify/services/cloudtrail/checks/sra_cloudtrail_11.py +178 -0
  74. sraverify/services/cloudtrail/checks/sra_cloudtrail_12.py +77 -0
  75. sraverify/services/cloudtrail/checks/sra_cloudtrail_13.py +120 -0
  76. sraverify/services/cloudtrail/client.py +118 -0
  77. sraverify/services/config/__init__.py +25 -0
  78. sraverify/services/config/base.py +249 -0
  79. sraverify/services/config/checks/__init__.py +1 -0
  80. sraverify/services/config/checks/sra_config_01.py +123 -0
  81. sraverify/services/config/checks/sra_config_02.py +156 -0
  82. sraverify/services/config/checks/sra_config_03.py +149 -0
  83. sraverify/services/config/checks/sra_config_04.py +104 -0
  84. sraverify/services/config/checks/sra_config_05.py +104 -0
  85. sraverify/services/config/checks/sra_config_06.py +194 -0
  86. sraverify/services/config/checks/sra_config_07.py +162 -0
  87. sraverify/services/config/checks/sra_config_08.py +185 -0
  88. sraverify/services/config/checks/sra_config_09.py +177 -0
  89. sraverify/services/config/client.py +264 -0
  90. sraverify/services/ec2/__init__.py +8 -0
  91. sraverify/services/ec2/base.py +75 -0
  92. sraverify/services/ec2/checks/__init__.py +1 -0
  93. sraverify/services/ec2/checks/sra_ec2_01.py +83 -0
  94. sraverify/services/ec2/client.py +63 -0
  95. sraverify/services/firewallmanager/__init__.py +23 -0
  96. sraverify/services/firewallmanager/base.py +48 -0
  97. sraverify/services/firewallmanager/checks/__init__.py +1 -0
  98. sraverify/services/firewallmanager/checks/sra_firewallmanager_01.py +75 -0
  99. sraverify/services/firewallmanager/checks/sra_firewallmanager_02.py +57 -0
  100. sraverify/services/firewallmanager/checks/sra_firewallmanager_03.py +51 -0
  101. sraverify/services/firewallmanager/checks/sra_firewallmanager_04.py +51 -0
  102. sraverify/services/firewallmanager/checks/sra_firewallmanager_05.py +51 -0
  103. sraverify/services/firewallmanager/checks/sra_firewallmanager_06.py +51 -0
  104. sraverify/services/firewallmanager/checks/sra_firewallmanager_07.py +51 -0
  105. sraverify/services/firewallmanager/checks/sra_firewallmanager_08.py +61 -0
  106. sraverify/services/firewallmanager/checks/sra_firewallmanager_09.py +61 -0
  107. sraverify/services/firewallmanager/checks/sra_firewallmanager_10.py +71 -0
  108. sraverify/services/firewallmanager/client.py +40 -0
  109. sraverify/services/guardduty/__init__.py +58 -0
  110. sraverify/services/guardduty/base.py +207 -0
  111. sraverify/services/guardduty/checks/__init__.py +3 -0
  112. sraverify/services/guardduty/checks/sra_guardduty_01.py +51 -0
  113. sraverify/services/guardduty/checks/sra_guardduty_02.py +80 -0
  114. sraverify/services/guardduty/checks/sra_guardduty_03.py +77 -0
  115. sraverify/services/guardduty/checks/sra_guardduty_04.py +84 -0
  116. sraverify/services/guardduty/checks/sra_guardduty_05.py +84 -0
  117. sraverify/services/guardduty/checks/sra_guardduty_06.py +84 -0
  118. sraverify/services/guardduty/checks/sra_guardduty_07.py +85 -0
  119. sraverify/services/guardduty/checks/sra_guardduty_08.py +83 -0
  120. sraverify/services/guardduty/checks/sra_guardduty_09.py +84 -0
  121. sraverify/services/guardduty/checks/sra_guardduty_10.py +83 -0
  122. sraverify/services/guardduty/checks/sra_guardduty_11.py +93 -0
  123. sraverify/services/guardduty/checks/sra_guardduty_12.py +83 -0
  124. sraverify/services/guardduty/checks/sra_guardduty_13.py +90 -0
  125. sraverify/services/guardduty/checks/sra_guardduty_14.py +136 -0
  126. sraverify/services/guardduty/checks/sra_guardduty_15.py +94 -0
  127. sraverify/services/guardduty/checks/sra_guardduty_16.py +94 -0
  128. sraverify/services/guardduty/checks/sra_guardduty_17.py +91 -0
  129. sraverify/services/guardduty/checks/sra_guardduty_18.py +91 -0
  130. sraverify/services/guardduty/checks/sra_guardduty_19.py +91 -0
  131. sraverify/services/guardduty/checks/sra_guardduty_20.py +111 -0
  132. sraverify/services/guardduty/checks/sra_guardduty_21.py +112 -0
  133. sraverify/services/guardduty/checks/sra_guardduty_22.py +111 -0
  134. sraverify/services/guardduty/checks/sra_guardduty_23.py +154 -0
  135. sraverify/services/guardduty/checks/sra_guardduty_24.py +111 -0
  136. sraverify/services/guardduty/checks/sra_guardduty_25.py +111 -0
  137. sraverify/services/guardduty/client.py +107 -0
  138. sraverify/services/inspector/__init__.py +29 -0
  139. sraverify/services/inspector/base.py +233 -0
  140. sraverify/services/inspector/checks/__init__.py +3 -0
  141. sraverify/services/inspector/checks/sra_inspector_01.py +69 -0
  142. sraverify/services/inspector/checks/sra_inspector_02.py +68 -0
  143. sraverify/services/inspector/checks/sra_inspector_03.py +68 -0
  144. sraverify/services/inspector/checks/sra_inspector_04.py +70 -0
  145. sraverify/services/inspector/checks/sra_inspector_05.py +69 -0
  146. sraverify/services/inspector/checks/sra_inspector_06.py +115 -0
  147. sraverify/services/inspector/checks/sra_inspector_07.py +109 -0
  148. sraverify/services/inspector/checks/sra_inspector_08.py +69 -0
  149. sraverify/services/inspector/checks/sra_inspector_09.py +69 -0
  150. sraverify/services/inspector/checks/sra_inspector_10.py +69 -0
  151. sraverify/services/inspector/checks/sra_inspector_11.py +69 -0
  152. sraverify/services/inspector/client.py +99 -0
  153. sraverify/services/macie/__init__.py +27 -0
  154. sraverify/services/macie/base.py +271 -0
  155. sraverify/services/macie/checks/__init__.py +1 -0
  156. sraverify/services/macie/checks/sra_macie_01.py +100 -0
  157. sraverify/services/macie/checks/sra_macie_02.py +102 -0
  158. sraverify/services/macie/checks/sra_macie_03.py +152 -0
  159. sraverify/services/macie/checks/sra_macie_04.py +120 -0
  160. sraverify/services/macie/checks/sra_macie_05.py +85 -0
  161. sraverify/services/macie/checks/sra_macie_06.py +124 -0
  162. sraverify/services/macie/checks/sra_macie_07.py +138 -0
  163. sraverify/services/macie/checks/sra_macie_08.py +82 -0
  164. sraverify/services/macie/checks/sra_macie_09.py +103 -0
  165. sraverify/services/macie/checks/sra_macie_10.py +81 -0
  166. sraverify/services/macie/client.py +220 -0
  167. sraverify/services/s3/__init__.py +16 -0
  168. sraverify/services/s3/base.py +69 -0
  169. sraverify/services/s3/checks/__init__.py +1 -0
  170. sraverify/services/s3/checks/sra_s3_01.py +89 -0
  171. sraverify/services/s3/checks/sra_s3_02.py +89 -0
  172. sraverify/services/s3/checks/sra_s3_03.py +88 -0
  173. sraverify/services/s3/checks/sra_s3_04.py +88 -0
  174. sraverify/services/s3/client.py +52 -0
  175. sraverify/services/securityhub/__init__.py +27 -0
  176. sraverify/services/securityhub/base.py +349 -0
  177. sraverify/services/securityhub/checks/__init__.py +1 -0
  178. sraverify/services/securityhub/checks/sra_securityhub_01.py +115 -0
  179. sraverify/services/securityhub/checks/sra_securityhub_02.py +114 -0
  180. sraverify/services/securityhub/checks/sra_securityhub_03.py +136 -0
  181. sraverify/services/securityhub/checks/sra_securityhub_04.py +75 -0
  182. sraverify/services/securityhub/checks/sra_securityhub_05.py +102 -0
  183. sraverify/services/securityhub/checks/sra_securityhub_06.py +113 -0
  184. sraverify/services/securityhub/checks/sra_securityhub_07.py +121 -0
  185. sraverify/services/securityhub/checks/sra_securityhub_08.py +113 -0
  186. sraverify/services/securityhub/checks/sra_securityhub_09.py +100 -0
  187. sraverify/services/securityhub/checks/sra_securityhub_10.py +94 -0
  188. sraverify/services/securityhub/checks/sra_securityhub_11.py +73 -0
  189. sraverify/services/securityhub/client.py +249 -0
  190. sraverify/services/securityincidentresponse/__init__.py +13 -0
  191. sraverify/services/securityincidentresponse/base.py +95 -0
  192. sraverify/services/securityincidentresponse/checks/__init__.py +1 -0
  193. sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_01.py +77 -0
  194. sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_02.py +72 -0
  195. sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_03.py +86 -0
  196. sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_04.py +117 -0
  197. sraverify/services/securityincidentresponse/checks/sra_securityincidentresponse_05.py +55 -0
  198. sraverify/services/securityincidentresponse/client.py +71 -0
  199. sraverify/services/securitylake/__init__.py +39 -0
  200. sraverify/services/securitylake/base.py +461 -0
  201. sraverify/services/securitylake/checks/__init__.py +1 -0
  202. sraverify/services/securitylake/checks/sra_securitylake_01.py +98 -0
  203. sraverify/services/securitylake/checks/sra_securitylake_02.py +133 -0
  204. sraverify/services/securitylake/checks/sra_securitylake_03.py +116 -0
  205. sraverify/services/securitylake/checks/sra_securitylake_04.py +72 -0
  206. sraverify/services/securitylake/checks/sra_securitylake_05.py +116 -0
  207. sraverify/services/securitylake/checks/sra_securitylake_06.py +104 -0
  208. sraverify/services/securitylake/checks/sra_securitylake_07.py +108 -0
  209. sraverify/services/securitylake/checks/sra_securitylake_08.py +107 -0
  210. sraverify/services/securitylake/checks/sra_securitylake_09.py +107 -0
  211. sraverify/services/securitylake/checks/sra_securitylake_10.py +106 -0
  212. sraverify/services/securitylake/checks/sra_securitylake_11.py +109 -0
  213. sraverify/services/securitylake/checks/sra_securitylake_12.py +108 -0
  214. sraverify/services/securitylake/checks/sra_securitylake_13.py +108 -0
  215. sraverify/services/securitylake/checks/sra_securitylake_14.py +72 -0
  216. sraverify/services/securitylake/checks/sra_securitylake_15.py +120 -0
  217. sraverify/services/securitylake/checks/sra_securitylake_16.py +104 -0
  218. sraverify/services/securitylake/checks/sra_securitylake_17.py +103 -0
  219. sraverify/services/securitylake/client.py +247 -0
  220. sraverify/services/shield/__init__.py +33 -0
  221. sraverify/services/shield/base.py +199 -0
  222. sraverify/services/shield/checks/__init__.py +1 -0
  223. sraverify/services/shield/checks/sra_shield_01.py +68 -0
  224. sraverify/services/shield/checks/sra_shield_02.py +77 -0
  225. sraverify/services/shield/checks/sra_shield_03.py +84 -0
  226. sraverify/services/shield/checks/sra_shield_04.py +84 -0
  227. sraverify/services/shield/checks/sra_shield_05.py +84 -0
  228. sraverify/services/shield/checks/sra_shield_06.py +84 -0
  229. sraverify/services/shield/checks/sra_shield_07.py +84 -0
  230. sraverify/services/shield/checks/sra_shield_08.py +69 -0
  231. sraverify/services/shield/checks/sra_shield_09.py +86 -0
  232. sraverify/services/shield/checks/sra_shield_10.py +100 -0
  233. sraverify/services/shield/checks/sra_shield_11.py +71 -0
  234. sraverify/services/shield/checks/sra_shield_12.py +130 -0
  235. sraverify/services/shield/checks/sra_shield_13.py +112 -0
  236. sraverify/services/shield/checks/sra_shield_14.py +111 -0
  237. sraverify/services/shield/client.py +214 -0
  238. sraverify/services/waf/__init__.py +21 -0
  239. sraverify/services/waf/base.py +100 -0
  240. sraverify/services/waf/checks/__init__.py +1 -0
  241. sraverify/services/waf/checks/sra_waf_01.py +63 -0
  242. sraverify/services/waf/checks/sra_waf_02.py +82 -0
  243. sraverify/services/waf/checks/sra_waf_03.py +123 -0
  244. sraverify/services/waf/checks/sra_waf_04.py +94 -0
  245. sraverify/services/waf/checks/sra_waf_05.py +94 -0
  246. sraverify/services/waf/checks/sra_waf_06.py +91 -0
  247. sraverify/services/waf/checks/sra_waf_07.py +94 -0
  248. sraverify/services/waf/checks/sra_waf_08.py +66 -0
  249. sraverify/services/waf/checks/sra_waf_09.py +95 -0
  250. sraverify/services/waf/client.py +109 -0
  251. sraverify/utils/__init__.py +3 -0
  252. sraverify/utils/banner.py +65 -0
  253. sraverify/utils/outputs.py +57 -0
  254. sraverify/utils/progress.py +97 -0
  255. sraverify-0.1.0.dist-info/LICENSE +175 -0
  256. sraverify-0.1.0.dist-info/METADATA +516 -0
  257. sraverify-0.1.0.dist-info/NOTICE +1 -0
  258. sraverify-0.1.0.dist-info/RECORD +261 -0
  259. sraverify-0.1.0.dist-info/WHEEL +5 -0
  260. sraverify-0.1.0.dist-info/entry_points.txt +2 -0
  261. sraverify-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,107 @@
1
+ """Check if Security Hub findings are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_08(SecurityLakeCheck):
9
+ """Check if Security Hub findings are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-08"
16
+ self.check_name = "Security Lake Security Hub findings enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "SecurityHub findings log and event source version 2.0 for all active accounts in the organization. "
21
+ "Security Hub findings help you understand your security posture in AWS and let you check your "
22
+ "environment against security industry standards and best practices. "
23
+ "Security Lake collects findings directly from Security Hub through "
24
+ "an independent and duplicated stream of events. "
25
+ "This check runs from the delegated administrator account "
26
+ "and validates configuration across all organization member accounts."
27
+ )
28
+ self.check_logic = (
29
+ "Checks if the Security Hub findings log source version 2.0 is enabled in Security Lake "
30
+ "for all active organization accounts. The check passes if the SH_FINDINGS log source version 2.0 is enabled. "
31
+ "The check fails if the SH_FINDINGS log source is not enabled or configured with version 1.0."
32
+ )
33
+
34
+ def execute(self) -> List[Dict[str, Any]]:
35
+ """
36
+ Execute the check.
37
+
38
+ Returns:
39
+ List of findings
40
+ """
41
+
42
+ for region in self.regions:
43
+ logger.debug(f"Checking if Security Hub findings are enabled in {region}")
44
+
45
+ # Get all organization accounts
46
+ org_accounts = self.get_organization_accounts(region)
47
+ if not org_accounts:
48
+ logger.debug("No organization accounts found, checking current account only")
49
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
50
+
51
+ # Create sets of active account IDs
52
+ active_org_account_ids = set()
53
+ for account in org_accounts:
54
+ if account.get('Status') == 'ACTIVE':
55
+ active_org_account_ids.add(account.get('Id'))
56
+
57
+ # Check each account in the organization
58
+ for account_id in active_org_account_ids:
59
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/SH_FINDINGS"
60
+
61
+ # Check Security Hub findings configuration
62
+ sh_findings_v2_enabled = self.check_log_source_configured(region, "SH_FINDINGS", account_id, "2.0")
63
+
64
+ if not sh_findings_v2_enabled:
65
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
66
+ sh_findings_v1_enabled = self.check_log_source_configured(region, "SH_FINDINGS", account_id, "1.0")
67
+
68
+ if sh_findings_v1_enabled:
69
+ actual_value = f"Security Hub findings are configured with version 1.0 instead of 2.0 for account {account_id}"
70
+ remediation = (
71
+ f"Update Security Hub findings to version 2.0 for account {account_id}. "
72
+ "In the Security Lake console, navigate to Sources and update the Security Hub findings source version. "
73
+ "Alternatively, use the AWS CLI command: "
74
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"SH_FINDINGS\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
75
+ )
76
+ else:
77
+ actual_value = f"Security Hub findings are not configured for account {account_id}"
78
+ remediation = (
79
+ "Enable Security Hub findings in Security Lake. In the Security Lake console, "
80
+ "navigate to Settings > Log Sources and enable Security Hub findings. "
81
+ "Alternatively, use the AWS CLI command: "
82
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"SH_FINDINGS\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
83
+ )
84
+
85
+ self.findings.append(
86
+ self.create_finding(
87
+ status="FAIL",
88
+ region=region,
89
+ resource_id=resource_id,
90
+ checked_value="Security Hub findings enabled with version 2.0",
91
+ actual_value=actual_value,
92
+ remediation=remediation
93
+ )
94
+ )
95
+ else:
96
+ self.findings.append(
97
+ self.create_finding(
98
+ status="PASS",
99
+ region=region,
100
+ resource_id=resource_id,
101
+ checked_value="Security Hub findings enabled with version 2.0",
102
+ actual_value=f"Security Hub findings are enabled with version 2.0 in {region} for account {account_id}",
103
+ remediation="No remediation needed"
104
+ )
105
+ )
106
+
107
+ return self.findings
@@ -0,0 +1,107 @@
1
+ """Check if EKS Audit logs are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_09(SecurityLakeCheck):
9
+ """Check if EKS Audit logs are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-09"
16
+ self.check_name = "Security Lake EKS audit logs enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "EKS Audit log and event source version 2.0 for all active accounts in the organization. "
21
+ "EKS Audit Logs help you detect potentially suspicious activities in your EKS clusters within the "
22
+ "Amazon Elastic Kubernetes Service. Security Lake consumes EKS Audit "
23
+ "Log events directly from the Amazon EKS control plane logging feature "
24
+ "through an independent and duplicative stream of audit logs. "
25
+ "This check runs from the delegated administrator account "
26
+ "and validates configuration across all organization member accounts."
27
+ )
28
+ self.check_logic = (
29
+ "Checks if the EKS Audit logs source version 2.0 is enabled in Security Lake "
30
+ "for all active organization accounts. The check passes if the EKS_AUDIT log source version 2.0 is enabled. "
31
+ "The check fails if the EKS_AUDIT log source is not enabled or configured with version 1.0."
32
+ )
33
+
34
+ def execute(self) -> List[Dict[str, Any]]:
35
+ """
36
+ Execute the check.
37
+
38
+ Returns:
39
+ List of findings
40
+ """
41
+
42
+ for region in self.regions:
43
+ logger.debug(f"Checking if EKS Audit logs are enabled in {region}")
44
+
45
+ # Get all organization accounts
46
+ org_accounts = self.get_organization_accounts(region)
47
+ if not org_accounts:
48
+ logger.debug("No organization accounts found, checking current account only")
49
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
50
+
51
+ # Create sets of active account IDs
52
+ active_org_account_ids = set()
53
+ for account in org_accounts:
54
+ if account.get('Status') == 'ACTIVE':
55
+ active_org_account_ids.add(account.get('Id'))
56
+
57
+ # Check each account in the organization
58
+ for account_id in active_org_account_ids:
59
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/EKS_AUDIT"
60
+
61
+ # Check EKS Audit logs configuration
62
+ eks_audit_v2_enabled = self.check_log_source_configured(region, "EKS_AUDIT", account_id, "2.0")
63
+
64
+ if not eks_audit_v2_enabled:
65
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
66
+ eks_audit_v1_enabled = self.check_log_source_configured(region, "EKS_AUDIT", account_id, "1.0")
67
+
68
+ if eks_audit_v1_enabled:
69
+ actual_value = f"EKS Audit logs are configured with version 1.0 instead of 2.0 for account {account_id}"
70
+ remediation = (
71
+ f"Update EKS Audit logs to version 2.0 for account {account_id}. "
72
+ "In the Security Lake console, navigate to Sources and update the EKS Audit logs source version. "
73
+ "Alternatively, use the AWS CLI command: "
74
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"EKS_AUDIT\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
75
+ )
76
+ else:
77
+ actual_value = f"EKS Audit logs are not configured for account {account_id}"
78
+ remediation = (
79
+ "Enable EKS Audit logs in Security Lake. In the Security Lake console, "
80
+ "navigate to Settings > Log Sources and enable EKS Audit logs. "
81
+ "Alternatively, use the AWS CLI command: "
82
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"EKS_AUDIT\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
83
+ )
84
+
85
+ self.findings.append(
86
+ self.create_finding(
87
+ status="FAIL",
88
+ region=region,
89
+ resource_id=resource_id,
90
+ checked_value="EKS Audit logs enabled with version 2.0",
91
+ actual_value=actual_value,
92
+ remediation=remediation
93
+ )
94
+ )
95
+ else:
96
+ self.findings.append(
97
+ self.create_finding(
98
+ status="PASS",
99
+ region=region,
100
+ resource_id=resource_id,
101
+ checked_value="EKS Audit logs enabled with version 2.0",
102
+ actual_value=f"EKS Audit logs are enabled with version 2.0 in {region} for account {account_id}",
103
+ remediation="No remediation needed"
104
+ )
105
+ )
106
+
107
+ return self.findings
@@ -0,0 +1,106 @@
1
+ """Check if Lambda execution logs are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_10(SecurityLakeCheck):
9
+ """Check if Lambda execution logs are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-10"
16
+ self.check_name = "Security Lake Lambda execution logs enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "Lambda execution log and event source version 2.0 for all active accounts in the organization. "
21
+ "These operations are often high-volume activities and should be enabled as per your requirement. "
22
+ "Security Lake pulls data directly from Lambda through an independent "
23
+ "and duplicated stream of events. "
24
+ "This check runs from the delegated administrator account "
25
+ "and validates configuration across all organization member accounts."
26
+ )
27
+ self.check_logic = (
28
+ "Checks if the Lambda execution logs source version 2.0 is enabled in Security Lake "
29
+ "for all active organization accounts. The check passes if the LAMBDA_EXECUTION log source version 2.0 is enabled. "
30
+ "The check fails if the LAMBDA_EXECUTION log source is not enabled or configured with version 1.0."
31
+ )
32
+
33
+ def execute(self) -> List[Dict[str, Any]]:
34
+ """
35
+ Execute the check.
36
+
37
+ Returns:
38
+ List of findings
39
+ """
40
+
41
+ for region in self.regions:
42
+ logger.debug(f"Checking if Lambda execution logs are enabled in {region}")
43
+
44
+ # Get all organization accounts
45
+ org_accounts = self.get_organization_accounts(region)
46
+ if not org_accounts:
47
+ logger.debug("No organization accounts found, checking current account only")
48
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
49
+
50
+ # Create sets of active account IDs
51
+ active_org_account_ids = set()
52
+ for account in org_accounts:
53
+ if account.get('Status') == 'ACTIVE':
54
+ active_org_account_ids.add(account.get('Id'))
55
+
56
+ # Check each account in the organization
57
+ for account_id in active_org_account_ids:
58
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/LAMBDA_EXECUTION"
59
+
60
+ # Check Lambda execution logs configuration
61
+ lambda_v2_enabled = self.check_log_source_configured(region, "LAMBDA_EXECUTION", account_id, "2.0")
62
+
63
+ if not lambda_v2_enabled:
64
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
65
+ lambda_v1_enabled = self.check_log_source_configured(region, "LAMBDA_EXECUTION", account_id, "1.0")
66
+
67
+ if lambda_v1_enabled:
68
+ actual_value = f"Lambda execution logs are configured with version 1.0 instead of 2.0 for account {account_id}"
69
+ remediation = (
70
+ f"Update Lambda execution logs to version 2.0 for account {account_id}. "
71
+ "In the Security Lake console, navigate to Sources and update the Lambda execution logs source version. "
72
+ "Alternatively, use the AWS CLI command: "
73
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"LAMBDA_EXECUTION\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
74
+ )
75
+ else:
76
+ actual_value = f"Lambda execution logs are not configured for account {account_id}"
77
+ remediation = (
78
+ "Enable Lambda execution logs in Security Lake. In the Security Lake console, "
79
+ "navigate to Settings > Log Sources and enable Lambda execution logs. "
80
+ "Alternatively, use the AWS CLI command: "
81
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"LAMBDA_EXECUTION\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
82
+ )
83
+
84
+ self.findings.append(
85
+ self.create_finding(
86
+ status="FAIL",
87
+ region=region,
88
+ resource_id=resource_id,
89
+ checked_value="Lambda execution logs enabled with version 2.0",
90
+ actual_value=actual_value,
91
+ remediation=remediation
92
+ )
93
+ )
94
+ else:
95
+ self.findings.append(
96
+ self.create_finding(
97
+ status="PASS",
98
+ region=region,
99
+ resource_id=resource_id,
100
+ checked_value="Lambda execution logs enabled with version 2.0",
101
+ actual_value=f"Lambda execution logs are enabled with version 2.0 in {region} for account {account_id}",
102
+ remediation="No remediation needed"
103
+ )
104
+ )
105
+
106
+ return self.findings
@@ -0,0 +1,109 @@
1
+ """Check if CloudTrail management logs are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_11(SecurityLakeCheck):
9
+ """Check if CloudTrail management logs are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-11"
16
+ self.check_name = "Security Lake CloudTrail management logs enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "CloudTrail management log and event source version 2.0 for all active accounts in the organization. "
21
+ "CloudTrail management events, also known as control plane events, provide insight into management "
22
+ "operations that are performed on CloudTrail in your AWS account. To "
23
+ "collect CloudTrail management events in Security Lake, there must be at "
24
+ "least one CloudTrail multi-Region organization trail that collects read "
25
+ "and write CloudTrail management events. Logging must be enabled for the trail. "
26
+ "This check runs from the delegated administrator account "
27
+ "and validates configuration across all organization member accounts."
28
+ )
29
+ self.check_logic = (
30
+ "Checks if the CloudTrail management logs source version 2.0 is enabled in Security Lake "
31
+ "for all active organization accounts. The check passes if the CLOUD_TRAIL_MGMT log source version 2.0 is enabled. "
32
+ "The check fails if the CLOUD_TRAIL_MGMT log source is not enabled or configured with version 1.0."
33
+ )
34
+
35
+ def execute(self) -> List[Dict[str, Any]]:
36
+ """
37
+ Execute the check.
38
+
39
+ Returns:
40
+ List of findings
41
+ """
42
+
43
+ for region in self.regions:
44
+ logger.debug(f"Checking if CloudTrail management logs are enabled in {region}")
45
+
46
+ # Get all organization accounts
47
+ org_accounts = self.get_organization_accounts(region)
48
+ if not org_accounts:
49
+ logger.debug("No organization accounts found, checking current account only")
50
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
51
+
52
+ # Create sets of active account IDs
53
+ active_org_account_ids = set()
54
+ for account in org_accounts:
55
+ if account.get('Status') == 'ACTIVE':
56
+ active_org_account_ids.add(account.get('Id'))
57
+
58
+ # Check each account in the organization
59
+ for account_id in active_org_account_ids:
60
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/CLOUD_TRAIL_MGMT"
61
+
62
+ # Check CloudTrail management logs configuration
63
+ cloudtrail_v2_enabled = self.check_log_source_configured(region, "CLOUD_TRAIL_MGMT", account_id, "2.0")
64
+
65
+ if not cloudtrail_v2_enabled:
66
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
67
+ cloudtrail_v1_enabled = self.check_log_source_configured(region, "CLOUD_TRAIL_MGMT", account_id, "1.0")
68
+
69
+ if cloudtrail_v1_enabled:
70
+ actual_value = f"CloudTrail management logs are configured with version 1.0 instead of 2.0 for account {account_id}"
71
+ remediation = (
72
+ f"Update CloudTrail management logs to version 2.0 for account {account_id}. "
73
+ "In the Security Lake console, navigate to Sources and update the CloudTrail management logs source version. "
74
+ "Alternatively, use the AWS CLI command: "
75
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"CLOUD_TRAIL_MGMT\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
76
+ )
77
+ else:
78
+ actual_value = f"CloudTrail management logs are not configured for account {account_id}"
79
+ remediation = (
80
+ "Enable CloudTrail management logs in Security Lake. In the Security Lake console, "
81
+ "navigate to Settings > Log Sources and enable CloudTrail management logs. "
82
+ "Ensure you have at least one CloudTrail multi-Region organization trail that collects "
83
+ "read and write management events. Alternatively, use the AWS CLI command: "
84
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"CLOUD_TRAIL_MGMT\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
85
+ )
86
+
87
+ self.findings.append(
88
+ self.create_finding(
89
+ status="FAIL",
90
+ region=region,
91
+ resource_id=resource_id,
92
+ checked_value="CloudTrail management logs enabled with version 2.0",
93
+ actual_value=actual_value,
94
+ remediation=remediation
95
+ )
96
+ )
97
+ else:
98
+ self.findings.append(
99
+ self.create_finding(
100
+ status="PASS",
101
+ region=region,
102
+ resource_id=resource_id,
103
+ checked_value="CloudTrail management logs enabled with version 2.0",
104
+ actual_value=f"CloudTrail management logs are enabled with version 2.0 in {region} for account {account_id}",
105
+ remediation="No remediation needed"
106
+ )
107
+ )
108
+
109
+ return self.findings
@@ -0,0 +1,108 @@
1
+ """Check if WAF logs are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_12(SecurityLakeCheck):
9
+ """Check if WAF logs are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-12"
16
+ self.check_name = "Security Lake WAF logs enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "WAF log and event source version 2.0 for all active accounts in the organization. "
21
+ "AWS WAF is a web application firewall that "
22
+ "helps protect your web applications or APIs against common web exploits "
23
+ "and bots that may affect availability, compromise security, or consume "
24
+ "excessive resources. Security Lake collects WAF logs directly from "
25
+ "AWS WAF through an independent and duplicated stream of events. "
26
+ "This check runs from the delegated administrator account "
27
+ "and validates configuration across all organization member accounts."
28
+ )
29
+ self.check_logic = (
30
+ "Checks if the WAF logs source version 2.0 is enabled in Security Lake "
31
+ "for all active organization accounts. The check passes if the WAF log source version 2.0 is enabled. "
32
+ "The check fails if the WAF log source is not enabled or configured with version 1.0."
33
+ )
34
+
35
+ def execute(self) -> List[Dict[str, Any]]:
36
+ """
37
+ Execute the check.
38
+
39
+ Returns:
40
+ List of findings
41
+ """
42
+
43
+ for region in self.regions:
44
+ logger.debug(f"Checking if WAF logs are enabled in {region}")
45
+
46
+ # Get all organization accounts
47
+ org_accounts = self.get_organization_accounts(region)
48
+ if not org_accounts:
49
+ logger.debug("No organization accounts found, checking current account only")
50
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
51
+
52
+ # Create sets of active account IDs
53
+ active_org_account_ids = set()
54
+ for account in org_accounts:
55
+ if account.get('Status') == 'ACTIVE':
56
+ active_org_account_ids.add(account.get('Id'))
57
+
58
+ # Check each account in the organization
59
+ for account_id in active_org_account_ids:
60
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/WAF"
61
+
62
+ # Check WAF logs configuration
63
+ waf_v2_enabled = self.check_log_source_configured(region, "WAF", account_id, "2.0")
64
+
65
+ if not waf_v2_enabled:
66
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
67
+ waf_v1_enabled = self.check_log_source_configured(region, "WAF", account_id, "1.0")
68
+
69
+ if waf_v1_enabled:
70
+ actual_value = f"WAF logs are configured with version 1.0 instead of 2.0 for account {account_id}"
71
+ remediation = (
72
+ f"Update WAF logs to version 2.0 for account {account_id}. "
73
+ "In the Security Lake console, navigate to Sources and update the WAF logs source version. "
74
+ "Alternatively, use the AWS CLI command: "
75
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"WAF\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
76
+ )
77
+ else:
78
+ actual_value = f"WAF logs are not configured for account {account_id}"
79
+ remediation = (
80
+ "Enable WAF logs in Security Lake. In the Security Lake console, "
81
+ "navigate to Settings > Log Sources and enable WAF logs. "
82
+ "Alternatively, use the AWS CLI command: "
83
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"WAF\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
84
+ )
85
+
86
+ self.findings.append(
87
+ self.create_finding(
88
+ status="FAIL",
89
+ region=region,
90
+ resource_id=resource_id,
91
+ checked_value="WAF logs enabled with version 2.0",
92
+ actual_value=actual_value,
93
+ remediation=remediation
94
+ )
95
+ )
96
+ else:
97
+ self.findings.append(
98
+ self.create_finding(
99
+ status="PASS",
100
+ region=region,
101
+ resource_id=resource_id,
102
+ checked_value="WAF logs enabled with version 2.0",
103
+ actual_value=f"WAF logs are enabled with version 2.0 in {region} for account {account_id}",
104
+ remediation="No remediation needed"
105
+ )
106
+ )
107
+
108
+ return self.findings
@@ -0,0 +1,108 @@
1
+ """Check if VPC Flow logs are enabled for Security Lake."""
2
+
3
+ from typing import List, Dict, Any
4
+ from sraverify.services.securitylake.base import SecurityLakeCheck
5
+ from sraverify.core.logging import logger
6
+
7
+
8
+ class SRA_SECURITYLAKE_13(SecurityLakeCheck):
9
+ """Check if VPC Flow logs are enabled for Security Lake."""
10
+
11
+ def __init__(self):
12
+ """Initialize check."""
13
+ super().__init__()
14
+ self.account_type = "log-archive" # Check all org accounts from delegated admin
15
+ self.check_id = "SRA-SECURITYLAKE-13"
16
+ self.check_name = "Security Lake VPC flow logs enabled with version 2.0 for all organization accounts"
17
+ self.severity = "HIGH"
18
+ self.description = (
19
+ "This check verifies whether Amazon Security Lake is configured with "
20
+ "VPC Flow log and event source version 2.0 for all active accounts in the organization. "
21
+ "VPC Flow Logs is a feature that enables "
22
+ "you to capture information about the IP traffic going to and from "
23
+ "network interfaces in your VPC. Security Lake collects VPC Flow Logs "
24
+ "directly from Amazon VPC through an independent and duplicated stream "
25
+ "of events. "
26
+ "This check runs from the delegated administrator account "
27
+ "and validates configuration across all organization member accounts."
28
+ )
29
+ self.check_logic = (
30
+ "Checks if the VPC Flow logs source version 2.0 is enabled in Security Lake "
31
+ "for all active organization accounts. The check passes if the VPC_FLOW log source version 2.0 is enabled. "
32
+ "The check fails if the VPC_FLOW log source is not enabled or configured with version 1.0."
33
+ )
34
+
35
+ def execute(self) -> List[Dict[str, Any]]:
36
+ """
37
+ Execute the check.
38
+
39
+ Returns:
40
+ List of findings
41
+ """
42
+
43
+ for region in self.regions:
44
+ logger.debug(f"Checking if VPC Flow logs are enabled in {region}")
45
+
46
+ # Get all organization accounts
47
+ org_accounts = self.get_organization_accounts(region)
48
+ if not org_accounts:
49
+ logger.debug("No organization accounts found, checking current account only")
50
+ org_accounts = [{'Id': self.account_id, 'Status': 'ACTIVE'}]
51
+
52
+ # Create sets of active account IDs
53
+ active_org_account_ids = set()
54
+ for account in org_accounts:
55
+ if account.get('Status') == 'ACTIVE':
56
+ active_org_account_ids.add(account.get('Id'))
57
+
58
+ # Check each account in the organization
59
+ for account_id in active_org_account_ids:
60
+ resource_id = f"arn:aws:securitylake:{region}:{account_id}:log-source/VPC_FLOW"
61
+
62
+ # Check VPC Flow logs configuration
63
+ vpc_flow_v2_enabled = self.check_log_source_configured(region, "VPC_FLOW", account_id, "2.0")
64
+
65
+ if not vpc_flow_v2_enabled:
66
+ # Only check v1.0 if v2.0 is not enabled (uses cached data)
67
+ vpc_flow_v1_enabled = self.check_log_source_configured(region, "VPC_FLOW", account_id, "1.0")
68
+
69
+ if vpc_flow_v1_enabled:
70
+ actual_value = f"VPC Flow logs are configured with version 1.0 instead of 2.0 for account {account_id}"
71
+ remediation = (
72
+ f"Update VPC Flow logs to version 2.0 for account {account_id}. "
73
+ "In the Security Lake console, navigate to Sources and update the VPC Flow logs source version. "
74
+ "Alternatively, use the AWS CLI command: "
75
+ f"aws securitylake update-data-lake --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"VPC_FLOW\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
76
+ )
77
+ else:
78
+ actual_value = f"VPC Flow logs are not configured for account {account_id}"
79
+ remediation = (
80
+ "Enable VPC Flow logs in Security Lake. In the Security Lake console, "
81
+ "navigate to Settings > Log Sources and enable VPC Flow logs. "
82
+ "Alternatively, use the AWS CLI command: "
83
+ f"aws securitylake create-aws-log-source --sources '[{{\"regions\":[\"{region}\"],\"sourceName\":\"VPC_FLOW\",\"sourceVersion\":\"2.0\"}}]' --region {region}"
84
+ )
85
+
86
+ self.findings.append(
87
+ self.create_finding(
88
+ status="FAIL",
89
+ region=region,
90
+ resource_id=resource_id,
91
+ checked_value="VPC Flow logs enabled with version 2.0",
92
+ actual_value=actual_value,
93
+ remediation=remediation
94
+ )
95
+ )
96
+ else:
97
+ self.findings.append(
98
+ self.create_finding(
99
+ status="PASS",
100
+ region=region,
101
+ resource_id=resource_id,
102
+ checked_value="VPC Flow logs enabled with version 2.0",
103
+ actual_value=f"VPC Flow logs are enabled with version 2.0 in {region} for account {account_id}",
104
+ remediation="No remediation needed"
105
+ )
106
+ )
107
+
108
+ return self.findings