OpenZFS cifra datasets, no el pool entero. El pool (etiquetas, metaslab) sigue visible; el contenido de tank/secret no. Sirve en TrueNAS, Proxmox y Linux.

Guías útiles: Ars native encryption, ZFS encrypted backups.

Crear

1
2
zfs create -o encryption=on -o keyformat=passphrase -o keylocation=prompt tank/encrypted
zfs create tank/encrypted/child1

child1 hereda cifrado. No pongas encryption=off en un hijo: OpenZFS no permite “agujero” sin cifrar bajo un padre cifrado.

Keyfile en vez de prompt:

1
2
zfs create -o encryption=on -o keyformat=passphrase \
  -o keylocation=file:///root/zfs.key tank/encrypted

El archivo de la key no va en el dataset cifrado. USB, TPM o un path en otro pool.

Cargar la key al boot

1
2
zfs load-key tank/encrypted
zfs mount tank/encrypted

Sin load-key, el dataset existe y zfs list lo muestra, pero no monta.

Recibir un dataset claro como cifrado

En el primer recv, puedes fijar propiedades de cifrado:

1
2
3
zfs send tank/test@snap1 \
  | zfs recv -o encryption=on -o keyformat=passphrase \
      -o keylocation=file:///path/to/keyfile tank/encrypted

Eso es un receive sin -w. -w (raw) copia el wrapping key del origen: solo aplica si el origen ya estaba cifrado. Detalle en send de dataset sin cifrar a cifrado.

Rotar passphrase (OpenZFS)

En Solaris el comando era zfs key -c. En OpenZFS / Linux / TrueNAS:

1
2
zfs change-key tank/encrypted
zfs get keyformat,keylocation,keystatus tank/encrypted

Keyfile nueva:

1
zfs change-key -o keylocation=file:///media/stick/key tank/encrypted

rekey de wrapping key (no re-cifra todos los bloques; rota la key que envuelve las master keys) es zfs change-key -i según versión — lee zfs change-key de tu man page antes de usarlo en producción.

Ver también: hold de snapshots, backups fuera del host.