Header Ads

Samba Full Audit

En  Compartición de Archivos, hablamos de Samba y cómo compartir un directorio en nuestra red local (a ver si algún día los usuarios finalmente dejan de usar memorias usb para pasarse los archivos... y de paso, malware). 
Hoy le tocó el turno a  full_audit. Este módulo nos permite registrar en un log todo los que sucede con nuestro recurso compartido, los usuarios que acceden, crean, eliminan, modifican archivos y directorios, entre otros parámetros. 
Pero, antes de comenzar, debemos asegurarnos de lo siguiente: 
1. Instalar samba y componentes (puede variar en dependencia de sus necesidades):
sudo apt -y install samba samba-common smbclient winbind cifs-utils
Nota: Para eliminar:
sudo apt -y remove --purge samba samba-common cifs-utils smbclient
sudo rm -rf /var/cache/samba /etc/samba /run/samba /var/lib/samba /var/log/samba
2. Crear la carpeta que vamos a usar como compartida en nuestra red local (reemplace "your_user" por su usuario y "shared" por el nombre de su carpeta compartida):
mkdir -p /home/your_user/shared
sudo chown -R nobody.nogroup /home/your_user/shared
sudo chmod -R 777 /home/your_user/shared
3. Eventualmente Samba puede crear durante la instalación la carpeta  usershares (herencia de versiones anteriores) y en el caso de que no lo haga es mejor tenerla que no tenerla, pero dejarla solo para uso del usuario de sistema, activando Sticky Bit (para mayor información consulte Compartición de archivos y Samba Usershares):
if [ ! -d /var/lib/samba/usershares ]; then sudo mkdir -p /var/lib/samba/usershares; fi
sudo chmod 1775 /var/lib/samba/usershares/
sudo chmod +t /var/lib/samba/usershares/
4. Activar reglas en su firewall que permita el acceso a los puertos samba (opcional NetBios):
# NETBios (137,138,139), Microsoft-DS and SMB (445)
lan=enp2s0 # cámbielo por su interfaz de red
for protocol in $(echo tcp udp); do
    iptables -A INPUT -i $lan -p $protocol -m multiport --dports 137,138,139,445 -j ACCEPT
    iptables -A FORWARD -i $lan -p $protocol -m multiport --dports 137,138,139,445 -j ACCEPT
done
5. Tener declarado en nuestro archivo de configuración /etc/samba/smb.conf los paŕametros básicos globales (las configuraciones pueden variar en dependencia de las necesidades del usuario) (en interfaces reemplace eth1 por su interfaz de red y el rango 192.168.0.0/24 por el de su red local). Puede ver un ejemplo AQUÍ:
workgroup = WORKGROUP
server string = %h server
dns proxy = no
domain master = no
prefered master = no
local master = no
unix extensions = no
invalid users = root bin daemon adm sync shutdown halt mail news uucp operator
interfaces = lo eth1 127.0.0.1 192.168.0.0/24
max log size = 1000
server role = standalone server
obey pam restrictions = yes
unix password sync = yes
passwd program = /usr/bin/passwd %u
passwd chat = *Enter\snew\s*\spassword:* %n\n *Retype\snew\s*\spassword:* %n\n *password\supdated\ssuccessfully*
map to guest = bad password
security = user
valid users = nobody
guest account = nobody
log file = /var/log/samba/audit.log
6. Declarar nuestra carpeta compartida (reemplace el "path" y nombre de su recurso compartido):
[shared]
   comment = shared
   # change path
   path = /home/your_user/shared
   public = yes
   read only = no
   writeable = yes
   browseable = yes
   valid users = nobody
   guest ok = yes
   available = yes
   printable = no
   create mask = 0777
   directory mask = 0777 
