DEV Community

Cover image for policies.json: así se configura Firefox en la empresa
lu1tr0n
lu1tr0n

Posted on Originally published at elsolitario.org

policies.json: así se configura Firefox en la empresa

Un administrador de TI puede bloquear extensiones, apagar el guardado de contraseñas y forzar actualizaciones en miles de equipos sin tocar una sola máquina: las políticas de Firefox Enterprise hacen eso con un archivo JSON de pocas líneas.

Mozilla las documenta como parte de su oferta Firefox Enterprise, pensada para empresas que necesitan auditar y controlar el navegador en toda la organización. El mecanismo real detrás de esa promesa no es una consola misteriosa, es un archivo llamado policies.json que Firefox lee al iniciar.

TL;DR

  • policies.json es un archivo de configuración que Firefox lee al arrancar y aplica antes de mostrar cualquier ventana.
  • Windows usa plantillas ADMX vía Group Policy o Intune; macOS y Linux leen el mismo JSON desde una carpeta del sistema.
  • Las políticas bloqueadas con Locked:true no pueden revertirse desde about:preferences ni con permisos de administrador local.
  • about:policies muestra en vivo qué directivas están activas y si hubo errores de sintaxis al cargar el archivo.
  • El repositorio policy-templates de Mozilla en GitHub documenta cada clave válida, desde actualizaciones hasta certificados.

¿Qué son las políticas de Firefox Enterprise?

Las políticas de Firefox Enterprise son un conjunto de directivas JSON que Mozilla expone para que un administrador configure, bloquee o despliegue ajustes del navegador en todos los equipos de una organización, sin depender de la interfaz gráfica de cada usuario. Se definen en un archivo policies.json o mediante plantillas ADMX y MDM.

El motor que las interpreta se llama Enterprise Policy Engine y viene integrado en Firefox desde la versión 60, lanzada en 2018. No es un producto aparte que haya que instalar. Cualquier build oficial de Firefox para escritorio, Windows, macOS y Linux, ya sabe leer este archivo; Firefox para Android todavía no soporta policies.json.

El repositorio policy-templates de Mozilla en GitHub es la referencia canónica: ahí viven las plantillas ADMX/ADML para Windows, los perfiles para macOS y la documentación de cada clave JSON válida, con ejemplos listos para copiar.

Firefox lee distribution/policies.json antes de abrir cualquier ventana del navegador.

Por qué importa

Una empresa que no controla su navegador no controla su mayor superficie de ataque. El navegador es donde los empleados pegan credenciales, suben archivos a servicios externos y corren extensiones de terceros con acceso a cada pestaña abierta.

Mozilla construyó su propuesta Enterprise alrededor de marcos regulatorios concretos: DORA y NIS2 en la Unión Europea, GDPR para datos personales, ISO 27001 y SOC 2 para controles de seguridad operativa. Ninguno de esos marcos exige un navegador específico, pero todos exigen poder demostrar qué controles existen y auditarlos. policies.json es, en la práctica, una forma directa de generar esa evidencia, un archivo versionado en Git que un auditor puede leer línea por línea.

Hay además un argumento de independencia técnica que Mozilla repite en su propio sitio: a diferencia de un navegador basado en Chromium, Firefox corre su propio motor, Gecko, así que una vulnerabilidad en el motor de Chrome no afecta automáticamente a la flota de Firefox de una empresa. Diversificar el motor de navegador reduce el riesgo de que un solo exploit tumbe todos los equipos a la vez.

Cómo funciona policies.json por dentro

Cuando Firefox arranca, antes de cargar cualquier perfil de usuario, busca el archivo policies.json en una ruta fija del sistema operativo. Si lo encuentra y el JSON es válido, aplica cada clave como una directiva: oculta un menú, fuerza un valor o bloquea una preferencia para que el usuario no pueda cambiarla ni desde about:config.

