diff --git a/src/gateway/server-startup-bootstrap.ts b/src/gateway/server-startup-bootstrap.ts index b258be360708..6fc41a8be3ea 100644 --- a/src/gateway/server-startup-bootstrap.ts +++ b/src/gateway/server-startup-bootstrap.ts @@ -271,7 +271,7 @@ export async function prepareGatewayServerBootstrap(input: { trustedProxyDeviceAutoApprove.scopes?.some((scope) => scope.trim() === ADMIN_SCOPE) ) { log.warn( - "SECURITY WARNING: gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin; every proxy-authenticated user can auto-approve a new browser device with full admin, and requests without scopes receive full admin automatically. Remove operator.admin to require manual approval until per-identity roles are available.", + "SECURITY WARNING: gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin; every proxy-authenticated user can auto-approve a new browser device with full admin, and requests without scopes receive full admin automatically. Remove operator.admin and grant admin per identity via gateway.auth.identityScopes instead.", ); } const resolvedStartupAuthOverride = startupAuthOverride diff --git a/src/gateway/server.auth.trusted-proxy-device-autoapprove.test.ts b/src/gateway/server.auth.trusted-proxy-device-autoapprove.test.ts index fcc91665a0ce..e02bb17c6e82 100644 --- a/src/gateway/server.auth.trusted-proxy-device-autoapprove.test.ts +++ b/src/gateway/server.auth.trusted-proxy-device-autoapprove.test.ts @@ -212,7 +212,7 @@ describe("trusted-proxy browser device auto-approval", () => { expect( warnings.filter((message) => message.includes( - "SECURITY WARNING: gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin; every proxy-authenticated user can auto-approve a new browser device with full admin, and requests without scopes receive full admin automatically. Remove operator.admin to require manual approval until per-identity roles are available.", + "SECURITY WARNING: gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin; every proxy-authenticated user can auto-approve a new browser device with full admin, and requests without scopes receive full admin automatically. Remove operator.admin and grant admin per identity via gateway.auth.identityScopes instead.", ), ), ).toHaveLength(1); diff --git a/src/security/audit-gateway-config.ts b/src/security/audit-gateway-config.ts index 3cfaa4576f71..5ddbda83fa4c 100644 --- a/src/security/audit-gateway-config.ts +++ b/src/security/audit-gateway-config.ts @@ -373,7 +373,7 @@ export function collectGatewayConfigFindings( detail: "gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin, so every proxy-authenticated user can auto-approve a new browser device with full admin; requests without scopes receive full admin automatically.", remediation: - "Remove operator.admin and approve admin access manually, or use per-identity roles when they become available.", + "Remove operator.admin and approve admin access manually, or grant admin per identity via gateway.auth.identityScopes.", }); } } diff --git a/src/security/audit-gateway-exposure.test.ts b/src/security/audit-gateway-exposure.test.ts index 23e45fabd456..feac5deb9fdc 100644 --- a/src/security/audit-gateway-exposure.test.ts +++ b/src/security/audit-gateway-exposure.test.ts @@ -504,7 +504,7 @@ describe("security audit gateway exposure findings", () => { detail: "gateway.auth.trustedProxy.deviceAutoApprove.scopes includes operator.admin, so every proxy-authenticated user can auto-approve a new browser device with full admin; requests without scopes receive full admin automatically.", remediation: - "Remove operator.admin and approve admin access manually, or use per-identity roles when they become available.", + "Remove operator.admin and approve admin access manually, or grant admin per identity via gateway.auth.identityScopes.", }); });