Seguridad y Permisos

Por: Artiko
tauriseguridadpermisoscapabilitiescsp

Seguridad y Permisos

Tauri v2 implementa un modelo de seguridad granular. Nada esta habilitado por defecto — debes otorgar permisos explicitamente.

Modelo de seguridad

Limite de confianza

El codigo en el Webview no es confiable. Solo tiene acceso a lo que el Core expone via IPC. Esto significa:

Capas de proteccion

Webview (no confiable)
    ↓ IPC
Capabilities (que puede hacer cada ventana)

Permissions (que comandos estan habilitados)

Scopes (restricciones por recurso)

Core Rust (confiable)

Capabilities

Son archivos JSON en src-tauri/capabilities/ que definen que puede hacer cada ventana:

{
  "identifier": "default",
  "description": "Permisos de la ventana principal",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "fs:allow-read-text-file",
    "dialog:allow-open",
    "store:allow-get",
    "store:allow-set"
  ]
}

Multiples ventanas con permisos diferentes

// capabilities/main.json
{
  "identifier": "main-window",
  "windows": ["main"],
  "permissions": ["core:default", "fs:default", "dialog:default"]
}
// capabilities/settings.json
{
  "identifier": "settings-window",
  "windows": ["settings"],
  "permissions": ["core:default", "store:allow-get", "store:allow-set"]
}

La ventana settings no puede acceder al filesystem ni a dialogos.

Por plataforma

{
  "identifier": "desktop-only",
  "windows": ["main"],
  "platforms": ["linux", "macOS", "windows"],
  "permissions": ["shell:allow-open"]
}

Permisos

Cada plugin define permisos con formato plugin:accion:

FormatoEjemploDescripcion
plugin:allow-comandofs:allow-read-text-fileHabilita un comando
plugin:deny-comandofs:deny-write-fileBloquea un comando
plugin:defaultfs:defaultPermisos por defecto del plugin

Los deny siempre ganan sobre los allow.

Scopes

Restringen que recursos puede acceder un permiso. Ejemplo con filesystem:

{
  "identifier": "default",
  "windows": ["main"],
  "permissions": [
    {
      "identifier": "fs:allow-read-text-file",
      "allow": [
        { "path": "$APPDATA/**" },
        { "path": "$HOME/Documents/**" }
      ],
      "deny": [
        { "path": "$HOME/Documents/privado/**" }
      ]
    }
  ]
}

Variables de scope disponibles:

VariableRuta
$APPDATADirectorio de datos de la app
$HOMEHome del usuario
$DESKTOPEscritorio
$DOWNLOADDescargas
$DOCUMENTDocumentos
$TEMPDirectorio temporal

Content Security Policy (CSP)

Tauri inyecta CSP automaticamente para prevenir XSS. Puedes personalizarlo en tauri.conf.json:

{
  "app": {
    "security": {
      "csp": "default-src 'self'; img-src 'self' https://cdn.ejemplo.com; style-src 'self' 'unsafe-inline'"
    }
  }
}

En desarrollo, el CSP es mas permisivo para facilitar hot reload.

Permisos para comandos propios

Tus comandos tambien necesitan permisos. Crea src-tauri/capabilities/default.json:

{
  "identifier": "default",
  "windows": ["main"],
  "permissions": [
    "core:default",
    "my-app:allow-greet",
    "my-app:allow-login"
  ]
}

Mejores practicas

Resumen


← Sistema de Plugins | Indice | Siguiente: Personalizacion de Ventanas →