BSD HomeBox (IX): Copias de seguridad del servidor

Para realizar las copias de seguridad de los datos almacenados en el servidor utilizo un disco SATA en una caja externa con conexión e-SATA, y una controladora PCI Conceptronic en el servidor, con puerto e-SATA.

Conecto el disco externo y ejecuto el siguiente comando para que se le asigne un dispositivo:

atacontrol attach ata4

Creo el filesystem en el disco, en un slice creado anteriormente desde sysinstall:

newfs -U /dev/ad8s1c

Creo el usuario que utilizaré para realizar las copias de seguridad, y que sólo tendrá permisos de lectura sobre los datos a copiar:

pw useradd -n backup -G datos,operator -m -h 0

Añado la siguiente línea al fichero /etc/devfs.rules, en el apartado [localrules=5] que habíamos creado anteriormente, para que se asignen los permisos necesarios al dispositivo cada vez que se conecte el disco:

add path 'ad8*' mode 0660 group operator

En el archivo /etc/rc.conf ya debemos tener de antes la siguiente línea:

devfs_system_ruleset="localrules"

Reinicio el proceso devfs:

/etc/rc.d/devfs restart

Creo el directorio donde se montará el filesystem y le cambio el propietario al usuario backup:

mkdir /mnt/backup
chown backup:backup /mnt/backup

Creo un script para lanzar el backup desde el usuario root, con el siguiente contenido:

atacontrol attach ata4
mount /dev/ad8s1c /mnt/backup
su -m backup -c "rsync -rlti --delete /datos/ /mnt/backup --exclude '.snap' --exclude 'download' --exclude 'lost+found'"
sleep 5
umount /mnt/backup
atacontrol detach ata4

Hay información interesante sobre el manejo de discos externos aquí:

http://www.freebsd.org/doc/en/books/handbook/usb-disks.html

BSD HomeBox (VIII): P2P

Como cliente de P2P instalo transmission-daemon, y su correspondiente complemento para gestionar las descargas a través de web (desmarco las opciones de IPV6 y PROXY a la hora de compilar):

cd /usr/ports/net-p2p/transmission-daemon
make install clean
cd /usr/ports/www/transmission-web
make install clean

Creo el usuario con el que se ejecutará el demonio:

pw useradd -n torrent -m -h 0

Creo el directorio donde se almacenarán las descargas y le aplico permisos de modificación para todos los usuarios:

mkdir /datos/download
chmod 777 /datos/download

Edito el archivo /etc/rc.conf, añadiendo las siguientes entradas para que arranque automáticamente el demonio y la configuración de algunos parámetros:

transmission_enable="YES"
transmission_user="torrent"
transmission_conf_dir="/usr/home/torrent/.config/transmission-daemon"
transmission_download_dir="/datos/download"

Ahora puedo arrancar el demonio manualmente ejecutando:

/usr/local/etc/rc.d/transmission start

Con esto ya tengo el archivo de configuración para poder personalizar en /usr/home/torrent/.config/transmission-daemon/settings.json. Para modificar este archivo es necesario tener el demonio parado, de lo contrario al reiniciarse el demonio, el archivo de configuración volverá a su estado anterior. Para que los archivos sean creados con permisos totales para todos los usuarios, especifico el siguiente parámetro en el settings.json:

"umask": 0

FreeBSD: Parchear el kernel

