Páginas

Mostrando entradas con la etiqueta cifrar. Mostrar todas las entradas
Mostrando entradas con la etiqueta cifrar. Mostrar todas las entradas

sábado, 13 de diciembre de 2025

NFS sobre TLS FreeBSD 14.3

Configurar Cifrado NFS sobre TLS


El tráfico NFS está cifrado. Autenticación sigue siendo AUTH_SYS (UID/GID)

NFS sobre TLS proporciona cifrado en tránsito (cifrado del tráfico RPC/TLS) sin necesidad de Kerberos. Utiliza certificados X.509 (pueden ser auto-firmados para entornos locales).

Preparación (en el servidor y cliente) Resolución DNS correcta (tormenta.local.com -> 192.168.88.160)
El kernel en FreeBSD 14.3 soporta KTLS (está en Generic desde FreeBSD 13+)


En ambos dos editar /etc/rc.conf para habilitar los daemons TLS:

tlsservd_enable="YES"  # Demonio servidor TLS (necesario para mounts TLS)
tlsclntd_enable="YES"  # Demonio cliente TLS


En el servidor tormenta.local.com - 192.168.88.160


Instalar y configurar Unbound en el servidor


Generación y Colocación de Certificados


Generar los certificados y moverlos a la carpeta que tlsservd exige por defecto.

Crear directorio temporal para trabajar

mkdir -p /root/certs-work
cd /root/certs-work

Crear CA

openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt -subj "/CN=HomeLabRootCA"

Crear Certificado Servidor (tormenta)

openssl genrsa -out server.key 4096
openssl req -new -key server.key -out server.csr -subj "/CN=tormenta.local.com"
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

Crear Certificado Cliente (solaris) - se usará luego

openssl genrsa -out client.key 4096
openssl req -new -key client.key -out client.csr -subj "/CN=solaris.local.com"
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt

Instalacion en rutas por defecto del servidor


Crear el directorio

mkdir /etc/rpc.tlsservd

Copiar archivos con los nombres que FreeBSD espera:

cp server.crt /etc/rpc.tlsservd/cert.pem
cp server.key /etc/rpc.tlsservd/certkey.pem
cp ca.crt     /etc/rpc.tlsservd/cacert.pem

Crear lista de revocación vacía (necesaria por defecto)

touch /etc/rpc.tlsservd/crl.pem

Permisos estrictos

chmod 700 /etc/rpc.tlsservd
chmod 600 /etc/rpc.tlsservd/certkey.pem
chmod 444 /etc/rpc.tlsservd/cert.pem
chmod 444 /etc/rpc.tlsservd/cacert.pem

En el cliente (solaris.local.com) IP 192.168.88.51


Preparar directorios y certificados

mkdir /etc/rpc.tlsclntd

Copiar los archivos generados en tormenta hacia solaris y renombrarlos

scp tormenta.local.com:/root/certs-work/client.crt /etc/rpc.tlsclntd/cert.pem
scp tormenta.local.com:/root/certs-work/client.key /etc/rpc.tlsclntd/certkey.pem
scp tormenta.local.com:/root/certs-work/ca.crt /etc/rpc.tlsclntd/cacert.pem

Aplicar permisos estrictos

chmod 700 /etc/rpc.tlsclntd
chmod 600 /etc/rpc.tlsclntd/certkey.pem
chmod 444 /etc/rpc.tlsclntd/cert.pem
chmod 444 /etc/rpc.tlsclntd/cacert.pem
chmod 644 /etc/rpc.tlsclntd/crl.pem

client.crt Es el certificado público del cliente. Identifica quién es el cliente. client.key Es la clave privada del cliente. Nunca debe compartirse. Sirve para firmar la comunicación. cacert.pem Es el certificado de la Autoridad Certificadora. Sirve para que el cliente verifique que el servidor es confiable.

Es importante saber que cambiar la extensión del archivo no cambia su contenido, pero ayuda al software a entender qué formato esperar.

PEM (Privacy Enhanced Mail): Es el formato estándar de texto (Base64) que empieza con 
-----BEGIN CERTIFICATE-----

Verificar que la Clave Privada y el Certificado coinciden

Este es el paso más crítico. Ambos archivos deben tener el mismo "Módulo" (un identificador matemático único). Si los códigos hash que obtienes son idénticos, son pareja.

Ejecuta estos dos comandos:

# Extraer el módulo del certificado público
openssl x509 -noout -modulus -in cert.pem | openssl md5

# Extraer el módulo de la clave privada
openssl rsa -noout -modulus -in certkey.pem | openssl md5

Resultado esperado: Ambos comandos deben devolver exactamente la misma cadena de caracteres (ej. (stdin)= 68b19a0d...). Si son diferentes, esa clave no pertenece a ese certificado.

Verificar que el Certificado fue firmado por la CA

Ahora comprobaremos la cadena de confianza. Queremos confirmar que cert.pem es "hijo" legítimo de cacert.pem. Ejecutando

openssl verify -CAfile cacert.pem cert.pem
cert.pem: OK

Resultado esperado: Deberías ver un mensaje final que diga: cert.pem: OK

Comprobar validez de las fechas

openssl x509 -noout -dates -in cert.pem
notBefore=Dec  9 20:38:11 2025 GMT
notAfter=Dec  7 20:38:11 2035 GMT

Crear lista de revocación vacía (necesaria por defecto)

touch /etc/rpc.tlsservd/crl.pem

Modificar /etc/exports para requerir TLS

Solo la linea V4: puede tener opciones de seguridad.

V4: /nfsv4 -tls
/nfsv4/dellhome		-maproot=root -network 192.168.88.0/24
/nfsv4/poolrecovery 	-maproot=root -network 192.168.88.0/24
/nfsv4/docs 		-maproot=root -network 192.168.88.0/24
/nfsv4/confsolaris 	-maproot=root -network 192.168.88.0/24
/nfsv4/conftormenta 	-maproot=root -network 192.168.88.0/24

Aplicar cambios

service nfsuserd restart
service mountd restart
service nfsd restart

Cliente solaris.local.com (192.168.88.51)


Montar con TLS (temporal)

mount -t nfs -o nfsv4,tls tormenta.local.com:/docs /punto/de/montaje

Permanente (en /etc/fstab)

...
# nfs
tormenta:/poolrecovery    /nisc4    nfs     rw,nfsv4,tls,noatime,bg    	0  	0
tormenta:/confsolaris     /nics4    nfs     rw,nfsv4,tls,noatime,bg	0  	0
tormenta:/docs            /nids4    nfs     rw,nfsv4,tls,noatime,bg    	0  	0
tormenta:/dellhome 	  /nihs4    nfs     ro,nfsv4,tls,noatime,bg	0  	0
mount -a

Servidor - configuración de servicios /etc/rc.conf


NFS y RPC

nfs_server_enable="YES"
nfsv4_server_enable="YES"
nfsuserd_enable="YES"

TLS demonio (servidor)

sysrc tlsservd_enable="YES"

Habilitar Kernel TLS

sysctl kern.ipc.tls.enable=1
echo 'kern.ipc.tls.enable=1' >> /etc/sysctl.conf

Recomendación: La seguridad debe ser en capas (Defensa en profundidad): Firewall + Restricción de IP NFS + Certificados TLS.

sysrc statd_enable="YES"   # Para bloqueo de archivos (opcional pero recomendado)
sysrc lockd_enable="YES    # Para bloqueo de archivos 
sysrc mountd_flags="-r"    # Recarga automatica al compartir datasets

Iniciar servicios

service tlsservd start
service nfsuserd restart
service mountd restart
service nfsd restart

Cliente (solaris.local.com) Configuración (/etc/rc.conf)

nfs_client_enable="YES"
nfsv4_client_enable="YES"
nfsuserd_enable="YES"

# TLS demonio (cliente)
tlsclntd_enable="YES"

Iniciar servicios

service nfsclient start
service nfsuserd start

Habilitar Kernel TLS

sysctl kern.ipc.tls.enable=1
echo 'kern.ipc.tls.enable=1' >> /etc/sysctl.conf

Iniciar cliente

