@factiii/stack 0.1.6 → 0.1.8

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 (60) hide show
  1. package/dist/plugins/addons/server-mode/scanfix/mac.d.ts.map +1 -1
  2. package/dist/plugins/addons/server-mode/scanfix/mac.js +13 -1
  3. package/dist/plugins/addons/server-mode/scanfix/mac.js.map +1 -1
  4. package/dist/plugins/pipelines/aws/configs/free-tier.d.ts.map +1 -1
  5. package/dist/plugins/pipelines/aws/configs/free-tier.js +3 -38
  6. package/dist/plugins/pipelines/aws/configs/free-tier.js.map +1 -1
  7. package/dist/plugins/pipelines/aws/index.d.ts +4 -1
  8. package/dist/plugins/pipelines/aws/index.d.ts.map +1 -1
  9. package/dist/plugins/pipelines/aws/index.js +101 -29
  10. package/dist/plugins/pipelines/aws/index.js.map +1 -1
  11. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts +9 -0
  12. package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -0
  13. package/dist/plugins/pipelines/aws/scanfix/credentials.js +196 -0
  14. package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -0
  15. package/dist/plugins/pipelines/aws/scanfix/db-replication.d.ts +13 -0
  16. package/dist/plugins/pipelines/aws/scanfix/db-replication.d.ts.map +1 -0
  17. package/dist/plugins/pipelines/aws/scanfix/db-replication.js +136 -0
  18. package/dist/plugins/pipelines/aws/scanfix/db-replication.js.map +1 -0
  19. package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts +10 -0
  20. package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts.map +1 -0
  21. package/dist/plugins/pipelines/aws/scanfix/ec2.js +279 -0
  22. package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -0
  23. package/dist/plugins/pipelines/aws/scanfix/ecr.d.ts +9 -0
  24. package/dist/plugins/pipelines/aws/scanfix/ecr.d.ts.map +1 -0
  25. package/dist/plugins/pipelines/aws/scanfix/ecr.js +100 -0
  26. package/dist/plugins/pipelines/aws/scanfix/ecr.js.map +1 -0
  27. package/dist/plugins/pipelines/aws/scanfix/iam.d.ts +10 -0
  28. package/dist/plugins/pipelines/aws/scanfix/iam.d.ts.map +1 -0
  29. package/dist/plugins/pipelines/aws/scanfix/iam.js +255 -0
  30. package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -0
  31. package/dist/plugins/pipelines/aws/scanfix/rds.d.ts +10 -0
  32. package/dist/plugins/pipelines/aws/scanfix/rds.d.ts.map +1 -0
  33. package/dist/plugins/pipelines/aws/scanfix/rds.js +261 -0
  34. package/dist/plugins/pipelines/aws/scanfix/rds.js.map +1 -0
  35. package/dist/plugins/pipelines/aws/scanfix/s3.d.ts +9 -0
  36. package/dist/plugins/pipelines/aws/scanfix/s3.d.ts.map +1 -0
  37. package/dist/plugins/pipelines/aws/scanfix/s3.js +134 -0
  38. package/dist/plugins/pipelines/aws/scanfix/s3.js.map +1 -0
  39. package/dist/plugins/pipelines/aws/scanfix/security-groups.d.ts +10 -0
  40. package/dist/plugins/pipelines/aws/scanfix/security-groups.d.ts.map +1 -0
  41. package/dist/plugins/pipelines/aws/scanfix/security-groups.js +225 -0
  42. package/dist/plugins/pipelines/aws/scanfix/security-groups.js.map +1 -0
  43. package/dist/plugins/pipelines/aws/scanfix/ses.d.ts +9 -0
  44. package/dist/plugins/pipelines/aws/scanfix/ses.d.ts.map +1 -0
  45. package/dist/plugins/pipelines/aws/scanfix/ses.js +174 -0
  46. package/dist/plugins/pipelines/aws/scanfix/ses.js.map +1 -0
  47. package/dist/plugins/pipelines/aws/scanfix/vpc.d.ts +9 -0
  48. package/dist/plugins/pipelines/aws/scanfix/vpc.d.ts.map +1 -0
  49. package/dist/plugins/pipelines/aws/scanfix/vpc.js +237 -0
  50. package/dist/plugins/pipelines/aws/scanfix/vpc.js.map +1 -0
  51. package/dist/plugins/pipelines/aws/utils/aws-helpers.d.ts +50 -0
  52. package/dist/plugins/pipelines/aws/utils/aws-helpers.d.ts.map +1 -0
  53. package/dist/plugins/pipelines/aws/utils/aws-helpers.js +137 -0
  54. package/dist/plugins/pipelines/aws/utils/aws-helpers.js.map +1 -0
  55. package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
  56. package/dist/plugins/pipelines/factiii/index.js +11 -0
  57. package/dist/plugins/pipelines/factiii/index.js.map +1 -1
  58. package/dist/types/config.d.ts +11 -0
  59. package/dist/types/config.d.ts.map +1 -1
  60. package/package.json +1 -1
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ /**
3
+ * AWS RDS Fixes
4
+ *
5
+ * Provisions RDS PostgreSQL 15 instance (db.t2.micro free tier).
6
+ * Creates DB subnet group from private subnets, launches instance with RDS SG.
7
+ * Stores DATABASE_URL in Ansible Vault.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.rdsFixes = void 0;
11
+ const aws_helpers_js_1 = require("../utils/aws-helpers.js");
12
+ /**
13
+ * Find VPC by factiii:project tag
14
+ */
15
+ function findVpc(projectName, region) {
16
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws ec2 describe-vpcs --filters "Name=tag:factiii:project,Values=' + projectName + '" --query "Vpcs[0].VpcId" --output text', region);
17
+ if (!result || result === 'None' || result === 'null')
18
+ return null;
19
+ return result.replace(/"/g, '');
20
+ }
21
+ /**
22
+ * Find all private subnets
23
+ */
24
+ function findPrivateSubnets(projectName, region) {
25
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws ec2 describe-subnets --filters "Name=tag:factiii:project,Values=' + projectName + '" "Name=tag:factiii:subnet-type,Values=private" --query "Subnets[*].SubnetId" --output text', region);
26
+ if (!result || result === 'None' || result === 'null')
27
+ return [];
28
+ return result.split(/\s+/).filter(Boolean);
29
+ }
30
+ /**
31
+ * Find security group by name and VPC
32
+ */
33
+ function findSecurityGroup(groupName, vpcId, region) {
34
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws ec2 describe-security-groups --filters "Name=group-name,Values=' + groupName + '" "Name=vpc-id,Values=' + vpcId + '" --query "SecurityGroups[0].GroupId" --output text', region);
35
+ if (!result || result === 'None' || result === 'null')
36
+ return null;
37
+ return result.replace(/"/g, '');
38
+ }
39
+ /**
40
+ * Check if DB subnet group exists
41
+ */
42
+ function findDbSubnetGroup(groupName, region) {
43
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws rds describe-db-subnet-groups --db-subnet-group-name ' + groupName + ' --query "DBSubnetGroups[0].DBSubnetGroupName" --output text', region);
44
+ return !!result && result !== 'None' && result !== 'null';
45
+ }
46
+ /**
47
+ * Find RDS instance by identifier
48
+ */
49
+ function findRdsInstance(dbInstanceId, region) {
50
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws rds describe-db-instances --db-instance-identifier ' + dbInstanceId, region);
51
+ if (!result)
52
+ return null;
53
+ try {
54
+ const parsed = JSON.parse(result);
55
+ const instance = parsed.DBInstances?.[0];
56
+ if (!instance)
57
+ return null;
58
+ return {
59
+ status: instance.DBInstanceStatus,
60
+ endpoint: instance.Endpoint?.Address ?? null,
61
+ };
62
+ }
63
+ catch {
64
+ return null;
65
+ }
66
+ }
67
+ /**
68
+ * Check if AWS is configured for this project
69
+ */
70
+ function isAwsConfigured(config) {
71
+ if (config.aws)
72
+ return true;
73
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
74
+ const { extractEnvironments } = require('../../../../utils/config-helpers.js');
75
+ const environments = extractEnvironments(config);
76
+ return Object.values(environments).some((e) => e.pipeline === 'aws');
77
+ }
78
+ /**
79
+ * Generate a random password for RDS
80
+ */
81
+ function generateRdsPassword() {
82
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
83
+ let password = '';
84
+ const crypto = require('crypto');
85
+ const bytes = crypto.randomBytes(24);
86
+ for (let i = 0; i < 24; i++) {
87
+ password += chars[(bytes[i] ?? 0) % chars.length];
88
+ }
89
+ return password;
90
+ }
91
+ exports.rdsFixes = [
92
+ {
93
+ id: 'aws-rds-subnet-group-missing',
94
+ stage: 'prod',
95
+ severity: 'critical',
96
+ description: 'RDS DB subnet group not created (needs 2 AZs)',
97
+ scan: async (config) => {
98
+ if (!isAwsConfigured(config))
99
+ return false;
100
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
101
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
102
+ const privateSubnets = findPrivateSubnets(projectName, region);
103
+ if (privateSubnets.length < 2)
104
+ return false; // Private subnets must exist first
105
+ return !findDbSubnetGroup('factiii-' + projectName, region);
106
+ },
107
+ fix: async (config) => {
108
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
109
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
110
+ const privateSubnets = findPrivateSubnets(projectName, region);
111
+ if (privateSubnets.length < 2) {
112
+ console.log(' Need at least 2 private subnets first');
113
+ return false;
114
+ }
115
+ try {
116
+ const groupName = 'factiii-' + projectName;
117
+ (0, aws_helpers_js_1.awsExec)('aws rds create-db-subnet-group' +
118
+ ' --db-subnet-group-name ' + groupName +
119
+ ' --db-subnet-group-description "Factiii DB subnet group for ' + projectName + '"' +
120
+ ' --subnet-ids ' + privateSubnets.join(' '), region);
121
+ console.log(' Created DB subnet group: ' + groupName);
122
+ console.log(' Using subnets: ' + privateSubnets.join(', '));
123
+ return true;
124
+ }
125
+ catch (e) {
126
+ console.log(' Failed to create DB subnet group: ' + (e instanceof Error ? e.message : String(e)));
127
+ return false;
128
+ }
129
+ },
130
+ manualFix: 'Create DB subnet group with 2+ private subnets in different AZs',
131
+ },
132
+ {
133
+ id: 'aws-rds-instance-missing',
134
+ stage: 'prod',
135
+ severity: 'critical',
136
+ description: 'RDS PostgreSQL 15 instance not created (db.t2.micro)',
137
+ scan: async (config) => {
138
+ if (!isAwsConfigured(config))
139
+ return false;
140
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
141
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
142
+ const dbId = 'factiii-' + projectName + '-db';
143
+ return !findRdsInstance(dbId, region);
144
+ },
145
+ fix: async (config) => {
146
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
147
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
148
+ const vpcId = findVpc(projectName, region);
149
+ if (!vpcId) {
150
+ console.log(' VPC must be created first');
151
+ return false;
152
+ }
153
+ const subnetGroupName = 'factiii-' + projectName;
154
+ if (!findDbSubnetGroup(subnetGroupName, region)) {
155
+ console.log(' DB subnet group must be created first');
156
+ return false;
157
+ }
158
+ const rdsSgId = findSecurityGroup('factiii-' + projectName + '-rds', vpcId, region);
159
+ if (!rdsSgId) {
160
+ console.log(' RDS security group must be created first');
161
+ return false;
162
+ }
163
+ try {
164
+ const dbId = 'factiii-' + projectName + '-db';
165
+ const dbName = projectName.replace(/[^a-zA-Z0-9]/g, '');
166
+ const masterUser = 'factiii';
167
+ const masterPassword = generateRdsPassword();
168
+ (0, aws_helpers_js_1.awsExec)('aws rds create-db-instance' +
169
+ ' --db-instance-identifier ' + dbId +
170
+ ' --db-instance-class db.t2.micro' +
171
+ ' --engine postgres' +
172
+ ' --engine-version 15' +
173
+ ' --allocated-storage 20' +
174
+ ' --master-username ' + masterUser +
175
+ ' --master-user-password ' + masterPassword +
176
+ ' --db-name ' + dbName +
177
+ ' --db-subnet-group-name ' + subnetGroupName +
178
+ ' --vpc-security-group-ids ' + rdsSgId +
179
+ ' --no-publicly-accessible' +
180
+ ' --storage-type gp2' +
181
+ ' --backup-retention-period 7', region);
182
+ console.log(' Creating RDS instance: ' + dbId);
183
+ console.log(' Engine: PostgreSQL 15');
184
+ console.log(' Instance class: db.t2.micro (free tier eligible)');
185
+ console.log(' Storage: 20 GB gp2');
186
+ console.log(' Database name: ' + dbName);
187
+ console.log(' Master user: ' + masterUser);
188
+ console.log('');
189
+ console.log(' IMPORTANT: Save these credentials!');
190
+ console.log(' Master password: ' + masterPassword);
191
+ console.log(' DATABASE_URL: postgresql://' + masterUser + ':' + masterPassword + '@<endpoint>:5432/' + dbName);
192
+ console.log('');
193
+ console.log(' RDS instance takes ~5-10 minutes to become available.');
194
+ console.log(' Run "npx factiii scan --prod" to check status.');
195
+ console.log('');
196
+ console.log(' TIP: Store credentials in Ansible Vault: npx factiii secrets edit');
197
+ return true;
198
+ }
199
+ catch (e) {
200
+ console.log(' Failed to create RDS instance: ' + (e instanceof Error ? e.message : String(e)));
201
+ return false;
202
+ }
203
+ },
204
+ manualFix: 'Create RDS instance: aws rds create-db-instance --db-instance-class db.t2.micro --engine postgres --engine-version 15',
205
+ },
206
+ {
207
+ id: 'aws-rds-not-available',
208
+ stage: 'prod',
209
+ severity: 'warning',
210
+ description: 'RDS instance is not yet available (takes ~5-10 min)',
211
+ scan: async (config) => {
212
+ if (!isAwsConfigured(config))
213
+ return false;
214
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
215
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
216
+ const dbId = 'factiii-' + projectName + '-db';
217
+ const instance = findRdsInstance(dbId, region);
218
+ if (!instance)
219
+ return false; // No instance yet
220
+ return instance.status !== 'available';
221
+ },
222
+ fix: null,
223
+ manualFix: 'RDS instance is provisioning. Wait ~5-10 minutes and run scan again.\nCheck status: aws rds describe-db-instances --db-instance-identifier factiii-{name}-db --query "DBInstances[0].DBInstanceStatus"',
224
+ },
225
+ {
226
+ id: 'aws-rds-connection-test',
227
+ stage: 'prod',
228
+ severity: 'info',
229
+ description: 'Cannot verify RDS connectivity from EC2 (pg_isready not found)',
230
+ scan: async (config) => {
231
+ if (!isAwsConfigured(config))
232
+ return false;
233
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
234
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
235
+ const dbId = 'factiii-' + projectName + '-db';
236
+ const instance = findRdsInstance(dbId, region);
237
+ if (!instance || instance.status !== 'available' || !instance.endpoint)
238
+ return false;
239
+ // Check if pg_isready is available on EC2 via SSH
240
+ // This scan runs on the dev machine, so we check via SSH
241
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
242
+ const { extractEnvironments } = require('../../../../utils/config-helpers.js');
243
+ const environments = extractEnvironments(config);
244
+ const prodEnv = environments.prod ?? environments.production;
245
+ if (!prodEnv?.domain)
246
+ return false;
247
+ try {
248
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
249
+ const { sshExec } = require('../../../../utils/ssh-helper.js');
250
+ const result = await sshExec(prodEnv, 'which pg_isready 2>/dev/null && pg_isready -h ' + instance.endpoint + ' -p 5432 2>&1 || echo "pg_isready not found"');
251
+ return result.includes('pg_isready not found') || result.includes('no response');
252
+ }
253
+ catch {
254
+ return false; // Can't SSH — skip this check
255
+ }
256
+ },
257
+ fix: null,
258
+ manualFix: 'Install PostgreSQL client on EC2: sudo apt-get install -y postgresql-client-15\nTest connection: pg_isready -h <rds-endpoint> -p 5432',
259
+ },
260
+ ];
261
+ //# sourceMappingURL=rds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rds.js","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/rds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * AWS S3 Fixes
3
+ *
4
+ * Provisions S3 bucket with encryption and blocked public access.
5
+ * Configures CORS for the production domain.
6
+ */
7
+ import type { Fix } from '../../../../types/index.js';
8
+ export declare const s3Fixes: Fix[];
9
+ //# sourceMappingURL=s3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/s3.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAiB,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAuCrE,eAAO,MAAM,OAAO,EAAE,GAAG,EAiHxB,CAAC"}
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ /**
3
+ * AWS S3 Fixes
4
+ *
5
+ * Provisions S3 bucket with encryption and blocked public access.
6
+ * Configures CORS for the production domain.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.s3Fixes = void 0;
10
+ const aws_helpers_js_1 = require("../utils/aws-helpers.js");
11
+ /**
12
+ * Check if S3 bucket exists
13
+ */
14
+ function findBucket(bucketName, region) {
15
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws s3api head-bucket --bucket ' + bucketName, region);
16
+ // head-bucket returns empty on success, throws on failure
17
+ return result !== null;
18
+ }
19
+ /**
20
+ * Check if CORS is configured on bucket
21
+ */
22
+ function hasCors(bucketName, region) {
23
+ const result = (0, aws_helpers_js_1.awsExecSafe)('aws s3api get-bucket-cors --bucket ' + bucketName, region);
24
+ return !!result && result !== 'null';
25
+ }
26
+ /**
27
+ * Check if AWS is configured for this project
28
+ */
29
+ function isAwsConfigured(config) {
30
+ if (config.aws)
31
+ return true;
32
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
33
+ const { extractEnvironments } = require('../../../../utils/config-helpers.js');
34
+ const environments = extractEnvironments(config);
35
+ return Object.values(environments).some((e) => e.pipeline === 'aws');
36
+ }
37
+ exports.s3Fixes = [
38
+ {
39
+ id: 'aws-s3-bucket-missing',
40
+ stage: 'prod',
41
+ severity: 'warning',
42
+ description: 'S3 bucket not created for file storage',
43
+ scan: async (config) => {
44
+ if (!isAwsConfigured(config))
45
+ return false;
46
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
47
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
48
+ const bucketName = 'factiii-' + projectName;
49
+ return !findBucket(bucketName, region);
50
+ },
51
+ fix: async (config) => {
52
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
53
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
54
+ const bucketName = 'factiii-' + projectName;
55
+ try {
56
+ // Create bucket (us-east-1 doesn't need LocationConstraint)
57
+ if (region === 'us-east-1') {
58
+ (0, aws_helpers_js_1.awsExec)('aws s3api create-bucket --bucket ' + bucketName, region);
59
+ }
60
+ else {
61
+ (0, aws_helpers_js_1.awsExec)('aws s3api create-bucket --bucket ' + bucketName +
62
+ ' --create-bucket-configuration LocationConstraint=' + region, region);
63
+ }
64
+ console.log(' Created S3 bucket: ' + bucketName);
65
+ // Block all public access
66
+ (0, aws_helpers_js_1.awsExec)('aws s3api put-public-access-block --bucket ' + bucketName +
67
+ ' --public-access-block-configuration BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true', region);
68
+ console.log(' Blocked all public access');
69
+ // Enable server-side encryption (AES-256)
70
+ (0, aws_helpers_js_1.awsExec)('aws s3api put-bucket-encryption --bucket ' + bucketName +
71
+ ' --server-side-encryption-configuration ' +
72
+ '"{\\\"Rules\\\":[{\\\"ApplyServerSideEncryptionByDefault\\\":{\\\"SSEAlgorithm\\\":\\\"AES256\\\"}}]}"', region);
73
+ console.log(' Enabled AES-256 encryption');
74
+ return true;
75
+ }
76
+ catch (e) {
77
+ console.log(' Failed to create S3 bucket: ' + (e instanceof Error ? e.message : String(e)));
78
+ return false;
79
+ }
80
+ },
81
+ manualFix: 'Create S3 bucket with encryption and blocked public access',
82
+ },
83
+ {
84
+ id: 'aws-s3-cors-missing',
85
+ stage: 'prod',
86
+ severity: 'info',
87
+ description: 'S3 bucket CORS not configured for production domain',
88
+ scan: async (config) => {
89
+ if (!isAwsConfigured(config))
90
+ return false;
91
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
92
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
93
+ const bucketName = 'factiii-' + projectName;
94
+ if (!findBucket(bucketName, region))
95
+ return false;
96
+ return !hasCors(bucketName, region);
97
+ },
98
+ fix: async (config) => {
99
+ const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
100
+ const projectName = (0, aws_helpers_js_1.getProjectName)(config);
101
+ const bucketName = 'factiii-' + projectName;
102
+ // Get production domain for CORS
103
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
104
+ const { extractEnvironments } = require('../../../../utils/config-helpers.js');
105
+ const environments = extractEnvironments(config);
106
+ const prodEnv = environments.prod ?? environments.production;
107
+ const domain = prodEnv?.domain;
108
+ if (!domain || domain.startsWith('EXAMPLE-')) {
109
+ console.log(' Set production domain in factiii.yml first');
110
+ return false;
111
+ }
112
+ try {
113
+ const corsConfig = JSON.stringify({
114
+ CORSRules: [{
115
+ AllowedHeaders: ['*'],
116
+ AllowedMethods: ['GET', 'PUT', 'POST', 'DELETE'],
117
+ AllowedOrigins: ['https://' + domain],
118
+ MaxAgeSeconds: 3600,
119
+ }],
120
+ });
121
+ (0, aws_helpers_js_1.awsExec)('aws s3api put-bucket-cors --bucket ' + bucketName +
122
+ " --cors-configuration '" + corsConfig + "'", region);
123
+ console.log(' Configured CORS for https://' + domain);
124
+ return true;
125
+ }
126
+ catch (e) {
127
+ console.log(' Failed to configure CORS: ' + (e instanceof Error ? e.message : String(e)));
128
+ return false;
129
+ }
130
+ },
131
+ manualFix: 'Configure S3 CORS to allow requests from your production domain',
132
+ },
133
+ ];
134
+ //# sourceMappingURL=s3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/s3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * AWS Security Group Fixes
3
+ *
4
+ * Provisions security groups for EC2 and RDS.
5
+ * EC2 SG: SSH(22), HTTP(80), HTTPS(443)
6
+ * RDS SG: PostgreSQL(5432) from EC2 SG only
7
+ */
8
+ import type { Fix } from '../../../../types/index.js';
9
+ export declare const securityGroupFixes: Fix[];
10
+ //# sourceMappingURL=security-groups.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-groups.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/security-groups.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAwCrE,eAAO,MAAM,kBAAkB,EAAE,GAAG,EAqNnC,CAAC"}