Sunday, 24 May 2009 10:55

Samba + mysql Backend desde cero Featured

La idea aqui es autenticar usuarios contra mysql, Al principio probe samba+pam+mysql ya que pam es el
plugin de autenticación de facto en linux pero por algun motivo no funciono.

Luego buscando por la red he visto que los colaboradores de samba estaban en un proyecto de construccion del modulo pdb. que sirve tanto para conectarse  mysql como a postgresql.

Obs: La instalación de los paquetes se hara bajando los paquetes precompilados ya que no hay binarios disponibles
para las versiones de pdb.

Caracteristicas del SO.

Linux Ubuntu 8.1 Intrepid Main
version del kernel 2.6.27-7-generic

1ro- Checkear los apt-sources list en el archivo /etc/apt/sources.list y descomentar todo lo que empiece con deb.

2- Ejecutar apt-get update.

3- Crear un directorio en /root llamado sources para colocar ahi el codigo fuente.
su
Contraseña:

mkdir sources

cd sources

Instalamos las librerias necesarias para compilación de paquetes C y para soporte para mysql del pdb.

4-apt-get install buid-essential autoconf libmysql++-dev subversion

Instalamos(Bajamos) las fuentes oficiales del samba, esta es importante para dos cosas.

-Compilar el modulo de acceso a la base de datos (pdb)
-Instalar despues este samba para que las versiones sean correlativas.

5-apt-get source samba

Esperamos un ratito bajara unos 23 mb aprox.

5.1-luego cd samba-3.2.3

5.2-./autogen

5.3- ./configure

5.4- make proto

5.5- SAMBADIR=/root/sources/samba-3.2.3/source

6- Bajamos el souce del pdb

wget http://ufpr.dl.sourceforge.net/sourceforge/pdbsql/pdbsql_32-0.4-rc1.tar.bz2

6.1- tar -xvf pdb....

6.2 cd pdb....

6.3- ./autogen.sh

6.4- ./configure --with-samba-dir=$SAMBADIR

6.5- PDBDIR=/root/sources/pdb...
Recordemos que $SAMBADIR es una variable que declaramos y que apunta al source de samba, ver apartado 5.5.

7. Volvamos al source de samba para terminar la instalación

7.1-cd $SAMBADIR

7.2-make

7.3-make install

Aca nos instalaran todos los paquetes en /usr/local/samba, recordemos que /usr/local es el directorio de facto para paquetes compilados

8. Regresemos al directorio del pdb para finalizar la compilación

8.1 cd $PDBDIR

-solo resta hacer make y make install pero hay un pequeño traspie.

-al compilar pide tres archivos que le falta al $SAMBADIR estos son talloc.h, util_tdb.h, tdb.h que por algun motivo el samba source no los trae, pero no nos deseperemos.

8.1-regresemos al samba source

8.2-cd $SAMBADIR

8.3-creamos una carpeta samba-svn
mkdir samba-svn
cd samba-svn

8.4-recurramos a la ultima version del samba source ejecutando la sgte linea, este si tiene los tres archivos que nos falta para compilar exitosamente el tdb

svn co svn://svnanon.samba.org/samba/branches/SAMBA_3_0 samba_3.

Esperamos un ratito, al finalizar nos crea una carpeta samba_3.

ejecutamos las sgtes tres lineas para copiar los tres archivos faltantes de nuestro pdb


cp `find /$SAMBADIR/samba-svn -iname talloc.h` /$SAMBADIR/source
cp `find /$SAMBADIR/samba-svn -iname util_tdb.h` /$SAMBADIR/source
cp `find /$SAMBADIR/samba-svn -iname tdb.h` /$SAMBADIR/source

luego repetimos el apartado 8 hasta 8.1, de ahi hacemos lo sgte

-make

-make install

Al final veremos que compila y copia dos archivos, el mysql.so y el multi.so y lo copia a /usr/local/samba/lib/pdb

Ahora configuremos el samba

nano /usr/local/samba/lib/smb.conf

[global]
workgroup = TESTGROUP
netbios name = TESTGROUP

security = user

obey pam restrictions = Yes
encrypt passwords = yes
update encrypted = no
#client lanman auth = yes
#client plaintext auth = yes
#Esta es la parte que nos interesa
#Explicaremos esto en un apartado exclusivo
passdb backend           = mysql:mysql
mysql:mysql host         = localhost
mysql:mysql user         = samba
mysql:mysql password     =
mysql:mysql database     = samba
mysql:fullname column    = nt_fullname:
mysql:domain column      = 'TESTGROUP':
mysql:lanman pass column = NULL:
mysql:nt pass column     = NULL:
mysql:plain pass column  = plain_pw:
mysql:unknown_3 column   = NULL
mysql:sid column = user_sid

#security = user
#encrypt passwords = yes
smb passwd file = /etc/samba/private/smbpasswd

Ahora le toca a la BBDD

mysql -u root -p
Password:

mysql-> create database samba;

mysql-> GRANT ALL ON samba.* TO ''@'localhost' IDENTIFIED BY '';

mysql-> use samba;

