From 8086d5fe93c646d98b754907bec1c688dc8508c8 Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Thu, 24 Sep 2026 12:30:41 +0100 Subject: [PATCH 1/2] Add security page --- .github/workflows/validate-translations.yml | 1 + company/security.mdx | 118 +++++++++++++++++++ docs.json | 12 ++ es/company/security.mdx | 120 ++++++++++++++++++++ i18n.json | 1 + i18n.lock | 43 +++++++ 6 files changed, 295 insertions(+) create mode 100644 company/security.mdx create mode 100644 es/company/security.mdx diff --git a/.github/workflows/validate-translations.yml b/.github/workflows/validate-translations.yml index f9e03bc7..fd0c342b 100644 --- a/.github/workflows/validate-translations.yml +++ b/.github/workflows/validate-translations.yml @@ -9,6 +9,7 @@ on: - "openapi/**" - "package.json" - "account/**" + - "company/**" - "admin-api/**" - "api-reference/**" - "components/**" diff --git a/company/security.mdx b/company/security.mdx new file mode 100644 index 00000000..e3eaf620 --- /dev/null +++ b/company/security.mdx @@ -0,0 +1,118 @@ +--- +title: Security +description: How Trophy protects customer data, controls access, and approaches compliance. +og:description: How Trophy protects customer data, controls access, and approaches compliance. +icon: shield-check +--- + +## Data Residency {#data-residency} + +All customer data is stored and processed on cloud infrastructure hosted in London within GDPR compliance. + +Other data residency options are available. [Contact support](mailto:support@trophy.so) to discuss them. + +## Data Security {#data-security} + +### Encryption {#encryption} + +| Control area | Status | Notes | +| --- | --- | --- | +| Encryption in transit (TLS 1.2+) | In place | All API and web traffic uses HTTPS/TLS. | +| Encryption at rest | In place | Application volumes are encrypted. | +| Database encryption at rest | In place | Database volumes and cache stores are encrypted. | +| Secrets management | In place | Environment variables are stored in secure vaults. | + +### Data Classification {#data-classification} + +Trophy processes the following categories of end-user data: + +- User identifiers (anonymous external IDs provided by customers) +- Time zone identifiers (IANA) +- Gamification event data (actions, points, leaderboard ranks, timestamps, and similar events) +- Notification preferences (push notification and email subscription flags) + +By default, Trophy does not store personally identifiable information (PII) directly. It is possible to send the following PII to Trophy, but it is not required: + +- User name +- Email address + +It is also possible to send custom attributes (customer-managed key-value pairs attached to users and events) to Trophy with PII-status determined by the customer use case. + +Trophy processes the following categories of customer data: + +- Customer account and billing information + +Trophy does not have access to customer passwords or credit card data. + +### Data Retention and Deletion {#data-retention-and-deletion} + +- Customer data is retained for the duration of the contract and deleted within 30 days of contract termination on written request. +- You can request deletion of your data at any time by contacting [support@trophy.so](mailto:support@trophy.so). + +### Backups {#backups} + +- Daily automated snapshots of all databases +- Restore procedures are tested annually + +## Access Controls {#access-controls} + +### Internal Access {#internal-access} + +| Control area | Status | Notes | +| --- | --- | --- | +| Role-based access control (RBAC) | In place | Enabled on all cloud providers | +| Multi-factor authentication (MFA) | In place | Enabled on all cloud providers | +| SSO / identity provider | In place | Enabled on relevant internal systems | +| Access reviews | In place | Reviewed annually | + +### Principle of Least Privilege {#principle-of-least-privilege} + +All internal access follows least-privilege principles. Engineers are granted access only to the systems required for their role. Production database access is restricted to senior engineers and requires justification. + +### Customer Data Isolation {#customer-data-isolation} + +Each customer's data is isolated using customer-scoped API keys and row-level filtering. Customers can only access their own data. + +## Application Security {#application-security} + +### Development Practices {#development-practices} + +- All production code undergoes mandatory peer review before merge. +- Branch protection policies enforce this at the repository level, preventing direct commits. +- Dependency vulnerabilities are monitored continuously through GitHub security alerts. +- Secrets are never committed to source control. + +### Vulnerability Management {#vulnerability-management} + +| Control area | Status | Notes | +| --- | --- | --- | +| Dependency vulnerability scanning | In place | Automated on builds | +| Security patch SLA | In place | Critical patches applied within 24 hours | + +### API Security {#api-security} + +- All API access requires authenticated API keys scoped to the customer account. +- API keys can be rotated and revoked at any time in the Trophy dashboard. +- API keys are encrypted before they are stored in the database. +- Rate limiting is applied to all API endpoints to prevent abuse. +- Webhook signature verification is under customer control. Trophy recommends [verifying signatures](/webhooks/security) in webhook endpoints. + +### Web Application Security {#web-application-security} + +- Access to the Trophy dashboard is secured by an identity provider that holds an independent SOC 2 Type II certification. The identity provider manages user authentication, including credential storage, session management, and token issuance. Trophy does not store or handle raw user passwords. +- Dashboard access follows the principle of least privilege. Admin accounts grant and revoke access for other members. +- Multi-factor authentication (MFA) for customer accounts is available [on request](mailto:support@trophy.so). +- Single sign-on (SSO) for customer accounts is available [on request](mailto:support@trophy.so). +- Sessions use short-lived JWT tokens with automatic expiry. +- Customer accounts are fully isolated at the data layer. Authenticated sessions are scoped to the issuing organisation and cannot access data belonging to other customers. +- Application development follows the OWASP Top 10 as a baseline for identifying and mitigating common web application vulnerabilities, including injection attacks, broken authentication, and security misconfiguration. + +## GDPR {#gdpr} + +- Trophy acts as a data processor for customer data under GDPR. +- Trophy is fully compliant with all GDPR practices and procedures for data handling. +- We are happy to enter into a Data Processing Agreement (DPA) with customers. Request one from your account contact. + + + Contact [support@trophy.so](mailto:hello@trophy.so) for a copy of our full security and trust policies. + diff --git a/docs.json b/docs.json index 3d68c002..b8e756f9 100644 --- a/docs.json +++ b/docs.json @@ -118,6 +118,12 @@ "account/branding", "account/billing" ] + }, + { + "group": "Company", + "pages": [ + "company/security" + ] } ] }, @@ -527,6 +533,12 @@ "es/account/branding", "es/account/billing" ] + }, + { + "group": "Empresa", + "pages": [ + "es/company/security" + ] } ] }, diff --git a/es/company/security.mdx b/es/company/security.mdx new file mode 100644 index 00000000..6ce8c2d0 --- /dev/null +++ b/es/company/security.mdx @@ -0,0 +1,120 @@ +--- +title: Seguridad +description: Cómo Trophy protege los datos de los clientes, controla el acceso y + aborda el cumplimiento normativo. +og:description: Cómo Trophy protege los datos de los clientes, controla el + acceso y aborda el cumplimiento normativo. +icon: shield-check +--- + +## Residencia de datos {#data-residency} + +Todos los datos de clientes se almacenan y procesan en infraestructura en la nube alojada en Londres dentro del cumplimiento de GDPR. + +Hay otras opciones de residencia de datos disponibles. [Contacta con soporte](mailto:support@trophy.so) para discutirlas. + +## Seguridad de datos {#data-security} + +### Cifrado {#encryption} + +| Área de control | Estado | Notas | +| --- | --- | --- | +| Cifrado en tránsito (TLS 1.2+) | Implementado | Todo el tráfico de API y web utiliza HTTPS/TLS. | +| Cifrado en reposo | Implementado | Los volúmenes de aplicación están cifrados. | +| Cifrado de base de datos en reposo | Implementado | Los volúmenes de base de datos y almacenes de caché están cifrados. | +| Gestión de secretos | Implementado | Las variables de entorno se almacenan en bóvedas seguras. | + +### Clasificación de datos {#data-classification} + +Trophy procesa las siguientes categorías de datos de usuario final: + +- Identificadores de usuario (IDs externos anónimos proporcionados por los clientes) +- Identificadores de zona horaria (IANA) +- Datos de eventos de gamificación (acciones, puntos, rangos de clasificación, marcas de tiempo y eventos similares) +- Preferencias de notificación (indicadores de suscripción a notificaciones push y correo electrónico) + +Por defecto, Trophy no almacena información de identificación personal (PII) directamente. Es posible enviar la siguiente PII a Trophy, pero no es obligatorio: + +- Nombre de usuario +- Dirección de correo electrónico + +También es posible enviar atributos personalizados (pares clave-valor gestionados por el cliente adjuntos a usuarios y eventos) a Trophy con el estado de PII determinado por el caso de uso del cliente. + +Trophy procesa las siguientes categorías de datos de cliente: + +- Información de cuenta de cliente y facturación + +Trophy no tiene acceso a las contraseñas de clientes ni a los datos de tarjetas de crédito. + +### Retención y Eliminación de Datos {#data-retention-and-deletion} + +- Los datos de clientes se retienen durante la vigencia del contrato y se eliminan dentro de los 30 días posteriores a la terminación del contrato mediante solicitud por escrito. +- Puede solicitar la eliminación de sus datos en cualquier momento contactando a [support@trophy.so](mailto:support@trophy.so). + +### Copias de Seguridad {#backups} + +- Instantáneas automatizadas diarias de todas las bases de datos +- Los procedimientos de restauración se prueban anualmente + +## Controles de Acceso {#access-controls} + +### Acceso Interno {#internal-access} + +| Área de control | Estado | Notas | +| --- | --- | --- | +| Control de acceso basado en roles (RBAC) | Implementado | Habilitado en todos los proveedores de nube | +| Autenticación multifactor (MFA) | Implementado | Habilitado en todos los proveedores de nube | +| SSO / proveedor de identidad | Implementado | Habilitado en sistemas internos relevantes | +| Revisiones de acceso | Implementado | Revisado anualmente | + +### Principio de Mínimo Privilegio {#principle-of-least-privilege} + +Todo el acceso interno sigue los principios de mínimo privilegio. A los ingenieros se les concede acceso únicamente a los sistemas requeridos para su rol. El acceso a la base de datos de producción está restringido a ingenieros senior y requiere justificación. + +### Aislamiento de Datos de Clientes {#customer-data-isolation} + +Los datos de cada cliente están aislados mediante claves API con alcance de cliente y filtrado a nivel de fila. Los clientes solo pueden acceder a sus propios datos. + +## Seguridad de la Aplicación {#application-security} + +### Prácticas de Desarrollo {#development-practices} + +- Todo el código de producción se somete a revisión obligatoria por pares antes de la fusión. +- Las políticas de protección de ramas lo aplican a nivel de repositorio, evitando commits directos. +- Las vulnerabilidades de dependencias se monitorean continuamente mediante alertas de seguridad de GitHub. +- Los secretos nunca se incluyen en el control de versiones. + +### Gestión de vulnerabilidades {#vulnerability-management} + +| Área de control | Estado | Notas | +| --- | --- | --- | +| Escaneo de vulnerabilidades de dependencias | Implementado | Automatizado en compilaciones | +| SLA de parches de seguridad | Implementado | Parches críticos aplicados en 24 horas | + +### Seguridad de API {#api-security} + +- Todo acceso a la API requiere claves de API autenticadas con ámbito limitado a la cuenta del cliente. +- Las claves de API pueden rotarse y revocarse en cualquier momento desde el panel de Trophy. +- Las claves de API se cifran antes de almacenarse en la base de datos. +- Se aplica un límite de solicitudes a todos los endpoints de la API para prevenir abusos. +- La verificación de firma de webhooks está bajo control del cliente. Trophy recomienda [verificar las firmas](/es/webhooks/security) en los endpoints de webhook. + +### Seguridad de aplicaciones web {#web-application-security} + +- El acceso al panel de Trophy está protegido por un proveedor de identidad que posee una certificación SOC 2 Type II independiente. El proveedor de identidad gestiona la autenticación de usuarios, incluyendo el almacenamiento de credenciales, la gestión de sesiones y la emisión de tokens. Trophy no almacena ni maneja contraseñas de usuario sin procesar. +- El acceso al panel sigue el principio de mínimo privilegio. Las cuentas de administrador otorgan y revocan el acceso de otros miembros. +- La autenticación multifactor (MFA) para cuentas de clientes está disponible [bajo solicitud](mailto:support@trophy.so). +- El inicio de sesión único (SSO) para cuentas de clientes está disponible [bajo solicitud](mailto:support@trophy.so). +- Las sesiones utilizan tokens JWT de corta duración con vencimiento automático. +- Las cuentas de clientes están completamente aisladas en la capa de datos. Las sesiones autenticadas tienen un ámbito limitado a la organización emisora y no pueden acceder a datos pertenecientes a otros clientes. +- El desarrollo de aplicaciones sigue el OWASP Top 10 como base para identificar y mitigar vulnerabilidades comunes de aplicaciones web, incluyendo ataques de inyección, autenticación rota y configuración de seguridad incorrecta. + +## GDPR {#gdpr} + +- Trophy actúa como procesador de datos para los datos de clientes según el GDPR. +- Trophy cumple completamente con todas las prácticas y procedimientos del GDPR para el manejo de datos. +- Estamos encantados de firmar un Acuerdo de Procesamiento de Datos (DPA) con los clientes. Solicite uno a su contacto de cuenta. + + + Contacte a [support@trophy.so](mailto:hello@trophy.so) para obtener una copia de nuestras políticas completas de seguridad y confianza. + diff --git a/i18n.json b/i18n.json index 588ac6a5..11da0c05 100644 --- a/i18n.json +++ b/i18n.json @@ -11,6 +11,7 @@ "mdx": { "include": [ "account/*.mdx", + "company/*.mdx", "admin-api/*.mdx", "admin-api/endpoints/points/*.mdx", "admin-api/endpoints/streaks/*.mdx", diff --git a/i18n.lock b/i18n.lock index 463df373..bdae07b3 100644 --- a/i18n.lock +++ b/i18n.lock @@ -7192,3 +7192,46 @@ checksums: content/12: af0feb53dc5665ddb60c7e0bf27f5ba1 content/13: 10e8e9a59847ddd720c6d06b12c7b120 content/14: 9799b973234bf2d10d5c971b267f55a5 + b12885456ed1864406f2ce97d9fcddac: + meta/title: 4b34923fef858a2b9a4a914c3e822889 + meta/description: cabe1c4819aac67ef4b216de43e848e6 + meta/og%3Adescription: cabe1c4819aac67ef4b216de43e848e6 + meta/icon: 4411b430bd6f32cc473899fddcb3723f + content/0: 3de1446c907ea726449066f005efbbdc + content/1: 9c1114c4a96b56a9d36988082867fb9a + content/2: 4e3c48254394049468fe51313878c9e3 + content/3: 5345c4f922a2fb7b0c8654a3471989ac + content/4: 7f8a1ceae4b9cda385fc79e56c4fcd93 + content/5: 31033ba8cdf5b12a289c069c149b9618 + content/6: 7e1deea7042cec2e7d80abd039257a4f + content/7: fc09f49ee728df9d3412ffe86066112c + content/8: 1fd67040516c1a712dc4eabd87830166 + content/9: c918d347b35b89f41c6eeb2810bd483f + content/10: 2408230c588d05860fd25eb5f55c5338 + content/11: f697719766521a2389365f4396dd788c + content/12: a322dd8d71d623c966d4880559e6dbfe + content/13: 936a355223019fb8c5ae7a9dcc39b045 + content/14: 42fbb7764e9f8e74494535ecc9f9a2ca + content/15: ca443c8a177297c51e283907a020f726 + content/16: 7b7766cdf904710cd5fa26dc0b3b2503 + content/17: 462eb78cca682d5fa8dd12ded276a715 + content/18: 8146f2ae449691abbe568d9d6645d865 + content/19: 925161c9f0b0ac4cfa57b1b63f255791 + content/20: 200f0452d03f8d59d1dce97effbaf556 + content/21: 86b43935a5c916acf781559c8431d13b + content/22: ea606c6c2f769dee430d565c78b2384b + content/23: 6dd4920577fbdb678338e268ed1cccbb + content/24: b15e392a1cba3f8edc8e36774ff53997 + content/25: e1ff7669de34060bd8e56c2f721582c1 + content/26: 1eae55014550f66fcf7a968314867700 + content/27: bf188985846fd00d2bf4026f379164a4 + content/28: 500e899b0e6e8243b8e4a0bbb5726ab4 + content/29: 486a211700e759f0e8f8d475aa8855ba + content/30: 3f272c95744ed4401623dad9c324ec8a + content/31: 01bc5f76f5b827cfb45076830a219a7a + content/32: 9497354d005936b3c6052488b8e0bd24 + content/33: f4c9e69fe46c374a0836f8c348908518 + content/34: 8e6479dac30c04886d317cb99924e942 + content/35: f787576def79d901e78006d8ec376ef5 + content/36: 68256a2c31bee1a8202cc744b404e9ea + content/37: bb510f929be90e357007553f458c4a92 From 3b619140c4908cf4f1759b4643ed7e8dd0ad6e57 Mon Sep 17 00:00:00 2001 From: Charlie Hopkins-Brinicombe Date: Thu, 24 Sep 2026 12:35:32 +0100 Subject: [PATCH 2/2] spelling --- styles/config/vocabularies/Trophy/accept.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/styles/config/vocabularies/Trophy/accept.txt b/styles/config/vocabularies/Trophy/accept.txt index 74f11f66..42d286a5 100644 --- a/styles/config/vocabularies/Trophy/accept.txt +++ b/styles/config/vocabularies/Trophy/accept.txt @@ -23,6 +23,7 @@ localStorage shadcn agentic sandboxed +misconfiguration # Markdown rich text _[\w\s]+_