Samba

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Es relativamente sencillo compartir recursos entre sistemas Linux con NFS. Incluso usar OpenLDAP para autentificar usuarios en la red no resulta excesivamente complejo. Pero Windows no es directamente compatible con los protocolos NFS o CUPS. Tampoco puede usar directamente un servidor LDAP para autentificar. Necesita estar en un Dominio a su medida. De la misma manera, Linux no puede pertenecer a un dominio Windows.

Samba permite crear redes mixtas. Un Linux puede ser cliente o servidor de Windows. Incluso se puede usar Samba para comunicar dos Linux. Al principio, Samba se implementó mediante ingeniería inversa, ya que los protocolos de Windows no estaban publicados.

Usos de Samba

Samba puede ser útil cuando:

  • No se quiere paga por un servidor Windows
  • Las licencias de cada cliente para acceder a un servidor Windows son demasiado caras.
  • Hacer una transición de Windows a Linux y viceversa.
  • Compartir impresoras entre los dos sistemas.
  • Para una red con clientes mixtos.
  • Para integrar un método de autentificación común para clientes de todo tipo.

Samba Permite:

  • Compartir partes de un sistemas de ficheros (carpetas)
  • Control de acceso a recursos.
    • Shared
    • User
  • Compartir impresoras
  • Servidor de resolución de nombres NetBios (WINS)

Historia de Samba

Andrew Tridgell, creador del algoritmo de rsync, comenzó el desarrollo de smbserver en 1991. Más adelante se llamó Samba por problemas de marcas registradas. Para obtener el nombre buscó una palabra en el diccionario de Linux que tuviera las letras SMB:

$ grep -i '^s.*m.*b' /usr/share/dict/words
salmonberry
samba
sawtimber
scramble
....

Recientemente, Microsoft ha revelado parte de sus protocolos para mejorar Samba, ya que es interesante para ellos que funcione correctamente la integración entre los dos sistemas. Noticia

Protocolos implementados por Samba

  • NetBios over TCP/IP
  • SMB (Actualmente CIFS)
  • DCE/RPC o MSRPC (RPC de Windows)
  • WINS. Aunque ha quedado relegado por DNS, se puede seguir usando.
  • NT Domain suite of protocols:
    • NT Domain Logons
    • Secure Account Manager (SAM) database
    • Local Security Authority (LSA) service
    • NT-style printing service (SPOOLSS)
    • Active Directory Logon Kerberos (Kerberos y LDAP)
  • Compartició de impresoras.

Netbios

Protocolo de nivel de sesión del modelo OSI. Se trata de una especificación de interfaz de acceso a recursos de red para máquinas independiente del hardware.

Nació en 1984 de la mano de IBM com una API para diseñar aplicaciones de red.

Netbios proporciona:

  • Resolución de nombres.
  • Servicios de sesión para comunicaciones orientadas a conexión.
  • Servicio de datagramas para las no orientadas a conexión.

SMB/CIFS

Server Message Block. Protocolo de nivel de aplicación utilizado para compartir ficheros, impresoras y otros recursos. SMB se puede comparar con NFS, su diferencia fundamental es que SMB proporciona autenticación. Fue creado por IBM y modificado numerosas veces por Windows. Utilitza NetBios para funcionar.

En 1996, Microsoft lo renombró CIFS y con Vista ha vuelto a cambiar de nombre. Con Windows 7 se llama SMB 2.1

SMB es un protocolo de alto nivel que puede implementarse sobre diversos protocolos, entre ellos el TCP/IP. Samba utiliza la versión que usa NetBios sobre TCP/IP.

