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,23 @@
1
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_01 import SRA_FIREWALLMANAGER_01
2
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_02 import SRA_FIREWALLMANAGER_02
3
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_03 import SRA_FIREWALLMANAGER_03
4
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_04 import SRA_FIREWALLMANAGER_04
5
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_05 import SRA_FIREWALLMANAGER_05
6
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_06 import SRA_FIREWALLMANAGER_06
7
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_07 import SRA_FIREWALLMANAGER_07
8
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_08 import SRA_FIREWALLMANAGER_08
9
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_09 import SRA_FIREWALLMANAGER_09
10
+ from sraverify.services.firewallmanager.checks.sra_firewallmanager_10 import SRA_FIREWALLMANAGER_10
11
+
12
+ CHECKS = {
13
+ "SRA-FIREWALLMANAGER-01": SRA_FIREWALLMANAGER_01,
14
+ "SRA-FIREWALLMANAGER-02": SRA_FIREWALLMANAGER_02,
15
+ "SRA-FIREWALLMANAGER-03": SRA_FIREWALLMANAGER_03,
16
+ "SRA-FIREWALLMANAGER-04": SRA_FIREWALLMANAGER_04,
17
+ "SRA-FIREWALLMANAGER-05": SRA_FIREWALLMANAGER_05,
18
+ "SRA-FIREWALLMANAGER-06": SRA_FIREWALLMANAGER_06,
19
+ "SRA-FIREWALLMANAGER-07": SRA_FIREWALLMANAGER_07,
20
+ "SRA-FIREWALLMANAGER-08": SRA_FIREWALLMANAGER_08,
21
+ "SRA-FIREWALLMANAGER-09": SRA_FIREWALLMANAGER_09,
22
+ "SRA-FIREWALLMANAGER-10": SRA_FIREWALLMANAGER_10,
23
+ }
@@ -0,0 +1,48 @@
1
+ from typing import Dict, Any
2
+ from sraverify.core.check import SecurityCheck
3
+ from sraverify.services.firewallmanager.client import FirewallManagerClient
4
+ from sraverify.core.logging import logger
5
+
6
+ class FirewallManagerCheck(SecurityCheck):
7
+ # Class-level caches shared across all instances
8
+ _admin_account_cache = None
9
+ _policies_cache = {}
10
+
11
+ def __init__(self):
12
+ super().__init__(
13
+ account_type="audit",
14
+ service="FirewallManager",
15
+ resource_type="AWS::FMS::Policy"
16
+ )
17
+
18
+ def _setup_clients(self):
19
+ self._clients.clear()
20
+ # Firewall Manager admin APIs are global (us-east-1)
21
+ self._clients['us-east-1'] = FirewallManagerClient('us-east-1', session=self.session)
22
+ # For regional policy checks, create clients for all regions
23
+ if hasattr(self, 'regions') and self.regions:
24
+ for region in self.regions:
25
+ if region not in self._clients:
26
+ self._clients[region] = FirewallManagerClient(region, session=self.session)
27
+
28
+ def get_admin_account(self) -> Dict[str, Any]:
29
+ if FirewallManagerCheck._admin_account_cache is None:
30
+ logger.debug("FirewallManager: Fetching admin account")
31
+ client = self.get_client('us-east-1')
32
+ if client:
33
+ FirewallManagerCheck._admin_account_cache = client.get_admin_account()
34
+ logger.debug("FirewallManager: Cached admin account")
35
+ else:
36
+ logger.debug("FirewallManager: Using cached admin account")
37
+ return FirewallManagerCheck._admin_account_cache or {}
38
+
39
+ def list_policies(self, region: str) -> Dict[str, Any]:
40
+ if region not in FirewallManagerCheck._policies_cache:
41
+ logger.debug(f"FirewallManager: Fetching policies for {region}")
42
+ client = self.get_client(region)
43
+ if client:
44
+ FirewallManagerCheck._policies_cache[region] = client.list_policies()
45
+ logger.debug(f"FirewallManager: Cached policies for {region}")
46
+ else:
47
+ logger.debug(f"FirewallManager: Using cached policies for {region}")
48
+ return FirewallManagerCheck._policies_cache.get(region, {})
@@ -0,0 +1 @@
1
+ # Firewall Manager checks
@@ -0,0 +1,75 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_01(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ # Override account type for this specific check
8
+ self.account_type = "management"
9
+ self.resource_type = "AWS::FMS::AdminAccount"
10
+ self.check_id = "SRA-FIREWALLMANAGER-01"
11
+ self.check_name = "Firewall Manager delegated administrator is the audit account"
12
+ self.description = "Verifies that AWS Firewall Manager delegated administrator is configured and set to the audit account"
13
+ self.severity = "HIGH"
14
+ self.check_logic = "Calls get_admin_account() to retrieve the Firewall Manager administrator account and verifies it matches the audit account ID"
15
+
16
+ def execute(self) -> List[Dict[str, Any]]:
17
+ region = "us-east-1"
18
+
19
+ admin_response = self.get_admin_account()
20
+
21
+ if "Error" in admin_response:
22
+ self.findings.append(self.create_finding(
23
+ status="ERROR",
24
+ region=region,
25
+ resource_id=None,
26
+ actual_value=admin_response["Error"].get("Message", "Unknown error"),
27
+ remediation="Configure Firewall Manager delegated administrator: https://docs.aws.amazon.com/waf/latest/developerguide/fms-prereq.html"
28
+ ))
29
+ return self.findings
30
+
31
+ admin_account = admin_response.get("AdminAccount")
32
+ role_status = admin_response.get("RoleStatus")
33
+
34
+ if not admin_account:
35
+ self.findings.append(self.create_finding(
36
+ status="FAIL",
37
+ region=region,
38
+ resource_id=None,
39
+ actual_value="No Firewall Manager administrator configured",
40
+ remediation="Set up Firewall Manager administrator account: https://docs.aws.amazon.com/waf/latest/developerguide/fms-prereq.html"
41
+ ))
42
+ elif not hasattr(self, '_audit_accounts'):
43
+ self.findings.append(self.create_finding(
44
+ status="FAIL",
45
+ region=region,
46
+ resource_id=admin_account,
47
+ actual_value=f"Firewall Manager administrator is {admin_account}, but audit account not specified",
48
+ remediation="Run check with --audit-account parameter to verify delegated administrator"
49
+ ))
50
+ elif admin_account not in self._audit_accounts:
51
+ self.findings.append(self.create_finding(
52
+ status="FAIL",
53
+ region=region,
54
+ resource_id=admin_account,
55
+ actual_value=f"Firewall Manager administrator is {admin_account}, expected one of {self._audit_accounts}",
56
+ remediation=f"Change Firewall Manager administrator to audit account using PutAdminAccount API"
57
+ ))
58
+ elif role_status != "READY":
59
+ self.findings.append(self.create_finding(
60
+ status="FAIL",
61
+ region=region,
62
+ resource_id=admin_account,
63
+ actual_value=f"Firewall Manager administrator status is {role_status}",
64
+ remediation="Wait for administrator account to reach READY status or reconfigure if in error state"
65
+ ))
66
+ else:
67
+ self.findings.append(self.create_finding(
68
+ status="PASS",
69
+ region=region,
70
+ resource_id=admin_account,
71
+ actual_value=f"Firewall Manager administrator is audit account {admin_account} with status {role_status}",
72
+ remediation="No remediation needed"
73
+ ))
74
+
75
+ return self.findings
@@ -0,0 +1,57 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_02(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-02"
8
+ self.check_name = "Firewall Manager manages security groups"
9
+ self.description = "Verifies that AWS Firewall Manager has security group policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of SECURITY_GROUPS_COMMON, SECURITY_GROUPS_CONTENT_AUDIT, or SECURITY_GROUPS_USAGE_AUDIT"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ account_id = self.account_id
15
+
16
+ for region in self.regions:
17
+ policies_response = self.list_policies(region)
18
+
19
+ if "Error" in policies_response:
20
+ self.findings.append(self.create_finding(
21
+ status="ERROR",
22
+ region=region,
23
+ resource_id=None,
24
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
25
+ remediation="Check IAM permissions for Firewall Manager API access"
26
+ ))
27
+ continue
28
+
29
+ policies = policies_response.get("PolicyList", [])
30
+ sg_policies = [
31
+ p for p in policies
32
+ if p.get("SecurityServiceType") in [
33
+ "SECURITY_GROUPS_COMMON",
34
+ "SECURITY_GROUPS_CONTENT_AUDIT",
35
+ "SECURITY_GROUPS_USAGE_AUDIT"
36
+ ]
37
+ ]
38
+
39
+ if not sg_policies:
40
+ self.findings.append(self.create_finding(
41
+ status="FAIL",
42
+ region=region,
43
+ resource_id=None,
44
+ actual_value="No security group policies configured",
45
+ remediation="Create Firewall Manager security group policies: https://docs.aws.amazon.com/waf/latest/developerguide/security-group-policies.html"
46
+ ))
47
+ else:
48
+ policy_names = [p.get("PolicyName", "Unknown") for p in sg_policies]
49
+ self.findings.append(self.create_finding(
50
+ status="PASS",
51
+ region=region,
52
+ resource_id=",".join([p.get("PolicyId", "") for p in sg_policies]),
53
+ actual_value=f"{len(sg_policies)} security group policy(ies) configured: {', '.join(policy_names)}",
54
+ remediation="No remediation needed"
55
+ ))
56
+
57
+ return self.findings
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_03(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-03"
8
+ self.check_name = "Firewall Manager manages WAF policies"
9
+ self.description = "Verifies that AWS Firewall Manager has WAF policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of WAF or WAFV2"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+ waf_policies = [
29
+ p for p in policies
30
+ if p.get("SecurityServiceType") in ["WAF", "WAFV2"]
31
+ ]
32
+
33
+ if not waf_policies:
34
+ self.findings.append(self.create_finding(
35
+ status="FAIL",
36
+ region=region,
37
+ resource_id=None,
38
+ actual_value="No WAF policies configured",
39
+ remediation="Create Firewall Manager WAF policies: https://docs.aws.amazon.com/waf/latest/developerguide/waf-policies.html"
40
+ ))
41
+ else:
42
+ policy_names = [p.get("PolicyName", "Unknown") for p in waf_policies]
43
+ self.findings.append(self.create_finding(
44
+ status="PASS",
45
+ region=region,
46
+ resource_id=",".join([p.get("PolicyId", "") for p in waf_policies]),
47
+ actual_value=f"{len(waf_policies)} WAF policy(ies) configured: {', '.join(policy_names)}",
48
+ remediation="No remediation needed"
49
+ ))
50
+
51
+ return self.findings
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_04(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-04"
8
+ self.check_name = "Firewall Manager manages Shield Advanced policies"
9
+ self.description = "Verifies that AWS Firewall Manager has Shield Advanced policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of SHIELD_ADVANCED"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+ shield_policies = [
29
+ p for p in policies
30
+ if p.get("SecurityServiceType") == "SHIELD_ADVANCED"
31
+ ]
32
+
33
+ if not shield_policies:
34
+ self.findings.append(self.create_finding(
35
+ status="FAIL",
36
+ region=region,
37
+ resource_id=None,
38
+ actual_value="No Shield Advanced policies configured",
39
+ remediation="Create Firewall Manager Shield Advanced policies: https://docs.aws.amazon.com/waf/latest/developerguide/shield-policies.html"
40
+ ))
41
+ else:
42
+ policy_names = [p.get("PolicyName", "Unknown") for p in shield_policies]
43
+ self.findings.append(self.create_finding(
44
+ status="PASS",
45
+ region=region,
46
+ resource_id=",".join([p.get("PolicyId", "") for p in shield_policies]),
47
+ actual_value=f"{len(shield_policies)} Shield Advanced policy(ies) configured: {', '.join(policy_names)}",
48
+ remediation="No remediation needed"
49
+ ))
50
+
51
+ return self.findings
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_05(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-05"
8
+ self.check_name = "Firewall Manager manages Network ACL policies"
9
+ self.description = "Verifies that AWS Firewall Manager has Network ACL policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of NETWORK_ACL_COMMON"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+ nacl_policies = [
29
+ p for p in policies
30
+ if p.get("SecurityServiceType") == "NETWORK_ACL_COMMON"
31
+ ]
32
+
33
+ if not nacl_policies:
34
+ self.findings.append(self.create_finding(
35
+ status="FAIL",
36
+ region=region,
37
+ resource_id=None,
38
+ actual_value="No Network ACL policies configured",
39
+ remediation="Create Firewall Manager Network ACL policies: https://docs.aws.amazon.com/waf/latest/developerguide/network-acl-policies.html"
40
+ ))
41
+ else:
42
+ policy_names = [p.get("PolicyName", "Unknown") for p in nacl_policies]
43
+ self.findings.append(self.create_finding(
44
+ status="PASS",
45
+ region=region,
46
+ resource_id=",".join([p.get("PolicyId", "") for p in nacl_policies]),
47
+ actual_value=f"{len(nacl_policies)} Network ACL policy(ies) configured: {', '.join(policy_names)}",
48
+ remediation="No remediation needed"
49
+ ))
50
+
51
+ return self.findings
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_06(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-06"
8
+ self.check_name = "Firewall Manager manages AWS Network Firewall policies"
9
+ self.description = "Verifies that AWS Firewall Manager has Network Firewall policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of NETWORK_FIREWALL"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+ nfw_policies = [
29
+ p for p in policies
30
+ if p.get("SecurityServiceType") == "NETWORK_FIREWALL"
31
+ ]
32
+
33
+ if not nfw_policies:
34
+ self.findings.append(self.create_finding(
35
+ status="FAIL",
36
+ region=region,
37
+ resource_id=None,
38
+ actual_value="No Network Firewall policies configured",
39
+ remediation="Create Firewall Manager Network Firewall policies: https://docs.aws.amazon.com/waf/latest/developerguide/network-firewall-policies.html"
40
+ ))
41
+ else:
42
+ policy_names = [p.get("PolicyName", "Unknown") for p in nfw_policies]
43
+ self.findings.append(self.create_finding(
44
+ status="PASS",
45
+ region=region,
46
+ resource_id=",".join([p.get("PolicyId", "") for p in nfw_policies]),
47
+ actual_value=f"{len(nfw_policies)} Network Firewall policy(ies) configured: {', '.join(policy_names)}",
48
+ remediation="No remediation needed"
49
+ ))
50
+
51
+ return self.findings
@@ -0,0 +1,51 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_07(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-07"
8
+ self.check_name = "Firewall Manager manages Route 53 DNS Firewall policies"
9
+ self.description = "Verifies that AWS Firewall Manager has Route 53 DNS Firewall policies configured in each region"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks for policies with SecurityServiceType of DNS_FIREWALL"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+ dns_policies = [
29
+ p for p in policies
30
+ if p.get("SecurityServiceType") == "DNS_FIREWALL"
31
+ ]
32
+
33
+ if not dns_policies:
34
+ self.findings.append(self.create_finding(
35
+ status="FAIL",
36
+ region=region,
37
+ resource_id=None,
38
+ actual_value="No Route 53 DNS Firewall policies configured",
39
+ remediation="Create Firewall Manager Route 53 DNS Firewall policies: https://docs.aws.amazon.com/waf/latest/developerguide/dns-firewall-policies.html"
40
+ ))
41
+ else:
42
+ policy_names = [p.get("PolicyName", "Unknown") for p in dns_policies]
43
+ self.findings.append(self.create_finding(
44
+ status="PASS",
45
+ region=region,
46
+ resource_id=",".join([p.get("PolicyId", "") for p in dns_policies]),
47
+ actual_value=f"{len(dns_policies)} Route 53 DNS Firewall policy(ies) configured: {', '.join(policy_names)}",
48
+ remediation="No remediation needed"
49
+ ))
50
+
51
+ return self.findings
@@ -0,0 +1,61 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_08(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-08"
8
+ self.check_name = "Firewall Manager policy remediation is enabled"
9
+ self.description = "Verifies that AWS Firewall Manager policies have remediation enabled to automatically apply to new resources"
10
+ self.severity = "MEDIUM"
11
+ self.check_logic = "Calls list_policies() per region and checks that all policies have RemediationEnabled set to true"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+
29
+ if not policies:
30
+ self.findings.append(self.create_finding(
31
+ status="PASS",
32
+ region=region,
33
+ resource_id=None,
34
+ actual_value="No Firewall Manager policies configured in region",
35
+ remediation="No remediation needed"
36
+ ))
37
+ continue
38
+
39
+ for policy in policies:
40
+ policy_id = policy.get("PolicyId", "")
41
+ policy_name = policy.get("PolicyName", "Unknown")
42
+ remediation_enabled = policy.get("RemediationEnabled", False)
43
+
44
+ if not remediation_enabled:
45
+ self.findings.append(self.create_finding(
46
+ status="FAIL",
47
+ region=region,
48
+ resource_id=policy_id,
49
+ actual_value=f"Policy '{policy_name}' has remediation disabled",
50
+ remediation=f"Enable remediation on policy '{policy_name}' to automatically apply to new resources"
51
+ ))
52
+ else:
53
+ self.findings.append(self.create_finding(
54
+ status="PASS",
55
+ region=region,
56
+ resource_id=policy_id,
57
+ actual_value=f"Policy '{policy_name}' has remediation enabled",
58
+ remediation="No remediation needed"
59
+ ))
60
+
61
+ return self.findings
@@ -0,0 +1,61 @@
1
+ from typing import Dict, List, Any
2
+ from sraverify.services.firewallmanager.base import FirewallManagerCheck
3
+
4
+ class SRA_FIREWALLMANAGER_09(FirewallManagerCheck):
5
+ def __init__(self):
6
+ super().__init__()
7
+ self.check_id = "SRA-FIREWALLMANAGER-09"
8
+ self.check_name = "Firewall Manager policies are in active status"
9
+ self.description = "Verifies that AWS Firewall Manager policies are in ACTIVE status and not out of admin scope"
10
+ self.severity = "HIGH"
11
+ self.check_logic = "Calls list_policies() per region and checks that all policies have PolicyStatus set to ACTIVE"
12
+
13
+ def execute(self) -> List[Dict[str, Any]]:
14
+ for region in self.regions:
15
+ policies_response = self.list_policies(region)
16
+
17
+ if "Error" in policies_response:
18
+ self.findings.append(self.create_finding(
19
+ status="ERROR",
20
+ region=region,
21
+ resource_id=None,
22
+ actual_value=policies_response["Error"].get("Message", "Unknown error"),
23
+ remediation="Check IAM permissions for Firewall Manager API access"
24
+ ))
25
+ continue
26
+
27
+ policies = policies_response.get("PolicyList", [])
28
+
29
+ if not policies:
30
+ self.findings.append(self.create_finding(
31
+ status="PASS",
32
+ region=region,
33
+ resource_id=None,
34
+ actual_value="No Firewall Manager policies configured in region",
35
+ remediation="No remediation needed"
36
+ ))
37
+ continue
38
+
39
+ for policy in policies:
40
+ policy_id = policy.get("PolicyId", "")
41
+ policy_name = policy.get("PolicyName", "Unknown")
42
+ policy_status = policy.get("PolicyStatus", "")
43
+
44
+ if policy_status != "ACTIVE":
45
+ self.findings.append(self.create_finding(
46
+ status="FAIL",
47
+ region=region,
48
+ resource_id=policy_id,
49
+ actual_value=f"Policy '{policy_name}' has status '{policy_status}'",
50
+ remediation=f"Ensure policy '{policy_name}' is within admin scope to make it ACTIVE"
51
+ ))
52
+ else:
53
+ self.findings.append(self.create_finding(
54
+ status="PASS",
55
+ region=region,
56
+ resource_id=policy_id,
57
+ actual_value=f"Policy '{policy_name}' is ACTIVE",
58
+ remediation="No remediation needed"
59
+ ))
60
+
61
+ return self.findings