Saltar al contenido

allow, deny, y quién gana

Hay permisos que niegan, y su prioridad no es la que la intuición sugiere. La regla de precedencia, para qué sirve de verdad negar, y el patrón de conceder ancho y recortar.

La regla

Una negación gana sobre cualquier concesión, esté donde esté. No importa el orden en el fichero, ni en qué capability aparezca cada una, ni cuál se escribió antes.

Para qué sirve negar

Si lo no concedido ya está denegado, ¿para qué existe el deny? Tres usos reales:

1 · Recortar un permiso ancho. El caso principal. Conceder lectura del directorio de datos y negar un subdirectorio concreto —el de secretos, el de la caché— es más corto y más claro que enumerar todos los subdirectorios permitidos. Y sobre todo: si mañana aparece un subdirectorio nuevo, queda permitido por defecto en la versión enumerada y también en la recortada, pero en la recortada al menos las exclusiones siguen valiendo.

2 · Poner una barrera que nadie pueda saltarse por accidente. Como la negación gana desde cualquier capability, una negación en un fichero central protege aunque alguien conceda de más en otro. Es útil en equipos: un deny sobre lo que nunca debe abrirse es una barrera que sobrevive a los descuidos.

3 · Las negaciones por defecto de los plugins. Algunos plugins traen negaciones ya puestas para proteger rutas sensibles —ficheros de configuración del sistema, directorios de credenciales— y esas están ahí precisamente porque conceder ancho es lo que la gente hace.

El patrón de conceder y recortar

JSON
{  "identifier": "proyectos",  "windows": ["main"],  "permissions": [    "core:default",    {      "identifier": "fs:allow-read",      "allow": [{ "path": "$APPDATA/proyectos/**" }],      "deny": [{ "path": "$APPDATA/proyectos/**/.secreto/**" }]    }  ]}

Se lee de un vistazo: puede leer los proyectos, menos lo que esté en un directorio de secretos. La alternativa enumerando lo permitido sería más larga y, lo importante, dejaría de proteger en cuanto apareciera una estructura de directorios nueva.

La regla práctica: enumerar lo permitido cuando el conjunto es pequeño y estable; conceder y recortar cuando es grande o cambia.

Cuándo negar es peor

Dos casos en que el deny da una falsa sensación de control:

Cuando lo que hay que hacer es no conceder. Si tu aplicación no necesita leer el disco entero, la respuesta no es concederlo y negar veinte directorios sensibles: es no concederlo. Una lista de negaciones larga suele ser la señal de que la concesión de partida era demasiado ancha.

Cuando la negación es más fácil de esquivar que la concesión de comprobar. Negar por ruta tiene el problema de las representaciones equivalentes —enlaces simbólicos, rutas relativas, distinta escritura de mayúsculas según el sistema de ficheros— y el nivel 30 lo trata en serio. Una negación que se puede rodear escribiendo la ruta de otra forma no es una barrera: es un obstáculo.