Revisaremos el funcionamiento interno del protocolo SMB. - Supongamos que un sistema cliente quiere acceder a una carpeta compartida que exporta el servidor (en modo user). Se produciría el siguiente intercambio de mensajes entre ellos:

  1. Petición: Sesión NetBIOS. Quiere establecer una sesión fiable para subsiguientes mensajes entre los ordenadores cliente y servidor. El cliente conoce el nombre NetBIOS del servidor, el nombre NetBIOS del cliente es parte del mensaje, de modo que ambos saben quién es el otro.
  2. Respuesta: Sesión NetBIOS. El servidor envía un mensaje de reconocimiento aceptando la conexión.
  3. Petición: Dialecto SMB. El cliente envía una lista con los dialectos o variantes de SMB que soporta.
  4. Respuesta: Dialecto SMB. El servidor contesta con el dialecto que prefiere para la comunicación subsiguiente.
  5. Petición: Inicio de sesión. El cliente envía las credenciales de usuario (usuario, dominio, contraseña) con las que este desea conectarse al servidor.
  6. Respuesta: Inicio de sesión. El servidor autentifica las credenciales de usuario. Si las credenciales son buenas, el servidor tiene ya un SID válido que le permite, ante todo, comprobar si el usuario tiene el derecho de conectar al servidor. En caso afirmativo, se acepta la conexión y el servidor construye un identificador numérico particular para esta conexión (denominado User ID o UID). Los UIDs pueden ser reutilizados durante la vida del sistema, pero son únicos para todas las conexiones simultáneas que mantiene el servidor en un momento dado, de manera que identifican unívocamente una conexión (aceptada). Todos los mensajes posteriores del cliente deben contener este identificador para ser aceptados por el servidor.
  7. Petición: Conexión a un recurso concreto. El cliente envía un mensaje que contiene una cadena que identifica el recurso al que desea acceder (por ejemplo, \ \ pc01 \ impresora o \ \ pc01 \ carpeta).
  8. Respuesta: Conexión a un recurso concreto. Si el recurso solicitado por el cliente existe y el SID tiene suficientes permisos, el servidor construye un identificador denominado Tree ID o TID, que será utilizado por el cliente par

Niveles de seguridad en SMB/CIFS

  • Share-level: Protección a nivel de recurso compartido. Cada recurso puede tener una contraseña. No hay usuarios.
  • User Level: Protección con usuarios. Primero se autentifica y luego se le indica qué recursos puede obtener con ese usuario.

Tipos de servidor Samba

Estos son los tipos de servidores windows:

  • Primary domain controller (PDC). De este tipo solo puede haber uno por dominio.
  • Backup domain controller (BDC) Sirver para hacer una copia de seguridad o para dar más rendimiento.
  • Domain member server (DMS). Un servidor de otros servicios en un dominio con PDC

Samba, por su parte, tiene 3 tipos de configuraciones como servidor:

  • Standalone Server (Seguridad share)
  • Domain member server.
  • Domain controller server
    • Primary Domain Controller (PDC)
    • Backups domain Controller (BDC)
    • Active directory domain server (ADS)

Si ejecutamos testparm, podemos ver el rol de nuestro servidor.

Samba provee de mayor flexibilidad en este sentido. Samba añade 4 subniveles a la seguridad a nivel de usuario.

  • Share: Cada recurso compartido utiliza una contraseña. Todo el que sepa esta contraseña puede acceder al recurso. Cada recurso tiene su palabra de paso independientemente del usuario. Pero en sistemas Linux se debe acceder como usuario. Por eso, el propio Samba genera un usuario para cada conexión y asigna permisos a ese usuario para ese recurso si acierta la contraseña. security=share
  • User: Cada recurso compartido del grupo de trabajo está configurado para permitir el acceso a un grupo específico de usuarios. En cada conexión inicial a un servidor Samba autentica al usuario. Esta es la opción por defecto. El cliente se autentifica a nivel de sesión enviando usuario y contraseña. El servidor se basa en el usuario y la máquina. Si la sesión se acepta, el cliente no debe introducir de nuevo la contraseña. security=user.
  • Server: El sistema es idéntico al anterior pero se utiliza otro servidor para obtener la información de los usuarios (LDAP por ejemplo)
  • Domain: Samba se convierte en miembro de un dominio de Windows NT y utiliza un PDC (Primary Domain Controller) para implementar la autenticación. Una vez autenticado el usuario mantiene un token con la información del usuario a partir de la cual poder determinar a qué recursos tiene acceso.