service nfsuserd start
service tlsclntd start

Prueba de montaje

mkdir -p /mnt/docs
mount -t nfs -o nfsv4,tls 192.168.88.160:/docs /mnt/docs

Verificar cifrado

root@solaris:~# nfsstat -m
tormenta:/docs on /nids4
nfsv4,minorversion=2,tcp,resvport,tls,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=16777216,timeout=120,retrans=2147483647

Debe aparecer tls en las banderas (flags)

nfsstat -m
root@solaris:~# nfsstat -m
tormenta:/poolrecovery on /nisc4
nfsv4,minorversion=2,tcp,resvport,tls,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=16777216,timeout=120,retrans=2147483647

tormenta:/confsolaris on /nics4
nfsv4,minorversion=2,tcp,resvport,tls,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=16777216,timeout=120,retrans=2147483647

tormenta:/docs on /nids4
nfsv4,minorversion=2,tcp,resvport,tls,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=16777216,timeout=120,retrans=2147483647

tormenta:/dellhome on /nihs4
nfsv4,minorversion=2,tcp,resvport,tls,nconnect=1,hard,cto,sec=sys,acdirmin=3,acdirmax=60,acregmin=5,acregmax=60,nametimeo=60,negnametimeo=60,rsize=65536,wsize=65536,readdirsize=65536,readahead=1,wcommitsize=16777216,timeout=120,retrans=2147483647

Regla simple:

tlsservd (TLS Server Daemon): Es para la máquina que OFRECE los archivos (el Servidor). Escucha las peticiones de cifrado entrantes.
tlsclntd (TLS Client Daemon): Es para la máquina que MONTA los archivos (el Cliente). Inicia la petición de cifrado hacia afuera.

Verificar con tcpdump que el tráfico NFS sobre TLS está cifrado

Una vez que el montaje NFS con TLS funciona correctamente, se puede confirmar que el tráfico está realmente cifrado ejecutando tcpdump en el servidor o en el cliente.

Comando básico (en servidor)

tcpdump -i re0 -nn port 2049

O más específico, ver sólo NFS

tcpdump -i re0 -nn port 2049 and host 192.168.88.51

Qué esperar

Si TLS está funcionado correctamente - cifrado activo Verás paquetes TCP en el puerto 2049 Después del handshake TLS inicial, todo el payload de los paquetes estará cifrado.

...
13:35:28.349050 IP 192.168.88.160.2049 > 192.168.88.51.773: Flags [P.], seq 469255:469785, ack 251188, win 29128, options [nop,nop,TS val 505937474 ecr 417283551], length 530
13:35:28.349301 IP 192.168.88.51.773 > 192.168.88.160.2049: Flags [.], ack 469785, win 4344, options 
...

No verás texto legible como nombre de archivos, rutas, ni datos de ficheros. Todo será binario cifrado.

Ejemplo típico de texto claro

NFS request xid ... read fh .../poolrecovery/backup-2025-12-10.gz offset 0 count 32768
Comando más detallado para ver el handshake TLS
tcpdump -i re0 -nn -s 0 -A port 2049
-i <interfaz>
-A imprime cada paquete en formato ASCII (crucial para leer contenido)
-n No convierte direcciones IP a nombres de host (más rápido)

En el cliente solaris echo 'Garantizar cifrado' > /nids4/prueba.txt no podrás ver ni el nombre del archivo ni su contenido.

...
14:10:09.830256 IP 192.168.88.160.2049 > 192.168.88.51.890: Flags [P.], seq 1:115, ack 162, win 29128, options [nop,nop,TS val 3871689747 ecr 1810578769], length 114
E....V..@.....X...X3...z.C........q.2......
...
tcpdump -i re0 -nn port 2049 -c 50

Genera activida en el cliente solaris

ls -ltr /nihs4
...
14:12:35.627829 IP 192.168.88.160.2049 > 192.168.88.51.698: Flags [.], ack 230, win 29128, options [nop,nop,TS val 1928012123 ecr 3657311778], length 0
14:12:35.628036 IP 192.168.88.160.2049 > 192.168.88.51.698: Flags [P.], seq 1:303, ack 230, win 
...

Si solo ves números de secuencia y longitudes, sin nombres de archivos -> cifrado Si ves rutas y operaciones NFS -> sin cifrado (TLS inactivo).

FreeBSD es genial!.

sábado, 14 de diciembre de 2024

Replicación de datos ZFS FreeBSD

Bibliografía:
klarasystems.com
Klara Inc. Allan Jude y Jim Salter
iceflatline.com
Illumos ZFS Administracion

Diagrama Dia

Replication ZFS en FreeBSD

Lo que hace la replicación ZFS es poder serializar un sistema de archivos. Cuando serializa un objeto en ciencia de datos o programación de computadoras se trata de hacerlo en formato que pueda transportarse con facilidad de tal manera que podamos recrear ese sistema de archivos en el otro lado, de forma que nos permite cruzar sistemas operativos, no importa si la fuente es FreeBSD y el destino es Linux, Illumos, Mac o Windows, etc.

Recrea el sistema de archivo exactamente igual sin depender que sea byte por byte. Eso también proporciona compatibilidad hacia delante y hacia atrás, puede hacer una transmisión ZFS 10 con la última versión de ZFS y aún recibirlo con una versión de ZFS de hace 10 años o viceversa.

Otra cosa importante sobre la forma en que esto funciona en la replicación ZFS es que es unidireccional, por lo que el remitente controla todo lo que empaqueta el sistema de archivos en el formato serializado y lo enviará, no requiere ninguna interacción con el lado que lo va a recibir, lo que significa que no tiene que recibirlo ahora mismo.

Lo interesante sobre la forma en que esto funciona es que no requiere un manejo especial para cosas como permisos, atributos extentidos de ACLS y cualquier otra cosa que pueden estar adjuntos al sistema de archivos, todos son sólo datos que se serializan de la misma manera que el contenido de los archivos, por lo que ZFS no tiene que realizar comprobaciones adicionales ni nigún trabajo extra, simplemente envía los datos y el resto, el lado es responsable de interpretarlo, por lo que si usa algunas de las herramientas de depuración de ZFS podemos ver lo que hay dentro de una secuencia de envío, pero básicamente es un comando de objeto que dice que necesitamos crear un nuevo objeto.

Como toda copia de seguridad todavía debe probar y asegurarse de que puede restaurar el sistema de archivos desde su copia de seguridad.

Sumas de Verificación de un Extremo a Otro

ZFS utiliza sumas de verificación de extremo a extremo por lo que sabemos que ZFS almacena una suma de verificación para cada bloque en el que escribe incluido sus propios metadatos internos. Antes de enviar ZFS se asegura de que los datos que está a punto de enviar son correctos comprobando la suma de verificación, luego los envía con la suma de verificación para que cuando llegue al otro lado verificar que lo que recibe sigue siendo los datos correctos. Después se escriben en disco y al volver a leerlos desde la copia de seguridad verifica de nuevo que sigue siendo la misma suma de verificación y que los datos sobrevivieron intactos. Si los datos están cifrados, también hay un código de verificación allí, asegurándose de que no solo los datos estén intactos sino también que no han sido modificados maliciosamente porque verifica que se descibra correctamente.

¿Que ocurre si por algún motivo se interrumpe la replicación?.

En el lado receptor aparece una propiedad llamada token de reanudación y contiene en qué instantánea estábamos, en que objeto en esa instantánea, que tan lejos en ese objeto y permite reanudar esa replicación. Si ejecutamos

  zfs get -H receive_resume_token zroot/backup
 zstream token 1-ca6584b3f-c0-bb2...
 object: 128
 offset: 1507590144
 bytes: 1511357704
 toguid: 2687048938072742180
 toname: 'zroot/usr/home@snap-20241214'
 

Nos dará una cadena, vemos que estamos enviando el objeto 128, este desplazamiento de 1.5 GB y que tenemos otros 1.5 GB para enviar, la cuadrícula de la instantánea y el nombre de la instantánea.

Como toda copia de seguridad todavía debe probar y asegurarse de que puede restaurar el sistema de archivos desde su backup