La ruta cambia según el sistema:

  • Windows: carpeta distribution junto al ejecutable (C:\Program Files\Mozilla Firefox\distribution\policies.json), o directamente vía Group Policy con las plantillas ADMX importadas en el dominio.
  • macOS: /Applications/Firefox.app/Contents/Resources/distribution/policies.json, o un perfil de configuración distribuido por MDM.
  • Linux: /etc/firefox/policies/policies.json en Debian y Ubuntu, o /usr/lib/firefox/distribution/policies.json en otras distribuciones, según cómo se empaquetó el navegador.

Todo policies.json válido debe tener la clave raíz "policies". Sin ella, Firefox también ignora el archivo completo, igual que con un JSON malformado. Dentro de esa clave raíz entran las decenas de directivas documentadas en policy-templates, desde ajustes triviales (Homepage, NewTabPage) hasta controles de seguridad profundos (SSLVersionMin, DisableSafeMode). No hace falta declarar las que no te interesan. Firefox aplica solo las claves presentes y deja el resto en su valor por defecto.

flowchart TD
A["Firefox arranca"] --> B["Busca distribution/policies.json"]
B --> C{"Archivo valido?"}
C -->|"si"| D["Enterprise Policy Engine aplica cada clave"]
C -->|"no, JSON roto"| E["Ignora el archivo y loguea el error"]
D --> F["Perfil del usuario carga con las restricciones activas"]
Enter fullscreen mode Exit fullscreen mode

Ejemplos prácticos

El policies.json más simple posible desactiva una sola función. Este ejemplo bloquea las actualizaciones automáticas, útil cuando el equipo de TI prefiere empujar versiones probadas manualmente:

{
  "policies": {
    "DisableAppUpdate": true
  }
}
Enter fullscreen mode Exit fullscreen mode

Al reiniciar Firefox y abrir about:preferences#general, la sección de actualizaciones desaparece por completo: no hay botón ni mensaje, porque la clave quedó bloqueada antes de que la interfaz se dibuje.

Un caso más realista combina varias directivas para una política de extensiones. Esta configuración permite solo una extensión específica e impide instalar cualquier otra:

{
  "policies": {
    "ExtensionSettings": {
      "*": {
        "installation_mode": "blocked"
      },
      "uBlock0@raymondhill.net": {
        "installation_mode": "force_installed",
        "install_url": "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi"
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Con esta política, el menú de complementos (about:addons) ya no tiene botón para explorar más complementos, y cualquier intento de arrastrar un .xpi al navegador falla con un aviso de que la instalación está bloqueada por política de la organización.

El tercer ejemplo combina control de red y de certificados, algo típico en empresas que inspeccionan tráfico TLS con un proxy corporativo:

{
  "policies": {
    "Certificates": {
      "ImportEnterpriseRoots": true,
      "Install": ["proxy-ca-corporativa.crt"]
    },
    "DNSOverHTTPS": {
      "Enabled": false,
      "Locked": true
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

ImportEnterpriseRoots le dice a Firefox que confíe en los certificados raíz que ya están instalados en el almacén del sistema operativo, en vez de usar solo el almacén propio de Mozilla. DNSOverHTTPS deshabilitado y bloqueado evita que un empleado lo reactive desde about:config y así sortee la inspección de DNS corporativa.

Cómo empezar

Dependencias antes de arrancar: Firefox 60 o superior instalado (cualquier versión actual lo cumple), permisos de administrador o root en el equipo donde se prueba, y un editor de texto para escribir JSON válido.

En Linux, el camino más directo es crear la carpeta de políticas y el archivo a mano:

sudo mkdir -p /etc/firefox/policies
sudo tee /etc/firefox/policies/policies.json > /dev/null  **💡 Tip:** about:policies también tiene una pestaña "Documentación" con el esquema JSON completo de la versión de Firefox instalada: sirve para validar nombres de clave sin salir del navegador.

Las claves con Locked:true no aparecen editables ni en about:config.

## Casos de uso reales

Mozilla agrupa las políticas más pedidas por empresas reguladas en un puñado de escenarios, documentados en su página de [Firefox Enterprise](https://www.firefox.com/en-US/enterprise/):

- **Prevención de fuga de datos (DLP)**: la clave `WebsiteFilter` o extensiones gestionadas vía `ExtensionSettings` pueden advertir o bloquear acciones hacia dominios no autorizados.
- **Control de herramientas de IA**: con `ExtensionSettings` y `WebsiteFilter` combinados, TI puede permitir, restringir o desactivar por completo el acceso a chatbots de IA desde el navegador corporativo.
- **Modo Lockdown**: endurece el navegador para perfiles de alto riesgo, restringiendo ejecución de scripts en sitios no confiables.
- **Integración con SIEM**: Firefox puede exportar eventos del navegador, como descargas o instalaciones de extensiones, hacia un colector SIEM para auditoría centralizada.
- **Gobierno de extensiones**: una lista blanca o negra organización-wide, igual que el ejemplo de uBlock Origin de la sección anterior, pero aplicada a cientos de equipos a la vez.

## Errores comunes y buenas prácticas

El error más frecuente es un JSON mal formado. Una coma de más o una llave sin cerrar bastan para romperlo. Firefox no avisa con un cuadro de diálogo, simplemente ignora el archivo completo y arranca sin ninguna política aplicada. La única forma de detectarlo es revisar `about:policies` después de cada cambio, nunca asumir que porque el archivo existe, se está usando.

Otro error común es confundir la carpeta `distribution` (donde vive policies.json) con la carpeta del perfil de usuario (`~/.mozilla/firefox/xxxxxxxx.default`): son rutas distintas y poner el archivo en la segunda no tiene ningún efecto.

En entornos con dominio Windows, el orden de precedencia importa. Group Policy siempre gana sobre un policies.json local si ambos definen la misma clave. Si una política parece no aplicarse, lo primero es revisar si una GPO del dominio la está sobrescribiendo.

Buena práctica: usar `Locked:true` solo en las claves que realmente necesitan impedir que el usuario las cambie. Bloquear preferencias que el usuario legítimamente necesita ajustar, como el idioma o el zoom, genera tickets de soporte innecesarios.

> **⚠️ Ojo:** policies.json no cifra ni oculta su contenido. Cualquier usuario con acceso de lectura al sistema de archivos puede abrir el archivo y ver exactamente qué restricciones tiene; no es un mecanismo de seguridad por ofuscación, es configuración declarada.

## Comparativa con alternativas

No todas las empresas necesitan el mismo mecanismo de distribución. La tabla siguiente resume cuándo conviene cada camino, desde un policies.json suelto hasta la oferta on-premises completa que Mozilla anuncia en su sitio.

OpciónCuándo usarlaVentajaLimitación

policies.json localEquipos sueltos, sin dominio, pruebas rápidasNo requiere infraestructura adicional, se versiona en GitHay que distribuir el archivo a mano o con un script propio
Group Policy (ADMX) en WindowsEmpresas con Active Directory ya desplegadoAplicación centralizada y automática a toda la unidad organizativaSolo cubre equipos Windows unidos al dominio
Perfil MDM (macOS / Intune)Flotas de laptops corporativas con MDM existenteSe integra con el mismo pipeline que gestiona el resto del dispositivoRequiere una solución MDM ya contratada y configurada
Firefox Enterprise on-premisesOrganizaciones reguladas que no quieren depender de infraestructura de un terceroConsola, datos y políticas corren en infraestructura propiaMozilla no publica aún precios ni fecha general de disponibilidad

## Profundizando: precedencia y el motor de políticas

Por debajo de policies.json corre el mismo motor, Enterprise Policy Engine, sin importar si la fuente es el archivo JSON, una GPO de Windows o un perfil MDM de macOS: todas terminan convertidas a la misma estructura interna antes de aplicarse. Eso es lo que permite mezclar fuentes sin reescribir código específico por plataforma.

Cuando dos fuentes definen la misma clave, gana la de mayor jerarquía administrativa, no la que se cargó último. En Windows, el orden es GPO de máquina, luego GPO de usuario y por último policies.json local. En macOS y Linux, al no existir GPO, policies.json es la fuente de mayor jerarquía disponible fuera de un MDM.

Enter fullscreen mode Exit fullscreen mode

flowchart LR
A["GPO de maquina Windows"] --> D["Enterprise Policy Engine"]
B["GPO de usuario Windows"] --> D
C["policies.json local"] --> D
E["Perfil MDM macOS"] --> D
D --> F["Configuracion final aplicada al navegador"]




Antes de 2018, Mozilla resolvía esto con autoconfig, archivos .cfg con JavaScript embebido, un mecanismo mucho más frágil: un error de sintaxis en JavaScript podía romper el arranque completo del navegador, mientras que un policies.json inválido simplemente se ignora. El cambio a JSON declarativo fue, en buena medida, una respuesta a años de reportes de bugs por ese motivo.

Una limitación real: policies.json no soporta lógica condicional. No hay forma de decir "aplicá esta política solo si el usuario pertenece al grupo X" dentro del archivo mismo; esa segmentación hay que hacerla afuera, generando un policies.json distinto por grupo y distribuyendo el que corresponda con la herramienta de gestión de configuración que ya use la empresa, sea Ansible, Puppet o Intune.

Como policies.json vive en el sistema de archivos sin firma criptográfica propia, la integridad depende de quién puede escribir en esa carpeta. Un atacante con acceso de escritura a `distribution/` podría, en teoría, forzar `Certificates.ImportEnterpriseRoots` o desactivar `DNSOverHTTPS` para facilitar un ataque de intermediario. Por eso la recomendación habitual es tratar esa carpeta con los mismos permisos que un binario del sistema. Solo una cuenta root o de servicio de gestión de configuración debería poder modificarla, nunca el usuario final.

📖 Resumen en Telegram: [Ver resumen](https://telegra.ph/policiesjson-así-se-configura-Firefox-en-la-empresa-10-14)

Tu próximo paso: creá un policies.json con una sola clave como DisableTelemetry en una máquina de prueba y confirmá el resultado en about:policies antes de tocar un equipo de producción.

## Preguntas frecuentes

### ¿Qué pasa si policies.json tiene un error de sintaxis?

Firefox ignora el archivo completo y arranca sin ninguna política aplicada, sin mostrar un cuadro de diálogo de error. La forma de detectarlo es revisar la pestaña "Errores" en about:policies.

### ¿Las políticas de Firefox Enterprise funcionan sin Active Directory?

Sí. policies.json es un archivo local que Firefox lee aunque el equipo no esté unido a ningún dominio. Group Policy y MDM son capas adicionales, no un requisito.

### ¿policy-templates y policies.json son lo mismo?

No. policies.json es el archivo de configuración en sí. policy-templates es el repositorio de GitHub de Mozilla que documenta cada clave válida y provee las plantillas ADMX para importar esas mismas claves en Group Policy.

### ¿Un usuario puede revertir una política bloqueada en policies.json?

No, si la clave tiene `Locked:true`. Ni desde about:preferences ni desde about:config aparece la opción de cambiarla; queda fija hasta que un administrador modifique el archivo.

### ¿Firefox para Android soporta policies.json?

No, al momento de escribir este artículo el soporte del Enterprise Policy Engine está limitado a las versiones de escritorio: Windows, macOS y Linux.

## Referencias

- [Firefox.com, página oficial de Firefox Enterprise](https://www.firefox.com/en-US/enterprise/): describe la oferta on-premises, DLP nativo y los marcos regulatorios que cubre.
- [Repositorio policy-templates de Mozilla en GitHub](https://github.com/mozilla/policy-templates): documentación completa de cada clave JSON y las plantillas ADMX/ADML oficiales.
- [Mozilla Support](https://support.mozilla.org/en-US/): centro de soporte oficial con guías de configuración para administradores de TI.
- [Wikipedia: Firefox](https://en.wikipedia.org/wiki/Firefox): contexto sobre el motor Gecko y la historia del navegador de Mozilla.

📱 **¿Te gusta este contenido?** Únete a nuestro canal de Telegram [@programacion](https://t.me/programacion) donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Enter fullscreen mode Exit fullscreen mode

Top comments (1)

Collapse
 
eliasdevv profile image
elias-devv •

curious how firefox merges policies.json with existing user prefs on startup, does it reload the JSON each launch or cache it?