Nota : Tenga presente que hasta aquí hemos creando un recurso compartido de acceso público. Si es lo que quiere, salte al punto 8
Para aplicar restricciones al recurso debe ponerle credenciales y para esto debe crear un usuario samba. Tenga en cuenta que a partir de la versión 4.x, Samba tiene la capacidad de ejecutarse como un controlador de dominio AD, por tanto no es necesario tener un usuario estándar de Linux/Unix para cada usuario de Samba que se crea. Para mayor información consulte  Cómo agregar un usuario de Samba en Linux
Una vez agregado el/los usuario/s verifique con:
sudo pdbedit -L
Si no sale nada es porque no lo agregó a samba
sudo smbpasswd -a usuario # cambie 'usuario' por el nombre del usuario a agregar a samba
New SMB password:
Retype new SMB password:
Si se equivoca puede eliminarlo
sudo smbpasswd -x usuario
Ahora debe agregar los usuarios que van a ingresar al recurso. Por tanto debe reemplazar:
valid users = nobody
por el/los usuario/s. Ejemplo:
valid users = user1, user2, user3
Para administrar el recurso, reemplace "your_user" por el usuario administrador (pueden ser varios pero no se recomienda):
admin users = your_user
Opcional: puede utilizar un solo usuario Unix para todos los usuarios que se conecten a este servicio. Para hacerlo, reemplace "your_user" por el usuario elegido:
force user = your_user
Al final quedaría el recurso configurado más o menos así (ejemplo: carpeta compartida "download" con restricciones):
[download]
  comment = download
  path = /home/user/download
  writeable = yes
  read only = no
  create mask = 0774
  directory mask = 0777
  # todos los usuarios con acceso a la carpeta
  valid users = user1, user2, user3
  # usuario administrador
  admin users = your_user
  # Opcional: Todos los archivos se escriben como este usuario
  force_user = your_user 
8. Si quiere agregar un veto de extensiones de archivos en su recurso compartido consulte  Veto Files 
9. Si va a usar firma SMB ( SMB sign) (recomendado), ejecute con privilegios administrativos los siguientes comandos en la consola cmd de sus equipos Windows (consulte la documentación AQUÍ):
reg add "HKLM\System\CurrentControlSet\services\LanmanWorkstation\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 1 /f
reg add "HKLM\System\CurrentControlSet\services\LanmanServer\Parameters" /v "RequireSecuritySignature" /t REG_DWORD /d 1 /f
reg add "HKLM\System\CurrentControlSet\services\LanmanServer\Parameters" /v "EnableSecuritySignature" /t REG_DWORD /d 1 /f
Importante:
- Windows 7/8/10/11 ya trae por defecto 1 en EnableSecuritySignature para LanmanWorkstation por tanto lo anterior no es necesario para esta clave
- Para deshabilitar la firma cambie el 1 por 0. 
- Si ejecuta los anteriores comandos y no está presente la activación de la firma en  smb.conf sus equipos perderán la conexión con el recurso compartido. Para activarla  agregue lo siguiente debajo de la plantilla [global]:
# smb v4.14 and later
server signing = mandatory
server min protocol = SMB3
server smb encrypt = required
# smb v4.13 or earlier
smb encrypt = required
Opciones por defecto según manual:
server signing = # default, auto, mandatory, disabled
server min protocol = # SMB2, SMB3, LANMAN1, LANMAN2, NT1
server smb encrypt = # default, off, if_required, desired, required
Importante: 
- Las opciones de min protocol y max protocol son: SMB2 (incluye SMB2_02, SMB2_10 -win7 default-), SMB3 (incluye: SMB3_00 -win8-, SMB3_02 -win8.1-, SMB3_11 -win10 default-), LANMAN1 y LANMAN2 (Soporte de nombre de archivo largo) y NT1 (conocido como CIFS -winNT-) . La opción SMB está descontinuada
- A partir del protocolo SMB2  ya no se puede deshabilitar la firma (o sea no se puede usar el parámetro server signing = disable y si se establece en deshabilitado, se tratará como automático) y tampoco se puede usar security = share y server signing al mismo tiempo
- Cuando se establece en automático (auto) o predeterminado (default), se ofrece cifrado, pero no se aplica. Cuando se establece en obligatorio (mandatory), se requiere el cifrado. 
- A partir de SMB3 (y superior) soporta cifrado completo (autenticación, transporte de datos, etc.), pero puede generar incompatibilidades con algunos equipos y sistemas operativos antiguos (anterior a Windows 8 y Windows Server 2012) o desactualizados. Si quiere garantizar retro-compatibilidad en su red local utilice SMB2, pero no tendrá cifrado completo.
- Si no tiene en cuenta la versión de Samba al usar el parámetro smb encrypt saldrá el mensaje de error Unknown parameter encountered: "server smb encrypt".
- Para mayor información sobre los parámetros en smb.conf ejecute en el terminal man smb.conf
Activando módulo full_audit
Y al fin llegamos a lo que nos interesa. Para activar el módulo debemos editar  /etc/samba/smb.conf y agregar a la plantilla [global]:
vfs object = full_audit
full_audit:prefix = %I|%m|%S
full_audit:success = mkdirat pread pwrite renameat unlinkat create_file
full_audit:failure = none
full_audit:facility = LOCAL7
full_audit:priority = notice
Nomenclatura:
- vfs objects: Carga del módulo full_audit
- full_audit:prefix: Variables que se almacenarán en el log (usuario, IP, nombre del equipo, nombre de la carpeta compartida, etc.)
- full_audit:failure: Operaciones a registrar si hay error (se usan los mismos valores que full_audit:success). En el ejemplo usamos la opción none para no dejar registros de los fallos
- full_audit:facility: LOCAL5 (si va a registrar en un LOG individual) o LOCAL7 (en syslog)
- full_audit:priority: Niveles de registro (notice, info, debug, warning, alert)
- full_audit:success: Operaciones que se registrarán en el log (obtenga la lista completa de opciones  AQUÍ)
  • mkdirat: creación de carpetas
  • renameat: renombrado o manipulación de archivos
  • unlinkat: borrado de archivos y carpetas
  • create_file: creación archivos (genera mucha información basura)
  • pwrite: escritura de archivos
  • pread: apertura de archivos
