Merge pull request #3072 from Infisical/secret-metadata-audit-log

Improvement: Include Secret Metadata in Audit Logs
This commit is contained in:
Scott Wilson
2025-02-06 15:10:49 -08:00
committed by GitHub
6 changed files with 42 additions and 10 deletions
@@ -317,6 +317,8 @@ interface GetSecretsEvent {
}; };
} }
type TSecretMetadata = { key: string; value: string }[];
interface GetSecretEvent { interface GetSecretEvent {
type: EventType.GET_SECRET; type: EventType.GET_SECRET;
metadata: { metadata: {
@@ -325,6 +327,7 @@ interface GetSecretEvent {
secretId: string; secretId: string;
secretKey: string; secretKey: string;
secretVersion: number; secretVersion: number;
secretMetadata?: TSecretMetadata;
}; };
} }
@@ -336,6 +339,7 @@ interface CreateSecretEvent {
secretId: string; secretId: string;
secretKey: string; secretKey: string;
secretVersion: number; secretVersion: number;
secretMetadata?: TSecretMetadata;
}; };
} }
@@ -344,7 +348,12 @@ interface CreateSecretBatchEvent {
metadata: { metadata: {
environment: string; environment: string;
secretPath: string; secretPath: string;
secrets: Array<{ secretId: string; secretKey: string; secretVersion: number }>; secrets: Array<{
secretId: string;
secretKey: string;
secretVersion: number;
secretMetadata?: TSecretMetadata;
}>;
}; };
} }
@@ -356,6 +365,7 @@ interface UpdateSecretEvent {
secretId: string; secretId: string;
secretKey: string; secretKey: string;
secretVersion: number; secretVersion: number;
secretMetadata?: TSecretMetadata;
}; };
} }
@@ -364,7 +374,7 @@ interface UpdateSecretBatchEvent {
metadata: { metadata: {
environment: string; environment: string;
secretPath: string; secretPath: string;
secrets: Array<{ secretId: string; secretKey: string; secretVersion: number }>; secrets: Array<{ secretId: string; secretKey: string; secretVersion: number; secretMetadata?: TSecretMetadata }>;
}; };
} }
+18 -5
View File
@@ -411,7 +411,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
secretPath: req.query.secretPath, secretPath: req.query.secretPath,
secretId: secret.id, secretId: secret.id,
secretKey: req.params.secretName, secretKey: req.params.secretName,
secretVersion: secret.version secretVersion: secret.version,
secretMetadata: secret.secretMetadata
} }
} }
}); });
@@ -519,7 +520,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
secretPath: req.body.secretPath, secretPath: req.body.secretPath,
secretId: secret.id, secretId: secret.id,
secretKey: req.params.secretName, secretKey: req.params.secretName,
secretVersion: secret.version secretVersion: secret.version,
secretMetadata: req.body.secretMetadata
} }
} }
}); });
@@ -631,7 +633,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
secretPath: req.body.secretPath, secretPath: req.body.secretPath,
secretId: secret.id, secretId: secret.id,
secretKey: req.params.secretName, secretKey: req.params.secretName,
secretVersion: secret.version secretVersion: secret.version,
secretMetadata: req.body.secretMetadata
} }
} }
}); });
@@ -1904,6 +1907,10 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
} }
const { secrets } = secretOperation; const { secrets } = secretOperation;
const secretMetadataMap = new Map(
inputSecrets.map(({ secretKey, secretMetadata }) => [secretKey, secretMetadata])
);
await server.services.auditLog.createAuditLog({ await server.services.auditLog.createAuditLog({
projectId: secrets[0].workspace, projectId: secrets[0].workspace,
...req.auditLogInfo, ...req.auditLogInfo,
@@ -1915,7 +1922,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
secrets: secrets.map((secret) => ({ secrets: secrets.map((secret) => ({
secretId: secret.id, secretId: secret.id,
secretKey: secret.secretKey, secretKey: secret.secretKey,
secretVersion: secret.version secretVersion: secret.version,
secretMetadata: secretMetadataMap.get(secret.secretKey)
})) }))
} }
} }
@@ -2010,6 +2018,10 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
} }
const { secrets } = secretOperation; const { secrets } = secretOperation;
const secretMetadataMap = new Map(
inputSecrets.map(({ secretKey, secretMetadata }) => [secretKey, secretMetadata])
);
await server.services.auditLog.createAuditLog({ await server.services.auditLog.createAuditLog({
projectId: secrets[0].workspace, projectId: secrets[0].workspace,
...req.auditLogInfo, ...req.auditLogInfo,
@@ -2021,7 +2033,8 @@ export const registerSecretRouter = async (server: FastifyZodProvider) => {
secrets: secrets.map((secret) => ({ secrets: secrets.map((secret) => ({
secretId: secret.id, secretId: secret.id,
secretKey: secret.secretKey, secretKey: secret.secretKey,
secretVersion: secret.version secretVersion: secret.version,
secretMetadata: secretMetadataMap.get(secret.secretKey)
})) }))
} }
} }
@@ -1291,8 +1291,13 @@ export const secretV2BridgeServiceFactory = ({
] ]
} }
}); });
if (secretsToUpdate.length !== inputSecrets.length) if (secretsToUpdate.length !== inputSecrets.length) {
throw new NotFoundError({ message: `Secret does not exist: ${secretsToUpdate.map((el) => el.key).join(",")}` }); const secretsToUpdateNames = secretsToUpdate.map((secret) => secret.key);
const invalidSecrets = inputSecrets.filter((secret) => !secretsToUpdateNames.includes(secret.secretKey));
throw new NotFoundError({
message: `Secret does not exist: ${invalidSecrets.map((el) => el.secretKey).join(",")}`
});
}
const secretsToUpdateInDBGroupedByKey = groupBy(secretsToUpdate, (i) => i.key); const secretsToUpdateInDBGroupedByKey = groupBy(secretsToUpdate, (i) => i.key);
secretsToUpdate.forEach((el) => { secretsToUpdate.forEach((el) => {
@@ -1444,7 +1444,7 @@ export const secretServiceFactory = ({
decryptedSecret.secretValue = expandedSecretValue || ""; decryptedSecret.secretValue = expandedSecretValue || "";
} }
return decryptedSecret; return { secretMetadata: undefined, ...decryptedSecret };
}; };
const createSecretRaw = async ({ const createSecretRaw = async ({
@@ -4,6 +4,8 @@ export const eventToNameMap: { [K in EventType]: string } = {
[EventType.GET_SECRETS]: "List secrets", [EventType.GET_SECRETS]: "List secrets",
[EventType.GET_SECRET]: "Read secret", [EventType.GET_SECRET]: "Read secret",
[EventType.DELETE_SECRETS]: "Delete secrets", [EventType.DELETE_SECRETS]: "Delete secrets",
[EventType.CREATE_SECRETS]: "Create secrets",
[EventType.UPDATE_SECRETS]: "Update secrets",
[EventType.CREATE_SECRET]: "Create secret", [EventType.CREATE_SECRET]: "Create secret",
[EventType.UPDATE_SECRET]: "Update secret", [EventType.UPDATE_SECRET]: "Update secret",
[EventType.DELETE_SECRET]: "Delete secret", [EventType.DELETE_SECRET]: "Delete secret",
@@ -19,6 +19,8 @@ export enum UserAgentType {
export enum EventType { export enum EventType {
GET_SECRETS = "get-secrets", GET_SECRETS = "get-secrets",
DELETE_SECRETS = "delete-secrets", DELETE_SECRETS = "delete-secrets",
CREATE_SECRETS = "create-secrets",
UPDATE_SECRETS = "update-secrets",
GET_SECRET = "get-secret", GET_SECRET = "get-secret",
CREATE_SECRET = "create-secret", CREATE_SECRET = "create-secret",
UPDATE_SECRET = "update-secret", UPDATE_SECRET = "update-secret",