Instalar Samba

En Debian/Ubuntu:

$ sudo apt-get install samba

La configuración la podemos encontrar en /etc/samba/smb.conf Se puede ver información en man smb.conf

Se recomienda hacer una copia de seguridad antes de tocar nada:

$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.backup

Hay dos programas que se ejecutan en Samba:

  • smbd Se encarga de ofrecer los servicios de acceso a ficheros, impresoras y autenticación de usuarios.
  • nmbd Se encarga de solucionar los nombres de windows, incluye el anuncio del grupo de trabajo, peticiones de resolución de nombres, gestión de la lista de ordenadores y anuncio de recursos compartidos.

Adicionalmente, Samba proporciona diversas utilidades:

  • smbclient: Permite a un usuario de un sistema Unix conectarse a recursos SMB.
  • swat Permite configurar Samba con un navegador web.
  • smbfs Sistema de ficheros SMB para linux, similar a NFS.
  • winbind: Integra un servidor Samba a un dominio windows sin necesitar de crear usuarios Unix en el servidor Samba y simplificando la tarea de administración.

Control de Samba

$ sudo service smbd restart
$ testparm 
# Sirve para ver la configuración actual

Para crear usuarios:

$ sudo smbpasswd -a rickgrimes

Borrar:

 $ sudo smbpasswd -d rickgrimes

Una de las primeras cosas que hay que hacer es añadir root a Samba:

 $ sudo smbpasswd -a 

Crear usuarios sólo para Windows:

$ useradd -s /sbin/nologin usuario-windows
$ smbpasswd -a usuario-windows

Otros comandos:

$ smbstatus
# muestra el estado del servidor.
$ smbstatus -u rickgrimes
$ smbstatus -S # información de recursos compartidos.
$ smbstatus -p # otras informaciones

pdbedit

Esta herramienta sirve al administrador para gestionar la política de cuentas.

net

Herramienta para gestionar el dominio, similar al net de Windows.

rpcclient

Herramienta de más bajo nivel para conectarse a un controlador de dominio y consultar o modificar cosas.

El rpcclient se puede usar para ejecutar una sola orden o para establecer una conexión y acceder al servidor.

smb.conf

smb.conf está dividido en secciones:

[ global ]

Afecta a toda la configuración del servidor.

[global]
workgroup = ASO  # el nombre del dominio
server string = Samba Version %v 
netbios name = es-servidor-1
wins support = yes         # En caso de que no tengamos disponible un DNS
#=========== INFORMACION DE RED ============
interfaces = lo eth1  # nuestra red y las de los clientes
hosts allow = 127. 10.0.0.
#============= LOGIN ======================
log file = /var/log/samba/%m.log # ficheros de log
max log size = 50
#============== DOMINIO ==================
domain master = yes
domain logons = yes
local master = yes
os level = 33
preferred master = yes
security = user
passdb backend = tdbsam
logon path = \\%N\%U\profile
#logon path = \\%L\Profiles\%u
logon drive = H:
logon home = \\%N\%U
#logon home = \\%L\%U\.9xprofile 
logon script = logon.cmd

La parte que define al dominio dice que: Es controlador de dominio, sirve para autentificar, tiene un niver 33 de importancia para ser el controlador, tiene seguridad de usuario y la base de datos local es de tipo Samba. Por último da información acerca de dónde están los perfiles de usuario.

#========== USUARIOS =====================
add user script = /usr/sbin/useradd "%u" -m -g users
add group script = /usr/sbin/groupadd "%g"
add machine script = sudo /usr/sbin/useradd -N -g machines -c Machine -d /var/lib/samba -s /bin/false %u 
delete user script = /usr/sbin/userdel "%u"
delete user from group script = /usr/sbin/userdel "%u" "%g"
delete group script = /usr/sbin/groupdel "%g"