En el lado de envío (origen) se utiliza:

zfs send -t receive_resume_token 1-ca6584b3f-c0-bb2...

El token contiene el resto de la información sobre exactamente desde dónde continuar y dejaremos que este envio continue.

Conectar al servidor tormenta vía SSH desde el cliente solaris

El archivo de hosts contiene información sobre los hosts conocidos en la red.

Archivo /etc/hosts

cat /etc/hosts| grep tormenta
192.168.88.160   tormenta

Archivo ~/.ssh/config

$ cat .ssh/config
Host tormenta
	HostName 192.168.88.160
	User carlos
	Port 30000
	AddressFamily inet
	BindInterface em0
	CheckHostIP yes
...
$ ssh tormenta
Last login: Sat Dec 14 06:50:20 2024 from solaris
...

Compruebe que el ssh basado en clave funciona

Copiar la clave publica id_rsa.pub del cliente en el archivo authorized_keys de su cuenta en el servidor

 ssh-keygen

 cat ~/.ssh/id_rsa.pub | ssh remote_host "cat >> .ssh/authorized_keys"

 ssh tormenta
 
 carlos@tormenta:~ %

Particionar el Disco Para las Copias de Seguridad

El disco debe estar desmontado, para averiguar el punto de montaje se utiliza mount y unmount para desmontarlo.

Es importante asegurarse del disco sobre el que va a trabajar. Para ello dispone de múltiples opciones.

 gpart
 gpart show

 lsblk
 lsblk -d
 
 Mostrar discos físicos
 sysctl kern.disks

Y por último usando dmesg para identificar discos conectados, por ejemplo, si conecta un dispositivo de almacenamiento vía USB aparece al final del archivo dmesg

 /sbin/dmesg | tail
 

Preparar el dispositivo de almacenamiento

El comando gpart destroy DESTRUYE EL ESQUEMA DE PARTICIONAMIENTO implementado por GEOM. Es un proceso irreversible. Destruye todos los datos. -F Fuerza la destrucción de la tabla de particiones incluso si no está vacía.

Ya conoce el disco a particionar?

En esta laboratorio es (da1) /dev/da1 de 2 TB con una capacidad real de 1862 GB (2x0.9313 = 1.862 TB = 1862 GB)

gpart destroy -F /dev/da1

gpart create -s gpt /dev/da1
gpart add -t freebsd-zfs -a 1m da1
da1p1 created

zpool create backups /dev/da1p1

zpool set autoexpand=on backups
zpool set listsnapshots=on backups

zfs set mountpoint=/export backups

Consultar propiedades

zfs get mountpoint,name backups
NAME     PROPERTY    VALUE       SOURCE
backups  mountpoint  /export     local
backups  name        backups     -

Crear Conjunto de Datos en pool backups

zfs create -p backups/usr/backup/docs
zfs create backps/usr/home
zfs create -p backups/solarishome/home
zfs create -p backups/recovery/solaris
zfs create backups/recovery/tormenta
zfs create backups/reserved

Listar recursivamente backups

zfs list -r backups
NAME                             USED  AVAIL     REFER  MOUNTPOINT
backups                          480G  1.29T      192K  /export
backups/recovery                 330G  1.29T       96K  /export/recovery
backups/recovery/solaris        67.9G  1.29T     67.9G  /export/recovery/solaris
backups/recovery/tormenta        262G  1.29T      262G  /export/recovery/tormenta
backups/reserved                  96K  1.34T       96K  /export/reserved
backups/solarishome             62.8G  1.29T       96K  /export/solarishome
backups/solarishome/home        62.8G  1.29T     40.4G  /export/solarishome/home
backups/usr                     7.78G  1.29T       96K  /export/usr
backups/usr/backup              7.78G  1.29T       96K  /export/usr/backup
backups/usr/backup/docs         7.78G  1.29T     7.78G  /export/usr/backup/docs
backups/usr/home                6.14M  1.29T     5.97M  /export/usr/home

Listar recursivamente pool zroot servidor tormenta

zfs list -r zroot 
NAME                                   USED  AVAIL   REFER  MOUNTPOINT
zroot                                  170G   264G    112K  /zroot
zroot/ROOT                            40.8G   264G     96K  none
zroot/ROOT/default                    40.8G   264G   36.0G  /
zroot/confsolaris                     1.16M   264G   1.16M  /zroot/confsolaris
zroot/jails                           1.25G   264G     96K  /jails
zroot/jails/loghost                   1.25G   264G   1.25G  /jails/loghost
zroot/jails/media                       96K   264G     96K  /jails/media
zroot/reserved                          96K   289G     96K  /zroot/reserved
zroot/tmp                             2.87G   264G   2.87G  /tmp
zroot/usr                             90.7G   264G     96K  /usr
zroot/usr/backup                      88.5G   264G    128K  /usr/backup
zroot/usr/backup/confiles              284M   264G     96K  /usr/backup/confiles
zroot/usr/backup/confiles/tormenta    4.71M   264G    860K  /usr/backup/confiles/tormenta
zroot/usr/backup/docs                 7.78G   264G   7.78G  /usr/backup/docs
zroot/usr/home                        6.57M   264G   4.82M  /usr/home
zroot/usr/ports                        924M   264G    924M  /usr/ports
zroot/usr/src                         1.26G   264G   1.26G  /usr/src
zroot/var                             1.27G   264G     96K  /var
zroot/var/audit                         96K   264G     96K  /var/audit
zroot/var/crash                         96K   264G     96K  /var/crash
zroot/var/db                            96K   264G     96K  /var/db
zroot/var/jail                        1.26G   264G     96K  /var/jail
zroot/var/jail/www                    1.26G   264G   1.26G  /var/jail/www
zroot/var/log                         3.86M   264G   2.64M  /var/log
zroot/var/mail                         144K   264G    144K  /var/mail
zroot/var/tmp                          152K   264G     96K  /var/tmp

Exportar e Importar backups

Esto asegura que el pool se cierre correctamente y se liberen todos los recursos asociados. Luego, el disco puede ser desconectado de forma segura.

zpool export backups

Grupos disponibles para importar


zpool import
  pool: backups
     id: 10639314260213971789
  state: ONLINE
 action: The pool can be imported using its name or numeric identifier.
 config:

	backups     ONLINE
	  da0p1     ONLINE
zpool import backups	  

Listar Información Sobre los Grupos de Almacenamiento ZFS

zpool list 
NAME      SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH
backups  1.81T   430G  1.39T        -         -     0%    23%  1.00x    ONLINE
zroot     448G   142G   306G        -         -     4%    31%  1.00x    ONLINE

Disponible para importar

zpool import
no pools available to import

Crear las instantáneas

Para crear instantáneas y todos sus sistemas de archivos descendientes se utiliza -r Crear las instantáneas de los conjunto de datos zroot/usr/backup/docs y zroot/usr/home

zfs snapshot -r zroot/usr/home@snap-`date +%Y%m%d`
zfs snapshot -r zroot/usr/backup/docs@snap-`date +%Y%m%d`

Listar instantáneas creadas

zfs list -t snapshot zroot/usr/home@snap-20241213
NAME                           USED  AVAIL     REFER  MOUNTPOINT
zroot/usr/home@snap-20241213   172K      -     5.97M  -

zfs list -t snapshot zroot/usr/backup/docs@snap-20241213
NAME                                  USED  AVAIL     REFER  MOUNTPOINT
zroot/usr/backup/docs@snap-20241213   216K      -     7.78G  -

Enviar la primera instantánea completa

-R con el comando zfs send. Esta opción preservará las propiedades ZFS de cualquier conjunto de datos, instantáneas y clones descendientes en la secuencia.
-d Utilice la ruta completa de la instantánea enviada sin el primer elemento (sin el nombre del grupo) para determinar el nombre de la nueva instantánea
-u No montar el flujo recibido
-v Imprime información detallada sobre la secuencia y el tiempo necesario para realizar la operación de recepción

En el primer envío se utiliza la ruta de destino completa (backups/usr/backup/docs)
En el flujo incremental sólo se utiliza el nombre del pool (backups)

