From 4489adeefa9679ea4d62660a19d82e423ea138f2 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 13 Apr 2023 09:01:57 -0700 Subject: [PATCH 1/5] set https to false by default aws ec2 deploy --- cloudformation/ec2-deployment/infisical-ec2-deployment.template | 1 + 1 file changed, 1 insertion(+) diff --git a/cloudformation/ec2-deployment/infisical-ec2-deployment.template b/cloudformation/ec2-deployment/infisical-ec2-deployment.template index 36f0d9dce..2db93b779 100644 --- a/cloudformation/ec2-deployment/infisical-ec2-deployment.template +++ b/cloudformation/ec2-deployment/infisical-ec2-deployment.template @@ -96,6 +96,7 @@ Resources: echo "JWT_AUTH_SECRET=${!JWT_AUTH_SECRET}" >> .env echo "JWT_SERVICE_SECRET=${!JWT_SERVICE_SECRET}" >> .env echo "MONGO_URL=${!DOCUMENT_DB_CONNECTION_URL}" >> .env + echo "HTTPS_ENABLED=false" >> .env docker-compose up -d From 83ddba29e2ade5ed4503a869d09515d21ba89ce2 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 13 Apr 2023 09:03:23 -0700 Subject: [PATCH 2/5] conditionally set https --- backend/src/config/index.ts | 15 +++++- backend/src/controllers/v1/authController.ts | 14 +++--- backend/src/controllers/v2/authController.ts | 8 ++-- .../src/controllers/v2/signupController.ts | 46 +++++++++---------- 4 files changed, 48 insertions(+), 35 deletions(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 68427d078..86b8db44e 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -48,4 +48,17 @@ export const getStripeSecretKey = () => infisical.get('STRIPE_SECRET_KEY')!; export const getStripeWebhookSecret = () => infisical.get('STRIPE_WEBHOOK_SECRET')!; export const getTelemetryEnabled = () => infisical.get('TELEMETRY_ENABLED')! !== 'false' && true; export const getLoopsApiKey = () => infisical.get('LOOPS_API_KEY')!; -export const getSmtpConfigured = () => infisical.get('SMTP_HOST') == '' || infisical.get('SMTP_HOST') == undefined ? false : true \ No newline at end of file +export const getSmtpConfigured = () => infisical.get('SMTP_HOST') == '' || infisical.get('SMTP_HOST') == undefined ? false : true +export const getHttpsEnabled = () => { + if (getNodeEnv() != "production") { + // no https for anything other than prod + return false + } + + if (infisical.get('HTTPS_ENABLED') == undefined || infisical.get('HTTPS_ENABLED') == "") { + // default when no value present + return true + } + + return Boolean(infisical.get('HTTPS_ENABLED')) +} \ No newline at end of file diff --git a/backend/src/controllers/v1/authController.ts b/backend/src/controllers/v1/authController.ts index 3c6ec523a..84404bc74 100644 --- a/backend/src/controllers/v1/authController.ts +++ b/backend/src/controllers/v1/authController.ts @@ -15,10 +15,10 @@ import { BadRequestError } from '../../utils/errors'; import { EELogService } from '../../ee/services'; import { getChannelFromUserAgent } from '../../utils/posthog'; // TODO: move this import { - getNodeEnv, getJwtRefreshSecret, getJwtAuthLifetime, - getJwtAuthSecret + getJwtAuthSecret, + getHttpsEnabled } from '../../config'; declare module 'jsonwebtoken' { @@ -126,21 +126,21 @@ export const login2 = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() }); const loginAction = await EELogService.createAction({ name: ACTION_LOGIN, userId: user._id }); - + loginAction && await EELogService.createLog({ userId: user._id, actions: [loginAction], channel: getChannelFromUserAgent(req.headers['user-agent']), ipAddress: req.ip }); - + // return (access) token in response return res.status(200).send({ token: tokens.token, @@ -182,14 +182,14 @@ export const logout = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() as boolean }); const logoutAction = await EELogService.createAction({ name: ACTION_LOGOUT, userId: req.user._id }); - + logoutAction && await EELogService.createLog({ userId: req.user._id, actions: [logoutAction], diff --git a/backend/src/controllers/v2/authController.ts b/backend/src/controllers/v2/authController.ts index 3a36d559c..92b4a159a 100644 --- a/backend/src/controllers/v2/authController.ts +++ b/backend/src/controllers/v2/authController.ts @@ -17,9 +17,9 @@ import { } from '../../variables'; import { getChannelFromUserAgent } from '../../utils/posthog'; // TODO: move this import { - getNodeEnv, getJwtMfaLifetime, - getJwtMfaSecret + getJwtMfaSecret, + getHttpsEnabled } from '../../config'; declare module 'jsonwebtoken' { @@ -163,7 +163,7 @@ export const login2 = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() }); // case: user does not have MFA enablgged @@ -302,7 +302,7 @@ export const verifyMfaToken = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() }); interface VerifyMfaTokenRes { diff --git a/backend/src/controllers/v2/signupController.ts b/backend/src/controllers/v2/signupController.ts index aaf055b78..ff41aa017 100644 --- a/backend/src/controllers/v2/signupController.ts +++ b/backend/src/controllers/v2/signupController.ts @@ -8,7 +8,7 @@ import { import { issueAuthTokens } from '../../helpers/auth'; import { INVITED, ACCEPTED } from '../../variables'; import request from '../../config/request'; -import { getNodeEnv, getLoopsApiKey } from '../../config'; +import { getLoopsApiKey, getHttpsEnabled } from '../../config'; /** * Complete setting up user by adding their personal and auth information as part of the @@ -24,9 +24,9 @@ export const completeAccountSignup = async (req: Request, res: Response) => { email, firstName, lastName, - protectedKey, - protectedKeyIV, - protectedKeyTag, + protectedKey, + protectedKeyIV, + protectedKeyTag, publicKey, encryptedPrivateKey, encryptedPrivateKeyIV, @@ -38,9 +38,9 @@ export const completeAccountSignup = async (req: Request, res: Response) => { email: string; firstName: string; lastName: string; - protectedKey: string; - protectedKeyIV: string; - protectedKeyTag: string; + protectedKey: string; + protectedKeyIV: string; + protectedKeyTag: string; publicKey: string; encryptedPrivateKey: string; encryptedPrivateKeyIV: string; @@ -48,11 +48,11 @@ export const completeAccountSignup = async (req: Request, res: Response) => { salt: string; verifier: string; organizationName: string; - } = req.body; + } = req.body; // get user user = await User.findOne({ email }); - + if (!user || (user && user?.publicKey)) { // case 1: user doesn't exist. // case 2: user has already completed account @@ -66,10 +66,10 @@ export const completeAccountSignup = async (req: Request, res: Response) => { userId: user._id.toString(), firstName, lastName, - encryptionVersion: 2, - protectedKey, - protectedKeyIV, - protectedKeyTag, + encryptionVersion: 2, + protectedKey, + protectedKeyIV, + protectedKeyTag, publicKey, encryptedPrivateKey, encryptedPrivateKeyIV, @@ -127,7 +127,7 @@ export const completeAccountSignup = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() }); } catch (err) { Sentry.setUser(null); @@ -158,9 +158,9 @@ export const completeAccountInvite = async (req: Request, res: Response) => { email, firstName, lastName, - protectedKey, - protectedKeyIV, - protectedKeyTag, + protectedKey, + protectedKeyIV, + protectedKeyTag, publicKey, encryptedPrivateKey, encryptedPrivateKeyIV, @@ -192,10 +192,10 @@ export const completeAccountInvite = async (req: Request, res: Response) => { userId: user._id.toString(), firstName, lastName, - encryptionVersion: 2, - protectedKey, - protectedKeyIV, - protectedKeyTag, + encryptionVersion: 2, + protectedKey, + protectedKeyIV, + protectedKeyTag, publicKey, encryptedPrivateKey, encryptedPrivateKeyIV, @@ -232,7 +232,7 @@ export const completeAccountInvite = async (req: Request, res: Response) => { httpOnly: true, path: '/', sameSite: 'strict', - secure: getNodeEnv() === 'production' ? true : false + secure: getHttpsEnabled() }); } catch (err) { Sentry.setUser(null); @@ -241,7 +241,7 @@ export const completeAccountInvite = async (req: Request, res: Response) => { message: 'Failed to complete account setup' }); } - + return res.status(200).send({ message: 'Successfully set up account', user, From 806448a7f95fc17ba49e2b3dff5fb05554062ff2 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Thu, 13 Apr 2023 22:30:42 +0300 Subject: [PATCH 3/5] Correct service token telemetry depending on creating entity --- backend/src/helpers/auth.ts | 2 +- backend/src/services/TelemetryService.ts | 14 +++++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/backend/src/helpers/auth.ts b/backend/src/helpers/auth.ts index b9c4e8232..9cbe82e34 100644 --- a/backend/src/helpers/auth.ts +++ b/backend/src/helpers/auth.ts @@ -157,7 +157,7 @@ const getAuthSTDPayload = async ({ }, { new: true }) - .select('+encryptedKey +iv +tag').populate('user'); + .select('+encryptedKey +iv +tag').populate('user serviceAccount'); if (!serviceTokenData) throw ServiceTokenDataNotFoundError({ message: 'Failed to find service token data' }); diff --git a/backend/src/services/TelemetryService.ts b/backend/src/services/TelemetryService.ts index 0566439b4..248ad3633 100644 --- a/backend/src/services/TelemetryService.ts +++ b/backend/src/services/TelemetryService.ts @@ -8,7 +8,9 @@ import { } from '../config'; import { IUser, + User, IServiceAccount, + ServiceAccount, IServiceTokenData } from '../models'; import { @@ -56,7 +58,7 @@ class Telemetry { }: { user?: IUser; serviceAccount?: IServiceAccount; - serviceTokenData?: IServiceTokenData; + serviceTokenData?: any; // TODO: fix (it's ServiceTokenData with user populated) }) => { let distinctId = ''; @@ -65,11 +67,13 @@ class Telemetry { } if (serviceAccount) { - distinctId = `sa.${serviceAccount._id}`; + distinctId = `sa.${serviceAccount._id.toString()}`; } - - if (serviceTokenData) { - distinctId = `st.${serviceTokenData._id}`; + + if (serviceTokenData?.user && serviceTokenData?.user instanceof User) { + distinctId = serviceTokenData.user.email; + } else if (serviceTokenData?.serviceAccount && serviceTokenData?.serviceAccount instanceof ServiceAccount) { + distinctId = `sa.${serviceTokenData.serviceAccount._id.toString()}`; } if (distinctId === '') { From 5c15fab46ef47180f5ea9054155f704db6b13209 Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 13 Apr 2023 15:24:26 -0700 Subject: [PATCH 4/5] correct HTTPS_ENABLED cast --- backend/src/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/config/index.ts b/backend/src/config/index.ts index 86b8db44e..29f62cdc6 100644 --- a/backend/src/config/index.ts +++ b/backend/src/config/index.ts @@ -60,5 +60,5 @@ export const getHttpsEnabled = () => { return true } - return Boolean(infisical.get('HTTPS_ENABLED')) + return infisical.get('HTTPS_ENABLED') === 'true' && true } \ No newline at end of file From 3b30095629b14611203cd77e3be8b94ae5ab9e5a Mon Sep 17 00:00:00 2001 From: Maidul Islam Date: Thu, 13 Apr 2023 15:31:10 -0700 Subject: [PATCH 5/5] update CF link --- docs/self-hosting/overview.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/self-hosting/overview.mdx b/docs/self-hosting/overview.mdx index a3812974b..8acdad974 100644 --- a/docs/self-hosting/overview.mdx +++ b/docs/self-hosting/overview.mdx @@ -17,7 +17,7 @@ Self-hosted Infisical allows you to maintain your sensitive information within y - 1 DocumentDB instance - Security groups - +