Add v1 audit log backend models and wiring to push secrets

This commit is contained in:
Tuan Dang
2022-12-27 12:12:39 -05:00
parent 019e90dc77
commit 9497a26eb2
26 changed files with 459 additions and 272 deletions
+1 -4
View File
@@ -14,7 +14,6 @@ import Token, { IToken } from './token';
import User, { IUser } from './user';
import UserAction, { IUserAction } from './userAction';
import Workspace, { IWorkspace } from './workspace';
import Log, { ILog } from './log';
export {
BackupPrivateKey,
@@ -48,7 +47,5 @@ export {
UserAction,
IUserAction,
Workspace,
IWorkspace,
Log,
ILog
IWorkspace
};
-102
View File
@@ -1,102 +0,0 @@
import { Schema, model, Types } from 'mongoose';
export interface ILog {
_id: Types.ObjectId;
user?: Types.ObjectId;
workspace: Types.ObjectId;
event: string;
groupId: string;
payload: {
numberofSecrets?: number;
environment?: string;
},
channel: string;
ipAddress?: string;
}
// log group consists of logs (each log is associated with 1 event)
// scenario:
// do we in the future record old and new values for secrets? (when you log update secret,
// do you want to know what the old secret value was changed to?)
// Option 1:
// action 1: pushed secrets (top-level event)
// - log 1 (groupId: ABC): modified 10 secrets (sub-level event)
// ---- array of secret ids that were modified
// - log 2 (groupId: ABC): deleted 5 secrets
// ---- array of secret ids that were deleted
// - log 3 (groupId: ABC): created 10 secrets
// ---- array of secret ids that were created
// action 2: pull secrets
// - log 4 (groupId: DEF): read 20 secrets
// ---- array of secret ids that were read
// Option 2 (many logs):
// action 1: pushed secrets (top-level event)
// - log 1 (groupId: ABC): modified secret abc
// - log 2 (groupId: ABC): modified secret def
// - log 3 (groupId: ABC): modified secret ghi
// - log 4 (groupId: ABC): created secret jkl
// - log 5 (groupId: ABC): created secret mno
// - log 6 (groupId: ABC): deleted secret pqr
// action 2: pull secrets (pulling 100 secrets = 100 logs; 10 times per day, 5 people => 5000 logs)
// - log 7 (groupId: DEF): read secret abc
// - log 8 (groupId: DEF): read secret def
// - log 9 (groupId: DEF): read secret ghi
// - log 10 (groupId: DEF): read secret jkl
// - log 11 (groupId: DEF): read secret mno
// logGroup
// ---- log (query for log groups by person and by secret etc.)
/**
* Action: save secrets
* -
*
*/
const logSchema = new Schema<ILog>(
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
},
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace'
},
event: { // CRUD secrets
type: String,
required: true
},
groupId: {
type: String,
required: true,
},
payload: {
secrets: [{
type: Schema.Types.ObjectId,
ref: 'Secret'
}]
},
channel: {
type: String,
enum: ['web', 'cli', 'auto'],
required: true
},
ipAddress: { // store in bytes?
type: String
}
}, {
timestamps: true
}
);
const Log = model<ILog>('Log', logSchema);
export default Log;
-25
View File
@@ -1,25 +0,0 @@
import { Schema, model, Types } from 'mongoose';
export interface ILogGroup {
workspace: Types.ObjectId,
logs: [Types.ObjectId]
}
const logGroupSchema = new Schema<ILogGroup>(
{
workspace: {
type: Schema.Types.ObjectId,
ref: 'Workspace'
},
logs: [{
type: Schema.Types.ObjectId,
ref: 'Log'
}]
}, {
timestamps: true
}
);
const LogGroup = model<ILogGroup>('LogGroup', logGroupSchema);
export default LogGroup;