zfs send -R -v zroot/usr/home@snap-20241213 | zfs receive -vd backups/usr/home
zfs send -R -v zroot/usr/backup/docs@snap-20241213 | zfs receive -vdF \
backups/usr/backup/docs

Envío incremental

Tenga en cuenta que el envío de un flujo incremental sólo tendrá éxito si ya existe una instantánea completa inicial en el lado receptor.

Envía todos los bloques que tienen una hora de creacion entre zroot@snap-20241213 y zroot@snap-20241214, se serializan y envían al otro lado que ya tiene zroot@snap-20241213 por lo que puede aplicar los cambios y tener eso también sin tener que mirar lo que hay en zroot@snap-20241213, al contrario que rsync que tiene que revisar archivo por archivo.

Si recibe un error como este al realizar una replicación incremental: "No se puede recibir el flujo incremental las copias de seguridad de destino se han modificado desde la snapshot más reciente", es decir, que las instantáneas de origen y destino ya no son idénticas ZFS aborta la replicación. Use receive -F para forzar al sistema receptor a retroceder al estado de la última instantánea recibida para que los sistemas estén nuevamente sincronizados.

Tomar las instantáneas

zfs snapshot zroot/usr/home@snap-`date +%Y%m%d`
zfs snapshot zroot/usr/backup/docs@snap-`date +%Y%m%d`

Listar instantáneas creadas

zfs list -t snapshot zroot/usr/home@snap-20241213
NAME                           USED  AVAIL   REFER  MOUNTPOINT
zroot/usr/home@snap-20241214   172K      -   5.97M  -

zfs list -t snapshot zroot/usr/backup/docs@snap-20241213
NAME                                  USED  AVAIL   REFER  MOUNTPOINT
zroot/usr/backup/docs@snap-20241214   216K      -   7.78G  -

Enviar el flujo de datos

-F Fuerce una reversión del sistema de archivos a la instantánea más reciente antes de realizar la operación de recepción. Si recibe un flujo de replicación incremental (por ejemplo, uno generado por zfs send -R [-i|-I]), destruya las instantáneas y los sistemas de archivos que no existan en el lado de envío.

zfs send -R -i zroot/usr/home@snap-20241213 zroot/usr/home@snap-20241214 | zfs \
>receive -vdF backups
zfs send -R -i  zroot/usr/backup/docs@snap-20241213 \
zroot/usr/backup/docs@snap-20241214 | zfs receive -vdF backups

Replicación remota a través de SSH

Origen FreeBSD solaris, destino backups servidor tormenta

Tomar la instatánea del conjunto de datos zroot/home

solaris~ # zfs snapshot zroot/home@snap-`date +%Y%m%d`
 

Listar instantánea

solaris~ # zfs list -t snapshot zroot/home@snap-20241213
NAME                       USED  AVAIL  REFER  MOUNTPOINT
zroot/home@snap-20241213  25.4M      -  39.2G  -
solaris~ # zfs send -Rv zroot/home@snap-20241213 | ssh root@tormenta "zfs \
receive -vdF backups/solarishome/home"
 

Replicación remota incremental

Tomar la instantánea

solaris~ # zfs snapshot zroot/home@snap-`date +%Y%m%d`

Listar las intantáneas

solaris~ # zfs list -t snapshot | grep "zroot/home@snap-*"   
zroot/home@snap-20241213           185M      -  39.2G  -
zroot/home@snap-20241214            53.4M    -  39.2G  -

Replicar el flujo de datos

 solaris~ # zfs send -R -v zroot/home@snap-20241213 zroot/home@snap-20241214 | \
 ssh root@tormenta "zfs receive -vdF backups"

Exportar e importar pool backups

 zfs export backups
 zfs import backups
 

Donde están las instantáneas?

Conectarse al servidor tormenta vía SSH

solaris~ $ ssh tormenta
carlos@tormenta~ $ % ls -l /export/solarishome/home/.zfs/snapshot
total 1
drwxr-xr-x  5 root  wheel  5 May 30  2024 snap-20241213
drwxr-xr-x  5 root  wheel  5 May 30  2024 snap-20241214

carlos@tormenta~ $ % ls -l /export/usr/home/.zfs/snapshot
total 1
drwxr-xr-x  4 root  wheel  4 Jul 24 17:31 snap-20241213
drwxr-xr-x  4 root  wheel  4 Jul 24 17:31 snap-20241214

carlos@tormenta:~ % ls -l /export/usr/backup/docs/.zfs/snapshot
total 289
drwxr-xr-x  30 carlos  wheel  923 Dec 12 08:19 snap-20241212
drwxr-xr-x  30 carlos  wheel  926 Dec 13 07:34 snap-20241214

carlos@tormenta:~ % zfs list -t snapshot -o name | grep "zroot/usr/backup/docs@snap-"
zroot/usr/backup/docs@snap-20241213    248K    -   7.78G  -
zroot/usr/backup/docs@snap-20241214    216K    -   7.78G  -

carlos@tormenta:~ % zfs list -t snapshot -o name | grep "zroot/usr/home@snap-"
zroot/usr/home@snap-20241213    172K    -   5.97M  -
zroot/usr/home@snap-20241214    172K    -   5.97M  -

Listar todas las instantáneas en backups

carlos@tormenta:~ % zfs list -t snapshot -r backups
NAME                                     USED  AVAIL   REFER  MOUNTPOINT
backups/solarishome/home@snap-20241213  22.5G      -   62.8G  -
backups/solarishome/home@snap-20241214     0B      -   40.4G  -
backups/usr/backup/docs@snap-20241213    276K      -   7.78G  -
backups/usr/backup/docs@snap-20241214      0B      -   7.78G  -
backups/usr/home@snap-20241213           172K      -   5.97M  -
backups/usr/home@snap-20241214             0B      -   5.97M  -

Tenga en cuenta las siguientes consideraciones al restaurar una instantánea:

. Se restaura la instantánea y el sistema de archivos.
. El sistema de archivos y todos los sistemas de archivos descendientes se desmontan.
. Los sistemas de archivos son inaccesibles mientras se restauran.
. El sistema de archivos original que e va a restaurar no debe exister mientras está siendo restaurado.
. Si existe un nombre de sistema de archivos en conflicto, puede utilizarse zfs rename para cambiar el nombre del sistema de archivos.

Restaurar instantánea de forma remota

-d Utilice la ruta completa de la instantánea enviada sin el primer elemento (sin el nombre del grupo) para determinar el nombre de la nueva instantánea.

 
ssh root@tormenta "zfs send -Rv backups/filesolaris/confsolaris@snap-20241215" \
| zfs receive -vFd zroot

full send of toshiba/filesolaris/confsolaris@snap-20241215 estimated size is 1.20M
total estimated size is 1.20M
receiving full stream of toshiba/filesolaris/confsolaris@snap-20241215 into \
zroot/filesolaris/confsolaris@snap-20241215
received 1.20M stream in 0.06 seconds (19.0M/sec)

Recuperar el flujo de datos desde tormenta (pool backups) a solaris

solaris~ # ssh root@tormenta "zfs send -Rv backups/usr/backup/docs@snap-20241216" \
zfs receive zroot/documentos

full send of toshiba/usr/backup/docs@snap-20241216 estimated size is 7.88G
send from @snap-20241216 to toshiba/usr/backup/docs@snap-20241217 estimated size is 105K
total estimated size is 7.88G
TIME   SENT   SNAPSHOT toshiba/usr/backup/docs@snap-20241216
...

 zfs list | grep "zroot/documentos"
zroot/documentos    96K   330G   96K  /zroot/documentos

Enviar el flujo de datos a un archivo

zfs send zroot/usr/home@-20241222-snap1 > usr.home.20241222.servidor

Podemos utilizar el comando receive y proporcionar el grupo en el que desea importarlo y podría ser un grupo completamente diferente, y es probablemente la principal razon por la que usarias esto para transferir un conjunto de datos a otro sistema, especifica el grupo y el conjunto de datos al que desea importarlo, si no proporciona uno simplemente creará un conjunto de datos con el nombre que se usó desde el momento en que se creo la instantánea. Ahora, usando cat nombre del archivo y canalizarlo a través de una tuberia a zfs receive, se creará un nuevo conjunto de datos llamado zroot/homeservidor

 cat usr.home.20241222.tormenta | zfs receive zroot/home.20241222.servidor