Aprovecho una actualización de seguridad publicada esta semana (http://security.freebsd.org/advisories/FreeBSD-SA-09:14.devfs.asc)  para exponer cómo la he instalado. En cuanto a la verificación con GNUPG me he guiado por este artículo.

En primer lugar instalo la utilidad que me permitirá verificar la veracidad del parche descargado:

cd /usr/ports/security/gnupg
make install clean
cd /usr/ports/security/pinentry
make install clean

Genero mi clave:

gpg --gen-key

Importo las claves de FreeBSD:

fetch http://www.freebsd.org/doc/pgpkeyring.txt && gpg --import pgpkeyring.txt

Descargo el parche y la firma:

fetch http://security.FreeBSD.org/patches/SA-09:14/devfs7.patch
fetch http://security.FreeBSD.org/patches/SA-09:14/devfs7.patch.asc

Verifico la firma:

gpg --verify devfs7.patch.asc devfs7.patch

Aplico el parche:

cd /usr/src
patch < /root/parche/devfs7.patch

Recompilo el kernel:

make buildkernel KERNCONF=BSDBOX
make installkernel KERNCONF=BSDBOX

Reinicio el equipo y listo.

BSD HomeBox (VII): Repositorio de copias de seguridad

El objetivo es que el servidor actúe como respositorio de datos, donde poder depositar una copia de seguridad desde los clientes mediante rsync.

En este caso me ha orientado la siguiente guía:

http://www.freebsddiary.org/rsync.php

Instalo el port y me aseguro de seleccionar la opción ICONV en la configuración del mismo:

cd /usr/ports/net/rsync
make config
make install clean

Configuraré una conexión para realizar la copia de seguridad de mi pendrive desde el cliente Debian, editando el archivo /usr/local/etc/rsyncd.conf, quedando de la siguiente manera:

pid file = /var/run/rsyncd.pid
pid = datos
gid = datos
use chroot = no
max connections = 1
[USB_Emilio]
path = /datos/USB Emilio
read only = no
charset = iso8859-15
auth users = rbackup
secrets file = /usr/local/etc/rsyncd.secrets

Con el usuario datos, creo la carpeta destino de la información:

mkdir "/datos/USB Emilio"

Creo el archivo /usr/local/etc/rsyncd.secrets, que contiene los datos de autenticación, con el siguiente contenido:

usuariorsync:passwordrsync

Aseguro el archivo para que sólo pueda ser leído por root:

chmod 600 /usr/local/etc/rsyncd.secrets

Incluyo la siguiente línea en el archivo /etc/rc.conf:

rsyncd_enable="YES"

Por último inicio el demonio:

/usr/local/etc/rc.d/rsyncd start

Ahora ya puedo ejecutar la copia de seguridad desde el cliente con el siguiente script:

#!/bin/bash
rsync -rlti --delete --iconv=. --chmod=Du=rwx,Dg=rx,Do=,Fu=rw,Fg=r,Fo= /media/KINGSTON/ usuariorsync@ip_del_servidor::USB_Emilio
read -p "Pulsa [Intro] para terminar"

BSD HomeBox (VI): Servidor de impresión

Mi referencia para este apartado ha sido la siguiente guía:

http://www.freebsd.org/doc/en/articles/cups/index.html

Instalo el port correspondiente

cd /usr/ports/print/cups
make install clean

Creo las reglas para la asignación automática de los permisos a los dispositivos USB correspondientes a mi impresora, en el archivo /etc/devfs.rules:

[localrules=5]
add path 'unlpt0' mode 0660 group cups
add path 'ulpt0' mode 0660 group cups

Añado al archivo /etc/rc.conf la referencia a la nueva directiva:

devfs_system_ruleset="localrules"

Reinicio el proceso devfs:

/etc/rc.d/devfs restart

Incluyo la siguiente línea en el archivo /etc/rc.conf, para el inicio automática del demonio CUPS:

cupsd_enable="YES"

Descomento la siguiente línea en el archivo /usr/local/etc/cups/mime.convs, para evitar problemas con los clientes Windows:

application/octet-stream        application/vnd.cups-raw        0       -

Edito el archivo /usr/local/etc/cups/cupsd.conf:

Cambio la siguiente línea

Listen localhost:631

Por esta otra, para permitir conectarme a la web de configuración de CUPS desde otros equipos de la red

Port 631

Autorizo a los equipos de la red, mediante los siguientes apartados

# Restrict access to the server...
<Location />
Order allow,deny
Allow 192.168.1.*
</Location>
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow 192.168.1.*
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow 192.168.1.*
</Location>

Finalmente, inicio el servidor:

/usr/local/etc/rc.d/cupsd start

Ahora me conecto vía web al puerto 631 del servidor para configurar la impresora y compartirla.

No instalo en este servidor ningún tipo de controlador adicional para la impresora, dejando que sean los clientes los que dispongan de estos controladores.

BSD HomeBox (V): Sirviendo archivos

En primer lugar creo el usuario que será propietario de los datos ubicados en la partición que utilizaré para ello:

pw useradd -n datos -m -h 0

Edito el archivo /home/datos/.shrc  estableciendo en él un “umask” que me permitirá que todos los archivos creados por el usuario “datos” queden con permisos de lectura y escritura para él mismo y sólo lectura para los pertenecientes al grupo, además de no permitir el acceso al resto de usuarios:

umask 027

Creo la carpeta para el punto de montaje del filesystem y establezco los permisos oportunos:

mkdir /datos
chown datos:datos /datos
chmod 751 /datos

Formateo la partición del segundo slice, con el sistema de archivos UFS y habilitando los “soft-updates”:

newfs -U /dev/ad4s2a

Añado la partición al fichero /etc/fstab:

/dev/ad4s2a        /datos        ufs    rw        2    2

Monto el filesystem:

mount -a

Ahora instalo el servidor SAMBA, desmarcando en las opciones de compilación las entradas LDAP y WINBIND:

cd /usr/ports/net/samba33
make install clean

Edito el fichero /usr/local/etc/smb.conf, comentando completamente las secciones [homes] y [printers], y estableciendo las siguiente opciones (dejando el resto como está):

security = user
passdb backend = tdbsam
display charset = ISO8859-15
unix charset = ISO8859-15
dos charset = 850

En el mismo fichero anterior añado la siguiente sección, que representará el recurso compartido con los archivos que serviré:

[datos]
comment = Datos
path = /datos
valid users = datos
public = no
browseable = yes
writable = yes
printable = no
create mask = 0640
directory mask = 0750

Añado el usuario “datos” a la base de datos de SAMBA:

pdbedit -a -u datos

Añado al archivo /etc/rc.conf la siguiente línea para que el sistema inicie automáticamente el servidor SAMBA:

samba_enable="YES"

Reinicio el equipo y ya debería ser accesible el recurso desde la red.

BSD HomeBox (IV): Habilitando el acceso remoto

Voy a habilitar el acceso a la máquina vía SSH, ya que no dispondré de teclado ni monitor para acceder directamente.

Añado el usuario “remoto” que será el único con privilegios para la conexión, otorgándole permisos para hacer “su” a root:

pw useradd -n remoto -G wheel -m -h 0

Edito el fichero /etc/rc.conf añadiendo la siguiente entrada:

sshd_enable="YES"

Edito el fichero /etc/ssh/sshd_config añadiendo la siguiente línea:

AllowUsers      remoto

Inicio el servicio:

/etc/rc.d/sshd start

BSD HomeBox (III): Recompilando el sistema

Hago una copia de la configuración del kernel genérico y creo un enlace a la ruta donde se ubican normalmente estos archivos:

cd /usr/src/sys/i386/conf
mkdir /root/kernels
cp GENERIC /root/kernels/BSDBOX
ln -s /root/kernels/BSDBOX

Edito mi copia de configuración del kernel con el objetivo de optimizarlo un poco, eliminando entradas que no vaya a necesitar. En mi caso el contenido final del archivo es el siguiente:

cpu             I686_CPU
ident           BSDBOX

options         SCHED_ULE               # ULE scheduler
options         PREEMPTION              # Enable kernel thread preemption
options         INET                    # InterNETworking
options         SCTP                    # Stream Control Transmission Protocol
options         FFS                     # Berkeley Fast Filesystem
options         SOFTUPDATES             # Enable FFS soft updates support
options         UFS_ACL                 # Support for access control lists
options         UFS_DIRHASH             # Improve performance on big directories
options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
options         GEOM_PART_GPT           # GUID Partition Tables.
options         GEOM_LABEL              # Provides labelization
options         COMPAT_43TTY            # BSD 4.3 TTY compat [KEEP THIS!]
options         STACK                   # stack(9) support
options         SYSVSHM                 # SYSV-style shared memory
options         SYSVMSG                 # SYSV-style message queues
options         SYSVSEM                 # SYSV-style semaphores
options         P1003_1B_SEMAPHORES     # POSIX-style semaphores
options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extension
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         STOP_NMI                # Stop CPUS using NMI instead of IPI
options         AUDIT                   # Security event auditing

# To make an SMP kernel, the next two lines are needed
options         SMP                     # Symmetric MultiProcessor Kernel
device          apic                    # I/O APIC

# CPU frequency control
device          cpufreq

# Bus support.
device          pci

# ATA and ATAPI devices
device          ata
device          atadisk         # ATA disk drives
device          atapicd         # ATAPI CDROM drives
options         ATA_STATIC_ID   # Static device numbering

# SCSI peripherals
device          scbus
device          da
device          pass

# atkbdc0 controls both the keyboard and the PS/2 mouse
device          atkbdc          # AT keyboard controller
device          atkbd           # AT keyboard

device          vga             # VGA video card driver

# syscons is the default console driver, resembling an SCO console
device          sc
device          agp             # support several AGP chipsets

# Power management support (see NOTES for more options)
# Add suspend/resume support for the i8254.
device          pmtimer

# PCI Ethernet NICs that use the common MII bus controller code.
# NOTE: Be sure to keep the 'device miibus' line in order to use these NICs!
device          miibus          # MII bus support
device          rl              # RealTek 8129/8139

# Pseudo devices.
device          loop            # Network loopback
device          random          # Entropy device
device          ether           # Ethernet support
device          pty             # Pseudo-ttys (telnet etc)

# USB support
device          uhci            # UHCI PCI->USB interface
device          ohci            # OHCI PCI->USB interface
device          ehci            # EHCI PCI->USB interface (USB 2.0)
device          usb             # USB Bus (required)
device          ugen            # Generic
device          ukbd            # Keyboard
device          ulpt            # Printer
device          umass           # Disks/Mass storage - Requires scbus and da

Es importante, siempre que se actualizan los sources, recompilar todo el sistema, tanto el kernel como el resto de binarios.

En primer lugar elimino restos de compilaciones anteriores, aunque en este caso no sería necesario por tratarse de la primera vez:

cd /usr/obj
chflags -R noschg *
rm -rf *

Recompilamos e instalamos todo de nuevo:

cd /usr/src
make buildworld
make buildkernel KERNCONF=BSDBOX
make installkernel KERNCONF=BSDBOX
shutdown now
cd /usr/src
mergemaster -p
make installworld
mergemaster
reboot

BSD HomeBox (II): Configuraciones iniciales

A partir de ahora, y para toda la configuración del sistema, utilizaré el usuario “root” a menos que indique lo contrario.

En primer lugar establezco la configuración del compilador:

cp /usr/share/examples/etc/make.conf /etc
edit /etc/make.conf

Me aseguro de que quedan descomentadas las siguientes opciones, y añado la última ya que no aparece:

CPUTYPE?=pentium4
CFLAGS= -O2 -fno-strict-aliasing -pipe
CXXFLAGS+= -fconserve-space
NO_PROFILE=true

Instalo la colección de ports actualizada:

portsnap fetch
portsnap extract

Instalo el port que me permitirá actualizar la base de “sources” que tengo en el sistema:

cd /usr/ports/net/cvsup
make install clean

Al compilar el port le digo que no soporte X11.

Establezco un fichero de configuración para cvsup:

cp /usr/share/examples/cvsup/stable-supfile /root
edit /root/stable-supfile

Ahora modifico la línea del host por defecto al que se conectará cvsup estableciéndola así:

*default host=cvsup.es.FreeBSD.org

Actualizo todos los sources:

cvsup -g -L 2 /root/stable-supfile

Establezco los siguientes parámetros en el archivo /etc/rc.conf, para asegurar un correcto chequeo (desatendido) de los filesystems en caso de reinicio “inesperado”:

fsck_y_enable="YES"
background_fsck="NO"