febrero 18, 2017

Compartición de archivos II

Linux shares mapped as network drives in Windows. Image by techgage
En el post anterior Compartición de Archivos, publicamos una serie de recomendaciones referentes a Samba (una implementación libre del protocolo de archivos compartidos de Microsoft Windows para sistemas tipo UNIX que permite la interacción entre estas plataformas), pero con la llegada de Samba 4, los problemas en lugar de disminuir, aumentaron, ya que sus diseñadores no se molestaron en corregir las fallas de la versión, cuando ya estaban liberando la siguiente.
Asumiendo que no tenemos problemas con SELinux (restricciones sobre la lectura y escritura de la carpeta compartida), para solucionar muchos males heredados de versiones previas a Samba 4, lo mejor es eliminarlo y reinstalarlo:
sudo apt purge -y samba samba-common smbclient system-config-samba
sudo rm -rf /etc/samba /etc/default/samba /var/cache/samba
sudo apt autoremove && sudo apt -y update && sudo apt -y dist-upgrade
sudo apt -y install libnss-winbind* libpam-winbind* samba* smbclient system-config-samba winbind*
sudo apt -f install
Una vez hecho esto, hay que hacer unos pequeños ajustes al archivo de configuración (/etc/samba/smb.conf) que harán que su Samba funcione mejor. 
Según mit.edu han surgido informes recientes de clientes Microsoft Windows con problemas de compatibilidad con servidores de seguridad a nivel de recurso compartido. Para solucionarlo edite smb.conf y reemplace en la sección [global]:
security = share
por
security = user
Y:
map to guest = bad user
por
map to guest = Bad Password
En el caso de carpetas públicas lo recomendado es asignarlas al grupo "nobody.nogroup" para evitar problemas de conexión con Windows. Ejemplo: (carpeta pública: "compartida").
mkdir -p compartida
sudo chown -R nobody.nogroup compartida
sudo chmod -R 777 compartida
También se recomienda desactivar las reglas obsoletas syslog:
# syslog only = no
# syslog = 0 
Un mensaje frecuente que vemos en los logs es similar a este: Samba name server USER is now a local master browser for workgroup WORKGROUP on subnet 192.168.1.16, que se repite cada vez que el servicio de samba reinicia:
Para prevenir que Samba haga esto como un intento de controlar la red local (Domain Controller Windows NT Server, o similares) se recomienda agregar a la sección [global] lo siguiente:
domain master = no
prefered master = no
local master = no
Establecer el hostname:
sudo hostnamectl set-hostname $HOSTNAME
Y verifique con:
cat /etc/hostname
Una vulnerabilidad reciente detectada en Samba, identificada con CVE-2017-2619 puede permitir a un cliente malicioso acceder a áreas no exportadas del servidor de archivos mediante una ruta de enlace simbólico. Para evitarlo actualice a la última versión y edite el smb.conf y agregue a la sección [global] el siguiente parámetro (y luego reinicie samba):
# Symlink race allows access outside share definition
# https://www.samba.org/samba/security/CVE-2017-2619.html
unix extensions = no
Otra situación que se puede presentar con Samba 4 es la caída constante del servicio nmbd
Esto se debe a la exclusión de localhost (lo) en la línea de interfaces. Para solucionarlo agréguelo de acuerdo a las especificaciones oficiales:
bind interfaces only = yes
interfaces = lo eth0
Aunque si Samba presenta conflictos con systemd (algo muy frecuente), puede desactivar bind interfaces only, pero tenga en cuenta que al hacerlo Samba solo dependerá de los puertos abiertos en el firewall y no de la interfaz de red asociada:
bind interfaces only = no
Otro problema que puede presentarse en la compartición de archivos es con el directorio /var/lib/samba/usershares, y pueden salir mensajes como este:
Esto puede ser generado por muchas causas. Una de ellas es el malware (que se está pasando de los PCs Windows a la carpeta compartida, que está montada como unidad de red en los PCs conectados a Samba, asumiendo que la partición donde se encuentre la carpeta compartida sea NTFS).
Una posible solución es evitar que otros, que no sean el propietario, escriban o renombren archivos en esa carpeta y activando Sticky bit:
sudo chmod 1775 /var/lib/samba/usershares/
sudo chmod +t /var/lib/samba/usershares/
Y agregar en la sección Global de smb.conf la línea:
usershare path =
Un mensaje muy común es sobre el número límite de Windows rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384). Para solucionar este problema, edite el archivo /etc/security/limits.conf y agregue la línea:
*  -  nofile  16384
Guarde cambios y reinicie el equipo. Finalmente pruebe su smb.conf para verificar que todos los parámetros están correctos, con el comando:
testparm
Y si todo sale bien, reinicie los servicios:
sudo systemctl restart smbd.service nmbd.service winbind.service
Sin embargo hay una falla de Samba 4, que no se puede solucionar con un simple cambio en la configuración. Si revisamos los logs (en algunos equipos) veremos el mensaje systemd[1]: Reloading LSB: start Samba SMB/CIFS daemon (smbd):
Este mensaje es normal que aparezca regularmente al reiniciar los servicios. Lo que no es normal es que se repita cada 5 minutos aproximadamente, y en cuestión de horas congestione los logs de samba. Muchos blogs hablan sobre el tema y al parecer afecta a algunas distribuciones de Linux; incluso es considerado un Bug. Desafortunadamente la solución a esta falla de Samba depende en gran medida de la configuración de las interfaces de red del equipo donde esté instalado.
NetworkManager es una especie de demonio o más bien un frontend (de iproute, dhclient, wpa_supplicant y ppp) que sirve para editar las conexiones de red, de una manera cómoda en el escritorio de Linux (sea cual sea). Es bastante intuitivo y facilita las conexiones, sobre todo las redes inalámbricas. Pero existe otro archivo llamado /etc/network/interfaces que hace exactamente lo mismo, con la diferencia que nos permite poner valores estáticos de configuración de nuestras interfaces de red, lo cual es bueno, ya que impide alteraciones en los parámetros por personas no autorizadas (se modifica con permisos de superusuario (sudo) o root), brindando una mayor seguridad que NetworkManager. Usualmente se utiliza para configurar las interfaces de red en servidores proxy y otros tipos de servidores en redes locales.
Estos dos "mecanismos" de interacción con las interfaces de red no siempre se llevan bien, y por lo general sucede que al ingresar información al archivo "interfaces", NetworkManager no lee adecuadamente la información de este archivo o simplemente queda inutilizado. El resultado de esta "pelea" afecta a Samba en su versión 4x (no podemos confirmar que esto suceda con versiones anteriores).
En resumen, Samba mantiene buenas relaciones con NetworkManager, ya sea con IPs estáticas o DHCP, pero tiene problemas con la información de red DHCP que pongamos manualmente en el archivo "interfaces". En concreto, la falla de Samba radica en que no interpreta bien la regla DHCP. Ejemplo:
auto eth0
iface eth0 inet dhcp
Esto genera el reinicio constante de los servicios de Samba y mensaje reloading lsb start samba smb/cifs daemon (smbd), causando desconexiones de los recursos compartidos. Paradójicamente no sucede lo mismo con la información en "interfaces" que contenga IPs estáticas, la cual Samba lee correctamente. Ejemplo:
auto eth0
iface eth0 inet static
address 192.168.0.10
netmask 255.255.255.0
broadcast 192.168.0.255
network 192.168.0.0
gateway 192.168.0.1
dns-nameservers 8.8.8.8 8.8.4.4
Entonces la solución para evitar el colapso de Samba es, si tenemos un servidor en producción con una o varias interfaces de red (ej: una para internet y otra para la red local), sin importar el tipo de interfaz (wifi, eth, etc.) se recomienda desinstalar NetworkManager y configurar el archivo "/etc/network/interfaces" y asignar a las tarjetas de red, direcciones IPs estáticas (fijas).
Caso contrario; si tenemos un terminal Linux para nuestro trabajo diario en una red local, lo recomendado es que maneje sus conexiones con NetworkManager (si va a usar NetworkManager, asegúrese de tener el archivo /etc/libuser.conf con los permisos adecuados. Si no lo tiene puede crearlo desde root).
Es necesario aclarar que estas fallas no afectan a todas las distribuciones de Linux ni a todas las versiones, por tanto recomendamos que revise sus logs, para cerciorarse, antes de aplicar las correcciones propuestas. Finalmente no olvide abrir en su firewall los puertos Samba (137, 138, 139 y 445 tcp/udp)
Asignatura pendiente
Desafortunadamente Samba aún es muy limitado, por ejemplo sigue sin brindar soporte para establecer límites en cuanto a la capacidad de directorios compartidos (y mucho menos a subdirectorios dentro del directorio compartido), y la única manera de hacerlo es asignando cuotas de disco... o haciendo trampas con imágenes montadas.
Ejemplo:
A continuación, crearemos una imagen llamada share.img, de 1 GB pero puede ser de la cantidad que quieran, con un bloque de 1024 bytes, que es el recomendado para crear la imagen inicial y así no recargar el sistema durante la creación, en el directorio test que será montada en el directorio share (que es el directorio compartido para usuarios (deben crear primero las carpetas y asignarle propietario -chown- y permisos -chmod-).
1. Creando la imagen de 1 GB (1048576). Puede usar esta calculadora para determinar los valores para la imagen en Kb y determinar el tamaño del bloque
dd if=/dev/zero of=/home/user/test/share.img bs=1024 count=1048576
2. Creando el sistema de archivos (ext2/ext3/ext4) con mke2fs.
sudo mke2fs -L share.img -j /home/user/test/share.img
Por defecto crea en ext3. Para especificar ext4 agregue la opción -t
sudo /sbin/mke2fs -t ext4 -L share.img -j /home/user/test/share.img
También puede formatear la partición en ext4 con:
sudo mkfs.ext4 /home/user/test/share.img
Reemplace mkfs.ext4 por mkfs.ext3 o mkfs.ext2 si va a usar ext3 o ext2. O mkfs.vfat (mkfs -t vfat 32 -F /dev/hda1 o mkfs.vfat -n nombre /dev/sdc1). Si no quiere reservar block use el parámetro -m 0
3. Opcional: Incrementando el bloque a 8786 (de 4k) (Solo funciona con particiones simples. La imagen no debe estar montada)
sudo resize2fs -M /home/user/test/share.img
Opcional: Cambiando la etiqueta a la imagen (Donde "prueba" es el nombre que se le asignará a la unidad)
sudo e2label /home/user/test/share.img prueba
4. Verifique la imagen que está correcta antes de montarla
sudo e2fsck -f -y /home/user/test/share.img
5. Montando la imagen en el directorio compartido "share" y permisos sobre lo montado
sudo mount -t ext4 /home/user/test/share.img -o loop /home/user/share
sudo chmod 1777 /home/user/share
Este procedimiento se puede automatizar con el siguiente script. Para redimensionar consulte AQUI.
De esta manera se limita el almacenamiento. También se puede hacer con subdirectorios dentro del directorio compartido, pero tenga en cuenta que debe incluir estas imágenes a montar en el fstab para que arranquen con el sistema.
Esperemos que algún día Samba incluya esta posibilidad nativamente y así evitarnos este engorroso procedimiento de tener cuotas de disco o montar imágenes.

Lista de cambios en Samba 4x
Maravento, Actualizado en: 11:43
Escrito por: Maravento Studio
 
© 2017 Maravento. All Rights Reserved | Powered by Maravento
Design by Novatoz and Maravento | Bloggerized By LawnyDesignz
# https://github.com/google/code-prettify