Páginas

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!.

miércoles, 21 de septiembre de 2022

Freebsd tar Excluir Directorios

Fuente:
https://www.gnu.org/software/tar/manual/html_node/exclude.html#exclude

Ciertas opciones para tar le permite especificar un nombre para su archivo. Otras opciones le permiten decidir qué archivos incluir o excluir del archivo, en función de cuándo o si se modificaron los archivos, si los nombres de los archivos coinciden o no con los patrones especificados, o si los archivos están en directorios especificados.

Realizar copias con tar excluyendo directorios listados dentro de un archivo, utilizando la opción --exclude-from

Importamos el zpool copias

# zpool import copias
# zpool status
  pool: copias
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	copias      ONLINE       0     0     0
	  da0p1     ONLINE       0     0     0

errors: No known data errors

  pool: zroot
 state: ONLINE
config:

	NAME        STATE     READ WRITE CKSUM
	zroot       ONLINE       0     0     0
	  nvd0p4    ONLINE       0     0     0

errors: No known data errors

Creamos el archivo excluir_dirs.txt donde incluiremos todos los directorios a excluir de la copia

carlos@foo:~ % pwd

/usr/home/carlos

carlos@foo:~ % touch excluir_dirs.txt

Tenga en cuenta que las líneas del archivo se leen palabra por palabra. Uno de los los errores frecuentes es dejar espacios en blanco adicionales después de un nombre de archivo, que es difícil de detectar usando editores de texto. Sin embargo, las líneas vacías están bien

carlos@foo:~ % cat excluir_dirs.txt

./.ssh
./.dbus
./.mozilla
./.cache
./Descargas
./DevOps_Bootcamp
./Musica
# tar cfCv - /usr/home/carlos/ --exclude-from excluir_dirs.txt . | \
tar xpfC - /copias/tar_home_fbsd

-c Crear un nuevo archivo que contenga los elementos especificados

-f Leer el archivo desde o escribir el archivo en el fichero especificado

-C directorio, --cd directorio. En el modo c y r, esto cambia el directorio antes de añadir los siguientes archivos.

-v Produce una salida detallada. En los modos de creación y extracción, tar enumerará cada nombre de archivo a medida que se lea o escriba en el archivo.

-x Extraer al disco desde el archivo. Si un archivo con el mismo nombre aparece más de una vez en el archivo, cada copia será extraído, y las copias posteriores sobrescribirán las anteriores copias.

-p --preserve-permissions (sólo en modo x) Preserva los permisos de los archivos. Intenta restaurar los permisos completos

Exportar el zpool copias

# zpool export copias

carlos@foo:~ % ls -Fa

...
.ssh/
.cache/
.dbus/
.mozilla
Avanzado/
bhyve/
Dell-7390/
Descargas/
DevOps_Bootcamp/
docs/
Documentos/
Ebooks/
Escritorio/
excluir_dirs.txt
Imagenes/
Musica/
Plantillas/
Publico/
scripts/
Videos/

FreeBSD es genial!.

sábado, 3 de septiembre de 2022

Virtual Machine Linux en FreeBSD 13.1 con bhyve UEFI

Instalar Debian en una máquina virtual en FreeBSD 13.1 bhyve

Levantar (up) el dispositivo de túnel tap por defecto, agregando la siguiente línea al archivo /etc/sysctl.conf

echo "net.link.tap.up_on_open=1" >> /etc/sysctl.conf
sysctl net.link.tap.up_on_open=1

Firewall reglas pf

# Reglas para vm bhyve
pass in quick on bridge0 all keep state
pass in quick on tap0 all keep state
pass out quick on bridge0 all keep state
pass out quick on tap0 all keep state

Reiniciar pf

service pf restart

Cargar el controlador como módulo en el momento del arranque

# /boot/loader.conf
echo 'vmm_load="YES"' >> /boot/loader.conf
echo 'nmdm_load="YES"' >> /boot/loader.conf
echo 'if_tap_load="YES"' >> /boot/loader.conf
echo 'if_bridge_load="YES"' >> /boot/loader.conf

Crear un bridge

ifconfig bridge create
bridge0

Añadir como miembro del puente la interfaz em0

ifconfig bridge0 addm em0

Cambiar el nombre de la interfaz bridge0

ifconfig bridge0 name em0bridge
em0bridge

Activar la interfaz

ifconfig em0bridge up

Crear una nueva interfaz de tap de nombre tap0

ifconfig tap0 create

Agregar la interfaz a em0bridge0

ifconfig em0bridge0 addm tap0

Activar la interfaz tap0

ifconfig tap0 up

Habilitar los dispositivos de red para su arranque automático

# byhve /etc/rc.conf
cloned_interfaces = "bridge0 tap0"
ifconfig_bridge0_name = "em0bridge"
ifconfig_em0bridge = "addm em0 addm tap0 up"

Crear un volumen de 20 Gb zfs

zfs create -V20G -o volmode=dev zroot/debianvm

