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
Post a Comment