@stacksjs/ts-cloud-core 0.1.1

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 (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,456 @@
1
+ /**
2
+ * AWS Security Hub
3
+ * Centralized security and compliance view across AWS accounts
4
+ */
5
+
6
+ export interface SecurityHubConfig {
7
+ id: string
8
+ enable: boolean
9
+ controlFindingGenerator?: 'STANDARD_CONTROL' | 'SECURITY_CONTROL'
10
+ enableDefaultStandards?: boolean
11
+ standards?: SecurityStandard[]
12
+ automationRules?: AutomationRule[]
13
+ }
14
+
15
+ export interface SecurityStandard {
16
+ id: string
17
+ arn: string
18
+ name: string
19
+ description: string
20
+ enabled: boolean
21
+ disabledControls?: string[]
22
+ }
23
+
24
+ export interface AutomationRule {
25
+ id: string
26
+ ruleName: string
27
+ description?: string
28
+ actions: AutomationAction[]
29
+ criteria: AutomationCriteria
30
+ ruleStatus: 'ENABLED' | 'DISABLED'
31
+ ruleOrder: number
32
+ }
33
+
34
+ export interface AutomationAction {
35
+ type: 'FINDING_FIELDS_UPDATE'
36
+ findingFieldsUpdate: {
37
+ note?: {
38
+ text: string
39
+ updatedBy: string
40
+ }
41
+ severity?: {
42
+ label: 'INFORMATIONAL' | 'LOW' | 'MEDIUM' | 'HIGH' | 'CRITICAL'
43
+ }
44
+ workflow?: {
45
+ status: 'NEW' | 'NOTIFIED' | 'RESOLVED' | 'SUPPRESSED'
46
+ }
47
+ relatedFindings?: Array<{
48
+ productArn: string
49
+ id: string
50
+ }>
51
+ userDefinedFields?: Record<string, string>
52
+ }
53
+ }
54
+
55
+ export interface AutomationCriteria {
56
+ productName?: StringFilter[]
57
+ companyName?: StringFilter[]
58
+ severityLabel?: StringFilter[]
59
+ resourceType?: StringFilter[]
60
+ resourceId?: StringFilter[]
61
+ recordState?: StringFilter[]
62
+ workflowStatus?: StringFilter[]
63
+ complianceStatus?: StringFilter[]
64
+ verificationState?: StringFilter[]
65
+ confidence?: NumberFilter[]
66
+ criticality?: NumberFilter[]
67
+ title?: StringFilter[]
68
+ description?: StringFilter[]
69
+ sourceUrl?: StringFilter[]
70
+ productFields?: MapFilter[]
71
+ resourceTags?: MapFilter[]
72
+ userDefinedFields?: MapFilter[]
73
+ }
74
+
75
+ export interface StringFilter {
76
+ value: string
77
+ comparison: 'EQUALS' | 'PREFIX' | 'NOT_EQUALS' | 'PREFIX_NOT_EQUALS'
78
+ }
79
+
80
+ export interface NumberFilter {
81
+ gte?: number
82
+ lte?: number
83
+ eq?: number
84
+ gt?: number
85
+ lt?: number
86
+ }
87
+
88
+ export interface MapFilter {
89
+ key: string
90
+ value?: string
91
+ comparison: 'EQUALS' | 'NOT_EQUALS'
92
+ }
93
+
94
+ /**
95
+ * Security Hub manager
96
+ */
97
+ export class SecurityHubManager {
98
+ private hubs: Map<string, SecurityHubConfig> = new Map()
99
+ private hubCounter = 0
100
+ private ruleCounter = 0
101
+
102
+ /**
103
+ * Available security standards
104
+ */
105
+ static readonly Standards = {
106
+ AWS_FOUNDATIONAL_SECURITY: {
107
+ arn: 'arn:aws:securityhub:::ruleset/aws-foundational-security-best-practices/v/1.0.0',
108
+ name: 'AWS Foundational Security Best Practices',
109
+ description: 'AWS recommended security best practices',
110
+ },
111
+ CIS_AWS_FOUNDATIONS_1_2: {
112
+ arn: 'arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0',
113
+ name: 'CIS AWS Foundations Benchmark v1.2.0',
114
+ description: 'CIS AWS Foundations Benchmark v1.2.0',
115
+ },
116
+ CIS_AWS_FOUNDATIONS_1_4: {
117
+ arn: 'arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.4.0',
118
+ name: 'CIS AWS Foundations Benchmark v1.4.0',
119
+ description: 'CIS AWS Foundations Benchmark v1.4.0',
120
+ },
121
+ PCI_DSS: {
122
+ arn: 'arn:aws:securityhub:us-east-1::standards/pci-dss/v/3.2.1',
123
+ name: 'PCI DSS v3.2.1',
124
+ description: 'Payment Card Industry Data Security Standard',
125
+ },
126
+ NIST_800_53: {
127
+ arn: 'arn:aws:securityhub:us-east-1::standards/nist-800-53/v/5.0.0',
128
+ name: 'NIST SP 800-53 Rev. 5',
129
+ description: 'NIST Special Publication 800-53 Revision 5',
130
+ },
131
+ }
132
+
133
+ /**
134
+ * Create Security Hub
135
+ */
136
+ createHub(hub: Omit<SecurityHubConfig, 'id'>): SecurityHubConfig {
137
+ const id = `hub-${Date.now()}-${this.hubCounter++}`
138
+
139
+ const securityHub: SecurityHubConfig = {
140
+ id,
141
+ ...hub,
142
+ }
143
+
144
+ this.hubs.set(id, securityHub)
145
+
146
+ return securityHub
147
+ }
148
+
149
+ /**
150
+ * Create comprehensive Security Hub with all standards
151
+ */
152
+ createComprehensiveHub(): SecurityHubConfig {
153
+ return this.createHub({
154
+ enable: true,
155
+ controlFindingGenerator: 'SECURITY_CONTROL',
156
+ enableDefaultStandards: true,
157
+ standards: [
158
+ {
159
+ id: 'aws-foundational',
160
+ ...SecurityHubManager.Standards.AWS_FOUNDATIONAL_SECURITY,
161
+ enabled: true,
162
+ },
163
+ {
164
+ id: 'cis-1-4',
165
+ ...SecurityHubManager.Standards.CIS_AWS_FOUNDATIONS_1_4,
166
+ enabled: true,
167
+ },
168
+ {
169
+ id: 'pci-dss',
170
+ ...SecurityHubManager.Standards.PCI_DSS,
171
+ enabled: true,
172
+ },
173
+ ],
174
+ })
175
+ }
176
+
177
+ /**
178
+ * Create basic Security Hub
179
+ */
180
+ createBasicHub(): SecurityHubConfig {
181
+ return this.createHub({
182
+ enable: true,
183
+ controlFindingGenerator: 'STANDARD_CONTROL',
184
+ enableDefaultStandards: true,
185
+ standards: [
186
+ {
187
+ id: 'aws-foundational',
188
+ ...SecurityHubManager.Standards.AWS_FOUNDATIONAL_SECURITY,
189
+ enabled: true,
190
+ },
191
+ ],
192
+ })
193
+ }
194
+
195
+ /**
196
+ * Create automation rule for low severity findings
197
+ */
198
+ createLowSeveritySuppressionRule(): AutomationRule {
199
+ return {
200
+ id: `rule-${Date.now()}-${this.ruleCounter++}`,
201
+ ruleName: 'Suppress Low Severity Informational Findings',
202
+ description: 'Automatically suppress informational findings',
203
+ actions: [
204
+ {
205
+ type: 'FINDING_FIELDS_UPDATE',
206
+ findingFieldsUpdate: {
207
+ workflow: {
208
+ status: 'SUPPRESSED',
209
+ },
210
+ note: {
211
+ text: 'Automatically suppressed low severity finding',
212
+ updatedBy: 'SecurityHub Automation',
213
+ },
214
+ },
215
+ },
216
+ ],
217
+ criteria: {
218
+ severityLabel: [
219
+ {
220
+ value: 'INFORMATIONAL',
221
+ comparison: 'EQUALS',
222
+ },
223
+ ],
224
+ recordState: [
225
+ {
226
+ value: 'ACTIVE',
227
+ comparison: 'EQUALS',
228
+ },
229
+ ],
230
+ },
231
+ ruleStatus: 'ENABLED',
232
+ ruleOrder: 1,
233
+ }
234
+ }
235
+
236
+ /**
237
+ * Create automation rule for specific resource types
238
+ */
239
+ createResourceTypeNotificationRule(resourceTypes: string[]): AutomationRule {
240
+ return {
241
+ id: `rule-${Date.now()}-${this.ruleCounter++}`,
242
+ ruleName: 'Notify on Critical Resource Findings',
243
+ description: 'Set findings for critical resources to NOTIFIED status',
244
+ actions: [
245
+ {
246
+ type: 'FINDING_FIELDS_UPDATE',
247
+ findingFieldsUpdate: {
248
+ workflow: {
249
+ status: 'NOTIFIED',
250
+ },
251
+ note: {
252
+ text: 'Critical resource finding requires attention',
253
+ updatedBy: 'SecurityHub Automation',
254
+ },
255
+ },
256
+ },
257
+ ],
258
+ criteria: {
259
+ resourceType: resourceTypes.map(type => ({
260
+ value: type,
261
+ comparison: 'EQUALS' as const,
262
+ })),
263
+ severityLabel: [
264
+ {
265
+ value: 'HIGH',
266
+ comparison: 'EQUALS',
267
+ },
268
+ {
269
+ value: 'CRITICAL',
270
+ comparison: 'EQUALS',
271
+ },
272
+ ],
273
+ workflowStatus: [
274
+ {
275
+ value: 'NEW',
276
+ comparison: 'EQUALS',
277
+ },
278
+ ],
279
+ },
280
+ ruleStatus: 'ENABLED',
281
+ ruleOrder: 2,
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Create automation rule for compliance failures
287
+ */
288
+ createComplianceFailureRule(): AutomationRule {
289
+ return {
290
+ id: `rule-${Date.now()}-${this.ruleCounter++}`,
291
+ ruleName: 'Flag Compliance Failures',
292
+ description: 'Increase severity for compliance failures',
293
+ actions: [
294
+ {
295
+ type: 'FINDING_FIELDS_UPDATE',
296
+ findingFieldsUpdate: {
297
+ severity: {
298
+ label: 'HIGH',
299
+ },
300
+ workflow: {
301
+ status: 'NOTIFIED',
302
+ },
303
+ note: {
304
+ text: 'Compliance failure detected - requires immediate attention',
305
+ updatedBy: 'SecurityHub Automation',
306
+ },
307
+ },
308
+ },
309
+ ],
310
+ criteria: {
311
+ complianceStatus: [
312
+ {
313
+ value: 'FAILED',
314
+ comparison: 'EQUALS',
315
+ },
316
+ ],
317
+ recordState: [
318
+ {
319
+ value: 'ACTIVE',
320
+ comparison: 'EQUALS',
321
+ },
322
+ ],
323
+ },
324
+ ruleStatus: 'ENABLED',
325
+ ruleOrder: 3,
326
+ }
327
+ }
328
+
329
+ /**
330
+ * Create automation rule for false positives
331
+ */
332
+ createFalsePositiveSuppressionRule(productName: string, titlePatterns: string[]): AutomationRule {
333
+ return {
334
+ id: `rule-${Date.now()}-${this.ruleCounter++}`,
335
+ ruleName: `Suppress False Positives - ${productName}`,
336
+ description: `Automatically suppress known false positives from ${productName}`,
337
+ actions: [
338
+ {
339
+ type: 'FINDING_FIELDS_UPDATE',
340
+ findingFieldsUpdate: {
341
+ workflow: {
342
+ status: 'SUPPRESSED',
343
+ },
344
+ note: {
345
+ text: 'Known false positive - automatically suppressed',
346
+ updatedBy: 'SecurityHub Automation',
347
+ },
348
+ },
349
+ },
350
+ ],
351
+ criteria: {
352
+ productName: [
353
+ {
354
+ value: productName,
355
+ comparison: 'EQUALS',
356
+ },
357
+ ],
358
+ title: titlePatterns.map(pattern => ({
359
+ value: pattern,
360
+ comparison: 'PREFIX' as const,
361
+ })),
362
+ },
363
+ ruleStatus: 'ENABLED',
364
+ ruleOrder: 10,
365
+ }
366
+ }
367
+
368
+ /**
369
+ * Get Security Hub
370
+ */
371
+ getHub(id: string): SecurityHubConfig | undefined {
372
+ return this.hubs.get(id)
373
+ }
374
+
375
+ /**
376
+ * List Security Hubs
377
+ */
378
+ listHubs(): SecurityHubConfig[] {
379
+ return Array.from(this.hubs.values())
380
+ }
381
+
382
+ /**
383
+ * Generate CloudFormation for Security Hub
384
+ */
385
+ generateHubCF(hub: SecurityHubConfig): any {
386
+ const cf: any = {
387
+ Type: 'AWS::SecurityHub::Hub',
388
+ Properties: {},
389
+ }
390
+
391
+ if (hub.controlFindingGenerator) {
392
+ cf.Properties.ControlFindingGenerator = hub.controlFindingGenerator
393
+ }
394
+
395
+ if (hub.enableDefaultStandards !== undefined) {
396
+ cf.Properties.EnableDefaultStandards = hub.enableDefaultStandards
397
+ }
398
+
399
+ return cf
400
+ }
401
+
402
+ /**
403
+ * Generate CloudFormation for security standard subscription
404
+ */
405
+ generateStandardCF(standard: SecurityStandard): any {
406
+ const cf: any = {
407
+ Type: 'AWS::SecurityHub::Standard',
408
+ Properties: {
409
+ StandardsArn: standard.arn,
410
+ },
411
+ }
412
+
413
+ if (standard.disabledControls && standard.disabledControls.length > 0) {
414
+ cf.Properties.DisabledStandardsControls = standard.disabledControls.map(controlId => ({
415
+ StandardsControlArn: controlId,
416
+ Reason: 'Disabled by configuration',
417
+ }))
418
+ }
419
+
420
+ return cf
421
+ }
422
+
423
+ /**
424
+ * Generate CloudFormation for automation rule
425
+ */
426
+ generateAutomationRuleCF(rule: AutomationRule): any {
427
+ return {
428
+ Type: 'AWS::SecurityHub::AutomationRule',
429
+ Properties: {
430
+ RuleName: rule.ruleName,
431
+ Description: rule.description,
432
+ Actions: rule.actions.map(action => ({
433
+ Type: action.type,
434
+ FindingFieldsUpdate: action.findingFieldsUpdate,
435
+ })),
436
+ Criteria: rule.criteria,
437
+ RuleStatus: rule.ruleStatus,
438
+ RuleOrder: rule.ruleOrder,
439
+ },
440
+ }
441
+ }
442
+
443
+ /**
444
+ * Clear all data
445
+ */
446
+ clear(): void {
447
+ this.hubs.clear()
448
+ this.hubCounter = 0
449
+ this.ruleCounter = 0
450
+ }
451
+ }
452
+
453
+ /**
454
+ * Global Security Hub manager instance
455
+ */
456
+ export const securityHubManager: SecurityHubManager = new SecurityHubManager()