Listar el conjunto de datos
 zfs list | grep "zroot/homeservidor"
zroot/homeservidor  4.82M  264G  4.82M  /zroot/home.20241222.servidor


Otro ejemplo de envío y recepción de datos ZFS:

El comando zfs send crea una representación de flujo de una instantánea que está escrita, a la salida estándar. Puede redirigir la salida a un archivo o a un sistema diferente. El comando zfs receive crea una instantánea cuyo contenido se especifica en la secuencia que se proporciona en la entrada estándar. Si se recibe una transmisión completa, un nuevo sistema de archivos también se crea.

Creacion de los conjuntos de datos

 zfs -p create zroot/usuarios/user1
 zfs create zroot/usuarios/user2
 zfs create zroot/usuarios/user3

 zfs list -r zroot/usuarios
 NAME                   USED  AVAIL  REFER  MOUNTPOINT
 zroot/usuarios        63.5M   351G  63.2M  /zroot/usuarios
 zroot/usuarios/user1    96K   351G    96K  /zroot/usuarios/user1
 zroot/usuarios/user2    96K   351G    96K  /zroot/usuarios/user2
 zroot/usuarios/user3    96K   351G    96K  /zroot/usuarios/user3

Tomar las instantáneas

 zfs snapshot -r zroot/usuarios@hoy

Se crea una secuencia de replicación para todas las instantáneas de usuarios

 zfs send -R zroot/usuarios@hoy > /snaps/usuarios

A continuación, los sistemas de archivos originales y las instantáneas se destruyen

 zfs destroy -r zroot/usuarios
 zfs list -r zroot/usuarios
 cannot open 'zroot/usuarios': dataset does not exist

Y luego se recuperan

 zfs receive -Fd zroot < /snaps/usuarios
 zfs list -r zroot/usuarios
 NAME                   USED  AVAIL  REFER  MOUNTPOINT
 zroot/usuarios        63.6M   351G   112K  /zroot/usuarios
 zroot/usuarios/user1    96K   351G    96K  /zroot/usuarios/user1
 zroot/usuarios/user2    96K   351G    96K  /zroot/usuarios/user2
 zroot/usuarios/user3    96K   351G    96K  /zroot/usuarios/user3
FreeBSD es genial!.

martes, 11 de julio de 2023

Servidor VPN con ZeroTier FreeBSD Raspberry Pi

Para crear una VPN se necesita:

1.- Un Servidor VPN
2.- Configuración de los clientes VPN
3.- Servicio DDNS (para conocer la IP pública de nuestro servidor)
4.- Abrir los puertos en el Router y poder acceder desde el exterior al servidor VPN
5.- No estar detrás de un CG-NAT.

Como acceder a nuestra red de una manera segura, cifrada (cifrado de 256 bits), saltándonos el CG-NAT en caso de que nuestro proveedor de Internet lo utilice, sin abrir puertos y sin servicio DDNS?.

La respuesta es el servicio ZeroTier, (SD-WAN), gratuito para uso personal (25 dispositivos). Con ZeroTier podremos unir equipos, unir redes, tanto si están dentro de la red como fuera de la misma. Podremos acceder desde cualquier ordenador, teléfono, cualquer dispositivo que tengamos dentro de nuestra red pero desde fuera de la red.

Para conseguirlo utilizaremos una raspberrypi (Raspberry Pi 3B) y la convertimos en un servidor VPN. Instalamos el sistema operativo raspbian en un disco externo SSD Intel de 40GB. No es necesario configurar una dirección estática porque no se usa el reenvío de puertos en el Router. Y sí, necesitamos el acceso vía SSH por lo que lo habilitaremos.

La red virtual asignada por ZeroTier es la 192.168.192.0/24, también puede crear su propia red o elegir otra red de las ofrecidas por ZeroTier desde su panel dec control. Debe ser una subred diferente a la subred que tenemos. Por ejemplo, yo tengo la subred 192.168.88.0/24 que no coincide con la red virtual de ZeroTier, la 192.168.192.0/24.

La dirección IP de mi servidor VPN es 192.168.8.12 accedemos a través de un portátil FreeBSD a la Raspberry Pi a través de la red.


% ssh carlos@192.168.88.12

ifconfig servidor VPN

ifconfig solaris FreeBSD

Como utilizaremos Zerotier para construir nuestro propio servidor VPN nos vamos a la página principal de ZeroTier, nos registramos (gratuito para uso personal y menos de 25 computadoras), habilitamos 2 factor authentication, creamos una Red y utilizamos el Network ID o identificador de red para conectar los clientes a esa red.


 

ZeroTier permite enrutar entre una red física y una red privada virtual para que los dispositivos remotos puedan acceder a los recursos locales a través de Internet.

Instalar Zerotier


carlos@raspberrypi3:~ $ sudo apt install zerotier-one

Unirse a la red


carlos@raspberrypi3:~ $ sudo zerotier-cli join 565799d8f6259736
	
carlos@raspberrypi3:~ $ sudo zerotier-cli status
200 info 7dd6...... 1.10.6 ONLINE

Listar redes


carlos@raspberrypi3:~ $ sudo zerotier-cli listnetworks
200 listnetworks <nwid> <name> <mac> <status> <type> <dev> <ZT assigned ips>
200 listnetworks 565799d8f6259736 home_arpa 4e:0c:37:66:55:d8 OK PRIVATE zt2lrsbp44 fccc:d2b0:827d:d6b6:9b19::1/40,192.168.192.119/24

Mostrar información de estado


carlos@raspberrypi3:~ $ sudo zerotier-cli info
200 info 7dd....... 1.10.6 ONLINE

Conexión peer to peer listar peers


carlos@raspberrypi3:~ $ sudo zerotier-cli listpeers

A continuación vamos a la página de Zerotier nos logueamos y permitimos que esa computadora se una a la red de zerotier (autorizar - Auth?) y le ponemos un nombre para identificarlo. Repetimos lo mismo para los demás dispositivos (teléfono móvil, iPads, PC, etc.).

Instalar ZeroTier en FreeBSD 13.1


# pkg install zerotier
# sysrc zerotier_enable=YES

Iniciar el servicio


# service zerotier start

Unirse a la red


# zerotier-cli join 565799d8f6259736

Comprobar estado


# zerotier-cli status
200 info 6a58..... 1.10.2 ONLINE

Salir de la red


# zerotier-cli leave 565799d8f6259736

Para configuración adicional consulte la página de zerotier


https://www.zerotier.com/manual.shtml

Crear las rutas

A continuación enrute entre las dos redes; física y red virtual zerotier para que las computadoras remotas puedan acceder a la red local utilizando la computadora de destino.

Rango de mi red local 192.168.88.0/24


192.168.88.0/24 a través de la ip asignada a la raspberrypi3 (VPN) por ZetoTier -> 192.168.192.119

Add Routes 
Destination		    Via
192.168.88.0/24		192.168.192.119

FIGURA zerotier-rutas-4.png 

 


Ahora se configura el reenvío de puertos en la raspberrypi3 y activar el reenvío de tráfico entre las dos interfaces de red, la interface eth0 y la interfaz de red de Zerotier. Para ello:

Habilitar el reenvio de paquetes entre dos interfaces (IP forwarding), la interfaz de red fisica y la interfaz de zerotier


echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf

$ sudo sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

Y finalmente estos comandos para permitir el paso de tráfico entre las dos interfaces

https://zerotier.atlassian.net/wiki/spaces/SD/pages/224395274/Route+between+ZeroTier+and+Physical+Networks

PHY_IFACE=eth0; ZT_IFACE=zt2lrsbp44

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o zt2lrsbp44 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i zt2lrsbp44 -o eth0 -j ACCEPT

sudo apt install iptables-persistent
# bash -c iptables-save > /etc/iptables/rules.v4