Descargar la imagen debian-11.4.0

cd /tmp/
wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.4.0-amd64-netinst.iso

Instalar paquetes necesarios y sus dependencias

pkg install grub2-bhyve bhyve-firmware
New packages to be INSTALLED:
	bhyve-firmware: 1.0_1
	edk2-bhyve: g202202_1
	grub2-bhyve: 0.40_8
	uefi-edk2-bhyve-csm: 0.2_3,1

Instalar la VM debian 11.4.0 bajo FreeBSD

bhyve -c 4 -m 1G -w -H \
-s 0,hostbridge \
-s 3,ahci-cd,/tmp/debian-11.4.0-amd64-netinst.iso \
-s 4,virtio-blk,/dev/zvol/zroot/debianvm \
-s 5,virtio-net,tap0 \
-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \
-s 30,xhci,tablet \
-s 31,lpc -l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd debianvm

man bhyve

-m memsize[K|k|M|m|G|g|T|t] Establece el tamaño de la memoria física del huésped

-H: sistema de archivos host para exportar al cargador

-l: el cargador del sistema operativo que se utilizará - uefi

-s: configure una ranura PCI virtual y otras funciones, como disco duro, cdrom y otros dispositivos.

-c Número de CPUs virtuales invitadas y/o la topología de la CPU. El valor por defecto de para cada uno de numcpus, sockets, cores y hilos es 1

-W Forzar las emulaciones de dispositivos PCI de virtio para que usen las interrupciones MSI en lugar de las interrupciones MSI-X.

-l lpcdev,conf Permite configurar los dispositivos detrás del puente LPC PCI-ISA. Los únicos dispositivos soportados son los de clase TTY com1, com2, com3 y com4

-l help Imprimir una lista de dispositivos LPC soportados.

bhyve -l help
bootrom
com1
com2
com3
com4
pc-testdev

-s help Imprimir una lista de dispositivos PCI soportados.

bhyve -s help
ahci
ahci-hd
ahci-cd
e1000
dummy
hda
fbuf
amd_hostbridge
hostbridge
lpc
nvme
passthru
virtio-9p
virtio-blk
virtio-console
virtio-net
virtio-rnd
virtio-scsi
uart
xhci

Instalar un cliente vnc

pkg install tigerviewer

Script que inicia la vm debian

#!/bin/sh
#
bhyve -c 1 -m 1G -w -H \
-s 0,hostbridge \
-s 4,virtio-blk,/dev/zvol/zroot/debianvm \
-s 5,virtio-net,tap0 \
-s 29,fbuf,tcp=0.0.0.0:5900,w=1024,h=768 \
-s 30,xhci,tablet \
-s 31,lpc -l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd debianvm

Llegados a este punto accedemos al instalador de Debian 11 Linux, iniciando la máquina virtual y el cliente VNC TigerVnc viewer. Escriba la dirección del servidor y el puerto, en mi caso

192.168.88.51:5900

clic en Conectar para empezar con la instalación

Al finalizar la instalación haga clic en Retroceder y

ejecute un shell para instalar el cargador de arranque uefi

sino la vm no se iniciará y eso no es lo que quiere

Ejecutar un shell

Crear el directorio BOOT

mkdir /target/boot/efi/EFI/BOOT/

Copiar grubx64.efi a /targe/boot/efi/EFI/BOOT/bootx64.efi

cp /target/boot/efi/EFI/debian/grubx64.efi /target/boot/efi/EFI/BOOT/bootx64.efi
exit

Terminar la instalación

Continuar

Iniciar la vm debian

Usando un script para iniciar la VM

#!/bin/sh
bhyve -c 4 -m 1G -w -H \
-s 0,hostbridge \
-s 3,ahci-cd,/tmp/debian-11.4.0-amd64-netinst.iso \
-s 4,virtio-blk,/dev/zvol/zroot/debianvm \
-s 5,virtio-net,tap0 \
-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \
-s 30,xhci,tablet \
-s 31,lpc -l com1,stdio \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
debianvm
chmod +x /usr/home/carlos/scripts/startdebian.sh
cd /usr/home/carlos/scripts
./startdebian.sh

Permitir acceso ssh a la vm debian

Archivo de configuracion de ssh /etc/ssh/sshd_conf

PermitRootLogin no
AllowUsers carlos@192.168.88.*
Reiniciar servicio
systemctl restart sshd

Acceder via ssh a la vm debian

% ssh carlos@192.168.88.101
The authenticity of host '192.168.88.101 (192.168.88.101)' can't be established.
ED25519 key fingerprint is SHA256:/vYJensJh11xpGCdbwe2pLNGTPtRlkw1y0bsABU3XtE.
No matching host key fingerprint found in DNS.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

FreeBSD es genial!.

jueves, 1 de septiembre de 2022

ZFS Freebsd no Arranca Reparar Sistema