Aquí indica los scripts que usa Samba para crear los usuarios, ya que se tienen que corresponder con un usuario real del sistema.

Otros recursos

[homes]
  comment = Directorios personales
  browseable = no
  read only = no
  create mask = 0700
  directory mask = 0700
  valid users = %S

Este primero sirve para guardar los directorios de usuarios.

[netlogon]
  comment = Network Logon Service
  path = /srv/samba/netlogon
  guest ok = yes
  read only = yes
  share modes = no
[profiles]
  path = /var/lib/samba/profiles 
  browseable = no
  guest ok = yes
  readonly = no
[tmp]
  comment = Ficheros temporales
  path = /tmp
  public = yes
  writable = yes
  printable = no

netlogon es necesario para clientes Windows, es donde ser guardar el script logon.cmd. Profiles sirve para los perfiles de usuarios. Se pueden compartir, a partir de ahí todo tipo de carpetas e impresoras.


  • Guest ok: Se permite el acceso anónimo. Yes o No.
  • Public: Equivalente a la anterior.
  • Browseable: El recurso se muestra en la lista de recursos compartidos. Yes o No.
  • Writable: Se permite la escritura. Puede ser Yes o No.
  • Read only: El valor puede ser Yes o No.
  • Valid users: ¿Qué usuarios o grupos pueden acceder al recurso compartido. Se pueden especificar múltiples usuarios separados por comas o nombres de grupo (con la arroba @ delante). Ejemplo: fulanito, Menganito, @ administradores.
  • Write list: Define qué usuarios pueden acceder con permisos de escritura. Misma sintaxis que el anterior.
  • Admin users: Define qué usuarios pueden acceder con permisos de administración (superusuarios) del recurso compartido. Misma sintaxis que el anterior.
  • Directory mask: Define qué permisos tendrán los subdirectorios del recurso compartido. Ejemplo 1777.
  • Create mask: Define qué permisos tendrán los ficheros creados al recurso compartido. Ejemplo 1777.

Usuarios administradores

Además de los usuarios normales, es necesario crear un usuario administrador que pueda hacer modificaciones en los equipos Windows añadidos al dominio. Un usuario administrador de Windows es un usuario del grupo "Domain admins".

Lo primero que hay que hacer es crear un grupo en Linux equivalente al Domain Admins y otro al de usuarios normales.

$ sudo groupadd ntadmin
$ sudo groupadd ntuser

Luego se asocia el grupo de Linux al de Dominio mediante la orden net:

$ sudo net groupmap add ntgroup=”Domain Admins” unixgroup=ntadmin rid=512 type=d comment=”Administradores”
$ sudo net groupmap add ntgroup=”Domain Users” unixgroup=ntuser rid=513 type=d comment=”Usuarios”

A continuación, se agrega el usuario al grupo ntadmin:

$ sudo useradd -g ntadmin usuario
# En caso de que no exista el usuario o:
$ sudo usermod -g ntadmin usuario
$ sudo pdbedit -r -G 512 -u usuario
# En caso de que exista ya.

Impresoras en Samba

Las impresoras en Samba se pueden configurar de la manera tradicional o con CUPS. Hacerlo con CUPS proporciona las ventajas de un servidor de impresión avanzado.

Para configurar Samba con CUPS hay que modificar las siguientes líneas:

[global]
 load printers = yes
 printing = cups # Esto le dice que utilice CUPS
 printcap name = cups # printcap es un fichero con una lista de impresoras. 
                      # Para CUPS es obsoleto, pero Samba lo necesita.
[printers]
 comment = All Printers
 path = /var/spool/samba
 browseable = no
 guest ok = yes
 writable = no
 printable = yes
 printer admin = root, @ntadmins, @smbprintadm