1.- Apague el wifi en tu teléfono
2.- Únase a la red zerotier, autorízalo
3.- Intente acceder a algo en la LAN física

Desde mi iPhone descargo las App Zerotier y Termius: Terminal & SSH client

Estoy conectado a Internet a través de la VPN que acabo de crear, también puedo entrar vía SSH a los dispositivos configurados para ese fin.










 

 

Reglas del Firewall PF FreeBSD


###################################################################
int_if = "em0"
lan_net = "192.168.88.0/24"

rfc1918 = "{ 127.0.0.0/8, 172.16.0.0/12, \
169.254.0.0/16, 192.0.2.0/24, \
0.0.0.0/8, 240.0.0.0/4, 224.0.0.0/3 }"

#tcp_pass="{ 22 53  80 123 111 443 832 1110 1651 2049 3000 8000 8080 20049 }"
#udp_pass="{ 53 111 832 1110 1651 2049 20049 }"
#tcp_pass="{ 22 53  80 123 111 443 1110 3000 8000 8080 }"
#udp_pass="{ 53 111 1110 9993}"

# scrub incoming packets
scrub in all

# setup a default deny policy
block in all
block out all

# pass traffic on the loopback interface in either direction
pass quick on lo0 all

# activate spoofing protection for the internal interface.
antispoof quick for $int_if inet

############
block drop in quick on $int_if from $rfc1918 to any
block drop out quick on $int_if from any to $rfc1918
############

# only allow ssh connections from the local network if it‘s from the
# trusted computer, 192.168.0.15. use "block return" so that a TCP RST is
# sent to close blocked connections right away. use "quick" so that this
# rule is not overridden by the "pass" rules below.
# block return in quick on $int_if proto tcp from ! 192.168.0.15 \
# to $int_if port ssh flags S/SA
block return in quick proto tcp from ! 192.168.192.0/24 port ssh flags S/SA

# pass all traffic to and from the local network
pass in on $int_if from $lan_net to any
pass out on $int_if from any to $lan_net

# pass out on se refiere al trafico de salida
#pass out quick on $int_if proto tcp to any port $tcp_pass keep state
#pass out quick on $int_if proto udp to any port $udp_pass keep state

# pass tcp, udp, and icmp out on the external (Internet) interface.
# keep state on udp and icmp and modulate state on tcp.
pass out on $int_if proto tcp all modulate state flags S/SA
pass out on $int_if proto { udp, icmp } all keep state

# allow ssh connections in on the external interface as long as they‘re
# NOT destined for the firewall (i.e., they‘re destined for a machine on
# the local network). log the initial packet so that we can later tell
# who is trying to connect. use the tcp syn proxy to proxy the connection.
#pass in log on $ext_if proto tcp from any to { !$ext_if, !$int_if } \
#port ssh flags S/SA synproxy state
pass in log proto tcp from any to { !$int_if } port ssh flags S/SA synproxy state
#################################################################################
FreeBSD es genial!.

viernes, 21 de octubre de 2022

ZFS Cifrar Conjunto de Datos Dataset FreeBSD

https://www.oracle.com/technical-resources/articles/solaris/how-to-manage-zfs-encryption.html

ZFS Datasets Encriptados

Resultado de shell que muestra la lista de conjuntos de datos

$ zfs list


NAME                                           USED  AVAIL     REFER  MOUNTPOINT
zroot                                         14.1G   420G       96K  /zroot
zroot/ROOT                                    12.1G   420G       96K  none
zroot/ROOT/13.1-RELEASE-p2_2022-10-19_233328     8K   420G     2.63G  /
zroot/ROOT/13.1-RELEASE_2022-10-19_232051        8K   420G     1.33G  /
zroot/ROOT/default                            12.1G   420G     11.4G  /
zroot/encrypt                                   96K  30.0G       96K  /zroot/encrypt
zroot/tmp                                      288K   420G      152K  /tmp
zroot/usr                                     1.97G   420G       96K  /usr
zroot/usr/home                                 350M   420G      308M  /usr/home
zroot/usr/ports                                912M   420G      912M  /usr/ports
zroot/usr/src                                  759M   420G      759M  /usr/src
zroot/var                                     1.16M   420G       96K  /var
zroot/var/audit                                 96K   420G       96K  /var/audit
zroot/var/crash                                 96K   420G       96K  /var/crash
zroot/var/log                                  592K   420G      384K  /var/log
zroot/var/mail                                 200K   420G      144K  /var/mail
zroot/var/tmp
104K   420G       96K  /var/tmp

Listar snapshots

$ zfs list -t snapshot


NAME                                                              USED  AVAIL     REFER  MOUNTPOINT
zroot@baseMateKdeInstall                                            0B      -       96K  -
zroot/ROOT@baseMateKdeInstall                                       0B      -       96K  -
zroot/ROOT/13.1-RELEASE-p2_2022-10-19_233328@baseMateKdeInstall     0B      -     2.63G  -
zroot/ROOT/13.1-RELEASE_2022-10-19_232051@baseMateKdeInstall        0B      -     1.33G  -
zroot/ROOT/default@2022-10-19-23:20:51-0                         77.8M      -     1.33G  -
zroot/ROOT/default@2022-10-19-23:33:28-0                         34.2M      -     2.63G  -
zroot/ROOT/default@baseMateKdeInstall                             533M      -     11.9G  -
zroot/tmp@baseMateKdeInstall                                      136K      -      168K  -
zroot/usr@baseMateKdeInstall                                        0B      -       96K  -
zroot/usr/home@baseMateKdeInstall                                41.3M      -      224M  -
zroot/usr/ports@baseMateKdeInstall                                  8K      -      912M  -
zroot/usr/src@baseMateKdeInstall                                    8K      -      759M  -
zroot/var@baseMateKdeInstall                                        0B      -       96K  -
zroot/var/audit@baseMateKdeInstall                                  0B      -       96K  -
zroot/var/crash@baseMateKdeInstall                                  0B      -       96K  -
zroot/var/log@baseMateKdeInstall                                  208K      -      336K  -
zroot/var/mail@baseMateKdeInstall                                  56K      -      144K  -
zroot/var/tmp@baseMateKdeInstall                                    8K      -       96K  -


Creación y uso de conjuntos de datos cifrados, ejemplo simple de habilitación del cifrado.

Administrar claves de cifrado localmente. Si no especifica ninguna política de administración de claves, ZFS solicitará interactivamente una frase de contraseña. Esto probablemente no es ideal en la mayoría de las implementaciones de centros de datos, por lo que en su lugar necesitamos obtener la clave a través de medios no interactivos desde otro lugar. La clave de ajuste puede ser una frase de contraseña o una clave AES sin procesar. El método no interactivo más simple es almacenar la clave de ajuste o frase de contraseña en un archivo y decirle a ZFS qué archivo buscar para esa clave. Si utiliza este método, se supone que el otro sistema de archivos es suficientemente seguro por otros medios, como estar en un disco extraíble. La clave de ajuste solo es necesaria en el momento en que el sistema de archivos ZFS se monta inicialmente después del arranque del sistema, por lo que los medios extraíbles se pueden quitar más tarde si es necesario.


 $ zfs create -o encryption=on -o keylocation=prompt -o \
 keyformat=passphrase zroot/encrypt
Enter new passphrase:
Re-enter new passphrase:

Zfs Listar el dataset zroot/encrypt


 $ zfs list zroot/encrypt 
NAME            USED  AVAIL     REFER  MOUNTPOINT
zroot/encrypt   200K   420G      200K  /zroot/encrypt

Crear un archivo dentro del dataset


 $ touch /zroot/encrypt/supersecret

Zfs creación del conjunto de datos con una cuota


 $ zfs set quota=30g zroot/encrypt

Zfs obtener encryption


 $ zfs get encryption zroot/encrypt 
NAME           PROPERTY    VALUE        SOURCE
zroot/encrypt  encryption  aes-256-gcm  -

Zfs desmontar dataset


 $ zfs unmount zroot/encrypt

Zfs descargar llave


 $ zfs unload-key -r zroot/encrypt 
1 / 1 key(s) successfully unloaded