- %I: Dirección IP del cliente
- %m: NetBIOS del cliente
- %S recurso solicitado (en este caso la carpeta compartida)
Importante:
- Si tiene varias carpetas en  smb.conf y la cláusula los parámetros full audit están debajo de la plantilla [global] pero encima de las configuraciones de sus carpetas, entonces auditará todas las carpetas configuradas en smb.conf. Si desea limitar la auditoría a una carpeta específica (ejemplo: la compartida), entonces pase la cláusula vfs object = full_audit (o full_audit recycle si tiene papelera de reciclaje) al final de los parámetros de dicha carpeta en  smb.conf
- A partir de Samba 4 y si agrega un parámetro inexistente o descontinuado (como rmdir, rename o mkdir) aparecerá en el log el registro el mensaje Could not find opname rename, logging all y se activarán todas las opciones de full_audit y su log se llenará de datos (inservibles). Para mayor información consulte Bug Samba vfs_full_audit reports everything 
- El parámetro %m trabaja conjuntamente con el demonio nmbd y para que funcione debe activar smb ports = 139 en smb.conf. Tenga en cuenta que esto hará que Samba no escuche en el puerto 445 y permitirá que la funcionalidad de inclusión funcione como hizo con Samba 2.x, pero su red local puede perder el acceso al recurso compartido (A partir de la version 4.13.14 ya no es necesario activar este puerto en smb.conf para que muestre en audit.log el nombre de los equipos que se conectan al recurso compartido).
LOCAL5 vs LOCAL7
Con LOCAL7 los registros se guardan en syslog. Para independizar los registros de auditoría es más cómodo LOCAL5:
full_audit:facility = LOCAL5
Para esto editamos:
/etc/rsyslog.d/50-default.conf
Y agregamos la siguiente línea (preferentemente en la cabecera para que sea prioritaria):
local5.* /var/log/samba/audit.log
& stop 
O abreviando:
echo -e "local5.* /var/log/samba/audit.log\n& stop" | sudo tee -a /etc/rsyslog.d/50-default.conf
Lo anterior significa que todos los registros se almacenan en /var/log/samba/audit.log y la segunda línea evita que se guarden en syslog.
Nota: Antes de Samba 4 se utilizaba el estado ~ pero ya está descontinuado y si lo usa saldrá el error 2307
No olvidemos crear el log si no existe:
if [ ! -d /var/log/samba ]; then sudo mkdir -p /var/log/samba; fi
sudo touch /var/log/samba/audit.log
Reiniciamos los servicios:
sudo systemctl restart rsyslog smbd nmbd winbind
o recargarlos:
sudo smbcontrol all reload-config && sudo /etc/init.d/rsyslog force-reload
Nota: Al hacer este cambio rsyslog puede generar un registro bastante molesto, que si se deja así puede llenar nuestro log rápidamente:
rsyslogd: action 'action-1-builtin:omfile' suspended (module 'builtin:omfile'), retry 0
Para solucionarlo, comente las siguientes líneas en /etc/rsyslog.conf (ejecute los comandos en el terminal):
sudo cp -f /etc/rsyslog.conf{,.bak}
sudo sed 's/^[^#]*\($FileOwner syslog\|$FileGroup adm\|$FileCreateMode 0640\|$FileCreateMode 0640\|$DirCreateMode 0755\|$Umask 0022\|$PrivDropToUser syslog\|$PrivDropToGroup syslog\)$/#\1/' -i /etc/rsyslog.conf
No olvide asegurarse que al final del archivo /etc/rsyslog.conf se encuentre declarado audit.log (ejecute el siguiente comando en el terminal):
grep -qxF '*.none /var/log/samba/audit.log' /etc/rsyslog.conf || echo '*.none /var/log/samba/audit.log' | sudo tee -a /etc/rsyslog.conf
Nota: También podemos usar Apache y publicar el log para verlo en el navegador, o supervisarlo con webmin
Rotación del log
Para rotar el log edite el archivo:
/etc/logrotate.d/samba
Y agregue la siguiente información:
/var/log/samba/audit.log {
	weekly
	missingok
	rotate 7
	postrotate
	    reload rsyslog > /dev/null 2>&1 || true
	endscript
	compress
	notifempty
}
Bonus: Full Audit con Papelera de Reciclaje 
Para activar full audit con papelera de reciclaje (Recycle Bin) en la carpeta compartida agregue lo siguiente (los parámetros pueden cambiar según sus necesidades).  Para mayor información consulte  Cómo configurar Samba con Papelera de Reciclaje:
## SAMBA FULL AUDIT AND RECYCLE BIN ###
vfs object = full_audit recycle
full_audit:prefix = %I|%m|%S
full_audit:success = mkdirat pread pwrite renameat unlinkat
full_audit:failure = none
full_audit:facility = LOCAL5
full_audit:priority = notice
recycle:repository = recycle/%U
recycle:directory_mode = 0777
recycle:touch = yes
recycle:keeptree = yes
recycle:versions = yes
recycle:noversions = *.doc*/*.ppt*/*.xls*/*.pdf/*.dat/*.ini
recycle:exclude = *.tmp|*.temp|*.o|~$*|*.~??|*.log|*.trace|*.TMP|*.asv
recycle:exclude_dir = /temp|/tmp|/cache|/.Trash-1000
recycle:maxsize = 0
recycle:mode = KEEP_DIRECTORIES|VERSION|TOUCH
hide files = /recycle/
Vaciado de la Papelera de Reciclaje cada 7 días en crontab:
@weekly find ~/shared/recycle/* -mtime +7 -exec rm -rf "{}" \; >/dev/null
  
Concluyendo, este módulo es bastante útil, pero no espere milagros. Samba cambia los parámetros con cada versión (a veces son necesarios y a veces no), los manuales no los actualizan a tiempo y en ocasiones los cambios son tantos que es difícil seguirles el paso.

Actualización
Tenga en cuenta la nueva vulnerabilidad de Samba a la hora de configurarlo
Con la tecnología de Blogger.