Luego se va a Windows y se añade siendo administrador.

Más información

Los drivers de CUPS-PDF para Windows

$ wget http://ftp.easysw.com/pub/cups/windows/cups-windows-6.0-source.tar.bz2
$ tar -xjvf cups-windows-6.0-source.tar.bz2 || cd cups-windows-6.0
$ sudo make install

Los drivers se instalan en /usr/share/cups/drivers/

Se pueden copiar en alguna carpeta compartida o instalarlos en samba.

Lo recomendable es instalarlos:

$ sudo mkdir /usr/share/cups/model/Generic
$ sudo cp /usr/share/ppd/cups-pdf/CUPS-PDF.ppd /usr/share/cups/model/Generic
$ cupsaddsmb -v -H localhost -U root

Ahora Windows tendrá disponibles los drivers al agregar la impresora.

Problema y solución con las impresoras samba y cups en ubuntu 12.04

Aunque configuremos perfectamente samba y cups, en ubuntu server 12.04 falla al declarar el nombre de las impresoras. Por eso Windows no es capaz de instalarla y dice que el nombre no está bien escrito.

Posible solución:

  • Comando a usar: rpcclient
  • Se tiene que establecer el nombre de la impresora
  • Teclear en la terminal del servidor el siguiente comando:
> rpcclient localhost
  • Pedirá la clave del usuario samba que administra las impresoras,
  • Se puede verificar el nombre de la impresora con el comando:
> enumprinters
  • Por ejemplo si el nombre de la impresora compartida es PDF
  • Hay que cambiar el nombre de la impresora con el comando:
> setprintername PDF PDF

Solución sacada de aquí

Samba y LDAP

En Ubuntu se puede seguir el manual oficial o manual oficial del 12.04 aunque hay alguna cosa en el 10.04 que no funciona. Por ejemplo, en el paso 5 de la configuración de OpenLDAP no funciona ese tipo de autentificación y hay que hacerlo con -Y EXTERNAL... Esto en el manual del 12.04 está arreglado.

En debian hay que:

Instalar y configurar el OpenLDAP

$ sudo apt-get install slapd ldap-utils smbldap-tools
  • slapd y ldap-utils instala el servidor OpenLDAP y algunos programas útiles para manejar LDAP
  • smbldap-tools instala una serie de herramientas y scripts que nos ayudará a configurar la base de datos LDAP para tener objetos Samba.

Se configura OpenLDAP y se añade el schema de Samba. Para configurarlo, se puede ver el manual oficial o el de la ubuntu server guide

$ cd /usr/share/doc/samba-doc/examples/LDAP
$ gunzip samba.schema.gz
$ cp samba.schema /etc/ldap/schema/

Para añadirlo, tenemos que meterlo en la base de datos. El manual oficial de Debian, actualmente (Diciembre de 2012) nos propone modificar el slapd.conf, pero esto es si tenemos OpenLDAP con la configuración estática anterior. Ahora hay que añadir el schema con un ldif, y primero hay que crearlo:

Se crea un fichero llamado, por ejemplo, schema_convert.ldif y se pone esto dentro:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/collective.schema
include /etc/ldap/schema/corba.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/duaconf.schema
include /etc/ldap/schema/dyngroup.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/java.schema
include /etc/ldap/schema/misc.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/openldap.schema
include /etc/ldap/schema/ppolicy.schema
include /etc/ldap/schema/ldapns.schema
include /etc/ldap/schema/pmi.schema
include /etc/ldap/schema/samba.schema

Son los schemas necesarios para que Samba pueda usar OpenLDAP para guardar sus usuarios y máquinas tal como Windows necesita.

A continuación se convierte este schema en un ldif

$ mkdir /tmp/ldif_output
$ slapcat -f schema_convert.conf -F /tmp/ldif_output -n0 -s "cn={12}samba,cn=schema,cn=config" > /tmp/cn=samba.ldif

Se debe modificar ese ldif dejando lo siguiente:

