Diferencia entre revisiones de «Samba»

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda
 
(No se muestran 44 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
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.
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.  
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.  
Línea 7: Línea 7:
Samba puede ser útil cuando:
Samba puede ser útil cuando:


* No se quiere paga por un servidor Windows
* No se quiere pagar por un servidor Windows
* Las licencias de cada cliente para acceder a un servidor Windows son demasiado caras.
* Las licencias de cada cliente para acceder a un servidor Windows son demasiado caras.
* Hacer una transición de Windows a Linux y viceversa.
* Hacer una transición de Windows a Linux y viceversa.
Línea 25: Línea 25:
== Historia de Samba ==
== 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:
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
  $ grep -i '^s.*m.*b' /usr/share/dict/words
Línea 112: Línea 112:


En Debian/Ubuntu:  
En Debian/Ubuntu:  
  $ sudo apt-get install samba
  $ 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
La configuración la podemos encontrar en /etc/samba/smb.conf Se puede ver información en man smb.conf
Línea 164: Línea 164:


Esta herramienta sirve al administrador para gestionar la política de cuentas.
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 ==
Línea 296: Línea 306:


[http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/CUPS-printing.html Más información]
[http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/CUPS-printing.html 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 ===
=== Problema y solución con las impresoras samba y cups en ubuntu 12.04 ===
Línea 306: Línea 333:
* Se tiene que establecer el nombre de la impresora
* Se tiene que establecer el nombre de la impresora
* Teclear en la terminal del servidor el siguiente comando:
* Teclear en la terminal del servidor el siguiente comando:
  $ rpcclient localhost
  > rpcclient localhost
* Pedirá la clave del usuario samba que administra las impresoras,
* Pedirá la clave del usuario samba que administra las impresoras,
* Se puede verificar el nombre de la impresora con el comando:  
* Se puede verificar el nombre de la impresora con el comando:  
  $ enumprinters
  > enumprinters
* Por ejemplo si el nombre de la impresora compartida es PDF
* Por ejemplo si el nombre de la impresora compartida es PDF
* Hay que cambiar el nombre de la impresora con el comando:
* Hay que cambiar el nombre de la impresora con el comando:
  $ setprintername PDF PDF
  > setprintername PDF PDF
[https://bugs.launchpad.net/ubuntu/+source/samba/+bug/967410/comments/21 Solución sacada de aquí]
[https://bugs.launchpad.net/ubuntu/+source/samba/+bug/967410/comments/21 Solución sacada de aquí]


== Samba y LDAP ==
Samba puede usar como backend un servidor [[LDAP]]. En el caso de este manual, usará [[OpenLDAP]]. De esta manera se combinan las ventajas de un PDC Samba (integración con máquinas Windows) y de LDAP (Rendimiento, acceso remoto, gestión, seguridad, no redundancia...)
La base de datos de usuarios y máquinas, el ''backend'', de Samba es, por defecto, tdbsam.
[[Archivo:Situacioninicialsamba.png|center|Esquema de la situación inicial. Windows autentifica con Samba y este con tdbsam y Linux usa el servidor OpenLDAP para autentificar usuarios en red.]]
Al final de este manual, Samba tendrá a LDAP como backend y los clientes Linux y Windows compartirán usuarios.
[[Archivo:Ldapsamba.png|center|Esquema de la situación final, tdbsam ya no se usa y ahora usar ldapsam para conectar con OpenLDAP]]
En Ubuntu se puede seguir el [https://help.ubuntu.com/10.04/serverguide/samba-ldap.html manual oficial] o [https://help.ubuntu.com/12.04/serverguide/samba-ldap.html 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 [http://wiki.debian.org/LDAP/OpenLDAPSetup manual oficial] o el de la [https://help.ubuntu.com/12.04/serverguide/openldap-server.html ubuntu server guide]. Puede ser interesante añadir un frontend inicial para hacer pruebas como propone el [https://help.ubuntu.com/12.04/serverguide/openldap-server.html#openldap-server-populate manual de ubuntu en su sección de ''populating your database''].
$ 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 [http://wiki.debian.org/SambaDcWithLdapBackend 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.
<div style="margin:10px; padding:5px; border:1px solid #eee; background-color:#ddf">El archivo smb.conf por defecto de Debian y ubuntu está lleno de comentarios que, en la práctica, molestan, ya que no podemos ver de un vistazo todas la líneas de configuración.
Como se ha de hacer una copia de seguridad, podemos hacerla en el home de root y luego hacer este comando:
# cat smb.conf | egrep -v '(^#|^$)' > /etc/samba/smb.conf
Y así lo dejamos más límpio. alguna línea comentada necesaria se pierde, pero como hay que revisarlas todas, se detecta fácilmente.
</div>
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=Machines
  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
=== 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
Si no funciona, reiniciar. Si sigue sin funcionar, hay que modificar los ficheros /etc/pam.d/common-* como dice el [http://wiki.debian.org/LDAP/PAM manual de PAM de debian]
Ahora ya se puede añadir una máquina al dominio.
=== Solución de algunos problemas ===
''' Antes de probar cosas raras: '''
* Asegurate de que las Unidades organizativas de smb.conf, la base de datos ldap y smbldap-tools.conf coinciden.
* Asegurate de que Debian es capaz de autentificar con LDAP.
* Comprueba con un ldapsearch que todos los objetos de LDAP necesarios para Samba existen y coinciden con los que smb.conf supone.
* Asegurate con smbpasswd que root tiene contraseña de Samba.
* ¿Hacen ping? ¿Hacen ping al nombre de netbios?
El problema  getpeername failed. Error was Transport endpoint is not connected Puede ser porque el puerto 445 está cerrado con [[iptables]] o alguna otra cosa. Se puede modificar el smb.conf y poner:
smb ports = 139
Aunque esta no es una solución muy elegante y puede que sea necesario abrir los puertos 137, 138, 139 y 445:
Per a NetBIOS (tcp y udp)
iptables -A INPUT -i eth0 -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 137 -j ACCEPT
NetBIOS
iptables -A INPUT -i eth0 -p udp --dport 138 -j ACCEPT
Servici de sesions NetBios
iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT
Port utlitzat per XP si no té habilitat netbios:
iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 445 -j ACCEPT
Es posible que cuando entramos nos diga que hay que cambiar la contraseña. Cuando la intentamos cambiar dice que no puede cambiar su contraseña. Esto es contradictorio, pero tiene su razón, Samba intenta sincronizar la contraseña suya con la del sistema. Pero esto no es posible si el usuario es de LDAP.
Esto se puede solucionar editando esta línea:
unix password sync = no
Y comentado estas:
pam password change
passwd program
passwd chat
Para evitar que caduquen tan pronto las contraseñas se puede ejecutar:
$ sudo pdbedit -P "maximum password age" -C -1
Ante cualquier problema, se puede intentar el smbclient:
$ smbclient -L //serverip -U usuario
[http://acacha.org/mediawiki/index.php/Samba#Error_al_afegir_un_client_Windows_a_un_domini_SAMBA._RequireSignOrSeal modificacion de registro, (en teoría sólo para versiones antiguas)]
$ echo "root = administrator" > /etc/samba/smbusers
== Enlaces ==


[http://trufelli.wordpress.com/2011/03/10/how-to-create-administrators-of-a-samba-domain/]
[http://trufelli.wordpress.com/2011/03/10/how-to-create-administrators-of-a-samba-domain/]
[http://devrandom.blogsite.org/articles/cups-pdf/]
[http://devrandom.blogsite.org/articles/cups-pdf/]
[http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/index.html Manual oficial]
[http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/index.html Manual oficial]
[http://acacha.org/mediawiki/index.php/Samba_com_a_PDC#Windows Samba com a PDC]
[http://techminded.net/blog/install-samba-pdc--ldap-on-debian-squeeze.html Otro manual]
[http://www.joseschenone.com.ar/2010/04/debian-lenny-pdc.html otro mas]
[http://wiki.debian.org/SambaDomainController#Install_Samba Samba como PDC en debian]
[http://wiki.debian.org/SambaDcWithLdapBackend Samba con backend LDAP en Debian]

Revisión actual - 18:12 5 sep 2013

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 pagar 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 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.

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

Samba puede usar como backend un servidor LDAP. En el caso de este manual, usará OpenLDAP. De esta manera se combinan las ventajas de un PDC Samba (integración con máquinas Windows) y de LDAP (Rendimiento, acceso remoto, gestión, seguridad, no redundancia...)

La base de datos de usuarios y máquinas, el backend, de Samba es, por defecto, tdbsam.

Esquema de la situación inicial. Windows autentifica con Samba y este con tdbsam y Linux usa el servidor OpenLDAP para autentificar usuarios en red.

Al final de este manual, Samba tendrá a LDAP como backend y los clientes Linux y Windows compartirán usuarios.

Esquema de la situación final, tdbsam ya no se usa y ahora usar ldapsam para conectar con OpenLDAP

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. Puede ser interesante añadir un frontend inicial para hacer pruebas como propone el manual de ubuntu en su sección de populating your database.

$ 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.

El archivo smb.conf por defecto de Debian y ubuntu está lleno de comentarios que, en la práctica, molestan, ya que no podemos ver de un vistazo todas la líneas de configuración.

Como se ha de hacer una copia de seguridad, podemos hacerla en el home de root y luego hacer este comando:

# cat smb.conf | egrep -v '(^#|^$)' > /etc/samba/smb.conf

Y así lo dejamos más límpio. alguna línea comentada necesaria se pierde, pero como hay que revisarlas todas, se detecta fácilmente.


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=Machines
  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

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

Si no funciona, reiniciar. Si sigue sin funcionar, hay que modificar los ficheros /etc/pam.d/common-* como dice el manual de PAM de debian


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

Solución de algunos problemas

Antes de probar cosas raras:

  • Asegurate de que las Unidades organizativas de smb.conf, la base de datos ldap y smbldap-tools.conf coinciden.
  • Asegurate de que Debian es capaz de autentificar con LDAP.
  • Comprueba con un ldapsearch que todos los objetos de LDAP necesarios para Samba existen y coinciden con los que smb.conf supone.
  • Asegurate con smbpasswd que root tiene contraseña de Samba.
  • ¿Hacen ping? ¿Hacen ping al nombre de netbios?


El problema getpeername failed. Error was Transport endpoint is not connected Puede ser porque el puerto 445 está cerrado con iptables o alguna otra cosa. Se puede modificar el smb.conf y poner:

smb ports = 139

Aunque esta no es una solución muy elegante y puede que sea necesario abrir los puertos 137, 138, 139 y 445:

Per a NetBIOS (tcp y udp)

iptables -A INPUT -i eth0 -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 137 -j ACCEPT

NetBIOS

iptables -A INPUT -i eth0 -p udp --dport 138 -j ACCEPT

Servici de sesions NetBios

iptables -A INPUT -i eth0 -p tcp --dport 139 -j ACCEPT

Port utlitzat per XP si no té habilitat netbios:

iptables -A INPUT -i eth0 -p tcp --dport 445 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 445 -j ACCEPT


Es posible que cuando entramos nos diga que hay que cambiar la contraseña. Cuando la intentamos cambiar dice que no puede cambiar su contraseña. Esto es contradictorio, pero tiene su razón, Samba intenta sincronizar la contraseña suya con la del sistema. Pero esto no es posible si el usuario es de LDAP. Esto se puede solucionar editando esta línea:

unix password sync = no

Y comentado estas:

pam password change
passwd program
passwd chat


Para evitar que caduquen tan pronto las contraseñas se puede ejecutar:

$ sudo pdbedit -P "maximum password age" -C -1


Ante cualquier problema, se puede intentar el smbclient:

$ smbclient -L //serverip -U usuario

modificacion de registro, (en teoría sólo para versiones antiguas)

$ echo "root = administrator" > /etc/samba/smbusers

Enlaces

[1] [2] Manual oficial Samba com a PDC Otro manual otro mas Samba como PDC en debian Samba con backend LDAP en Debian