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)
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 your_user # cambie 'your_user' 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 2022
Tenga en cuenta la nueva vulnerabilidad de Samba a la hora de configurarlo

Actualización 2023
En las versiones de samba 4x muchas cosas han cambiado, como era de esperarse, es dificil seguirle el paso a esta gente. Hay un montón de cosas que ya no son necesarias, o es mejor que samba las administre y otras que son opcionales y se pueden personalizar. 
Esta es mas o menos la lista de lo que hemos podido detectar (lo que está comentado con ";" es mejor que samba lo administre, excepto las reglas "opcional" que pueden personalizarlas. Reemplace "your_user por el nombre del usuario samba):
# smb port for NetBIOS
;   smb ports = 445 139

# NetBIOS name
;   netbios name = your_user

# hosts allow (opcional)
;   hosts allow = 127.0.0.1, 192.168.0.0/24

# hosts deny (ALL, 0.0.0.0/0 150.203.4. badhost.mynet.edu.au etc.) (opcional)
;   hosts deny = ALL

# Prevent Samba´s services to manage the network (Domain Controller like a WinNT Server, or similar)
;   domain master = auto
;   local master = yes
;   preferred master = auto

# Windows Internet Name Service (WINS)
;   wins support = no

# Extended Attributes (opcional)
;   ea support = yes

# Store dos attributes
;   store dos attributes = yes
;   map archive = yes
;   map hidden = no
;   map system = no
;   map readonly = no

# Shared printers on samba server (si el servidor no tiene impresoras compartidas use esta configuración)
load printers = no
disable spoolss = yes

# winbindd will store user credentials from successful logins encrypted in a local cache.
winbind offline logon = no

# security users
security = user
guest account = your_user

# smb sign and smb protocol
server signing = mandatory
server min protocol = SMB3

# Encrypt (opcional)
# Important: This rule activates username and password to access shared resources
# for v4.13 or earlier
;   smb encrypt = required
# for v4.14 or higher
;   server smb encrypt = required

# Symlink race allows access outside share definition
# https://www.samba.org/samba/security/CVE-2017-2619.html
unix extensions = no

# Log Level (default: log level = 0)
;   log level = 1

# Deprecated
;   syslog = 0
;   syslog only = yes
Referente al módulo full_audit, es necesario configurar rsyslog para que pueda funcionar correctamente, ya que este tema de los registros personalizados es un poco enreversado. Entonces, es necesario primero corregir las reglas full audit en smb.conf quedando así. En la sección Global:
[global]
# SAMBA FULL AUDIT AND RECYCLE BIN
# NOMENCLATURE
# mkdirat: Create folders/directories | Creación de carpetas/directorios
# rmdir: Delete folders/directories | Borrado de carpetas/directorios
# pread: Open files (read) | Archivos abiertos (lectura)
# pwrite: New files (created or uploaded) | Nuevos ficheros (creados o subidos)
# renameat: Rename files | Renombrado de archivos
# unlinkat: Delete files | Borrado de archivos
# full audit
full_audit:logfile = /var/log/samba/fullaudit.log
full_audit:prefix = %I|%m|%S
full_audit:success = mkdirat read pread write pwrite renameat unlinkat
full_audit:failure = none
full_audit:facility = LOCAL5
full_audit:priority = notice
# recycle
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/
Y al final de la información de la carpeta compartida que pretendemos hacerle auditoría. Ejemplo:
[compartida]
comment = compartida
path = /home/your_user/compartida
public = yes
read only = no
writeable = yes
browseable = yes
valid users = nobody your_user
force user =
guest ok = yes
guest only = yes
available = yes
printable = no
create mask = 0777
directory mask = 0777
# Full Audit and Recycle
vfs object = full_audit recycle
Y ahora configurar los registros de rsyslog. Antes que nada elimine cualquier configuración personalizada (que mencionamos anteriormente) de /etc/rsyslog.conf y edite el archivo /etc/rsyslog.d/50-default.conf y agregue la siguiente regla ANTES de la directiva de syslog, quedando de la siguiente manera:
# fullaudit rule
if $PRI == 173 then {
   /var/log/samba/fullaudit.log
 stop
}
# First some standard log files.  Log by facility.
#
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
#cron.*				/var/log/cron.log
#daemon.*			-/var/log/daemon.log
kern.*				-/var/log/kern.log
#lpr.*				-/var/log/lpr.log
mail.*				-/var/log/mail.log
#user.*				-/var/log/user.log
O desde el terminal de comandos, ejecutar:
sudo sed -i '/# First some standard log files.  Log by facility./i # fullaudit rule\nif $PRI == 173 then {\n   /var/log/samba/fullaudit.log\n stop\n}' /etc/rsyslog.conf
Bueno, aquí surge la primera pregunta: Por qué los cambios deben hacerse en /etc/rsyslog.d/50-default.conf y no en /etc/rsyslog.conf?
La respuesta es "depende". Para saberlo ejecute el siguiente comando:
# deteniendo el servicio
sudo systemctl stop syslog.socket rsyslog.service
# verificando que esté detenido
ps ax | grep rsyslog | grep -v grep
# iniciando el servicio con la opción "-o":
sudo /usr/sbin/rsyslogd -o out.txt
# verificando que esté iniciado con esta opción:
ps ax | grep rsyslog | grep -v grep
294400 ?        Ssl    0:00 /usr/sbin/rsyslogd -o out.txt
Y si en la cabecera del archivo out.txt aparece algo como esto:
##### BEGIN CONFIG: /etc/rsyslog.d/50-default.conf (put on stack)
# etc etc etc etc......
Indica que rsyslog inicia primero en la sección /etc/rsyslog.d/50-default.conf, y como las reglas se leen en órden, la configuración personalizada deberá ir ahí.
Y que carajos es $PRI == 173?
Como bien lo explica David Lang en el issue 5214: "All the logs has a PRI value of 173" (ver la tabla PRI para local5 AQUI). 
Este tipo de nivel de depuración se puede ver si activamos la siguiente regla en /etc/rsyslog.conf:
if $syslogtag == "smbd_audit:" then /var/log/samba/debug.log;RSYSLOG_DebugFormat
Y la salida en debug.log, al comienzo de cada registro saldrá lo siguiente (en 'your_user' aparecerá el usuario de su servidor samba):
FROMHOST: 'your_user', fromhost-ip: '127.0.0.1', HOSTNAME: 'your_user', PRI: 173,
PRI: 173 son mensajes de tipo smbd_audit:, como estos:
msg: ' 192.168.1.31|desktop-rm8iodm|shared|unlinkat|ok|/home/user/shared/~$test.xlsx'
También puede encontrar otros registros, tales como:
FROMHOST: 'your_user', fromhost-ip: '127.0.0.1', HOSTNAME: 'your_user', PRI: 86,
Pero estos corresponden a mensajes similares al siguiente (que no nos interesan):
msg: ' pam_unix(samba:session): session closed for user
PRI: 173 viene siendo similar a local5.none, entonces se puede reemplazar con:
*.info;mail.none;authpriv.none;cron.none;local5.none /var/log/messages
local5.* /var/log/samba/fullaudit.log
& stop
Lo importante aquí no es la regla que utilice, sino dónde la va a poner. Debe estár en donde primero lee rsyslog y si quiere que los mensajes smbd_audit aparezcan en fullaudit.log y también en syslog, puede ponerla al final, pero si quiere evitar duplicados y que solo queden en fullaudit.log, deberá ponerla al comienzo del archivo de configuración de rsyslog

Con la tecnología de Blogger.