No se monta directamente


 $ zfs mount zroot/encrypt 
cannot mount 'zroot/encrypt': encryption key not loaded

Zfs obtener estado actual de la llave


 $ zfs get keystatus zroot/encrypt 
NAME           PROPERTY   VALUE        SOURCE
zroot/encrypt  keystatus  unavailable  -

Zfs cargar llave


 $ zfs load-key -r zroot/encrypt 
Enter passphrase for 'zroot/encrypt':
1 / 1 key(s) successfully loaded

$ zfs mount -a

Zfs comprobar accesibilidad


 $ ls /zroot/encrypt 
supersecret

$ Zfs listar


 $ zfs list
NAME                                           USED  AVAIL     REFER  MOUNTPOINT
zroot                                         14.1G   420G      104K  /zroot
zroot/ROOT                                    12.1G   420G       96K  none
zroot/ROOT/13.1-RELEASE-p2_2022-10-19_233328     8K   420G     2.63G  /
zroot/ROOT/13.1-RELEASE_2022-10-19_232051        8K   420G     1.33G  /
zroot/ROOT/default                            12.1G   420G     11.4G  /
zroot/encrypt                                  200K  30.0G      200K  /zroot/encrypt
zroot/tmp                                      288K   420G      152K  /tmp
zroot/usr                                     1.98G   420G       96K  /usr
zroot/usr/home                                 359M   420G      315M  /usr/home
zroot/usr/ports                                912M   420G      912M  /usr/ports
zroot/usr/src                                  759M   420G      759M  /usr/src
zroot/var                                     1.16M   420G       96K  /var
zroot/var/audit                                 96K   420G       96K  /var/audit
zroot/var/crash                                 96K   420G       96K  /var/crash
zroot/var/log                                  592K   420G      384K  /var/log
zroot/var/mail                                 200K   420G      144K  /var/mail
zroot/var/tmp                                  104K   420G       96K  /var/tmp

Zfs desmontar, listar, keystatus, load-key, mount, unmount.


$ zfs unmount zroot/encrypt
 $ zfs unload-key -r zroot/encrypt 
1 / 1 key(s) successfully unloaded
$ ls /zroot/encrypt $ zfs get keystatus zroot/encrypt NAME PROPERTY VALUE SOURCE zroot/encrypt keystatus unavailable -
$ zfs load-key -r zroot/encrypt Enter passphrase for 'zroot/encrypt': 1 / 1 key(s) successfully loaded
$ zfs get keystatus zroot/encrypt NAME PROPERTY VALUE SOURCE zroot/encrypt keystatus available -
$ zfs mount -a $ ls /zroot/encrypt supersecret
$ zfs unmount zroot/encrypt $ zfs unload-key -r zroot/encrypt 1 / 1 key(s) successfully unloaded
$ ls /zroot/encrypt

 $ zfs allow -u carlos keychange zroot/encrypt

El ejemplo anterior permite al usuario carlos cambiar el valor de la clave de ajuste para el conjunto de datos y sus elementos secundarios, pero no cambiar la propiedad keysource. En este caso que el usuario carlos no puede montar el conjunto de datos ZFS después del arranque ni puede forzar la descarga del conjunto de datos y su clave. El usuario raíz (y el propio arranque del sistema) tiene todas las delegaciones de ZFS.

Si fuera un disco externo tendríamos que importar el zpool después de un reinicio. Por ejemplo, previamente hemos creado un zpool de nombre cifrado y un conjunto de datos llamado encrypt.


# zfs import -l cifrado/encrypt
Enter passphrase for 'cifrado/encrypt':
1 / 1 keys successfully loaded

 

FreeBSD es genial!.

lunes, 3 de enero de 2022

FreeBSD intercambio cifrado con GELI en un gmirror y un grupo root cifrado con GELI.

https://wiki.freebsd.org/MasonLoringBliss/ZFSandGELIbyHAND

Paso a paso - Particionar e instalar FreeBSD 13.0

Duplicación

Duplicación es la técnica de escribir los mismos datos en mas de una unidad de disco. Cada unidad de un mirror (espejo) contiene una copia idéntica de los datos. Cuando falla una unidad individual, el mirror continua funcionando y el administrador tiene tiempo para reemplazar la unidad defectuosa sin interrupción.

Mirror

Las dos unidades en un espejo pueden ser idénticas en modelo y capacidad, pero gmirror(8) no lo requiere. Los espejos creados con diferentes discos tendrán una capacidad igual a la del disco mas pequeño del mirror. Este ejemplo asume FreeBSD 13, un par de discos y el deseo de reflejar todo.  Se adapta tanto a UEFI como a instalaciones heredadas, y tiene un esquema de partición predeterminado que puede tener ambas instalaciones a la vez. FreeBSD no automatiza la actualización del código de arranque y este es el enfoque adoptado por la versión actual de esta guía. Este conjunto de instrucciones configura un par de particiones freebsd-boot, un par de particiones ESP, intercambio cifrado con GELI en un gmirror y un grupo raíz cifrado con GELI.

Fuerza la destrucción de la tabla de particiones

# gpart destroy -F ada0
# gpart destroy -F ada1

Nueva tabla de particiones GPT


# gpart create -s gpt ada0
# gpart create -s gpt ada1

Particiones de arranque, primero legacy y luego UEFI/ESP

# gpart add -t freebsd-boot -s 512k -l boot0 ada0
# gpart add -t freebsd-boot -s 512k -l boot1 ada1
# gpart add -t efi -s 1m -l efi0 ada0
# gpart add -t efi -s 1m -l efi1 ada1

ESP debe ser vfat/fat32:


# newfs_msdos /dev/gpt/efi0
# newfs_msdos /dev/gpt/efi1

Swap - estos entrarán en un geom_mirror


# gpart add -t freebsd-swap -l swap0 -a 1m -s 4096m ada0
# gpart add -t freebsd-swap -l swap1 -a 1m -s 4096m ada1

Si tienes discos que no coinciden, deberás hacer que estos tengan un tamaño coincidente:


# gpart add -t freebsd-zfs -l tank0 -a 1m ada0
# gpart add -t freebsd-zfs -l tank1 -a 1m ada1
# gmirror label -v swap gpt/swap0 gpt/swap1

Establecer GELI - Configurar claves en lugar de frases de paso para GELI


# geli init -s 4096 -b -g gpt/tank0
# geli init -s 4096 -b -g gpt/tank1
# geli attach gpt/tank0
# geli attach gpt/tank1

Crear el pool root.

# zpool create -R /mnt -o cachefile=/tmp/zpool.cache -O mountpoint=/ \
    -O atime=off -O canmount=off -O compression=on \
    tank mirror gpt/tank0.eli gpt/tank1.eli
    
# zfs create -o canmount=off -o mountpoint=none tank/ROOT
# zfs create -o mountpoint=/ tank/ROOT/default
# zpool set bootfs=tank/ROOT/default tank
# zfs create tank/home
# zfs create -o canmount=off tank/usr
# zfs create tank/usr/local
# zfs create tank/usr/obj
# zfs create tank/usr/src
# zfs create tank/usr/ports
# zfs create tank/usr/ports/distfiles
# zfs create -o canmount=off tank/var
# zfs create tank/var/jail
# zfs create tank/var/log
# zfs create tank/var/tmp
# zfs create tank/tmp

# zfs set setuid=off tank/tmp
# zfs set setuid=off tank/var
# zfs set exec=off tank/var

Copiar el caché de zpool para tenerlo en el sistema en funcionamiento


# mkdir -p /mnt/boot/zfs
# cp /tmp/zpool.cache /mnt/boot/zfs

No olvide elegir la opción Shell para terminar la configuración.


# exit

cat >> /boot/loader.conf <<EOF
zfs_load="YES"

geom_eli_load="YES"
geom_mirror_load="YES"

zpool_cache_load="YES"
zpool_cache_name="/boot/zfs/zpool.cache"
zpool_cache_type="/boot/zfs/zpool.cache"

vfs.root.mountfrom="zfs:tank/ROOT/default"
EOF

