Samba
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:
- 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.
- Respuesta: Sesión NetBIOS. El servidor envía un mensaje de reconocimiento aceptando la conexión.
- Petición: Dialecto SMB. El cliente envía una lista con los dialectos o variantes de SMB que soporta.
- Respuesta: Dialecto SMB. El servidor contesta con el dialecto que prefiere para la comunicación subsiguiente.
- 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.
- 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.
- 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).
- 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 samba-doc
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.
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
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/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.ldif -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 user script = /usr/sbin/smbldap-useradd -m %u -d /domain/home/%u %u delete user script = /usr/sbin/smbldap-userdel %u -r %u add group script = /usr/sbin/smbldap-groupadd -p %g delete group script = /usr/sbin/smbldap-groupdel %g add user to group script = /usr/sbin/smbldap-groupmod -m %u %g delete user from group script = /usr/sbin/smbldap-groupmod -x %u %g set primary group script = /usr/sbin/smbldap-usermod -g %g %u add machine script = /usr/sbin/smbldap-useradd -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 secrets.tdb
Ahora ya se puede añadir una máquina al dominio.
Autentificar en el servidor con LDAP
Se puede instalar el paquete libpam-ldapd y el libnss-ldapd. Cuando se instala nos pregunta por la configuración de LDAP. Luego se edita /etc/nsswitch.conf y se pone:
passwd: compat ldap group: compat ldap shadow: compat ldap hosts: files dns ldap networks: files ldap protocols: db files services: db files ethers: db files rpc: db files netgroup: nis