dn: cn=samba,cn=schema,cn=config
...
cn: samba

Y quitando algo como esto:

structuralObjectClass: olcSchemaConfig
entryUUID: b53b75ca-083f-102d-9fff-2f64fd123c95
creatorsName: cn=config
createTimestamp: 200
entryCSN: 20080827045234.341425Z#000000#000#000000
modifiersName: cn=config
modifyTimestamp: 20080827045234Z

Luego se añade a la configuración:

$ sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /tmp/cn\=samba.ldif

Ahora OpenLDAP conoce todo lo que samba puede guardar. Es el momento de guardar los objetos baśicos como los grupos o las unidades organizativas machines o groups. Se puede hace a mano o con PHPldapAdmin, pero hay una herramienta más útil que lo hace con un script de perl. Esta herramienta está dentro de la smbldap-tools:

$ sudo gzip -d /usr/share/doc/smbldap-tools/configure.pl.gz
$ sudo perl /usr/share/doc/smbldap-tools/configure.pl 

Se ejecuta un script que nos pide los datos del dominio. Al terminar hay que revisar a fondo el fichero /etc/smbldap-tools/smbldap.conf

Este script sólo ha creado un fichero de configuración, hay que hacer el siguiente comando para que añada todo esto a la base de datos OpenLDAP:

$ sudo smbldap-populate

Hay que mirar detenidamente la salida por si hay algún error. Si lo hay, suele ser porque el fichero smbldap.conf o el smbldap_bind.conf no está bien.

Al finalizar, se puede comprobar que todo está bien:

$ ldapsearch -x -LLL -b dc=castillo,dc=es dn

dn: dc=castillo,dc=es
dn: cn=admin,dc=castillo,dc=es
dn: ou=People,dc=castillo,dc=es
dn: ou=Groups,dc=castillo,dc=es
dn: ou=machines,dc=castillo,dc=es
dn: ou=Idmap,dc=castillo,dc=es
dn: uid=root,ou=People,dc=castillo,dc=es
dn: uid=nobody,ou=People,dc=castillo,dc=es
dn: cn=Domain Admins,ou=groups,dc=castillo,dc=es
dn: cn=Domain Users,ou=groups,dc=castillo,dc=es
dn: cn=Domain Guests,ou=groups,dc=castillo,dc=es
dn: cn=Domain Computers,ou=groups,dc=castillo,dc=es
dn: cn=Administrators,ou=groups,dc=castillo,dc=es
dn: cn=Account Operators,ou=groups,dc=castillo,dc=es
dn: cn=Print Operators,ou=groups,dc=castillo,dc=es
dn: cn=Backup Operators,ou=groups,dc=castillo,dc=es
dn: cn=Replicators,ou=groups,dc=castillo,dc=es
dn: sambaDomainName=castillo.es,dc=castillo,dc=es

Cambiar la configuración de Samba

Ahora hay que decirle a Samba que ha de usar OpenLDAP para guardar sus usuarios.

En /etc/samba/smb.conf Buscar:

passdb backend=tdsam

Y reemplazar por:

  passdb backend = ldapsam:ldap://127.0.0.1
  ldap suffix = dc=castillo,dc=es
  ldap user suffix = ou=People
  ldap group suffix = ou=Groups
  ldap machine suffix = ou=Computers
  ldap idmap suffix = ou=Idmap
  ldap admin dn = cn=admin,dc=castillo,dc=es
  ldap ssl = off
  ldap passwd sync = yes

...

  add machine script = sudo /usr/sbin/smbldap-useradd -t 0 -w "%u"


Probar que todo funciona con:

$ testparm

A continuación hay que informar a Samba de cual es la contraseña del administrador de LDAP. Para ello usamos:

$ sudo smbpasswd -w password

Que la guarda en /etc/samba/secrets.tdb

Ahora ya se puede añadir una máquina al dominio.


[1] [2] Manual oficial