@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.
- package/LICENSE.md +21 -0
- package/README.md +321 -0
- package/package.json +31 -0
- package/src/advanced-features.test.ts +465 -0
- package/src/aws/cloudformation.ts +421 -0
- package/src/aws/cloudfront.ts +158 -0
- package/src/aws/credentials.test.ts +132 -0
- package/src/aws/credentials.ts +545 -0
- package/src/aws/index.ts +87 -0
- package/src/aws/s3.test.ts +188 -0
- package/src/aws/s3.ts +1088 -0
- package/src/aws/signature.test.ts +670 -0
- package/src/aws/signature.ts +1155 -0
- package/src/backup/disaster-recovery.test.ts +726 -0
- package/src/backup/disaster-recovery.ts +500 -0
- package/src/backup/index.ts +34 -0
- package/src/backup/manager.test.ts +498 -0
- package/src/backup/manager.ts +432 -0
- package/src/cicd/circleci.ts +430 -0
- package/src/cicd/github-actions.ts +424 -0
- package/src/cicd/gitlab-ci.ts +255 -0
- package/src/cicd/index.ts +8 -0
- package/src/cli/history.ts +396 -0
- package/src/cli/index.ts +10 -0
- package/src/cli/progress.ts +458 -0
- package/src/cli/repl.ts +454 -0
- package/src/cli/suggestions.ts +327 -0
- package/src/cli/table.test.ts +319 -0
- package/src/cli/table.ts +332 -0
- package/src/cloudformation/builder.test.ts +327 -0
- package/src/cloudformation/builder.ts +378 -0
- package/src/cloudformation/builders/api-gateway.ts +449 -0
- package/src/cloudformation/builders/cache.ts +334 -0
- package/src/cloudformation/builders/cdn.ts +278 -0
- package/src/cloudformation/builders/compute.ts +485 -0
- package/src/cloudformation/builders/database.ts +392 -0
- package/src/cloudformation/builders/functions.ts +343 -0
- package/src/cloudformation/builders/messaging.ts +140 -0
- package/src/cloudformation/builders/monitoring.ts +300 -0
- package/src/cloudformation/builders/network.ts +264 -0
- package/src/cloudformation/builders/queue.ts +147 -0
- package/src/cloudformation/builders/security.ts +399 -0
- package/src/cloudformation/builders/storage.ts +285 -0
- package/src/cloudformation/index.ts +30 -0
- package/src/cloudformation/types.ts +173 -0
- package/src/compliance/aws-config.ts +543 -0
- package/src/compliance/cloudtrail.ts +376 -0
- package/src/compliance/compliance.test.ts +423 -0
- package/src/compliance/guardduty.ts +446 -0
- package/src/compliance/index.ts +66 -0
- package/src/compliance/security-hub.ts +456 -0
- package/src/containers/build-optimization.ts +416 -0
- package/src/containers/containers.test.ts +508 -0
- package/src/containers/image-scanning.ts +360 -0
- package/src/containers/index.ts +9 -0
- package/src/containers/registry.ts +293 -0
- package/src/containers/service-mesh.ts +520 -0
- package/src/database/database.test.ts +762 -0
- package/src/database/index.ts +9 -0
- package/src/database/migrations.ts +444 -0
- package/src/database/performance.ts +528 -0
- package/src/database/replicas.ts +534 -0
- package/src/database/users.ts +494 -0
- package/src/dependency-graph.ts +143 -0
- package/src/deployment/ab-testing.ts +582 -0
- package/src/deployment/blue-green.ts +452 -0
- package/src/deployment/canary.ts +500 -0
- package/src/deployment/deployment.test.ts +526 -0
- package/src/deployment/index.ts +61 -0
- package/src/deployment/progressive.ts +62 -0
- package/src/dns/dns.test.ts +641 -0
- package/src/dns/dnssec.ts +315 -0
- package/src/dns/index.ts +8 -0
- package/src/dns/resolver.ts +496 -0
- package/src/dns/routing.ts +593 -0
- package/src/email/advanced/analytics.ts +445 -0
- package/src/email/advanced/index.ts +11 -0
- package/src/email/advanced/rules.ts +465 -0
- package/src/email/advanced/scheduling.ts +352 -0
- package/src/email/advanced/search.ts +412 -0
- package/src/email/advanced/shared-mailboxes.ts +404 -0
- package/src/email/advanced/templates.ts +455 -0
- package/src/email/advanced/threading.ts +281 -0
- package/src/email/analytics.ts +467 -0
- package/src/email/bounce-handling.ts +425 -0
- package/src/email/email.test.ts +431 -0
- package/src/email/handlers/__tests__/inbound.test.ts +38 -0
- package/src/email/handlers/__tests__/outbound.test.ts +37 -0
- package/src/email/handlers/converter.ts +227 -0
- package/src/email/handlers/feedback.ts +228 -0
- package/src/email/handlers/inbound.ts +169 -0
- package/src/email/handlers/outbound.ts +178 -0
- package/src/email/index.ts +15 -0
- package/src/email/reputation.ts +303 -0
- package/src/email/templates.ts +352 -0
- package/src/errors/index.test.ts +434 -0
- package/src/errors/index.ts +416 -0
- package/src/health-checks/index.ts +40 -0
- package/src/index.ts +360 -0
- package/src/intrinsic-functions.ts +118 -0
- package/src/lambda/concurrency.ts +330 -0
- package/src/lambda/destinations.ts +345 -0
- package/src/lambda/dlq.ts +425 -0
- package/src/lambda/index.ts +11 -0
- package/src/lambda/lambda.test.ts +840 -0
- package/src/lambda/layers.ts +263 -0
- package/src/lambda/versions.ts +376 -0
- package/src/lambda/vpc.ts +399 -0
- package/src/local/config.ts +114 -0
- package/src/local/index.ts +6 -0
- package/src/local/mock-aws.ts +351 -0
- package/src/modules/ai.ts +340 -0
- package/src/modules/api.ts +478 -0
- package/src/modules/auth.ts +805 -0
- package/src/modules/cache.ts +417 -0
- package/src/modules/cdn.ts +1062 -0
- package/src/modules/communication.ts +1094 -0
- package/src/modules/compute.ts +3348 -0
- package/src/modules/database.ts +554 -0
- package/src/modules/deployment.ts +1079 -0
- package/src/modules/dns.ts +337 -0
- package/src/modules/email.ts +1538 -0
- package/src/modules/filesystem.ts +515 -0
- package/src/modules/index.ts +32 -0
- package/src/modules/messaging.ts +486 -0
- package/src/modules/monitoring.ts +2086 -0
- package/src/modules/network.ts +664 -0
- package/src/modules/parameter-store.ts +325 -0
- package/src/modules/permissions.ts +1081 -0
- package/src/modules/phone.ts +494 -0
- package/src/modules/queue.ts +1260 -0
- package/src/modules/redirects.ts +464 -0
- package/src/modules/registry.ts +699 -0
- package/src/modules/search.ts +401 -0
- package/src/modules/secrets.ts +416 -0
- package/src/modules/security.ts +731 -0
- package/src/modules/sms.ts +389 -0
- package/src/modules/storage.ts +1120 -0
- package/src/modules/workflow.ts +680 -0
- package/src/multi-account/config.ts +521 -0
- package/src/multi-account/index.ts +7 -0
- package/src/multi-account/manager.ts +427 -0
- package/src/multi-region/cross-region.ts +410 -0
- package/src/multi-region/index.ts +8 -0
- package/src/multi-region/manager.ts +483 -0
- package/src/multi-region/regions.ts +435 -0
- package/src/network-security/index.ts +48 -0
- package/src/observability/index.ts +9 -0
- package/src/observability/logs.ts +522 -0
- package/src/observability/metrics.ts +460 -0
- package/src/observability/observability.test.ts +782 -0
- package/src/observability/synthetics.ts +568 -0
- package/src/observability/xray.ts +358 -0
- package/src/phone/advanced/analytics.ts +349 -0
- package/src/phone/advanced/callbacks.ts +428 -0
- package/src/phone/advanced/index.ts +8 -0
- package/src/phone/advanced/ivr-builder.ts +504 -0
- package/src/phone/advanced/recording.ts +310 -0
- package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
- package/src/phone/handlers/incoming-call.ts +117 -0
- package/src/phone/handlers/missed-call.ts +116 -0
- package/src/phone/handlers/voicemail.ts +179 -0
- package/src/phone/index.ts +9 -0
- package/src/presets/api-backend.ts +134 -0
- package/src/presets/data-pipeline.ts +204 -0
- package/src/presets/extend.test.ts +295 -0
- package/src/presets/extend.ts +297 -0
- package/src/presets/fullstack-app.ts +144 -0
- package/src/presets/index.ts +27 -0
- package/src/presets/jamstack.ts +135 -0
- package/src/presets/microservices.ts +167 -0
- package/src/presets/ml-api.ts +208 -0
- package/src/presets/nodejs-server.ts +104 -0
- package/src/presets/nodejs-serverless.ts +114 -0
- package/src/presets/realtime-app.ts +184 -0
- package/src/presets/static-site.ts +64 -0
- package/src/presets/traditional-web-app.ts +339 -0
- package/src/presets/wordpress.ts +138 -0
- package/src/preview/github.test.ts +249 -0
- package/src/preview/github.ts +297 -0
- package/src/preview/index.ts +37 -0
- package/src/preview/manager.test.ts +440 -0
- package/src/preview/manager.ts +326 -0
- package/src/preview/notifications.test.ts +582 -0
- package/src/preview/notifications.ts +341 -0
- package/src/queue/batch-processing.ts +402 -0
- package/src/queue/dlq-monitoring.ts +402 -0
- package/src/queue/fifo.ts +342 -0
- package/src/queue/index.ts +9 -0
- package/src/queue/management.ts +428 -0
- package/src/queue/queue.test.ts +429 -0
- package/src/resource-mgmt/index.ts +39 -0
- package/src/resource-naming.ts +62 -0
- package/src/s3/index.ts +523 -0
- package/src/schema/cloud-config.schema.json +554 -0
- package/src/schema/index.ts +68 -0
- package/src/security/certificate-manager.ts +492 -0
- package/src/security/index.ts +9 -0
- package/src/security/scanning.ts +545 -0
- package/src/security/secrets-manager.ts +476 -0
- package/src/security/secrets-rotation.ts +456 -0
- package/src/security/security.test.ts +738 -0
- package/src/sms/advanced/ab-testing.ts +389 -0
- package/src/sms/advanced/analytics.ts +336 -0
- package/src/sms/advanced/campaigns.ts +523 -0
- package/src/sms/advanced/chatbot.ts +224 -0
- package/src/sms/advanced/index.ts +10 -0
- package/src/sms/advanced/link-tracking.ts +248 -0
- package/src/sms/advanced/mms.ts +308 -0
- package/src/sms/handlers/__tests__/send.test.ts +40 -0
- package/src/sms/handlers/delivery-status.ts +133 -0
- package/src/sms/handlers/receive.ts +162 -0
- package/src/sms/handlers/send.ts +174 -0
- package/src/sms/index.ts +9 -0
- package/src/stack-diff.ts +389 -0
- package/src/static-site/index.ts +85 -0
- package/src/template-builder.ts +110 -0
- package/src/template-validator.ts +574 -0
- package/src/utils/cache.ts +291 -0
- package/src/utils/diff.ts +269 -0
- package/src/utils/hash.ts +227 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/parallel.ts +294 -0
- package/src/validators/credentials.test.ts +274 -0
- package/src/validators/credentials.ts +233 -0
- package/src/validators/quotas.test.ts +434 -0
- package/src/validators/quotas.ts +217 -0
- package/test/ai.test.ts +327 -0
- package/test/api.test.ts +511 -0
- package/test/auth.test.ts +632 -0
- package/test/cache.test.ts +406 -0
- package/test/cdn.test.ts +247 -0
- package/test/compute.test.ts +861 -0
- package/test/database.test.ts +523 -0
- package/test/deployment.test.ts +499 -0
- package/test/dns.test.ts +270 -0
- package/test/email.test.ts +439 -0
- package/test/filesystem.test.ts +382 -0
- package/test/integration.test.ts +350 -0
- package/test/messaging.test.ts +514 -0
- package/test/monitoring.test.ts +634 -0
- package/test/network.test.ts +425 -0
- package/test/permissions.test.ts +488 -0
- package/test/queue.test.ts +484 -0
- package/test/registry.test.ts +306 -0
- package/test/security.test.ts +462 -0
- package/test/storage.test.ts +463 -0
- package/test/template-validator.test.ts +559 -0
- package/test/workflow.test.ts +592 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,545 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Scanning & Vulnerability Assessment
|
|
3
|
+
* Automated security scanning, vulnerability detection, and compliance checking
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface SecurityScan {
|
|
7
|
+
id: string
|
|
8
|
+
name: string
|
|
9
|
+
scanType: ScanType
|
|
10
|
+
target: ScanTarget
|
|
11
|
+
status: 'queued' | 'running' | 'completed' | 'failed'
|
|
12
|
+
startedAt?: Date
|
|
13
|
+
completedAt?: Date
|
|
14
|
+
findings: SecurityFinding[]
|
|
15
|
+
summary?: ScanSummary
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ScanType =
|
|
19
|
+
| 'vulnerability'
|
|
20
|
+
| 'container_image'
|
|
21
|
+
| 'code_quality'
|
|
22
|
+
| 'secrets_detection'
|
|
23
|
+
| 'compliance'
|
|
24
|
+
| 'penetration_test'
|
|
25
|
+
|
|
26
|
+
export interface ScanTarget {
|
|
27
|
+
type: 'ecr_image' | 'ec2_instance' | 'lambda' | 'api' | 'repository'
|
|
28
|
+
identifier: string
|
|
29
|
+
region?: string
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SecurityFinding {
|
|
33
|
+
id: string
|
|
34
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO'
|
|
35
|
+
title: string
|
|
36
|
+
description: string
|
|
37
|
+
cve?: string
|
|
38
|
+
cvss?: number
|
|
39
|
+
affectedResource: string
|
|
40
|
+
remediation?: string
|
|
41
|
+
status: 'OPEN' | 'SUPPRESSED' | 'RESOLVED'
|
|
42
|
+
firstDetected: Date
|
|
43
|
+
lastSeen: Date
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface ScanSummary {
|
|
47
|
+
totalFindings: number
|
|
48
|
+
criticalCount: number
|
|
49
|
+
highCount: number
|
|
50
|
+
mediumCount: number
|
|
51
|
+
lowCount: number
|
|
52
|
+
infoCount: number
|
|
53
|
+
executionTime: number // milliseconds
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface VulnerabilityReport {
|
|
57
|
+
id: string
|
|
58
|
+
scanId: string
|
|
59
|
+
reportType: 'summary' | 'detailed' | 'executive'
|
|
60
|
+
format: 'json' | 'pdf' | 'html'
|
|
61
|
+
generatedAt: Date
|
|
62
|
+
s3Location?: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export interface ComplianceCheck {
|
|
66
|
+
id: string
|
|
67
|
+
framework: ComplianceFramework
|
|
68
|
+
checkId: string
|
|
69
|
+
title: string
|
|
70
|
+
description: string
|
|
71
|
+
status: 'PASS' | 'FAIL' | 'WARNING' | 'NOT_APPLICABLE'
|
|
72
|
+
severity: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW'
|
|
73
|
+
resourceType: string
|
|
74
|
+
resourceId: string
|
|
75
|
+
remediation?: string
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export type ComplianceFramework =
|
|
79
|
+
| 'CIS_AWS_FOUNDATIONS_1_4'
|
|
80
|
+
| 'CIS_AWS_FOUNDATIONS_1_2'
|
|
81
|
+
| 'PCI_DSS_3_2_1'
|
|
82
|
+
| 'HIPAA'
|
|
83
|
+
| 'SOC2'
|
|
84
|
+
| 'NIST_800_53'
|
|
85
|
+
| 'ISO_27001'
|
|
86
|
+
|
|
87
|
+
export interface SecurityPosture {
|
|
88
|
+
id: string
|
|
89
|
+
accountId: string
|
|
90
|
+
region: string
|
|
91
|
+
score: number // 0-100
|
|
92
|
+
grade: 'A' | 'B' | 'C' | 'D' | 'F'
|
|
93
|
+
assessedAt: Date
|
|
94
|
+
strengths: string[]
|
|
95
|
+
weaknesses: string[]
|
|
96
|
+
recommendations: string[]
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Security scanning manager
|
|
101
|
+
*/
|
|
102
|
+
export class SecurityScanningManager {
|
|
103
|
+
private scans: Map<string, SecurityScan> = new Map()
|
|
104
|
+
private findings: Map<string, SecurityFinding> = new Map()
|
|
105
|
+
private reports: Map<string, VulnerabilityReport> = new Map()
|
|
106
|
+
private complianceChecks: Map<string, ComplianceCheck> = new Map()
|
|
107
|
+
private postures: Map<string, SecurityPosture> = new Map()
|
|
108
|
+
private scanCounter = 0
|
|
109
|
+
private findingCounter = 0
|
|
110
|
+
private reportCounter = 0
|
|
111
|
+
private checkCounter = 0
|
|
112
|
+
private postureCounter = 0
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Create security scan
|
|
116
|
+
*/
|
|
117
|
+
createScan(scan: Omit<SecurityScan, 'id' | 'status' | 'findings'>): SecurityScan {
|
|
118
|
+
const id = `scan-${Date.now()}-${this.scanCounter++}`
|
|
119
|
+
|
|
120
|
+
const securityScan: SecurityScan = {
|
|
121
|
+
id,
|
|
122
|
+
status: 'queued',
|
|
123
|
+
findings: [],
|
|
124
|
+
...scan,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this.scans.set(id, securityScan)
|
|
128
|
+
|
|
129
|
+
return securityScan
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Create container image scan
|
|
134
|
+
*/
|
|
135
|
+
createContainerScan(options: {
|
|
136
|
+
name: string
|
|
137
|
+
imageUri: string
|
|
138
|
+
region?: string
|
|
139
|
+
}): SecurityScan {
|
|
140
|
+
return this.createScan({
|
|
141
|
+
name: options.name,
|
|
142
|
+
scanType: 'container_image',
|
|
143
|
+
target: {
|
|
144
|
+
type: 'ecr_image',
|
|
145
|
+
identifier: options.imageUri,
|
|
146
|
+
region: options.region || 'us-east-1',
|
|
147
|
+
},
|
|
148
|
+
})
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Create Lambda function scan
|
|
153
|
+
*/
|
|
154
|
+
createLambdaScan(options: {
|
|
155
|
+
name: string
|
|
156
|
+
functionName: string
|
|
157
|
+
region?: string
|
|
158
|
+
}): SecurityScan {
|
|
159
|
+
return this.createScan({
|
|
160
|
+
name: options.name,
|
|
161
|
+
scanType: 'vulnerability',
|
|
162
|
+
target: {
|
|
163
|
+
type: 'lambda',
|
|
164
|
+
identifier: options.functionName,
|
|
165
|
+
region: options.region || 'us-east-1',
|
|
166
|
+
},
|
|
167
|
+
})
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Create secrets detection scan
|
|
172
|
+
*/
|
|
173
|
+
createSecretsDetectionScan(options: {
|
|
174
|
+
name: string
|
|
175
|
+
repositoryUrl: string
|
|
176
|
+
}): SecurityScan {
|
|
177
|
+
return this.createScan({
|
|
178
|
+
name: options.name,
|
|
179
|
+
scanType: 'secrets_detection',
|
|
180
|
+
target: {
|
|
181
|
+
type: 'repository',
|
|
182
|
+
identifier: options.repositoryUrl,
|
|
183
|
+
},
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Execute scan
|
|
189
|
+
*/
|
|
190
|
+
async executeScan(scanId: string): Promise<SecurityScan> {
|
|
191
|
+
const scan = this.scans.get(scanId)
|
|
192
|
+
|
|
193
|
+
if (!scan) {
|
|
194
|
+
throw new Error(`Scan not found: ${scanId}`)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
console.log(`\nExecuting security scan: ${scan.name}`)
|
|
198
|
+
console.log(`Scan type: ${scan.scanType}`)
|
|
199
|
+
console.log(`Target: ${scan.target.type} - ${scan.target.identifier}`)
|
|
200
|
+
|
|
201
|
+
scan.status = 'running'
|
|
202
|
+
scan.startedAt = new Date()
|
|
203
|
+
|
|
204
|
+
try {
|
|
205
|
+
console.log('\nScanning...')
|
|
206
|
+
|
|
207
|
+
// Simulate scanning and finding vulnerabilities
|
|
208
|
+
const findings = this.simulateFindings(scan)
|
|
209
|
+
scan.findings = findings
|
|
210
|
+
|
|
211
|
+
scan.status = 'completed'
|
|
212
|
+
scan.completedAt = new Date()
|
|
213
|
+
|
|
214
|
+
// Generate summary
|
|
215
|
+
scan.summary = {
|
|
216
|
+
totalFindings: findings.length,
|
|
217
|
+
criticalCount: findings.filter(f => f.severity === 'CRITICAL').length,
|
|
218
|
+
highCount: findings.filter(f => f.severity === 'HIGH').length,
|
|
219
|
+
mediumCount: findings.filter(f => f.severity === 'MEDIUM').length,
|
|
220
|
+
lowCount: findings.filter(f => f.severity === 'LOW').length,
|
|
221
|
+
infoCount: findings.filter(f => f.severity === 'INFO').length,
|
|
222
|
+
executionTime: scan.completedAt.getTime() - scan.startedAt.getTime(),
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
console.log('\n✓ Scan completed')
|
|
226
|
+
console.log(` Findings: ${scan.summary.totalFindings}`)
|
|
227
|
+
console.log(` Critical: ${scan.summary.criticalCount}`)
|
|
228
|
+
console.log(` High: ${scan.summary.highCount}`)
|
|
229
|
+
console.log(` Medium: ${scan.summary.mediumCount}`)
|
|
230
|
+
console.log(` Low: ${scan.summary.lowCount}`)
|
|
231
|
+
|
|
232
|
+
return scan
|
|
233
|
+
} catch (error) {
|
|
234
|
+
scan.status = 'failed'
|
|
235
|
+
scan.completedAt = new Date()
|
|
236
|
+
throw error
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Simulate findings (in production, this would call actual scanning tools)
|
|
242
|
+
*/
|
|
243
|
+
private simulateFindings(scan: SecurityScan): SecurityFinding[] {
|
|
244
|
+
const findings: SecurityFinding[] = []
|
|
245
|
+
const now = new Date()
|
|
246
|
+
|
|
247
|
+
if (scan.scanType === 'container_image') {
|
|
248
|
+
findings.push(
|
|
249
|
+
this.createFinding({
|
|
250
|
+
severity: 'HIGH',
|
|
251
|
+
title: 'Vulnerable OpenSSL version detected',
|
|
252
|
+
description: 'OpenSSL 1.1.1k contains known vulnerabilities',
|
|
253
|
+
cve: 'CVE-2021-3711',
|
|
254
|
+
cvss: 7.5,
|
|
255
|
+
affectedResource: scan.target.identifier,
|
|
256
|
+
remediation: 'Update OpenSSL to version 1.1.1l or later',
|
|
257
|
+
status: 'OPEN',
|
|
258
|
+
firstDetected: now,
|
|
259
|
+
lastSeen: now,
|
|
260
|
+
})
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
findings.push(
|
|
264
|
+
this.createFinding({
|
|
265
|
+
severity: 'MEDIUM',
|
|
266
|
+
title: 'Outdated npm package: lodash',
|
|
267
|
+
description: 'lodash 4.17.19 has known security issues',
|
|
268
|
+
cve: 'CVE-2020-8203',
|
|
269
|
+
cvss: 5.3,
|
|
270
|
+
affectedResource: scan.target.identifier,
|
|
271
|
+
remediation: 'Update lodash to version 4.17.21 or later',
|
|
272
|
+
status: 'OPEN',
|
|
273
|
+
firstDetected: now,
|
|
274
|
+
lastSeen: now,
|
|
275
|
+
})
|
|
276
|
+
)
|
|
277
|
+
} else if (scan.scanType === 'secrets_detection') {
|
|
278
|
+
findings.push(
|
|
279
|
+
this.createFinding({
|
|
280
|
+
severity: 'CRITICAL',
|
|
281
|
+
title: 'AWS Access Key exposed in code',
|
|
282
|
+
description: 'Hardcoded AWS access key found in source code',
|
|
283
|
+
affectedResource: `${scan.target.identifier}/src/config.ts:12`,
|
|
284
|
+
remediation: 'Remove hardcoded credentials and use AWS Secrets Manager',
|
|
285
|
+
status: 'OPEN',
|
|
286
|
+
firstDetected: now,
|
|
287
|
+
lastSeen: now,
|
|
288
|
+
})
|
|
289
|
+
)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return findings
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Create finding
|
|
297
|
+
*/
|
|
298
|
+
createFinding(finding: Omit<SecurityFinding, 'id'>): SecurityFinding {
|
|
299
|
+
const id = `finding-${Date.now()}-${this.findingCounter++}`
|
|
300
|
+
|
|
301
|
+
const securityFinding: SecurityFinding = {
|
|
302
|
+
id,
|
|
303
|
+
...finding,
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
this.findings.set(id, securityFinding)
|
|
307
|
+
|
|
308
|
+
return securityFinding
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Suppress finding
|
|
313
|
+
*/
|
|
314
|
+
suppressFinding(findingId: string, reason?: string): void {
|
|
315
|
+
const finding = this.findings.get(findingId)
|
|
316
|
+
if (finding) {
|
|
317
|
+
finding.status = 'SUPPRESSED'
|
|
318
|
+
console.log(`Finding suppressed: ${finding.title}`)
|
|
319
|
+
if (reason) {
|
|
320
|
+
console.log(`Reason: ${reason}`)
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Resolve finding
|
|
327
|
+
*/
|
|
328
|
+
resolveFinding(findingId: string): void {
|
|
329
|
+
const finding = this.findings.get(findingId)
|
|
330
|
+
if (finding) {
|
|
331
|
+
finding.status = 'RESOLVED'
|
|
332
|
+
console.log(`Finding resolved: ${finding.title}`)
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Generate vulnerability report
|
|
338
|
+
*/
|
|
339
|
+
generateReport(options: {
|
|
340
|
+
scanId: string
|
|
341
|
+
reportType: 'summary' | 'detailed' | 'executive'
|
|
342
|
+
format: 'json' | 'pdf' | 'html'
|
|
343
|
+
}): VulnerabilityReport {
|
|
344
|
+
const id = `report-${Date.now()}-${this.reportCounter++}`
|
|
345
|
+
|
|
346
|
+
const report: VulnerabilityReport = {
|
|
347
|
+
id,
|
|
348
|
+
scanId: options.scanId,
|
|
349
|
+
reportType: options.reportType,
|
|
350
|
+
format: options.format,
|
|
351
|
+
generatedAt: new Date(),
|
|
352
|
+
s3Location: `s3://security-reports/${id}.${options.format}`,
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
this.reports.set(id, report)
|
|
356
|
+
|
|
357
|
+
return report
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Run compliance check
|
|
362
|
+
*/
|
|
363
|
+
runComplianceCheck(options: {
|
|
364
|
+
framework: ComplianceFramework
|
|
365
|
+
resourceType: string
|
|
366
|
+
resourceId: string
|
|
367
|
+
}): ComplianceCheck[] {
|
|
368
|
+
const checks: ComplianceCheck[] = []
|
|
369
|
+
|
|
370
|
+
// Simulate compliance checks based on framework
|
|
371
|
+
if (options.framework.includes('CIS')) {
|
|
372
|
+
checks.push(
|
|
373
|
+
this.createComplianceCheck({
|
|
374
|
+
framework: options.framework,
|
|
375
|
+
checkId: '1.1',
|
|
376
|
+
title: 'Avoid the use of root account',
|
|
377
|
+
description: 'Root account should not be used for everyday tasks',
|
|
378
|
+
status: 'PASS',
|
|
379
|
+
severity: 'CRITICAL',
|
|
380
|
+
resourceType: options.resourceType,
|
|
381
|
+
resourceId: options.resourceId,
|
|
382
|
+
})
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
checks.push(
|
|
386
|
+
this.createComplianceCheck({
|
|
387
|
+
framework: options.framework,
|
|
388
|
+
checkId: '2.1',
|
|
389
|
+
title: 'Ensure CloudTrail is enabled',
|
|
390
|
+
description: 'CloudTrail should be enabled in all regions',
|
|
391
|
+
status: 'FAIL',
|
|
392
|
+
severity: 'HIGH',
|
|
393
|
+
resourceType: options.resourceType,
|
|
394
|
+
resourceId: options.resourceId,
|
|
395
|
+
remediation: 'Enable CloudTrail in all regions',
|
|
396
|
+
})
|
|
397
|
+
)
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return checks
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Create compliance check
|
|
405
|
+
*/
|
|
406
|
+
createComplianceCheck(check: Omit<ComplianceCheck, 'id'>): ComplianceCheck {
|
|
407
|
+
const id = `check-${Date.now()}-${this.checkCounter++}`
|
|
408
|
+
|
|
409
|
+
const complianceCheck: ComplianceCheck = {
|
|
410
|
+
id,
|
|
411
|
+
...check,
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
this.complianceChecks.set(id, complianceCheck)
|
|
415
|
+
|
|
416
|
+
return complianceCheck
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Assess security posture
|
|
421
|
+
*/
|
|
422
|
+
assessSecurityPosture(options: {
|
|
423
|
+
accountId: string
|
|
424
|
+
region: string
|
|
425
|
+
}): SecurityPosture {
|
|
426
|
+
const id = `posture-${Date.now()}-${this.postureCounter++}`
|
|
427
|
+
|
|
428
|
+
// Calculate score based on compliance checks and findings
|
|
429
|
+
const allChecks = Array.from(this.complianceChecks.values())
|
|
430
|
+
const passedChecks = allChecks.filter(c => c.status === 'PASS').length
|
|
431
|
+
const totalChecks = allChecks.length
|
|
432
|
+
|
|
433
|
+
const score = totalChecks > 0 ? Math.round((passedChecks / totalChecks) * 100) : 0
|
|
434
|
+
|
|
435
|
+
let grade: 'A' | 'B' | 'C' | 'D' | 'F'
|
|
436
|
+
if (score >= 90) grade = 'A'
|
|
437
|
+
else if (score >= 80) grade = 'B'
|
|
438
|
+
else if (score >= 70) grade = 'C'
|
|
439
|
+
else if (score >= 60) grade = 'D'
|
|
440
|
+
else grade = 'F'
|
|
441
|
+
|
|
442
|
+
const posture: SecurityPosture = {
|
|
443
|
+
id,
|
|
444
|
+
accountId: options.accountId,
|
|
445
|
+
region: options.region,
|
|
446
|
+
score,
|
|
447
|
+
grade,
|
|
448
|
+
assessedAt: new Date(),
|
|
449
|
+
strengths: [
|
|
450
|
+
'IAM password policy enforced',
|
|
451
|
+
'Multi-factor authentication enabled',
|
|
452
|
+
'CloudTrail logging enabled',
|
|
453
|
+
],
|
|
454
|
+
weaknesses: [
|
|
455
|
+
'Some S3 buckets are publicly accessible',
|
|
456
|
+
'Security groups allow unrestricted ingress',
|
|
457
|
+
'Outdated dependencies in Lambda functions',
|
|
458
|
+
],
|
|
459
|
+
recommendations: [
|
|
460
|
+
'Review and update S3 bucket policies',
|
|
461
|
+
'Implement least-privilege security group rules',
|
|
462
|
+
'Update Lambda runtime versions and dependencies',
|
|
463
|
+
'Enable GuardDuty for threat detection',
|
|
464
|
+
],
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
this.postures.set(id, posture)
|
|
468
|
+
|
|
469
|
+
return posture
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Get scan
|
|
474
|
+
*/
|
|
475
|
+
getScan(id: string): SecurityScan | undefined {
|
|
476
|
+
return this.scans.get(id)
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* List scans
|
|
481
|
+
*/
|
|
482
|
+
listScans(): SecurityScan[] {
|
|
483
|
+
return Array.from(this.scans.values())
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Get open findings by severity
|
|
488
|
+
*/
|
|
489
|
+
getOpenFindings(severity?: 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO'): SecurityFinding[] {
|
|
490
|
+
return Array.from(this.findings.values()).filter(
|
|
491
|
+
f => f.status === 'OPEN' && (!severity || f.severity === severity)
|
|
492
|
+
)
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Get compliance checks by status
|
|
497
|
+
*/
|
|
498
|
+
getComplianceChecksByStatus(status: 'PASS' | 'FAIL' | 'WARNING' | 'NOT_APPLICABLE'): ComplianceCheck[] {
|
|
499
|
+
return Array.from(this.complianceChecks.values()).filter(c => c.status === status)
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/**
|
|
503
|
+
* List postures
|
|
504
|
+
*/
|
|
505
|
+
listPostures(): SecurityPosture[] {
|
|
506
|
+
return Array.from(this.postures.values())
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/**
|
|
510
|
+
* Generate CloudFormation for ECR image scanning
|
|
511
|
+
*/
|
|
512
|
+
generateECRScanCF(repositoryName: string): any {
|
|
513
|
+
return {
|
|
514
|
+
Type: 'AWS::ECR::Repository',
|
|
515
|
+
Properties: {
|
|
516
|
+
RepositoryName: repositoryName,
|
|
517
|
+
ImageScanningConfiguration: {
|
|
518
|
+
ScanOnPush: true,
|
|
519
|
+
},
|
|
520
|
+
ImageTagMutability: 'IMMUTABLE',
|
|
521
|
+
},
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Clear all data
|
|
527
|
+
*/
|
|
528
|
+
clear(): void {
|
|
529
|
+
this.scans.clear()
|
|
530
|
+
this.findings.clear()
|
|
531
|
+
this.reports.clear()
|
|
532
|
+
this.complianceChecks.clear()
|
|
533
|
+
this.postures.clear()
|
|
534
|
+
this.scanCounter = 0
|
|
535
|
+
this.findingCounter = 0
|
|
536
|
+
this.reportCounter = 0
|
|
537
|
+
this.checkCounter = 0
|
|
538
|
+
this.postureCounter = 0
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
/**
|
|
543
|
+
* Global security scanning manager instance
|
|
544
|
+
*/
|
|
545
|
+
export const securityScanningManager: SecurityScanningManager = new SecurityScanningManager()
|