Propiedad canmount zroot/ROOT/default

 zfs get -r -s local -o name,property,value all zroot|grep canmount
 zroot/ROOT/be_28082022      canmount              noauto
 zroot/ROOT/default          canmount              noauto
 zroot/usr                   canmount              off
 zroot/var                   canmount              off

Cuando se establece el valor noauto, un conjunto de datos sólo puede ser montado y desmontado explícitamente. El conjunto de datos no se monta automáticamente cuando se crea o se importa, ni se monta mediante el comando "zfs mount -a" ni se desmonta con el comando "zfs umount -a".

Esta propiedad no se hereda.

Iniciar con el cd de instalacion de FreeBSD 13

Cuando vea en pantalla Install Shell Livecd

Entrar en el shell

Ir a /tmp

cd /tmp

Crear un directorio

 mkdir /tmp/montado

Importar zroot

 zpool import -f -R /tmp/montado zroot

Enumerar la información de las propiedades de los conjuntos de datos en forma de tabla

 zfs list

Montar el conjunto de datos zroot/ROOT/default

 zfs mount zroot/ROOT/default
 mount -a

Entrar en /tmp/montado.

 cd /tmp/montado

Restaurar Cargador de Arranque


Llegados a este punto, el sistema es accesible. Si realizó una instalación utilizando el asistente de FreeBSD

Montar boot para restablecer boot loader

 mount -t msdosfs /dev/gpt/efiboot0 /tmp/montado/boot/efi
 cp /boot/loader.efi /tmp/montado/boot/efi/efi/boot/bootx64.efi

Si ha realizado un particionado manual añadiendo particiones con etiquetas (-l label) para acceder a ellas por su nombre:

Montar boot explícitamente, particionado manual

 mount -t msdosfs /dev/gpt/efi0 /tmp/montado/boot/efi0
 cp /boot/loader.efi /tmp/montado/boot/efi0/efi/boot/bootx64.efi

Ahora tiene acceso a todo el sistema

Por ejemplo puede editar el archivo rc.conf utilizando ruta absoluta

 vi /tmp/montado/etc/rc.conf

O utilizando ruta relativa

 pwd
/tmp/montado
 ee boot/loader.conf
 cd
 umount /tmp/montado
 zfs umount zroot/ROOT/default
 zpool export zroot
  o
 zpool export -f zroot
 zfs list
no datasets available

Reiciniar el sistema

 reboot

FreeBSD es genial!.

domingo, 26 de junio de 2022

FreeBSD cliente ntpd

Si tiene una máquina cliente deberá escuchar un servidor NTP para obtener la hora

ntp viene instalado por defecto

Configurar ntpd

/etc/rc.conf

# ntpd_enable="YES"
# ntpd_config="/etc/ntp.conf"
# netwait_enable="YES"

Archivo por defecto:

% sed -e '/^[ ]*#/d' -e '/^$/d' /etc/ntp.conf

tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst
restrict default limited kod nomodify notrap noquery nopeer
restrict source  limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict ::1
leapfile "/var/db/ntpd.leap-seconds.list"

Agregar un servidor NTP cercano (España)

tos minclock 3 maxclock 6
# pool 0.freebsd.pool.ntp.org iburst
#
# Servidor NTP
pool 0.es.pool.ntp.org iburst
#
restrict default limited kod nomodify notrap noquery nopeer
restrict source  limited kod nomodify notrap noquery
restrict 127.0.0.1
restrict ::1
leapfile "/var/db/ntpd.leap-seconds.list"

Modificar la hora sin cambiar la fecha

Por ejemplo, actualizar hora a 13 horas y 22 minutos

# date 1322

Iniciar el servicio

# service ntpd start

Solucionar error ntpd: error resolving pool 0.freebsd.pool

ntp esperará que nuestro equipo tenga conexión a internet

# sysrc netwait_enable=YES
netwait_enable: NO -> YES

Comprobar que funciona

# ntpq -pn
    remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 0.freebsd.pool. .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 0.es.pool.ntp.o .POOL.          16 p    -   64    0    0.000   +0.000   0.000
 -51.195.26.118   90.187.148.77    2 u   69   64  377   34.733   -1.417   0.259
#193.145.15.15   193.147.107.33   2 u   61   64  377   10.797   -0.456   0.831
-162.159.200.123 10.19.9.88       3 u   66   64  377   19.087   -0.709   0.719
*185.179.104.12  .GPS.            1 u   57   64  377   28.571   -0.880   0.429
#185.132.136.116 130.206.0.1      2 u   63   64  367   56.016  +11.404   1.522
-5.56.160.3      178.32.88.247    3 u   58   64  377   30.043   -0.500   0.904
#185.90.148.209  150.214.94.5     2 u   62   64  377   36.419   -0.867   0.528
+92.222.150.77   192.168.100.15   2 u   53   64  377   29.147   -0.891   0.325
+51.195.26.119   90.187.148.77    2 u   59   64  377   34.076   -1.644   0.533
 

FreeBSD es genial!.