@factiii/stack 0.1.2 → 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.
- package/bin/factiii +13 -0
- package/dist/cli/pr-check.d.ts +24 -0
- package/dist/cli/pr-check.d.ts.map +1 -0
- package/dist/cli/pr-check.js +153 -0
- package/dist/cli/pr-check.js.map +1 -0
- package/dist/plugins/addons/server-mode/index.d.ts.map +1 -1
- package/dist/plugins/addons/server-mode/index.js +3 -0
- package/dist/plugins/addons/server-mode/index.js.map +1 -1
- package/dist/plugins/addons/server-mode/scanfix/mac.d.ts +20 -3
- package/dist/plugins/addons/server-mode/scanfix/mac.d.ts.map +1 -1
- package/dist/plugins/addons/server-mode/scanfix/mac.js +304 -177
- package/dist/plugins/addons/server-mode/scanfix/mac.js.map +1 -1
- package/dist/plugins/addons/server-mode/scanfix/tart.d.ts +19 -0
- package/dist/plugins/addons/server-mode/scanfix/tart.d.ts.map +1 -0
- package/dist/plugins/addons/server-mode/scanfix/tart.js +350 -0
- package/dist/plugins/addons/server-mode/scanfix/tart.js.map +1 -0
- package/dist/plugins/pipelines/aws/configs/free-tier.d.ts.map +1 -1
- package/dist/plugins/pipelines/aws/configs/free-tier.js +3 -38
- package/dist/plugins/pipelines/aws/configs/free-tier.js.map +1 -1
- package/dist/plugins/pipelines/aws/index.d.ts +4 -1
- package/dist/plugins/pipelines/aws/index.d.ts.map +1 -1
- package/dist/plugins/pipelines/aws/index.js +101 -29
- package/dist/plugins/pipelines/aws/index.js.map +1 -1
- package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts +9 -0
- package/dist/plugins/pipelines/aws/scanfix/credentials.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/credentials.js +196 -0
- package/dist/plugins/pipelines/aws/scanfix/credentials.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/db-replication.d.ts +13 -0
- package/dist/plugins/pipelines/aws/scanfix/db-replication.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/db-replication.js +136 -0
- package/dist/plugins/pipelines/aws/scanfix/db-replication.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts +10 -0
- package/dist/plugins/pipelines/aws/scanfix/ec2.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ec2.js +279 -0
- package/dist/plugins/pipelines/aws/scanfix/ec2.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ecr.d.ts +9 -0
- package/dist/plugins/pipelines/aws/scanfix/ecr.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ecr.js +100 -0
- package/dist/plugins/pipelines/aws/scanfix/ecr.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/iam.d.ts +10 -0
- package/dist/plugins/pipelines/aws/scanfix/iam.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/iam.js +255 -0
- package/dist/plugins/pipelines/aws/scanfix/iam.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/rds.d.ts +10 -0
- package/dist/plugins/pipelines/aws/scanfix/rds.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/rds.js +261 -0
- package/dist/plugins/pipelines/aws/scanfix/rds.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/s3.d.ts +9 -0
- package/dist/plugins/pipelines/aws/scanfix/s3.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/s3.js +134 -0
- package/dist/plugins/pipelines/aws/scanfix/s3.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/security-groups.d.ts +10 -0
- package/dist/plugins/pipelines/aws/scanfix/security-groups.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/security-groups.js +225 -0
- package/dist/plugins/pipelines/aws/scanfix/security-groups.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ses.d.ts +9 -0
- package/dist/plugins/pipelines/aws/scanfix/ses.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/ses.js +174 -0
- package/dist/plugins/pipelines/aws/scanfix/ses.js.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/vpc.d.ts +9 -0
- package/dist/plugins/pipelines/aws/scanfix/vpc.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/scanfix/vpc.js +237 -0
- package/dist/plugins/pipelines/aws/scanfix/vpc.js.map +1 -0
- package/dist/plugins/pipelines/aws/utils/aws-helpers.d.ts +50 -0
- package/dist/plugins/pipelines/aws/utils/aws-helpers.d.ts.map +1 -0
- package/dist/plugins/pipelines/aws/utils/aws-helpers.js +137 -0
- package/dist/plugins/pipelines/aws/utils/aws-helpers.js.map +1 -0
- package/dist/plugins/pipelines/factiii/index.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/index.js +11 -0
- package/dist/plugins/pipelines/factiii/index.js.map +1 -1
- package/dist/plugins/pipelines/factiii/pr-check.d.ts +35 -0
- package/dist/plugins/pipelines/factiii/pr-check.d.ts.map +1 -0
- package/dist/plugins/pipelines/factiii/pr-check.js +202 -0
- package/dist/plugins/pipelines/factiii/pr-check.js.map +1 -0
- package/dist/plugins/pipelines/factiii/utils/workflows.d.ts.map +1 -1
- package/dist/plugins/pipelines/factiii/utils/workflows.js +1 -0
- package/dist/plugins/pipelines/factiii/utils/workflows.js.map +1 -1
- package/dist/plugins/pipelines/factiii/workflows/factiii-cicd-staging.yml +8 -3
- package/dist/plugins/pipelines/factiii/workflows/factiii-pr-check.yml +103 -0
- package/dist/plugins/servers/mac/staging.d.ts.map +1 -1
- package/dist/plugins/servers/mac/staging.js +304 -52
- package/dist/plugins/servers/mac/staging.js.map +1 -1
- package/dist/types/config.d.ts +11 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/utils/github-status.d.ts +39 -0
- package/dist/utils/github-status.d.ts.map +1 -0
- package/dist/utils/github-status.js +172 -0
- package/dist/utils/github-status.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* AWS IAM Fixes
|
|
4
|
+
*
|
|
5
|
+
* Creates IAM users with scoped policies:
|
|
6
|
+
* - Dev user: read-only access for development
|
|
7
|
+
* - Prod user: full access for deployment
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.iamFixes = void 0;
|
|
11
|
+
const aws_helpers_js_1 = require("../utils/aws-helpers.js");
|
|
12
|
+
/**
|
|
13
|
+
* Check if IAM user exists
|
|
14
|
+
*/
|
|
15
|
+
function findIamUser(userName, region) {
|
|
16
|
+
const result = (0, aws_helpers_js_1.awsExecSafe)('aws iam get-user --user-name ' + userName, region);
|
|
17
|
+
return !!result && !result.includes('NoSuchEntity');
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Check if AWS is configured for this project
|
|
21
|
+
*/
|
|
22
|
+
function isAwsConfigured(config) {
|
|
23
|
+
if (config.aws)
|
|
24
|
+
return true;
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
26
|
+
const { extractEnvironments } = require('../../../../utils/config-helpers.js');
|
|
27
|
+
const environments = extractEnvironments(config);
|
|
28
|
+
return Object.values(environments).some((e) => e.pipeline === 'aws');
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate dev IAM policy (read-only)
|
|
32
|
+
*/
|
|
33
|
+
function getDevPolicy(projectName, region, accountId) {
|
|
34
|
+
return JSON.stringify({
|
|
35
|
+
Version: '2012-10-17',
|
|
36
|
+
Statement: [
|
|
37
|
+
{
|
|
38
|
+
Sid: 'ECRReadOnly',
|
|
39
|
+
Effect: 'Allow',
|
|
40
|
+
Action: [
|
|
41
|
+
'ecr:GetAuthorizationToken',
|
|
42
|
+
'ecr:BatchGetImage',
|
|
43
|
+
'ecr:GetDownloadUrlForLayer',
|
|
44
|
+
'ecr:DescribeRepositories',
|
|
45
|
+
'ecr:ListImages',
|
|
46
|
+
],
|
|
47
|
+
Resource: 'arn:aws:ecr:' + region + ':' + accountId + ':repository/' + projectName,
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
Sid: 'ECRAuth',
|
|
51
|
+
Effect: 'Allow',
|
|
52
|
+
Action: 'ecr:GetAuthorizationToken',
|
|
53
|
+
Resource: '*',
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
Sid: 'S3ReadOnly',
|
|
57
|
+
Effect: 'Allow',
|
|
58
|
+
Action: [
|
|
59
|
+
's3:GetObject',
|
|
60
|
+
's3:ListBucket',
|
|
61
|
+
],
|
|
62
|
+
Resource: [
|
|
63
|
+
'arn:aws:s3:::factiii-' + projectName,
|
|
64
|
+
'arn:aws:s3:::factiii-' + projectName + '/*',
|
|
65
|
+
],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
Sid: 'EC2Describe',
|
|
69
|
+
Effect: 'Allow',
|
|
70
|
+
Action: [
|
|
71
|
+
'ec2:DescribeInstances',
|
|
72
|
+
'ec2:DescribeVpcs',
|
|
73
|
+
'ec2:DescribeSubnets',
|
|
74
|
+
'ec2:DescribeSecurityGroups',
|
|
75
|
+
],
|
|
76
|
+
Resource: '*',
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
Sid: 'RDSDescribe',
|
|
80
|
+
Effect: 'Allow',
|
|
81
|
+
Action: [
|
|
82
|
+
'rds:DescribeDBInstances',
|
|
83
|
+
'rds:DescribeDBSubnetGroups',
|
|
84
|
+
],
|
|
85
|
+
Resource: '*',
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Generate prod IAM policy (full access for deployment)
|
|
92
|
+
*/
|
|
93
|
+
function getProdPolicy(projectName, region, accountId) {
|
|
94
|
+
return JSON.stringify({
|
|
95
|
+
Version: '2012-10-17',
|
|
96
|
+
Statement: [
|
|
97
|
+
{
|
|
98
|
+
Sid: 'ECRFullAccess',
|
|
99
|
+
Effect: 'Allow',
|
|
100
|
+
Action: 'ecr:*',
|
|
101
|
+
Resource: 'arn:aws:ecr:' + region + ':' + accountId + ':repository/' + projectName,
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
Sid: 'ECRAuth',
|
|
105
|
+
Effect: 'Allow',
|
|
106
|
+
Action: 'ecr:GetAuthorizationToken',
|
|
107
|
+
Resource: '*',
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
Sid: 'S3FullAccess',
|
|
111
|
+
Effect: 'Allow',
|
|
112
|
+
Action: 's3:*',
|
|
113
|
+
Resource: [
|
|
114
|
+
'arn:aws:s3:::factiii-' + projectName,
|
|
115
|
+
'arn:aws:s3:::factiii-' + projectName + '/*',
|
|
116
|
+
],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
Sid: 'EC2Management',
|
|
120
|
+
Effect: 'Allow',
|
|
121
|
+
Action: [
|
|
122
|
+
'ec2:DescribeInstances',
|
|
123
|
+
'ec2:StartInstances',
|
|
124
|
+
'ec2:StopInstances',
|
|
125
|
+
'ec2:RebootInstances',
|
|
126
|
+
'ec2:DescribeVpcs',
|
|
127
|
+
'ec2:DescribeSubnets',
|
|
128
|
+
'ec2:DescribeSecurityGroups',
|
|
129
|
+
'ec2:DescribeAddresses',
|
|
130
|
+
],
|
|
131
|
+
Resource: '*',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
Sid: 'RDSManagement',
|
|
135
|
+
Effect: 'Allow',
|
|
136
|
+
Action: [
|
|
137
|
+
'rds:DescribeDBInstances',
|
|
138
|
+
'rds:StartDBInstance',
|
|
139
|
+
'rds:StopDBInstance',
|
|
140
|
+
'rds:RebootDBInstance',
|
|
141
|
+
'rds:CreateDBSnapshot',
|
|
142
|
+
'rds:DescribeDBSnapshots',
|
|
143
|
+
],
|
|
144
|
+
Resource: '*',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
Sid: 'SESFullAccess',
|
|
148
|
+
Effect: 'Allow',
|
|
149
|
+
Action: 'ses:*',
|
|
150
|
+
Resource: '*',
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
exports.iamFixes = [
|
|
156
|
+
{
|
|
157
|
+
id: 'aws-iam-dev-user-missing',
|
|
158
|
+
stage: 'secrets',
|
|
159
|
+
severity: 'warning',
|
|
160
|
+
description: 'IAM dev user not created (read-only access)',
|
|
161
|
+
scan: async (config) => {
|
|
162
|
+
if (!isAwsConfigured(config))
|
|
163
|
+
return false;
|
|
164
|
+
const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
|
|
165
|
+
const projectName = (0, aws_helpers_js_1.getProjectName)(config);
|
|
166
|
+
return !findIamUser('factiii-' + projectName + '-dev', region);
|
|
167
|
+
},
|
|
168
|
+
fix: async (config) => {
|
|
169
|
+
const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
|
|
170
|
+
const projectName = (0, aws_helpers_js_1.getProjectName)(config);
|
|
171
|
+
const userName = 'factiii-' + projectName + '-dev';
|
|
172
|
+
try {
|
|
173
|
+
// Get account ID for ARNs
|
|
174
|
+
const accountResult = (0, aws_helpers_js_1.awsExec)('aws sts get-caller-identity --query Account --output text', region);
|
|
175
|
+
const accountId = accountResult.replace(/"/g, '').trim();
|
|
176
|
+
// Create IAM user
|
|
177
|
+
(0, aws_helpers_js_1.awsExec)('aws iam create-user --user-name ' + userName, region);
|
|
178
|
+
console.log(' Created IAM user: ' + userName);
|
|
179
|
+
// Create and attach inline policy
|
|
180
|
+
const policy = getDevPolicy(projectName, region, accountId);
|
|
181
|
+
(0, aws_helpers_js_1.awsExec)('aws iam put-user-policy --user-name ' + userName +
|
|
182
|
+
' --policy-name factiii-' + projectName + '-dev-policy' +
|
|
183
|
+
" --policy-document '" + policy + "'", region);
|
|
184
|
+
console.log(' Attached dev policy (read-only ECR, S3, EC2, RDS)');
|
|
185
|
+
// Create access key
|
|
186
|
+
const keyResult = (0, aws_helpers_js_1.awsExec)('aws iam create-access-key --user-name ' + userName, region);
|
|
187
|
+
const parsed = JSON.parse(keyResult);
|
|
188
|
+
const accessKeyId = parsed.AccessKey?.AccessKeyId;
|
|
189
|
+
const secretKey = parsed.AccessKey?.SecretAccessKey;
|
|
190
|
+
console.log('');
|
|
191
|
+
console.log(' Dev credentials (save these!):');
|
|
192
|
+
console.log(' Access Key ID: ' + accessKeyId);
|
|
193
|
+
console.log(' Secret Access Key: ' + secretKey);
|
|
194
|
+
console.log('');
|
|
195
|
+
console.log(' TIP: Store in Ansible Vault: npx factiii secrets edit');
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
catch (e) {
|
|
199
|
+
console.log(' Failed to create dev IAM user: ' + (e instanceof Error ? e.message : String(e)));
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
manualFix: 'Create IAM dev user with read-only policy for ECR, S3, EC2, RDS',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
id: 'aws-iam-prod-user-missing',
|
|
207
|
+
stage: 'secrets',
|
|
208
|
+
severity: 'warning',
|
|
209
|
+
description: 'IAM prod user not created (deployment access)',
|
|
210
|
+
scan: async (config) => {
|
|
211
|
+
if (!isAwsConfigured(config))
|
|
212
|
+
return false;
|
|
213
|
+
const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
|
|
214
|
+
const projectName = (0, aws_helpers_js_1.getProjectName)(config);
|
|
215
|
+
return !findIamUser('factiii-' + projectName + '-prod', region);
|
|
216
|
+
},
|
|
217
|
+
fix: async (config) => {
|
|
218
|
+
const { region } = (0, aws_helpers_js_1.getAwsConfig)(config);
|
|
219
|
+
const projectName = (0, aws_helpers_js_1.getProjectName)(config);
|
|
220
|
+
const userName = 'factiii-' + projectName + '-prod';
|
|
221
|
+
try {
|
|
222
|
+
// Get account ID for ARNs
|
|
223
|
+
const accountResult = (0, aws_helpers_js_1.awsExec)('aws sts get-caller-identity --query Account --output text', region);
|
|
224
|
+
const accountId = accountResult.replace(/"/g, '').trim();
|
|
225
|
+
// Create IAM user
|
|
226
|
+
(0, aws_helpers_js_1.awsExec)('aws iam create-user --user-name ' + userName, region);
|
|
227
|
+
console.log(' Created IAM user: ' + userName);
|
|
228
|
+
// Create and attach inline policy
|
|
229
|
+
const policy = getProdPolicy(projectName, region, accountId);
|
|
230
|
+
(0, aws_helpers_js_1.awsExec)('aws iam put-user-policy --user-name ' + userName +
|
|
231
|
+
' --policy-name factiii-' + projectName + '-prod-policy' +
|
|
232
|
+
" --policy-document '" + policy + "'", region);
|
|
233
|
+
console.log(' Attached prod policy (full ECR, S3, EC2, RDS, SES)');
|
|
234
|
+
// Create access key
|
|
235
|
+
const keyResult = (0, aws_helpers_js_1.awsExec)('aws iam create-access-key --user-name ' + userName, region);
|
|
236
|
+
const parsed = JSON.parse(keyResult);
|
|
237
|
+
const accessKeyId = parsed.AccessKey?.AccessKeyId;
|
|
238
|
+
const secretKey = parsed.AccessKey?.SecretAccessKey;
|
|
239
|
+
console.log('');
|
|
240
|
+
console.log(' Prod credentials (save these!):');
|
|
241
|
+
console.log(' Access Key ID: ' + accessKeyId);
|
|
242
|
+
console.log(' Secret Access Key: ' + secretKey);
|
|
243
|
+
console.log('');
|
|
244
|
+
console.log(' TIP: Store in Ansible Vault: npx factiii secrets edit');
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
catch (e) {
|
|
248
|
+
console.log(' Failed to create prod IAM user: ' + (e instanceof Error ? e.message : String(e)));
|
|
249
|
+
return false;
|
|
250
|
+
}
|
|
251
|
+
},
|
|
252
|
+
manualFix: 'Create IAM prod user with deployment policy for ECR, S3, EC2, RDS, SES',
|
|
253
|
+
},
|
|
254
|
+
];
|
|
255
|
+
//# sourceMappingURL=iam.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iam.js","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/iam.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAGH,4DAA6F;AAE7F;;GAEG;AACH,SAAS,WAAW,CAAC,QAAgB,EAAE,MAAc;IACnD,MAAM,MAAM,GAAG,IAAA,4BAAW,EACxB,+BAA+B,GAAG,QAAQ,EAC1C,MAAM,CACP,CAAC;IACF,OAAO,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,MAAqB;IAC5C,IAAI,MAAM,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IAC5B,iEAAiE;IACjE,MAAM,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC/E,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACjD,OAAO,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CACrC,CAAC,CAAU,EAAE,EAAE,CAAE,CAA2B,CAAC,QAAQ,KAAK,KAAK,CAChE,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,WAAmB,EAAE,MAAc,EAAE,SAAiB;IAC1E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,2BAA2B;oBAC3B,mBAAmB;oBACnB,4BAA4B;oBAC5B,0BAA0B;oBAC1B,gBAAgB;iBACjB;gBACD,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW;aACnF;YACD;gBACE,GAAG,EAAE,SAAS;gBACd,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,2BAA2B;gBACnC,QAAQ,EAAE,GAAG;aACd;YACD;gBACE,GAAG,EAAE,YAAY;gBACjB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,cAAc;oBACd,eAAe;iBAChB;gBACD,QAAQ,EAAE;oBACR,uBAAuB,GAAG,WAAW;oBACrC,uBAAuB,GAAG,WAAW,GAAG,IAAI;iBAC7C;aACF;YACD;gBACE,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,uBAAuB;oBACvB,kBAAkB;oBAClB,qBAAqB;oBACrB,4BAA4B;iBAC7B;gBACD,QAAQ,EAAE,GAAG;aACd;YACD;gBACE,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,yBAAyB;oBACzB,4BAA4B;iBAC7B;gBACD,QAAQ,EAAE,GAAG;aACd;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,WAAmB,EAAE,MAAc,EAAE,SAAiB;IAC3E,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,OAAO,EAAE,YAAY;QACrB,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,eAAe;gBACpB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,cAAc,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,cAAc,GAAG,WAAW;aACnF;YACD;gBACE,GAAG,EAAE,SAAS;gBACd,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,2BAA2B;gBACnC,QAAQ,EAAE,GAAG;aACd;YACD;gBACE,GAAG,EAAE,cAAc;gBACnB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,MAAM;gBACd,QAAQ,EAAE;oBACR,uBAAuB,GAAG,WAAW;oBACrC,uBAAuB,GAAG,WAAW,GAAG,IAAI;iBAC7C;aACF;YACD;gBACE,GAAG,EAAE,eAAe;gBACpB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,uBAAuB;oBACvB,oBAAoB;oBACpB,mBAAmB;oBACnB,qBAAqB;oBACrB,kBAAkB;oBAClB,qBAAqB;oBACrB,4BAA4B;oBAC5B,uBAAuB;iBACxB;gBACD,QAAQ,EAAE,GAAG;aACd;YACD;gBACE,GAAG,EAAE,eAAe;gBACpB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE;oBACN,yBAAyB;oBACzB,qBAAqB;oBACrB,oBAAoB;oBACpB,sBAAsB;oBACtB,sBAAsB;oBACtB,yBAAyB;iBAC1B;gBACD,QAAQ,EAAE,GAAG;aACd;YACD;gBACE,GAAG,EAAE,eAAe;gBACpB,MAAM,EAAE,OAAO;gBACf,MAAM,EAAE,OAAO;gBACf,QAAQ,EAAE,GAAG;aACd;SACF;KACF,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,QAAQ,GAAU;IAC7B;QACE,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,6CAA6C;QAC1D,IAAI,EAAE,KAAK,EAAE,MAAqB,EAAoB,EAAE;YACtD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAY,EAAC,MAAM,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG,WAAW,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,MAAqB,EAAoB,EAAE;YACrD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAY,EAAC,MAAM,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC;YAEnD,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,MAAM,aAAa,GAAG,IAAA,wBAAO,EAC3B,2DAA2D,EAC3D,MAAM,CACP,CAAC;gBACF,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEzD,kBAAkB;gBAClB,IAAA,wBAAO,EAAC,kCAAkC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,QAAQ,CAAC,CAAC;gBAEhD,kCAAkC;gBAClC,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC5D,IAAA,wBAAO,EACL,sCAAsC,GAAG,QAAQ;oBACjD,yBAAyB,GAAG,WAAW,GAAG,aAAa;oBACvD,sBAAsB,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CACP,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;gBAEpE,oBAAoB;gBACpB,MAAM,SAAS,GAAG,IAAA,wBAAO,EACvB,wCAAwC,GAAG,QAAQ,EACnD,MAAM,CACP,CAAC;gBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;gBAClD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC;gBAEpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;gBAExE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,oCAAoC,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjG,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,SAAS,EAAE,iEAAiE;KAC7E;IACD;QACE,EAAE,EAAE,2BAA2B;QAC/B,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,+CAA+C;QAC5D,IAAI,EAAE,KAAK,EAAE,MAAqB,EAAoB,EAAE;YACtD,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAY,EAAC,MAAM,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;YAC3C,OAAO,CAAC,WAAW,CAAC,UAAU,GAAG,WAAW,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;QAClE,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,MAAqB,EAAoB,EAAE;YACrD,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,6BAAY,EAAC,MAAM,CAAC,CAAC;YACxC,MAAM,WAAW,GAAG,IAAA,+BAAc,EAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;YAEpD,IAAI,CAAC;gBACH,0BAA0B;gBAC1B,MAAM,aAAa,GAAG,IAAA,wBAAO,EAC3B,2DAA2D,EAC3D,MAAM,CACP,CAAC;gBACF,MAAM,SAAS,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBAEzD,kBAAkB;gBAClB,IAAA,wBAAO,EAAC,kCAAkC,GAAG,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC/D,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,QAAQ,CAAC,CAAC;gBAEhD,kCAAkC;gBAClC,MAAM,MAAM,GAAG,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC7D,IAAA,wBAAO,EACL,sCAAsC,GAAG,QAAQ;oBACjD,yBAAyB,GAAG,WAAW,GAAG,cAAc;oBACxD,sBAAsB,GAAG,MAAM,GAAG,GAAG,EACrC,MAAM,CACP,CAAC;gBACF,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;gBAErE,oBAAoB;gBACpB,MAAM,SAAS,GAAG,IAAA,wBAAO,EACvB,wCAAwC,GAAG,QAAQ,EACnD,MAAM,CACP,CAAC;gBACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;gBACrC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;gBAClD,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC;gBAEpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,oBAAoB,GAAG,WAAW,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;gBAExE,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,qCAAqC,GAAG,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClG,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,SAAS,EAAE,wEAAwE;KACpF;CACF,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS RDS Fixes
|
|
3
|
+
*
|
|
4
|
+
* Provisions RDS PostgreSQL 15 instance (db.t2.micro free tier).
|
|
5
|
+
* Creates DB subnet group from private subnets, launches instance with RDS SG.
|
|
6
|
+
* Stores DATABASE_URL in Ansible Vault.
|
|
7
|
+
*/
|
|
8
|
+
import type { Fix } from '../../../../types/index.js';
|
|
9
|
+
export declare const rdsFixes: Fix[];
|
|
10
|
+
//# sourceMappingURL=rds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rds.d.ts","sourceRoot":"","sources":["../../../../../src/plugins/pipelines/aws/scanfix/rds.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAiB,GAAG,EAAE,MAAM,4BAA4B,CAAC;AAmGrE,eAAO,MAAM,QAAQ,EAAE,GAAG,EA6KzB,CAAC"}
|
|
@@ -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"}
|