mysql-> CREATE TABLE user (
    logon_time int(9) default NULL,
    logoff_time int(9) default NULL,
    kickoff_time int(9) default NULL,
    pass_last_set_time int(9) default NULL,
    pass_can_change_time int(9) default '0',
    pass_must_change_time int(9) default '2147483647',
    username varchar(255) default NULL,
    domain varchar(255) default NULL,
    nt_username varchar(255) default NULL,
    nt_fullname varchar(255) default NULL,
    home_dir varchar(255) default NULL,
    dir_drive varchar(4) default NULL,
    logon_script varchar(255) default NULL,
    profile_path varchar(255) default NULL,
    acct_desc varchar(255) default NULL,
    workstations varchar(255) default NULL,
    unknown_str varchar(255) default NULL,
    munged_dial varchar(255) default NULL,
    uid int(9) NOT NULL PRIMARY KEY auto_increment,
    gid int(9) default NULL,
    user_sid varchar(255) default NULL,
    group_sid varchar(255) default NULL,
    lm_pw varchar(255) default NULL,
    nt_pw varchar(255) default NULL,
    acct_ctrl int(9) default '528',
    logon_divs int(9) default '168',
    hours_len int(9) default '21',
    unknown_6 int(9) default "1260",
    bad_password_count int(9) default NULL,
    logon_count int(9) default '0',
    logon_hours varchar(42) default NULL,
    password_history text default NULL,
    plain_pw int(10) NOT NULL,
    KEY username(username),
    
);

CREATE TABLE groups (
    groupname varchar(255) default NULL
);

quit

10- Ahora arranquemos el samba.

en un archivo startsamba.sh

escribamos

#!/bin/sh
/usr/local/samba/sbin/smbd -D
/usr/local/samba/sbin/winbindd -B
/usr/local/samba/sbin/nmbd -D

cerramos y le damos +w para que sea ejecutable

abrimos el archivo /etc/inetd.conf que es el capo en conocer puertos y conexiones y le agregamos

netbios-ssn stream tcp nowait root /usr/local/samba/sbin/smbd smbd
netbios-ns dgram udp wait root /usr/local/samba/sbin/nmbd nmbd

cerramos y ejecutamos

./startsamba

comprobamos su ejecución de dos formas

1- ps -aux | grep smbd nmbd
2- more /usr/local/samba/var/log.smbd

el log.smbd tiene que arrojar esto

  Copyright Andrew Tridgell and the Samba Team 1992-2008
[2009/05/24 01:04:11,  1] pdb_mysql.c:mysqlsam_init(607)
  Connecting to database server, host: localhost, user: samba, database: samba, port: 3306

12- Probamos

cd /usr/local/samba/bin/

./findsmb

root@pablo-desktop:/usr/local/samba/bin# ./findsmb

                                *=DMB
                                +=LMB
IP ADDR         NETBIOS NAME     WORKGROUP/OS/VERSION
---------------------------------------------------------------------
10.154.50.2     pablo-desktop.local+[TESTGROUP] [Unix] [Samba 3.2.3]

Agregamos un usuario via consola
root@pablo-desktop:/usr/local/samba/bin# ./smbpasswd -a pablo

Connecting to database server, host: localhost, user: samba, database: samba, port: 3306
Connecting to database server, host: localhost, user: samba, database: samba, port: 3306
new password:
retype new password:

Unix username:        juanperez
NT username:          
Account Flags:        [U          ]
User SID:             S-1-5-21-717355791-1739714386-2837643533-3002
Primary Group SID:    S-1-5-21-717355791-1739714386-2837643533-513
Full Name:            
Home Directory:       \\testgroup\juanperez
HomeDir Drive:        
Logon Script:         
Profile Path:         \\testgroup\juanperez\profile
Domain:               TESTGROUP
Account desc:         
Workstations:         
Munged dial:          
Logon time:           0
Logoff time:          never
Kickoff time:         never
Password last set:    dom, 24 may 2009 00:43:13 PYT
Password can change:  dom, 24 may 2009 00:43:13 PYT
Password must change: never
Last bad password   : 0
Bad password count  : 0
Logon hours         : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

#Aca hay un detalle , que mas que detalle es un error de los diseñadores y es bastante discutido en los foros
al poner el password se supone que este debera ser guardado en la BBDD de forma encriptada en MD5-hash, pero solo guarda
el numero 16, obiamente al autenticar fallara, asi que modifique la forma que le pasa el samba a la BBDD el password y lo puse en plaintex

en el smb.conf fijense

mysql:lanman pass column = NULL:
mysql:nt pass column     = NULL:
mysql:plain pass column  = plain_pw:

las columnas lanman y nt solo aceptan encriptados, creando una columna adicional llamada plain_pw y colocandola a esta el password del usuario correspondiente la autenticación funciona.

root@pablo-desktop:/usr/local/samba/bin# ./smbclient -L localhost -U pablo
Enter pablo's password:
Domain=[TESTGROUP] OS=[Unix] Server=[Samba 3.2.3]

    Sharename       Type      Comment
    ---------       ----      -------
    IPC$            IPC       IPC Service (Samba 3.2.3)
Domain=[TESTGROUP] OS=[Unix] Server=[Samba 3.2.3]

    Server               Comment
    ---------            -------
    TESTGROUP            Samba 3.2.3

    Workgroup            Master
    ---------            -------
    TESTGROUP            TESTGROUP
root@pablo-desktop:/usr/local/samba/bin#


Bueno es todo, que falta por hacer;

Realizar una tabla mas personalizada y probar a piacere el smb.conf de acuerdo a esa tabla,
Guardar el password en encriptacion md5 en la BBDD, porque guardar en texto plano es un riesgo de seguridad.
Hacer un codigo php capaz de modificar crear usuarios etc.

Last modified on Sunday, 05 July 2009 12:47
Juan Pablo González

Juan Pablo González

Diseñador de paginas web, administrador de redes y un apasionado por el software libre y la difusión de conocimientos

Website: www.juanpablo.netne.net E-mail: This e-mail address is being protected from spambots. You need JavaScript enabled to view it
More in this category: Squid+Mysql Backend »

Subscripciones

Cursos
Programación
Linux

Receive HTML?
Gracias..

Buscar

Estan en linea

We have 1 guest online