Ultimando un servidor SAMBA en ubuntu

Después de seguir los pasos en Añadir Samba en Active Directory me interesa acabar de dejar el servidor operativo haciendo lo siguiente:
  1. Crear un directorio para cada usuario del dominio "privado" que solo acceda él
  2. Crear los directorios compartidos de grupo (por departamentos por ejemplo)
  3. Auditar quien borra archivos
  4. Deshabilitar soporte de impresión
  5. Ejecutables en shares de samba
1. Crear directorios "privados" para cada usuario


Primero lo que haremos es crear para cada usuario del dominio un directorio en /home tal que solo pueda entrar el usuario correspondiente. Nota: el grupo users es un grupo que tiene por defecto ubuntu.

wbinfo -u > users
# edit users file to remove invalid users
-------------------
#!/bin/bash

while read x; do
  mkdir "/home/$x"
  chown "$x".users "/home/$x"
  chmod 700 "/home/$x"
done
ejecutando: cat users | ./create.sh (nombre del script) tenemos los directorios creados y con sus permisos. Verificamos que /etc/smb.conf este correcto:

[homes]
comment = Directorio personal
path = /home/%S
browseable = no
read only = no
create mask = 0600
directory mask = 0700
valid users = %S
force group = users
Comentarios:
  • Solo comentar que es necesario poner el path para que sepa encontrar donde está el directorio de usuario
  • Cuando el usuario ponga contenido lo crea con un grupo de active directory. Tampoco importa mucho ya que solo puede acceder él, así que no problem, pero para tenerlo limpito le meto el force group
  • Al hacerlo con la directiva [homes] y añadiendo el browseable=no es guapo porque cuando un usuario va a \\servidor no ve los recursos compartidos de los otros usuarios, solo ve su privado (y otros recursos que haya definidos pero no los privados de los demás)

2. Directorios departamentales o de grupo

En este punto me guío del post Añadir samba en AD (II). En este caso me interesa tener un directorio de Administración con un montón de contenido y hay dos subcarpetas que solo pueden acceder miembros de otro grupo (que es un subgrupo de administración)

wbinfo -g > users
# edit users file to remove invalid groups
-------------------
#!/bin/bash

while read x; do
  mkdir "/home/$x"
  chown Administrador."$x" "/home/$x"
  chmod 770 "/home/$x"
  chmod g+s "/home/$x"
done
ejecutando: cat users | ./script nos crea los directorios para cada grupo con sus permisos. Añadimos a /etc/smb.conf las configuraciones para dar acceso:
[administracio]
  path = /home/administracio
  read only = no
  browseable = yes
  valid users = @administracio
  admin users = ds
  create mask = 0660
  directory mask = 0770
  nt acl support = yes
  inherit acls = yes
#  inherit permissions = yes
  inherit owner = yes
  vfs objects = acl_xattr
Ahora creamos una carpeta dentro del recurso de administracio, se crea con permisos 0770 y con el grupo general. Si queremos que esta carpeta solo pueda entrar un grupo (o usuario) diferente de @administracio haremos los siguiente
setfacl -m g:Personal:rwx -m g::0 Personal/
setfacl -d -m g:Personal:rwx -m g::0 Personal/
se sobreentiende que el grupo Personal es un subgrupo de administracio sino no podrían acceder al recurso. El resto de usuarios que no son de personal no pueden acceder. Como el recurso tiene el inherit owner = Yes resulta que los archivos/directorios que se creen serán de Administrador pues es el propietario del directorio (ver script al crear los directorios).

También ha sido posible, desde el usuario ds que es un admin user, desde windows, acceder a las propiedades de la carpeta Personal, quitar la "herencia de permisos", quitar al grupo administracio y añadir al grupo personal con "control total" con el mismo resultado, EXCEPTO QUE, en las subcarpetas de personal el grupo administracio tambien tiene permisos (aunque no pueden entrar ya que no tienen acceso a personal). Por si las moscas prefiero hacerlo desde la consola linux.

3. Auditar


Para auditar los eventos usamos:

vfs objects = acl_xattr full_audit
full_audit:prefix = %u|%m-%I
full_audit:success = rmdir rename unlink
full_audit:failure = connect
full_audit:facility = local7
full_audit:priority = notice
en las propiedades del share de samba. Lo que hacemos es auditar cuando se borra un archivo o directorio o cambios de nombre, así cuando se deniega conectar. Estos logs los envia a LOCAL7.NOTICE. Utilizamos rsyslogd para los registros de errores, por tanto en /etc/rsyslog.d/50-default añadimos al final:
local7.notice     -/var/log/samba-audit
Tambien modificaremos la linea que guarda en /var/log/syslog (o messages) poniendo local7.none ya que sino los logs se duplicaran en los archivos:
*.*;auth,authpriv.none,local7.none  -/var/log/syslog
Finalmente haremos un logrotate evitar que nos genere un archivo inmenso, pero guardando un tiempo prudencial. Creamos un archivo en /etc/logrotate.d/samba-audit

/var/log/samba-audit {
   weekly
   missingok
   rotate 8
   postrotate
         reload rsyslog >/dev/null 2>&1 || true
   endscript
   compress
   notifempty
}
4. No soporte a impresión


Con el tiempo me doy cuenta que no paran de salir errores en el log.smbd:

[2012/05/24 10:30:20.698705,  0] printing/print_cups.c:110(cups_connect)
  Unable to connect to CUPS server localhost:631 - Connection refused
Evidentemente no tengo cups instalado pues las impresoras están en otro servidor. Para deshabilitarlo pongo lo siguiente en /etc/samba/smb.conf en la sección global:
disable spoolss = yes
load printers = no
printing = bsd
printcap name = /dev/null
5. Ejecutables en shares de samba

Me he encontrado que no podia ejecutar .exe en un recurso compartido. Sin embargo, el mismo .exe copiado en otro share del mismo servidor SI que se ejecutaba. Al final la solución a sido crear otro share y copiar los ficheros DESDE WINDOWS, entonces funciona, si lo copio desde linux por algun motivo (aunque despues les meta los mismos permisos) no puedo ejecutarlos.

Al copiar todos los archivos desde windows las carpetas me mete una ACL absurda, para quitarlas:
find . -type d -exec setfacl -b '{}' \;






Comentarios