diff --git a/backend/src/server/routes/v1/certificate-authority-router.ts b/backend/src/server/routes/v1/certificate-authority-router.ts index 992a162534..b108215cac 100644 --- a/backend/src/server/routes/v1/certificate-authority-router.ts +++ b/backend/src/server/routes/v1/certificate-authority-router.ts @@ -6,6 +6,7 @@ import { EventType } from "@app/ee/services/audit-log/audit-log-types"; import { CERTIFICATE_AUTHORITIES } from "@app/lib/api-docs"; import { ms } from "@app/lib/ms"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { CertExtendedKeyUsage, CertKeyAlgorithm, CertKeyUsage } from "@app/services/certificate/certificate-types"; @@ -14,6 +15,7 @@ import { validateAltNamesField, validateCaDateField } from "@app/services/certificate-authority/certificate-authority-validators"; +import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; export const registerCaRouter = async (server: FastifyZodProvider) => { server.route({ @@ -649,6 +651,16 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } }); + await server.services.telemetry.sendPostHogEvents({ + event: PostHogEventTypes.IssueCert, + distinctId: getTelemetryDistinctId(req), + properties: { + caId: ca.id, + commonName: req.body.commonName, + ...req.auditLogInfo + } + }); + return { certificate, certificateChain, @@ -707,7 +719,7 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } }, handler: async (req) => { - const { certificate, certificateChain, issuingCaCertificate, serialNumber, ca } = + const { certificate, certificateChain, issuingCaCertificate, serialNumber, ca, commonName } = await server.services.certificateAuthority.signCertFromCa({ isInternal: false, caId: req.params.caId, @@ -731,6 +743,16 @@ export const registerCaRouter = async (server: FastifyZodProvider) => { } }); + await server.services.telemetry.sendPostHogEvents({ + event: PostHogEventTypes.SignCert, + distinctId: getTelemetryDistinctId(req), + properties: { + caId: ca.id, + commonName, + ...req.auditLogInfo + } + }); + return { certificate: certificate.toString("pem"), certificateChain, diff --git a/backend/src/server/routes/v1/certificate-router.ts b/backend/src/server/routes/v1/certificate-router.ts index f61b1ea1e4..3101393bde 100644 --- a/backend/src/server/routes/v1/certificate-router.ts +++ b/backend/src/server/routes/v1/certificate-router.ts @@ -5,6 +5,7 @@ import { EventType } from "@app/ee/services/audit-log/audit-log-types"; import { CERTIFICATE_AUTHORITIES, CERTIFICATES } from "@app/lib/api-docs"; import { ms } from "@app/lib/ms"; import { readLimit, writeLimit } from "@app/server/config/rateLimiter"; +import { getTelemetryDistinctId } from "@app/server/lib/telemetry"; import { verifyAuth } from "@app/server/plugins/auth/verify-auth"; import { AuthMode } from "@app/services/auth/auth-type"; import { CertExtendedKeyUsage, CertKeyUsage, CrlReason } from "@app/services/certificate/certificate-types"; @@ -12,6 +13,7 @@ import { validateAltNamesField, validateCaDateField } from "@app/services/certificate-authority/certificate-authority-validators"; +import { PostHogEventTypes } from "@app/services/telemetry/telemetry-types"; export const registerCertRouter = async (server: FastifyZodProvider) => { server.route({ @@ -150,6 +152,17 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { } }); + await server.services.telemetry.sendPostHogEvents({ + event: PostHogEventTypes.IssueCert, + distinctId: getTelemetryDistinctId(req), + properties: { + caId: req.body.caId, + certificateTemplateId: req.body.certificateTemplateId, + commonName: req.body.commonName, + ...req.auditLogInfo + } + }); + return { certificate, certificateChain, @@ -228,7 +241,7 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { } }, handler: async (req) => { - const { certificate, certificateChain, issuingCaCertificate, serialNumber, ca } = + const { certificate, certificateChain, issuingCaCertificate, serialNumber, ca, commonName } = await server.services.certificateAuthority.signCertFromCa({ isInternal: false, actor: req.permission.type, @@ -251,6 +264,17 @@ export const registerCertRouter = async (server: FastifyZodProvider) => { } }); + await server.services.telemetry.sendPostHogEvents({ + event: PostHogEventTypes.SignCert, + distinctId: getTelemetryDistinctId(req), + properties: { + caId: req.body.caId, + certificateTemplateId: req.body.certificateTemplateId, + commonName, + ...req.auditLogInfo + } + }); + return { certificate: certificate.toString("pem"), certificateChain, diff --git a/backend/src/services/certificate-authority/certificate-authority-service.ts b/backend/src/services/certificate-authority/certificate-authority-service.ts index 3dfaa65323..266ba80171 100644 --- a/backend/src/services/certificate-authority/certificate-authority-service.ts +++ b/backend/src/services/certificate-authority/certificate-authority-service.ts @@ -1819,7 +1819,8 @@ export const certificateAuthorityServiceFactory = ({ certificateChain: `${issuingCaCertificate}\n${caCertChain}`.trim(), issuingCaCertificate, serialNumber, - ca + ca, + commonName: cn }; }; diff --git a/backend/src/services/telemetry/telemetry-types.ts b/backend/src/services/telemetry/telemetry-types.ts index 2f92978b27..45510899a4 100644 --- a/backend/src/services/telemetry/telemetry-types.ts +++ b/backend/src/services/telemetry/telemetry-types.ts @@ -17,7 +17,9 @@ export enum PostHogEventTypes { SecretRequestCreated = "Secret Request Created", SecretRequestDeleted = "Secret Request Deleted", SignSshKey = "Sign SSH Key", - IssueSshCreds = "Issue SSH Credentials" + IssueSshCreds = "Issue SSH Credentials", + SignCert = "Sign PKI Certificate", + IssueCert = "Issue PKI Certificate" } export type TSecretModifiedEvent = { @@ -159,6 +161,26 @@ export type TIssueSshCredsEvent = { }; }; +export type TSignCertificateEvent = { + event: PostHogEventTypes.SignCert; + properties: { + caId?: string; + certificateTemplateId?: string; + commonName: string; + userAgent?: string; + }; +}; + +export type TIssueCertificateEvent = { + event: PostHogEventTypes.IssueCert; + properties: { + caId?: string; + certificateTemplateId?: string; + commonName: string; + userAgent?: string; + }; +}; + export type TPostHogEvent = { distinctId: string } & ( | TSecretModifiedEvent | TAdminInitEvent @@ -173,4 +195,6 @@ export type TPostHogEvent = { distinctId: string } & ( | TSecretRequestDeletedEvent | TSignSshKeyEvent | TIssueSshCredsEvent + | TSignCertificateEvent + | TIssueCertificateEvent );