feat(aws-iam-rotation): add credentials validation

This commit is contained in:
carlosmonastyrski
2025-04-25 12:06:30 -03:00
parent ff9011c899
commit 8f670bde88

View File

@@ -11,7 +11,21 @@ import {
TRotationFactoryRevokeCredentials,
TRotationFactoryRotateCredentials
} from "@app/ee/services/secret-rotation-v2/secret-rotation-v2-types";
import { getAwsConnectionConfig } from "@app/services/app-connection/aws";
import { AppConnection } from "@app/services/app-connection/app-connection-enums";
import {
AwsConnectionMethod,
getAwsConnectionConfig,
validateAwsConnectionCredentials
} from "@app/services/app-connection/aws";
const sleep = async () =>
new Promise((resolve) => {
setTimeout(resolve, 10000);
});
const getCreateDate = (key: AWS.IAM.AccessKeyMetadata): number => {
return key.CreateDate ? new Date(key.CreateDate).getTime() : 0;
};
export const awsIamUserSecretRotationFactory: TRotationFactory<
TAwsIamUserSecretRotationWithConnection,
@@ -30,35 +44,37 @@ export const awsIamUserSecretRotationFactory: TRotationFactory<
const { AccessKeyMetadata } = await iam.listAccessKeys({ UserName: userName }).promise();
if (AccessKeyMetadata && AccessKeyMetadata.length > 0) {
// Delete inactive keys
await Promise.all(
AccessKeyMetadata.map((key) => {
if (key.Status === "Inactive" && key.AccessKeyId) {
return iam
.deleteAccessKey({
UserName: userName,
AccessKeyId: key.AccessKeyId
})
.promise();
}
return Promise.resolve();
})
);
// Sort keys by creation date (oldest first)
const sortedKeys = [...AccessKeyMetadata].sort((a, b) => getCreateDate(a) - getCreateDate(b));
const activeKey = AccessKeyMetadata.find((k) => k.Status === "Active");
if (activeKey && activeKey.AccessKeyId) {
await iam
.updateAccessKey({
UserName: userName,
AccessKeyId: activeKey.AccessKeyId,
Status: "Inactive"
})
.promise();
// If we already have 2 keys, delete the oldest one
if (sortedKeys.length >= 2) {
const accessId = sortedKeys[0].AccessKeyId || sortedKeys[1].AccessKeyId;
if (accessId) {
await iam
.deleteAccessKey({
UserName: userName,
AccessKeyId: accessId
})
.promise();
}
}
}
const { AccessKey } = await iam.createAccessKey({ UserName: userName }).promise();
await sleep();
await validateAwsConnectionCredentials({
app: AppConnection.AWS,
orgId: connection.orgId,
method: AwsConnectionMethod.AccessKey,
credentials: {
accessKeyId: AccessKey.AccessKeyId,
secretAccessKey: AccessKey.SecretAccessKey
}
});
return {
accessKeyId: AccessKey.AccessKeyId,
secretAccessKey: AccessKey.SecretAccessKey