cat >> /etc/rc.conf <<EOF
zfs_enable="YES"
zfsd_enable="YES"
EOF

cat >> /etc/fstab <<EOF
/dev/gpt/efi0 /boot/efi0 msdosfs rw,late 0 0
/dev/gpt/efi1 /boot/efi1 msdosfs rw,late 0 0
/dev/mirror/swap.eli none swap sw 0 0
EOF
# exit

Reiniciar


 reboot

Consoles: EFI console
GELI Passphrase for disk0p4:


# geli status
Name  Status  Components
     ada0p4.eli  ACTIVE  ada0p4
     ada1p4.eli  ACTIVE  ada1p4
mirror/swap.eli  ACTIVE  mirror/swap

# zpool status

  pool: tank
 state: ONLINE
config:

	NAME            STATE     READ WRITE CKSUM
	tank            ONLINE       0     0     0
	  mirror-0      ONLINE       0     0     0
	    ada0p4.eli  ONLINE       0     0     0
	    ada1p4.eli  ONLINE       0     0     0

errors: No known data errors

FreeBSD es genial!
.

sábado, 24 de septiembre de 2016

Cifrar particion con cryptsetup luks

Sistema Operativo Arch Linux

# lsmod|grep dm_crypt
dm_crypt               28672  1
dm_mod                102400  2 dm_crypt

Si no aparece el módulo lo cargamos con:
# modprobe dm_crypt


Ya creada la partición /dev/sda5, procedemos a formatear usando el sistema de archivos LUKS (Linux Unified Key Setup)

# cryptsetup luksFormat /dev/sda5

El UUID del nuevo sistema de ficheros encryptado.

# cryptsetup luksUUID /dev/sda5
2005190e-81e8-4292-a84e-e84a06d6d70a

El siguiente paso es mapear el sistema de ficheros contra encrypted-fs e introducir la contraseña que necesitaremos recordar.

# cryptsetup luksOpen /dev/sda5 encrypted-fs
Enter passphrase for /dev/sda5

Tendrá que darle formato y montar:

# mkfs.ext4 /dev/mapper/encrypted-fs
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 10521856 4k blocks and 2632672 inodes
Filesystem UUID: 8da03053-b6bd-4add-b944-713fa2942806
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (65536 blocks): done
Writing superblocks and filesystem accounting information: done 



Esta es la salida de fdisk

# fdisk -l
Disk /dev/sda: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 9E0ED2FC-0BC1-4542-9688-DF733F20A984

Device         Start       End   Sectors  Size Type
/dev/sda1       2048 104859647 104857600   50G Linux filesystem
/dev/sda2  104859648 105908223   1048576  512M EFI System
/dev/sda3  105908224 114296831   8388608    4G Linux swap
/dev/sda4  114296832 533727231 419430400  200G Linux filesystem
/dev/sda5  533727232 617906175  84178944 40.1G Linux filesystem



Disk /dev/mapper/encrypted-fs: 40.1 GiB, 43097522176 bytes, 84174848 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


La salida del comando siguiente nos sirve para averiguar el UUID y utilizarlo en fstab:

# tune2fs -l /dev/mapper/encrypted-fs | grep UUID

Filesystem UUID:          8da03053-b6bd-4add-b944-713fa2942806


# mkdir /encrypted-fs

Lo añadimos al archivo /etc/fstab con la opción noauto para iniciar y montar manualmente.

# /dev/sda5                                                                                                   
UUID=8da03053-b6bd-4add-b944-713fa2942806   /encrypted-fs  ext4  noauto,defaults  0 0


# cat /etc/fstab


Si quiere montar el sistema de archivos cifrado al iniciar el sistema, tiene que agregar al archivo /etc/crypttab la línea, le pedirá la contraseña al arranque del sistema.

encrypted-fs  /dev/mapper/encrypted-fs  none

Antes de desconectar el dispositivo vamos a copiar los datos que queremos mantener cifrados:

# cp -r /home/carles/gentoo /encrypted-fs/

Desmontamos el dispositivo antes de desconectarlo
# umount /encrypted-fs/

Ya podemods desconectar el dispositivo ejecutando cryptsetup, con la opción luksClose y el nombre del dispositivo.

# cryptsetup luksClose /dev/mapper/encrypted-fs

Bien, reiniciar el sistema.

Al reiniciar el sistema tendremos que cargar el módulo con lsmod, y abrirlo con cryptsetup y la opción luksOpen /dev/sda5 encrypted-fs. Nos pedirá la frase o contraseña introducida para el cifrado de la partición.

# cryptsetup luksOpen /dev/sda5 encrypted-fs
Enter passphrase for /dev/sda5:

Aún no podremos acceder al dispositivo, tenemos que montarlo:

# ls /encrypted-fs/gentoo
ls: cannot access '/encrypted-fs/gentoo': No such file or directory

# mount /encrypted-fs

# ls /encrypted-fs
gentoo  lost+found

Unix es genial!.

viernes, 7 de febrero de 2014

Encriptar con geli FreeBSD

Encriptar disco duro usb con geli:

Geli es una clase GEOM criptográfica que utiliza el framework crypto y entre otras características, soporta múltiples algoritmos criptográficos (AES, Blowfish y 3DES).

Conectar un disco duro externo a un puerto usb, se creará el dispositivo /dev/da0.

Habilitar soporte para geli en del kernel de FreeBSD

options    GEOM_ELI
device     crypto

Recompilar el kenel y reiniciar con el nuevo kernel.

Cargar el nuevo múdulo geli en el arranque añadiendo la siguiente línea al archivo /boot/loader.conf

geom_eli_load="YES"

Generar la clave maestra

Generar una archivo un archivo de clave que se utilizará como parte de la clave maestra para el proveedor de cifrado montado en /private. El archivo de clave algunos datos aleatorios que se utilizan para encriptar la clave maestra. La clave principal también estará protegida por una contraseña. El tamaño del sector del proveedor /dev/da0.eli será de 4kb

# dd if=/dev/random of=/root/safe/da0.key bs=64 count=1

Inicializar el proveedor que necesita ser encriptado. Aquí se puede
configurar el algoritmo criptográfico a usar, longitud de la clave, etc:

# geli init -s 4096 -K /root/safe/da0.key bs=64 count=1

Comprobar el sistema de archivos:


Conectar el proveedor con la clave generada:
# geli atach -k /root/safe/da0.key /dev/da0

# ls /dev/da0*
da0 da0.eli

Crear un nuevo sistema de archivos:

# dd if=/dev/random of=/dev/da0.eli bs=1m
# newfs /dev/da0.eli


# mount /dev/da0.eli /private

El sistema de archivos cifrado ahora es visible y disponible para su uso

# df -h


Desmontar y desconectar del proveedor:
Una vez terminado el trabajo sobre la partición cifrada, es prudente desmontar y separar la partición cifrada geli del kernel (en este caso desconectar el disco duro usb):

# umount /private/
# geli detach da0.eli

Conectar de nuevo:
# geli attach -k /root/safe/da0.key /dev/da0
Enter passphrase:

# umount /private
# geli detach da0.eli

Utilizar solo password:

Es más conveniente para cifrar una memoria USB o una imagen de archivo basada sólo en una fase de contraseña sin clave. En este caso no es necesario llevar el archivo de clave adicional para acceder al contenido del disco. El procedimiento es en gran medida el mismo que el anterior, sólo sin el archivo de clave. Vamos a encriptar un archivo basado en imagen /cryptedfile de 1 GB.

# dd if=/dev/zero of=/cryptedfile bs=1M count=1000
# mdconfig -at vnode -f /cryptedfile


# geli init /dev/da0
# geli attach /dev/da0

# newfs -U -m 0 /dev/da0.eli
# mount /dev/da0.eli /private
# geli detach da0.eli

Ahora es posible mountar esta imagen en otro sistema de solo con el password:
# mdconfig -at vnode -f /cryptedfile
# geli attach /dev/ad0
# mount /dev/da0.ali /private


Fuente:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/disks-encrypting.html
http://bsdtutorial.org/
http://cb.vu/unixtoolbox_pt.xhtml

Unix es genial!.