martes, 6 de abril de 2010

FreeBSD 8: Samba + LDAP + Dovecot + Postfix

Aqui de nuevo, esta vez me he visto en la necesidad de crear un dominio con samba+ldap y utilizar este contenido de datos para que FreeBSD consulte los usuarios con sus respectivas claves de acceso que por costumbre voy a utilizar el lenguaje comun ingles.

Bien aqui mismo, vamos a levantar un servidor de correo con Dovecot+Postfix que juntos hacen un buena mancuerna.

LDAP es el AD de Unix/Linux por ello es importante saber como usarlo, no soy un experto en el ya que es muy complejo, pero lo que he hecho con el sigue funcionando.

Para el correo no voy a usar directorios virtuales, como estamos hablando de un dominio, donde tenemos:
  • Usuarios
  • Computadoras
  • Grupos
Y cada usuario tiene si propio directorio en /home, asi:

/home/usurio1
/home/usurio2
/home/usurio3
...
/home/usurioN

Entonces no veo la razon de tener que crear esto:

/var/mail/virtual/dominioA/user1
/var/mail/virtual/dominioA/user2
/var/mail/virtual/dominioA/user3
...
/var/mail/virtual/dominioA/userN

Ademas de tener que levantar un Mysql para esto, es un solo dominio, si fueran mas dominios entonces si tendria que ver la posibilidad de hacer uso de Mysql o PostgreSQL, pero con mi actual red no le veo caso.

Vamos meternos con NSS para que FreeBSD consulte la informacion de los usuarios, por ejemplo tengo un usuario de nombre test en samba, FreeBSD no lo tiene localmente, pero al momento de ejecutar el comando ID debe darnos la informacion de este usuario, asi:

id test
uid=10003(test) gid=513(Domain Users) groups=513(Domain Users)

Como podran ver, es un usuario de LDAP, en la base de datos local no existe:

# $FreeBSD: src/etc/master.passwd,v 1.40.22.1.2.1 2009/10/25 01:10:29 kensmith Exp $
#
root:$1$2OxWxY4U$zs3bOHCFShY.8yUclDtRS0:0:0::0:0:Charlie &:/root:/bin/csh
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/usr/sbin/nologin
operator:*:2:5::0:0:System &:/:/usr/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/usr/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/usr/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/usr/sbin/nologin
games:*:7:13::0:0:Games pseudo-user:/usr/games:/usr/sbin/nologin
news:*:8:8::0:0:News Subsystem:/:/usr/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/usr/sbin/nologin
sshd:*:22:22::0:0:Secure Shell Daemon:/var/empty:/usr/sbin/nologin
smmsp:*:25:25::0:0:Sendmail Submission User:/var/spool/clientmqueue:/usr/sbin/nologin
mailnull:*:26:26::0:0:Sendmail Default User:/var/spool/mqueue:/usr/sbin/nologin
bind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin
proxy:*:62:62::0:0:Packet Filter pseudo-user:/nonexistent:/usr/sbin/nologin
_pflogd:*:64:64::0:0:pflogd privsep user:/var/empty:/usr/sbin/nologin
_dhcp:*:65:65::0:0:dhcp programs:/var/empty:/usr/sbin/nologin
uucp:*:66:66::0:0:UUCP pseudo-user:/var/spool/uucppublic:/usr/local/libexec/uucp/uucico
pop:*:68:6::0:0:Post Office Owner:/nonexistent:/usr/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/usr/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/usr/sbin/nologin
mysql:*:88:88::0:0:MySQL Daemon:/var/db/mysql:/usr/sbin/nologin

Es lo bonito de poder centralizar todo un solo punto, asi cualquier cliente con soporte para LDAP podra consultar este servidor para autentificar los usuarios, que bonito no?

Y como ultimo, todo esto no va a ejecutarse dentro de un sistema fisico, sino dentro de un Jail, que es una forma que tiene BSD para virtualizar nativamente, es como poder tener 2 FreeBSD en la misma caja.

Para ello, vamos a seguir paso a paso el capitulo 15 de la biblia de FreeBSD para crear nuestra Jail, les recomiendo leer "man src.conf" para que ustedes decidan que necesitan y que no, aqui yo les voy a indicar como me quedo el archivo para este servidor, para poder llegar a esto, tuve que ejecutar varias veces el buildworld, y reinstalar infinidad de veces la misma aplicacion via ports, pero valio la pena.

Antes iniciar esto, necesito que cumplan los siguientes requisitos

a) Si van a usar jails, crearla y ponerla en operacion.
b) Actualizar su arbol de ports.
b) Configurar el acceso a el jail via ssh por llave, aqui en mi blog viene esto.

Una vez hecho esto, podemos continuar.

Paso 1: Configurar Samba con LDAP.
Ports a instalar:
  • net/samba3
  • net/openldap24-server
  • net/openldap24-client
  • net/nss_ldap
  • security/pam_ldap
  • net/smbldap-tools
Como no voy a compartir las impresoras con Samba, deshabilito CUPS cuando salga el menu de configuracion de Samba.

Van a salir mas ports de los cuales dependen estos, pero usen las opciones que vienen por default.

src.conf
WITHOUT_AMD="yes"
WITHOUT_APM="yes"
WITHOUT_ASSERT_DEBUG="yes"
WITHOUT_ATM="yes"
WITHOUT_AUTHPF="yes"
WITHOUT_BIND="yes"
WITHOUT_BLUETOOTH="yes"
WITHOUT_BOOT="yes"
WITHOUT_CALENDAR="yes"
WITHOUT_CDDL="yes"
WITHOUT_CTM="yes"
WITHOUT_CVS="yes"
WITHOUT_DICT="yes"
WITHOUT_EXAMPLES="yes"
WITHOUT_FLOPPY="yes"
WITHOUT_FREEBSD_UPDATE="yes"
WITHOUT_GAMES="yes"
WITHOUT_GPIB="yes"
WITHOUT_HTML="yes"
WITHOUT_INET6="yes"
WITHOUT_IPFILTER="yes"
WITHOUT_IPFW="yes"
WITHOUT_IPX="yes"
WITHOUT_JAIL="yes"
WITHOUT_KVM="yes"
WITHOUT_LPR="yes"
WITHOUT_MAIL="yes"
WITHOUT_MAN="yes"
WITHOUT_NCP="yes"
WITHOUT_NDIS="yes
WITHOUT_NTP="yes"
WITHOUT_PF="yes"
WITHOUT_PMC="yes"
WITHOUT_PPP="yes"
WITHOUT_PROFILE="yes"
WITHOUT_QUOTAS="yes"
WITHOUT_RCMDS="yes"
WITHOU_RCS="yes"
WITHOUT_SHAREDOCS="yes"
WITHOUT_TELNET="yes"
WITHOUT_USB="yes"
WITHOUT_WIRELESS="yes"
WITHOUT_WPA_SUPPLICANT_EAPOL="yes"

LDAP Server

Una vez finalizado, lo primero que vamos a configurar es ldap, como sabran la configuracion la tenemos en /usr/local/etc/openldap.

Como este va a ser el servidor ldap, vamos a trabajar sobre slapd.conf, cuando este listo continuaremos con ldap.conf, ya que es usado por los clientes que buscan contactar a servidores ldap, aqui el servidor es a la vez cliente.

Vamos a definir nuestro dominio, pero vamos a darle mas realismo, aqui yo me registre en dyndns.org y elegi el nombre midominio, el cual quedo:

midominio.dyndns.org

Esta es la estructura de mi domino en ldap:

dc=midominio,dc=dyndns,dc=org

Vamos a tener lo siguiente en mi dominio:

Users -- Usuarios.
Groups -- Grupos.
Computers --Computadoras
Imap

Por pasos:

1; Password de ldap.
Necesitamos obtener el password que ldap va usar para administrarlo, para ello elegimos un password, ustedes elijen el que gusten:

root@ slappasswd
New password:
Re-enter new password:
{SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

2; Crear archivo ldif:

Con esta informacion voy a crear el siguiente archivo el cual mas adelante voy a usar para crear mi dominio en ldap, le voy a llamar midominio.ldif:

dn: dc=midominio,dc=dyndns,dc=org
objectClass: dcObject
objectClass: organizationalUnit
dc: midominio
ou: midominio

dn: cn=Manager,dc=midominio,dc=dyndns,dc=org
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: Manager
description: LDAP administrator
userPassword:{SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

dn: ou=Users,dc=midominio,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Users

dn: ou=Groups,dc=midominio,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=midominio,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Computers

dn: ou=Idmap,dc=midominio,dc=dyndns,dc=org
objectClass: organizationalUnit
ou: Idmap

El campo del password va a ser de acuerdo a su password que usaron con el comando anterior.

3; Editar el archivo slapd.conf:

Ahora necesitamos ahora si editar el archivo de configuracion del servidor ldap, su nombre es slapd.conf, se localiza en /usr/local/etc/openldap/, quedaria como sigue:

#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/samba.schema

# Define global ACLs to disable default read access.

# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org

pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args

# Load dynamic backend modules:
modulepath /usr/local/libexec/openldap
moduleload back_bdb
#######################################################################
# BDB database definitions
#######################################################################

database bdb
suffix "dc=midominio,dc=dyndns,dc=org"
rootdn "cn=Manager,dc=midominio,dc=dyndns,dc=org"
cachesize 100000

# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw {SSHA}XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
# The database directory MUST exist prior to running slapd AND
# should only be accessible by the slapd and slap tools.
# Mode 700 recommended.
directory /var/db/openldap-data/midominio
# Indices to maintain
index objectClass eq
index cn pres,sub,eq
index sn pres,sub,eq
index uid pres,sub,eq
index displayName pres,sub,eq
index uidNumber eq
index gidNumber eq
index memberUID eq
index sambaSID eq
index sambaPrimaryGroupSID eq
index sambaDomainName eq
index default sub

loglevel 256

Recordar el password del archivo midominio.ldif debe ser el mismo.

A) Yo estoy usando el folder midominio en la ruta indicada, asi que como no existe lo creo.

B) Muchos esquemas o "schemas" no estan con ldap asi que tenemos que buscarlos y copiarlos a el folder: .../openldap/schemas/ ejemplo:

include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/misc.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/openldap.schema
include /usr/local/etc/openldap/schema/samba.schema

cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/

C) Copear el archivo DB_CONFIG.example a donde Ldap va a almacenar su informacion:

cp /usr/local/etc/openldap/DB_CONFIG.example /var/db/openldap-data/pipi/DB_CONFIG

D) Cambiar los permisos del folder padre y sus subdirectorios, el usuario ldap y el mismo grupo deben ser los propietarios de esos directorios:

chown -R ldap:ldap /var/db/openldap-data/

E) Agregar el servicio para que arranque al iniciar el servidor:

slapd_enable="YES"
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://0.0.0.0/"'
slapd_sockets="/var/run/openldap/ldapi"

F) Iniciamos el servicio:

/usr/local/etc/rc.d/slapd start
Starting slapd.

G) Verificamos que haya arrancado:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
ldap slapd 23384 7 tcp4 192.168.49.2:389 *:*

H) De otro cliente probamos nos responda via telnet:

telnet 192.168.49.2 389
Trying 192.168.49.2...
Connected to 192.168.49.2.
Escape character is '^]'.

Listo.

I) Apagamos el servicio.

/usr/local/etc/rc.d/slapd stop
Stopping slapd.
Waiting for PIDS: 23384.

J) Agregamos el log a el syslog:

!slapd
*.* /var/log/slapd.log

Debemos crear este archivo.
touch /var/log/slapd.log

Debemos reiniciar syslog para que levante los cambios.
Debemos reiniciar slapd y ya debe estar logeando a ese archivo.

cat slapd.log
Apr 22 23:56:18 host slapd[23535]: @(#) $OpenLDAP: slapd 2.4.21 (Apr 21 2010 22:09:47) $ root@host.midomnio.dyndns.org:/usr/ports/net/openldap24-server/work/openldap-2.4.21/servers/slapd
Apr 22 23:56:18 mail slapd[23536]: slapd starting

Hasta aqui el servidor esta listo para poder ahora si crear nuestra estructura.

Creando el dominio.

Apagamos el servicio de ldap, ahora lo que sigue es muy simple, como en mi caso estoy almacenando la BD de ldap en /var/db/openldap-data/pipi/, todo ese contenido lo voy a borrar para poder ahora crear mi dominio.

cd /var/db/openldap-data/midominio/
mail# rm -rf ./*

De nuevo tenemos que hacer lo del paso C). Ahora vamos a darle a LDAP nuestro archivo de texto con extension ldif para que forme nuestro dominio.

slapadd -v -l /usr/local/etc/openldap/pipi.ldif
added: "dc=midominio,dc=dyndns,dc=org" (00000001)
added: "cn=Manager,dc=midominio,dc=dyndns,dc=org" (00000002)
added: "ou=Users,dc=midominio,dc=dyndns,dc=org" (00000003)
added: "ou=Groups,dc=midominio,dc=dyndns,dc=org" (00000004)
added: "ou=Computers,dc=midominio,dc=dyndns,dc=org" (00000005)
added: "ou=Idmap,dc=midominio,dc=dyndns,dc=org" (00000006)
_#################### 100.00% eta none elapsed none fast!
Closing DB...

Ahora repetir paso D).

Dejo el servicio apagado.

Ahora si, lo que sigue es trabajar con samba.

Samba

Tenemos nuestro servicio LDAP operando, ahora entra samba, tiene que ser configurado para que LDAP sea quien le proporcione informacion de los usuarios, maquinas, grupos, etc.

Para esto necesitamos configurar samba y proporcionarle la informacion necesaria para poder comunicarse con LDAP, para ello vamos a usar la siguiente configuración.

Encontramos el archivo en: /usr/local/etc/

smb.conf

# Global parameters
[global]
workgroup = PIPI
server string = Samba Server
netbios name = SMBPDC
hosts allow = 192.168.49. 127.
interfaces = xl0
bind interfaces only = Yes

# passwd backend
encrypt passwords = yes
passdb backend = ldapsam:ldap://192.168.49.2/
enable privileges = yes
pam password change= Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn * passwd:*all*authentication*tokens*updated*successfully*
unix password sync = Yes

# Log options
log level = 1
log file = /var/log/samba/%m.log
max log size = 500
syslog = 1

# Name resolution
name resolve order = wins hosts bcast

# misc
timeserver = No
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
use sendfile = yes
veto files = /*.eml/*.nws/*.{*}/
veto oplock files = /*.doc/*.xls/*.mdb/
deadtime = 120

# Dos-Attribute
map hidden = No
map system = No
map archive = No
map read only = No
store dos attributes = Yes

# printers - configured to use CUPS and automatically load them
load printers = No
printcap name =
printing =
cups options =
show add printer wizard = No

# scripts invoked by samba
add user script = /usr/local/sbin/smbldap-useradd -m %u
delete user script = /usr/local/sbin/smbldap-userdel %u
add group script = /usr/local/sbin/smbldap-groupadd -p %g
delete group script = /usr/local/sbin/smbldap-groupdel %g
add user to group script = /usr/local/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/local/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/local/sbin/smbldap-usermod -g %g %u
add machine script = /usr/local/sbin/smbldap-useradd -w %m

# LDAP-iConfiguration
ldap delete dn = Yes
ldap ssl = off
ldap passwd sync = Yes
ldap suffix = dc=midominio,dc=dyndns,dc=org
ldap machine suffix = ou=Computers
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap admin dn = cn=Manager,dc=midominio,dc=dyndns,dc=org
idmap backend = ldap:ldap://192.168.49.2
idmap uid = 10000-20000
idmap gid = 10000-20000

# logon options
logon script =
logon path =
logon path =
logon home =
logon drive =

# setting up as domain controller
username map = /home/samba/usermap
preferred master = Yes
wins support = Yes
domain logons = Yes
domain master = Yes
local master = Yes
os level = 64
map acl inherit = Yes
unix charset = UTF8
password level = 6

#========== Share Definitions ==============================

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon
guest ok = yes
locking = no

[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No

[Profiles]
comment = Network Profiles Service
path = /home/samba/profiles
read only = No
profile acls = yes
hide files = /desktop.ini/ntuser.ini/NTUSER.*/
profile acls = Yes

Parte de esto esta basado en el tutorial de freebsd para samba con algunas modificaciones hechas por mi.

FreeBSD-Samba

Creamos los folders:

/home
/home/samba
/home/samba/netlogon
/home/samba/profiles

Creamos el archivo usermap con esta informacion:

# Unix_name = SMB_name1 SMB_name2 ...
root = Manager administrator admin
nobody = guest pcguest smbguest

Si existen parametros que no entiendan de favor lean man smb.conf.

Este servidor aparecera como SMBPDC, cuando lo veamos con samba o windows dominio MIDOMINIO.

Probamos la configuracion de samba:

testparm
Load smb config files from /usr/local/etc/smb.conf
Processing section "[netlogon]"
Processing section "[homes]"
Processing section "[Profiles]"
Loaded services file OK.
Server role: ROLE_DOMAIN_PDC
Press enter to see a dump of your service definitions

[global]
unix charset = UTF8
workgroup = PIPI
netbios name = SMBPDC
server string = Samba Server
interfaces = xl0
bind interfaces only = Yes
passdb backend = ldapsam:ldap://192.168.49.2/
pam password change = Yes
passwd program = /usr/bin/passwd %u
passwd chat = *New*UNIX*password* %nn *ReType*new*UNIX*password* %nn * passwd:*all*authentication*tokens*updated*successfully*
username map = /home/samba/usermap
password level = 6
unix password sync = Yes
log level = 1
log file = /var/log/samba/%m.log
max log size = 500
name resolve order = wins hosts bcast
deadtime = 120
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
load printers = No
show add printer wizard = No
add user script = /usr/local/sbin/smbldap-useradd -m %u
delete user script = /usr/local/sbin/smbldap-userdel %u
add group script = /usr/local/sbin/smbldap-groupadd -p %g
delete group script = /usr/local/sbin/smbldap-groupdel %g
add user to group script = /usr/local/sbin/smbldap-groupmod -m %u %g
delete user from group script = /usr/local/sbin/smbldap-groupmod -x %u %g
set primary group script = /usr/local/sbin/smbldap-usermod -g %g %u
add machine script = /usr/local/sbin/smbldap-useradd -w %m
logon path =
logon home =
domain logons = Yes
os level = 64
preferred master = Yes
domain master = Yes
wins support = Yes
ldap admin dn = cn=Manager,dc=midominio,dc=dyndns,dc=org
ldap delete dn = Yes
ldap group suffix = ou=Groups
ldap idmap suffix = ou=Idmap
ldap machine suffix = ou=Computers
ldap passwd sync = Yes
ldap suffix = dc=midominio,dc=dyndns,dc=org
ldap user suffix = ou=Users
idmap backend = ldap:ldap://192.168.49.2
idmap uid = 10000-20000
idmap gid = 10000-20000
hosts allow = 192.168.49., 127.
map acl inherit = Yes
use sendfile = Yes
veto files = /*.eml/*.nws/*.{*}/
veto oplock files = /*.doc/*.xls/*.mdb/
map archive = No
map readonly = no
store dos attributes = Yes

[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon
guest ok = Yes
locking = No

[homes]
comment = Home Directories
valid users = %S
read only = No
browseable = No

[Profiles]
comment = Network Profiles Service
path = /home/samba/profiles
read only = No
profile acls = Yes
hide files = /desktop.ini/ntuser.ini/NTUSER.*/

Correcto no marco errores de ortografia o sintaxis.

Sigue darle a samba el password del administrator de ldap, por que tiene que presentarlo cuando accese informacion de LDAP.

Ejecutamos lo siguiente:

smbpasswd -W
Setting stored password for "cn=Manager,dc=midominio,dc=dyndns,dc=org" in secrets.tdb
New SMB password:
Retype new SMB password:

Este password es el mismo que usaron cuando estabamos configurando a LDAP.

El archivo es creado en /usr/local/etc/samba/:

ll
total 8
-rw------- 1 root wheel 8192 Apr 24 13:38 secrets.tdb
-rw-r--r-- 1 root wheel 0 Apr 23 14:15 smbpasswd

Bien ahora vamos a decirle a FreeBSD que arranque el servicio cada que el servidor reinicie:

Abrimo rc.conf y agregamos esto a el final:

#####################Samba#########################
nmbd_enable="YES"
smbd_enable="YES"
winbindd_enable="YES"

Reiniciamos el servicio y vemos si todo salio como debiera, debemos empezar por LDAP:

/usr/local/etc/rc.d/slapd start
Starting slapd.

Ahora si samba:

/usr/local/etc/rc.d/samba start
Removing stale Samba tdb files: ...... done
Starting nmbd.
Starting smbd.
Starting winbindd.

Checamos el status:

/usr/local/etc/rc.d/samba status
nmbd is running as pid 57468.
smbd is running as pid 57475.
winbindd is running as pid 57481.

Parece que todo esta funcionando sin problemas, vamos a revisar que los puertos esten escuchando:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
root smbd 57485 9 tcp4 192.168.49.2:47739 192.168.49.2:389
root winbindd 57483 21 tcp4 192.168.49.2:61499 192.168.49.2:389
root winbindd 57483 22 tcp4 192.168.49.2:12092 192.168.49.2:389
root winbindd 57483 23 tcp4 192.168.49.2:17436 192.168.49.2:389
root smbd 57475 9 tcp4 192.168.49.2:47739 192.168.49.2:389
root nmbd 57468 9 udp4 192.168.49.2:137 *:*
root nmbd 57468 10 udp4 192.168.49.2:138 *:*
ldap slapd 23844 7 tcp4 192.168.49.2:389 *:*
ldap slapd 23844 11 tcp4 192.168.49.2:389 192.168.49.2:47739
ldap slapd 23844 16 tcp4 192.168.49.2:389 192.168.49.2:61499
ldap slapd 23844 19 tcp4 192.168.49.2:389 192.168.49.2:12092
ldap slapd 23844 20 tcp4 192.168.49.2:389 192.168.49.2:17436

Los que estan bold nos indica que samba+winbind estan comunicados con LDAP, parace que todo ha salido sin problemas.

Hasta aqui hemos configurado samba para que pueda comunicarse con LDAP, lo que sigue configurar smbldap-tools que son la interface que nos va a ayudar a crear, usuarios, grupos, modificar parametros de grupo, usuarios, etc.

smbldap-tools

Bien smbldap-tools se instala en: /usr/local/etc/smbldap-tools.

Ahi dentro tenemos los siguientes archivos:

-r--r--r-- 1 root wheel 7944 Apr 21 22:59 smbldap.conf
-r--r--r-- 1 root wheel 7944 Apr 21 22:59 smbldap.conf.sample
-r--r--r-- 1 root wheel 433 Apr 21 22:59 smbldap_bind.conf
-r--r--r-- 1 root wheel 433 Apr 21 22:59 smbldap_bind.conf.sample

smbldap.conf contiene la configuracion de nuestro dominio.
smbldap_bind.conf los parametros para accesar LDAP.

Vamos empezando por smbldap.conf, esta nos quedaria asi:

Existe una informacion que smbldap necesita de nuestro servidor, la cual se en el mundo Windows se llama el "SID", cada dominio tiene una, para obtenerla de nuestro dominio debemos ejecutar el siguiente comando:

net getlocalsid
[2010/04/25 21:21:45, 0] lib/interface.c:load_interfaces(229)
WARNING: no network interfaces found
SID for domain SMBPDC is: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY

Les quiero aclarar algo, esta informacion a veces tarda en salir, por alguna razon LDAP tarda en proporcionarla, les dice que no puede contactar el dominio, etc.

No se desesperen, a veces necesitamos esperar un poco 15-20 minutos, y decirle el nombre del dominio como:

net getlocalsid MIDOMINIO
[2010/04/25 21:24:13, 0] lib/interface.c:load_interfaces(229)
WARNING: no network interfaces found
SID for domain MIDOMINIO is: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY

El programa smbldap-tools es una serie de scripts diseñados para poder comunicarse con LDAP y hacernos la vida mas facil, tenemos 2 maneras de configurarlo:

1) Automaticamente:
Aqui necesitamos ejecutar el siguiente comando:

/usr/local/share/examples/smbldap-tools/configure.pl

Aqui nos va a empezar a hacer preguntas que debemos conocer, por default algunas si tenemos que proporcionarselas, el trata de obtener el SID, si no lo tiene no podra operar correctamente, ejecutenlo si asi lo desean

2) Manual: Cuando sabemos la informacion que debemos proporcionarle a smbldap-tools, podremos editar ambos archivos, al final el comando anterior es lo que hace.

Yo me voy por el lado manual, y mi archivo queda asi:

smbldap.conf

##############################################################################
#
# General Configuration
#
##############################################################################

# Put your own SID. To obtain this number do: "net getlocalsid".
# If not defined, parameter is taking from "net getlocalsid" return
SID="S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY"
# Domain name the Samba server is in charged.
# If not defined, parameter is taking from smb.conf configuration file
# Ex: sambaDomain="IDEALX-NT"
sambaDomain="MIDOMINIO"

##############################################################################
#
# LDAP Configuration
#
##############################################################################

# Notes: to use to dual ldap servers backend for Samba, you must patch
# Samba with the dual-head patch from IDEALX. If not using this patch
# just use the same server for slaveLDAP and masterLDAP.
# Those two servers declarations can also be used when you have
# . one master LDAP server where all writing operations must be done
# . one slave LDAP server where all reading operations must be done
# (typically a replication directory)

# Slave LDAP server
# Ex: slaveLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
slaveLDAP="192.168.49.2"

# Slave LDAP port
# If not defined, parameter is set to "389"
slavePort="389"

# Master LDAP server: needed for write operations
# Ex: masterLDAP=127.0.0.1
# If not defined, parameter is set to "127.0.0.1"
masterLDAP="192.168.49.2"

# Master LDAP port
# If not defined, parameter is set to "389"
#masterPort="389"
masterPort="389"

# Use TLS for LDAP
# If set to 1, this option will use start_tls for connection
# (you should also used the port 389)
# If not defined, parameter is set to "0"
ldapTLS="0"

# Use SSL for LDAP
# If set to 1, this option will use SSL for connection
# (standard port for ldaps is 636)
# If not defined, parameter is set to "0"
ldapSSL="0"

# How to verify the server's certificate (none, optional or require)
# see "man Net::LDAP" in start_tls section for more details
verify="require"

# CA certificate
# see "man Net::LDAP" in start_tls section for more details
cafile="/etc/smbldap-tools/ca.pem"

# certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientcert="/etc/smbldap-tools/smbldap-tools.iallanis.info.pem"

# key certificate to use to connect to the ldap server
# see "man Net::LDAP" in start_tls section for more details
clientkey="/etc/smbldap-tools/smbldap-tools.iallanis.info.key"

# LDAP Suffix
# Ex: suffix=dc=IDEALX,dc=ORG
suffix="dc=midominio,dc=dyndns,dc=org"

# Where are stored Users
# Ex: usersdn="ou=Users,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for usersdn
usersdn="ou=Users,${suffix}"

# Where are stored Computers
# Ex: computersdn="ou=Computers,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for computersdn
computersdn="ou=Computers,${suffix}"
# Where are stored Groups
# Ex: groupsdn="ou=Groups,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for groupsdn
groupsdn="ou=Groups,${suffix}"

# Where are stored Idmap entries (used if samba is a domain member server)
# Ex: groupsdn="ou=Idmap,dc=IDEALX,dc=ORG"
# Warning: if 'suffix' is not set here, you must set the full dn for idmapdn
idmapdn="ou=Idmap,${suffix}"

# Where to store next uidNumber and gidNumber available for new users and groups
# If not defined, entries are stored in sambaDomainName object.
# Ex: sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"
# Ex: sambaUnixIdPooldn="cn=NextFreeUnixId,${suffix}"
sambaUnixIdPooldn="sambaDomainName=${sambaDomain},${suffix}"

# Default scope Used
scope="sub"

# Unix password encryption (CRYPT, MD5, SMD5, SSHA, SHA, CLEARTEXT)
hash_encrypt="SSHA"

# if hash_encrypt is set to CRYPT, you may set a salt format.
# default is "%s", but many systems will generate MD5 hashed
# passwords if you use "$1$%.8s". This parameter is optional!
crypt_salt_format="%s"

##############################################################################
#
# Unix Accounts Configuration
#
##############################################################################

# Login defs
# Default Login Shell
# Ex: userLoginShell="/bin/bash"
userLoginShell="/sbin/nologin"

# Home directory
# Ex: userHome="/home/%U"
userHome="/home/%U"

# Default mode used for user homeDirectory
userHomeDirectoryMode="700"
# Gecos
userGecos="System User"

# Default User (POSIX and Samba) GID
defaultUserGid="513"

# Default Computer (Samba) GID
defaultComputerGid="515"

# Skel dir
skeletonDir="/etc/skel"

# Default password validation time (time in days) Comment the next line if
# you don't want password to be enable for defaultMaxPasswordAge days (be
# careful to the sambaPwdMustChange attribute's value)
defaultMaxPasswordAge="10000"

##############################################################################
#
# SAMBA Configuration
#
##############################################################################

# The UNC path to home drives location (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon home'
# directive and/or disable roaming profiles
# Ex: userSmbHome="\\PDC-SMB3\%U"
userSmbHome="\\smbpdc\%U"

# The UNC path to profiles locations (%U username substitution)
# Just set it to a null string if you want to use the smb.conf 'logon path'
# directive and/or disable roaming profiles
# Ex: userProfile="\\PDC-SMB3\profiles\%U"
userProfile="\\smbpdc\profiles\%U"

# The default Home Drive Letter mapping
# (will be automatically mapped at logon time if home directory exist)
# Ex: userHomeDrive="H:"
userHomeDrive="H:"

# The default user netlogon script name (%U username substitution)
# if not used, will be automatically username.cmd
# make sure script file is edited under dos
# Ex: userScript="startup.cmd" # make sure script file is edited under dos
userScript=""
# Domain appended to the users "mail"-attribute
# when smbldap-useradd -M is used
# Ex: mailDomain="idealx.com"
mailDomain="midominio.dyndns.org"

##############################################################################
#
# SMBLDAP-TOOLS Configuration (default are ok for a RedHat)
#
##############################################################################

# Allows not to use smbpasswd (if with_smbpasswd == 0 in smbldap_conf.pm) but
# prefer Crypt::SmbHash library
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"

# Allows not to use slappasswd (if with_slappasswd == 0 in smbldap_conf.pm)
# but prefer Crypt:: libraries
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"

# comment out the following line to get rid of the default banner
# no_banner="1"

Ahora el que sigue:

smbldap_bind.conf

############################
# Credential Configuration #
############################
# Notes: you can specify two differents configuration if you use a
# master ldap for writing access and a slave ldap server for reading access
# By default, we will use the same DN (so it will work for standard Samba
# release)
slaveDN="cn=Manager,dc=midominio,dc=dyndns,dc=org"
slavePw="LDAP-PASSWORD"
masterDN="cn=Manager,dc=midominio,dc=dyndns,dc=org"
masterPw="LDAP-PASSWORD"

Bien lo que sigue es de los ultimos pasos, ya tenemos todo lo necesario para operar nuestro dominio, pero aun no falta hacer el ultimo paso el cual consiste en agregar la informacion necesaria que nos ayudara a emular un dominio tipo "Windows NT4". Para esto smbldap-tools instala unos scripts, solo necesitamos 1 de ellos, y es lo que sigue:

smbldap-populate

smbldap-populate
Populating LDAP directory for domain MIDOMINIO (S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY)
(using builtin directory structure)

entry dc=midominio,dc=dyndns,dc=org already exist.
entry ou=Users,midominio,dc=dyndns,dc=org already exist.
entry ou=Groups,midominio,dc=dyndns,dc=org already exist.
entry ou=Computers,midominio,dc=dyndns,dc=org already exist.
entry ou=Idmap,midominio,dc=dyndns,dc=org already exist.
adding new entry: uid=root,ou=Users,midominio,dc=dyndns,dc=org
adding new entry: uid=nobody,ou=Users,midominio,dc=dyndns,dc=org
adding new entry: cn=Domain Admins,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Domain Users,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Domain Guests,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Domain Computers,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Administrators,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Account Operators,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Print Operators,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Backup Operators,ou=Groups,midominio,dc=dyndns,dc=org
adding new entry: cn=Replicators,ou=Groups,midominio,dc=dyndns,dc=org
entry sambaDomainName=MIDOMINIO,midominio,dc=dyndns,dc=org already exist. Updating it...

Please provide a password for the domain root:
Changing UNIX and samba passwords for root
New password:
Retype new password:

El password es mismo que hemos estado usando desde que iniciamos, ese es el que tiene que usar siempre que necesiten hacer con el administrador de LDAP.

Bien, ya tenemos todo listo. Vamos probando.

Probando

net groupmap list
[2010/04/25 21:54:50, 0] lib/interface.c:load_interfaces(229)
WARNING: no network interfaces found
Administrators (S-1-5-32-544) -> 10000
Users (S-1-5-32-545) -> 10001
Domain Admins (S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY) -> 512
Domain Users (S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY) -> 513
Domain Guests (S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY) -> 514
Domain Computers (S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY) -> 515
Administrators (S-1-5-32-544) -> 544
Account Operators (S-1-5-32-548) -> 548
Print Operators (S-1-5-32-550) -> 550
Backup Operators (S-1-5-32-551) -> 551
Replicators (S-1-5-32-552) -> 552

Bien ahi tenemos los grupos creados, vamos viendo el comando pdbedit.

pdbedit -Lv root
Unix username: root
NT username: root
Account Flags: [U ]
User SID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
Primary Group SID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
Full Name: root
Home Directory: \\smbpdc\root
HomeDir Drive: H:
Logon Script:
Profile Path: \\smbpdc\profiles\root
Domain: MIDOMINIO
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: never
Kickoff time: never
Password last set: Sun, 25 Apr 2010 21:50:36 UTC
Password can change: Sun, 25 Apr 2010 21:50:36 UTC
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Todo bien, ahora vamos probando smbldap-tools:

smbldap-usershow root
dn: uid=root,ou=Users,dc=midominio,dc=dyndns,dc=org
cn: root
sn: root
objectClass: top,person,organizationalPerson,inetOrgPerson,sambaSamAccount,posixAccount,shadowAccount
gidNumber: 0
uid: root
uidNumber: 0
homeDirectory: /home/root
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
sambaHomePath: \\smbpdc\root
sambaHomeDrive: H:
sambaProfilePath: \\smbpdc\profiles\root
sambaPrimaryGroupSID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
sambaSID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
loginShell: /bin/false
gecos: Netbios Domain Administrator
sambaLMPassword: AS45DSA4D65AS4D654ASD654AS6D54ASD
sambaAcctFlags: [U]
sambaNTPassword: 4AASD54AS5D4AS6D46A5SD465AS4D
sambaPwdLastSet: 1272232236
sambaPwdMustChange: 2136232236
userPassword: {SSHA}A5SD4SA65D4SA65D46SA5D46SA5D4
shadowLastChange: 14724
shadowMax: 10000

Parece que todo ha salido correctamente, vamos agregando 1 usuario:

smbldap-useradd -a -m test1
smbldap-passwd test1
Changing UNIX and samba passwords for test1
New password:
Retype new password:

Vamos viendo su home folder:

pwd
/home
ll
total 4
drwxr-xr-x 4 root wheel 512 Apr 25 21:59 samba
drwx------ 2 root wheel 512 Apr 20 23:49 test1

Listo ahi esta su folder, ahora su informacion en el dominio:

smbldap-usershow test1
dn: uid=test1,ou=Users,dc=midominio,dc=dyndns,dc=org
objectClass: top,person,organizationalPerson,inetOrgPerson,posixAccount,shadowAccount,sambaSamAccount
cn: test1
sn: test1
givenName: test1
uid: test1
uidNumber: 1000
gidNumber: 513
homeDirectory: /home/test1
loginShell: /sbin/nologin
gecos: System User
sambaLogonTime: 0
sambaLogoffTime: 2147483647
sambaKickoffTime: 2147483647
sambaPwdCanChange: 0
displayName: test1
sambaSID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
sambaPrimaryGroupSID: S-1-5-21-WWWWWWWW-XXXXXXXXXX-YYYYYYYYYY
sambaProfilePath: \\smbpdc\profiles\test1
sambaHomePath: \\smbpdc\test1
sambaHomeDrive: H:
sambaLMPassword: 01FC5A6BE7BC6929AAD3B435B51404EE
sambaAcctFlags: [U]
sambaNTPassword: 0CB6948805F797BF2A82807973B89537
sambaPwdLastSet: 1272232931
sambaPwdMustChange: 2136232931
userPassword: {SSHA}x648ex6ahBbvwBH3bZtOqlCRz51nb2xo
shadowLastChange: 14724
shadowMax: 10000

Ahi esta.

Hasta aqui ya tenemos todo para administrar un dominio con samba+ldap. Desde windows ya deben de poder ver el dominio y registrar los equipos., si no busquenle.

Lo que voy hacer a continuacion es configurar FreeBSD para que use los usuarios de LDAP. Para esto necesitamos configurar nss_ldap y pam_ldap.

Como va a funcionar, vean el siguiente ejemplo:

id test1
id: test1: no such user

Aqui FreeBSD no sabe que existe el usuario test1 por que no tiene manera de comunicarse con LDAP, cuando lo haga tendremos esto:

id test1
uid=10020(test1) gid=513(Domain Users) groups=513(Domain Users)

Si ven la diferencia?

Configurando nss_ldap

Este es mi archivo de configuracion de nss_ldap.conf, ya sabendo donde lo pone FreeBSD, correcto?

host 192.168.49.2
base dc=midominio,dc=dyndns,dc=org
ldap_version 3
port 389
scope one
bind_policy soft
nss_connect_policy persist
idle_timelimit 3600
nss_paged_results yes
pagesize 1000
pam_login_attribute uid
nss_base_passwd ou=Users,dc=midominio,dc=dyndns,dc=org?one
nss_base_passwd ou=Computers,dc=midominio,dc=dyndns,dc=org?one
nss_base_shadow ou=Users,dc=midominio,dc=dyndns,dc=org?one
nss_base_group ou=Groups,dc=midominio,dc=dyndns,dc=org?one
ssl off

El archivo esta muy extenso, asi que solo puse lo necesario.

Tambien instalamos pam_ldap este instala una archivo de configuracion llamado: ldap.conf, y openldap tiene otro del mismo nombre, tenemos que configurar ambos y aparte necesitan la misma informacion que nss_ldap.conf, asi que mejor hacemos los siguiente:

1; Si existen ambos archivos borrarlos, pam_ldap lo coloca en /usr/local/etc/ y openldap en su folder que es /usr/local/etc/openldap/

2;Crear un enlace soft hacia nss_ldap.conf
ln -s /usr/local/etc/nss_ldap.conf /usr/local/etc/ldap.conf
ln -s /usr/local/etc/nss_ldap.conf /usr/local/etc/openldap/ldap.conf

Bien ahora le toca a /etc/nsswitch.conf, este queda asi:

group: files ldap
group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
passwd_compat: nis
shells: files
services: compat
services_compat: nis
protocols: files
rpc: files

*Recordar hacer siempre respaldos de los archivos del sistema: cp nsswitch.conf nsswitch.conf-default.

Ahora si prueben de nuevo:

id test1
uid=1000(test1) gid=513(Domain Users) groups=513(Domain Users)
mail# id root
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator),512(Domain Admins)

A esto es donde queria llegar, estamos listos para el siguiente paso, dovecot.

Dovecot

Bien ya tenemos todo listo para que dovecot haga uso de pam para poder proporcionar a los usuarios el servicio de correo usando Dovecot u proporcionando "imap", para esto vamos a hacer lo siguiente.

1; Instalar dovecot:

[X] KQUEUE
[X] SSL SSL support
[X] MANAGESIEVE ManageSieve support
[ ] GSSAPI GSSAPI support
[ ] VPOPMAIL VPopMail support
[ ] BDB BerkleyDB support
[X] LDAP OpenLDAP support
[ ] PGSQL PostgreSQL support
[X] MYSQL MySQL support
[ ] SQLITE SQLite support

Es lo que voy a usar.

2; Configurar dovecot:
Ya no necesito decirles donde esta dovecot.conf correcot?

dovecot.conf

protocol imap {
listen = 192.168.49.2:143
}
disable_plaintext_auth = no
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot.log
log_timestamp = "%b %d %H:%M:%S "
syslog_facility = local7
ssl = no
login_greeting = Listo My Lord.
login_trusted_networks = 192.168.49.0/24
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
login_log_format = %$: %s
mail_location = maildir:~/Maildir
namespace private {
separator = .
prefix = INBOX.
inbox = yes
}
mail_privileged_group = mail
mail_debug = yes
mail_log_prefix = "%Us(%u): "
dotlock_use_excl = yes
verbose_proctitle = yes
maildir_stat_dirs = yes
maildir_copy_with_hardlinks = yes
maildir_copy_preserve_filename = yes
protocol imap {
imap_client_workarounds = delay-newmail netscape-eoh tb-extra-mailbox-sep
}
protocol lda {
postmaster_address = postmaster
sendmail_path = /usr/sbin/sendmail
}
auth_username_format = %Lu
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
auth_worker_max_count = 1000
auth default {
mechanisms = plain login
passdb pam {
args = session=yes imap
}
userdb passwd {
args = blocking=yes
}
user = root
socket listen {
path = /var/run/dovecot/auth-master
mode = 0600
}
client {
path = /var/run/dovecot/auth-client
mode = 0660
}
}
}

3; Imap de PAM:
Debemos configurar en PAM el archivo imap que es el que va a utilizar dovecot para sacar la informacion de usuarios, este se localiza en /etc/pam.d/ y se llama "imap"

imap
=====line 1 col 0 lines from top 1 ============================================
#
# $FreeBSD: src/etc/pam.d/imap,v 1.7.10.1.2.1 2009/10/25 01:10:29 kensmith Exp $
#
# PAM configuration for the "imap" service
#

# auth
#auth sufficient pam_krb5.so no_warn try_first_pass
#auth sufficient pam_ssh.so no_warn try_first_pass
auth sufficient /usr/local/lib/pam_ldap.so try_first_pass
auth required pam_unix.so no_warn try_first_pass

# account
#account required pam_nologin.so
account sufficient /usr/local/lib/pam_ldap.so
account required pam_unix.so

4; Syslog:
Como estamos usando local7 para dovecot, debemos configurar el servicio y ademas crear el archivo dovecot.log.

touch /var/log/dovecot.log

agregamos a syslog.conf esto a el final:

local7 /var/log/dovecot.log

Reiniciamos syslogd

5; Agregamos a dovecot para que arranque cada que reiniciemos el sistema:
agregamos esto a rc.conf.

dovecot_enable="yes"

6; Iniciamos el servicio:

/usr/local/etc/rc.d/dovecot start

7; Verificamos puertos abiertos:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
dovecot imap-login 49041 4 tcp4 192.168.49.2:143 *:*
dovecot imap-login 49016 4 tcp4 192.168.49.2:143 *:*
dovecot imap-login 49015 4 tcp4 192.168.49.2:143 *:*
root dovecot-au 49013 5 tcp4 192.168.49.2:27813 192.168.49.2:389
root dovecot-au 49012 8 tcp4 192.168.49.2:11954 192.168.49.2:389
root dovecot 49011 7 tcp4 192.168.49.2:143 *:*
root smbd 88886 9 tcp4 192.168.49.2:34457 192.168.49.2:389
root smbd 88880 9 tcp4 192.168.49.2:34457 192.168.49.2:389
root nmbd 88873 9 udp4 192.168.49.2:137 *:*
root nmbd 88873 10 udp4 192.168.49.2:138 *:*
ldap slapd 88590 7 tcp4 192.168.49.2:389 *:*
ldap slapd 88590 11 tcp4 192.168.49.2:389 192.168.49.2:34457
ldap slapd 88590 16 tcp4 192.168.49.2:389 192.168.49.2:11954
ldap slapd 88590 19 tcp4 192.168.49.2:389 192.168.49.2:27813
ldap slapd 88590 24 tcp4 192.168.49.2:389 192.168.49.2:46517

Ahi lo tenemos.

8; Probando login de usuarios:

Tenemos ya unos usuarios creados, para que dovecot pueda accesar a el folder de cada usuario, el verifica que los permisos esten correctamente creados, cada usuario debe ser el dueño de su directorio, si debemos arreglar esto.

Les comento esto, por que cuando se esta configurando ldap+samba, puede que uno de los directorios creados para algun usuario haya quedado con los permisos erroneos, una vez que hayamos configurado nss_ldap y nis todo queda arreglado.

Si algun folder del /home no tiene los permisos correctos se los podemos arreglar:

chown -R UsuarioX:"Domain Users" /home/UsuarioX

Todos son creados con el modo 700.

Ahora si, de otra maquina vamos probando el puerto de dovecot:

telnet 192.168.49.2 143
Trying 192.168.49.2...
Connected to mail.midominio.dyndns.org.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE AUTH=PLAIN AUTH=LOGIN] Listo My Lord.

*Ahora vamos a logearnos con algun usuario*

a login test2 123 ===>>> usuario:test2, password:123
a OK [CAPABILITY IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID ENABLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS] Logged in

b select inbox
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
* OK [PERMANENTFLAGS (\Answered \Flagged \Deleted \Seen \Draft \*)] Flags permitted.
* 0 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1272323541] UIDs valid
* OK [UIDNEXT 1] Predicted next UID
* OK [HIGHESTMODSEQ 1] Highest
b OK [READ-WRITE] Select completed.

Ctrl+]

Listo salimos, todo funciono sin problemas, vamos revisando el folder de ese usuario a ver si hay algo nuevo.

cd /home/test2
mail# ll
total 2
drwx------ 5 test2 Domain Users 512 Apr 26 23:12 Maildir
mail# cd Maildir/
mail# ll
total 12
drwx------ 2 test2 Domain Users 512 Apr 26 23:12 cur
-rw------- 1 test2 Domain Users 17 Apr 26 23:12 dovecot-uidlist
-rw------- 1 test2 Domain Users 8 Apr 26 23:12 dovecot-uidvalidity
-rw------- 1 test2 Domain Users 0 Apr 26 23:12 dovecot-uidvalidity.4bd61dd5
-rw------- 1 test2 Domain Users 156 Apr 26 23:12 dovecot.index.log
drwx------ 2 test2 Domain Users 512 Apr 26 23:12 new
drwx------ 2 test2 Domain Users 512 Apr 26 23:12 tmp

Como pueden ver todo funciono a la perfeccion, dovecot creo el folder Maildir para el usuario, vamos revisando el log, esto es importantisimo, por que yo a todos mis servidores les habilito el "debug" aqui no es la excepcion, asi que cuando todo este ya listo para entrar a produccion, o le bajan a el nivel de debug o lo deshabilitan, aunque esto ultimo no lo recomiendo, y mas por el tipo de servicio que esta proporcionando.

cat /var/log/dovecot.log

Apr 26 23:10:19 auth(default): Info: new auth connection: pid=49554
Apr 26 23:11:17 auth(default): Info: client in: AUTH 1 PLAIN service=imap secured lip=192.168.49.2 rip=192.168.49.2 lport=143 rport=20712 resp=AHRlc3QyADEyMw==
Apr 26 23:11:17 auth-worker(default): Info: pam(test2,192.168.49.2): lookup service=imap
Apr 26 23:11:17 auth-worker(default): Info: pam(test2,192.168.49.2): #1/1 style=1 msg=Password:
Apr 26 23:11:17 auth(default): Info: client out: OK 1 user=test2
Apr 26 23:11:17 auth(default): Info: master in: REQUEST 3 49015 1
Apr 26 23:11:17 auth-worker(default): Info: passwd(test2,192.168.49.2): lookup
Apr 26 23:11:17 auth(default): Info: master out: USER 3 test2 system_groups_user=test2 uid=1003 gid=513 home=/home/test2
Apr 26 23:11:17 imap-login: Info: Login: user=, method=PLAIN, rip=192.168.49.2, lip=192.168.49.2, secured
Apr 26 23:11:17 IMAP(test2): Info: Effective uid=1003, gid=513, home=/home/test2
Apr 26 23:11:17 IMAP(test2): Info: Namespace: type=private, prefix=INBOX., sep=., inbox=yes, hidden=no, list=yes, subscriptions=yes
Apr 26 23:11:17 IMAP(test2): Info: maildir: data=~/Maildir
Apr 26 23:11:17 IMAP(test2): Info: maildir++: root=/home/test2/Maildir, index=, control=, inbox=/home/test2/Maildir
Apr 26 23:12:21 IMAP(test2): Info: Namespace INBOX.: Permission lookup failed from /home/test2/Maildir
Apr 26 23:12:21 IMAP(test2): Info: Namespace INBOX.: Using permissions from /home/test2/Maildir: mode=0700 gid=-1
Apr 26 23:12:36 IMAP(test2): Info: Connection closed bytes=16/595

Listo, ya podemos configurar algun cliente de correo y accesar a nuestros correos, lo que sigue es configurar postfix.

Postfix
Ya sigue configurar postfix para ahora si poder enviar/recibir correos. Postfix es de los programa que ya por default viene listo para usarse, pero vamos a hacerle unas pequeñas modificaciones para adapatarlo a nuestra red, muy minimas, asi que vamos empezando.

1; Instalar Postfix: Estos son los parametros que yo uso cuando los instalo de los ports.

[X] PCRE Perl Compatible Regular Expressions
[X] TLS Enable SSL and TLS support
[X] MYSQL MySQL maps (choose version with WITH_MYSQL_VER)
[X] NIS NIS maps lookups
[X] VDA VDA (Virtual Delivery Agent 32Bit)
[X] INST_BASE Install into /usr and /etc/postfix

El ultimo parametro lo que hace es poner los archivos de configuracion en "/etc", ya ven que por default FreeBSD los pone en /usr/local/etc/, pero no importa ustedes pueden si gustan deshabilitar ese parametro sin problemas.

2; Configurar archivo principal de postfix:

main.conf
postconf -n

alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
home_mailbox = Maildir/
html_directory = /usr/share/doc/postfix
inet_interfaces = $myhostname
local_recipient_maps = unix:passwd.byname $alias_maps
mail_owner = postfix
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = midominio.dyndns.org
myhostname = mail.midominio.dyndns.org
mynetworks = 192.168.49.0/24, 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix
relay_domains = $mydomain
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = maildrop
smtpd_banner = $myhostname ESMTP $mail_name
smtpd_recipient_restrictions = reject_non_fqdn_recipient reject_non_fqdn_sender reject_unknown_sender_domain reject_unknown_recipient_domain permit_mynetworks reject_unauth_destination reject_non_fqdn_hostname reject_invalid_hostname permit
unknown_local_recipient_reject_code = 550

Como es una archivo extenso, con el comando "postconf -n" muestro los parametros que estoy usando, asi que solo busquenlos y cambienlos a su necesidad.

Existen algunos archivo que necesitamos crear, los que estab marcados en bold, para ello necesitamos hacer lo siguiente:

a) crear archivo en la ruta indicada.
touch /etc/aliases
b) crear db tipo bdb
postmap hash:/etc/aliases

Aqui encontran un nuevo archivo de nombre aliases.db en /etc.

3; Agregar a postfix para que arranque a el reiniciar el servidor:

postfix_enable="YES"

NOTA: Lo ponemos arriba de dovecot.

4; Iniciamos el servicio:

/etc/rc.d/postfix start

En mi caso ya no uso la ruta de los ports si la del sistema /etc/rc.d/ por que yo le dije a postfix que se instalar ahi, si ustedes no hicieron esto deben poner la ruta default:

/usr/local/etc/rc.d/postfix start

5; Verificamos puertos abiertos:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
dovecot imap-login 17451 4 tcp4 192.168.49.2:143 *:*
postfix qmgr 1870 8 tcp4 192.168.49.2:26455 192.168.49.2:389
postfix pickup 1869 8 tcp4 192.168.49.2:43595 192.168.49.2:389
root master 1858 12 tcp4 192.168.49.2:25 *:*
root sshd 56266 3 tcp4 192.168.49.2:4576 189.220.35.217:1938
root sshd 56266 4 tcp4 192.168.49.2:63718 192.168.49.2:389
dovecot imap-login 49554 4 tcp4 192.168.49.2:143 *:*
dovecot imap-login 49016 4 tcp4 192.168.49.2:143 *:*
root dovecot-au 49013 5 tcp4 192.168.49.2:56388 192.168.49.2:389
root dovecot-au 49012 8 tcp4 192.168.49.2:11954 192.168.49.2:389
root dovecot 49011 7 tcp4 192.168.49.2:143 *:*
root smbd 88886 9 tcp4 192.168.49.2:34457 192.168.49.2:389
root smbd 88880 9 tcp4 192.168.49.2:34457 192.168.49.2:389
root nmbd 88873 9 udp4 192.168.49.2:137 *:*
root nmbd 88873 10 udp4 192.168.49.2:138 *:*
ldap slapd 88590 7 tcp4 192.168.49.2:389 *:*
ldap slapd 88590 11 tcp4 192.168.49.2:389 192.168.49.2:34457
ldap slapd 88590 16 tcp4 192.168.49.2:389 192.168.49.2:11954
ldap slapd 88590 20 tcp4 192.168.49.2:389 192.168.49.2:63718
ldap slapd 88590 24 tcp4 192.168.49.2:389 192.168.49.2:43595
ldap slapd 88590 28 tcp4 192.168.49.2:389 192.168.49.2:26455
ldap slapd 88590 29 tcp4 192.168.49.2:389 192.168.49.2:56388

Listo, ahora revisamos el log de postfix /var/log/maillog

Apr 27 07:05:03 mail postfix/qmgr[1870]: 1755829C805: from=, size=589, nrcpt=1 (queue active)
Apr 27 07:05:03 mail postfix/pickup[1869]: 2198D29C806: uid=0 from=
Apr 27 07:05:03 mail postfix/cleanup[1890]: 2198D29C806: message-id=<20100427070503.2198d29c806@mail.midominio.dyndns.org>
Apr 27 07:05:03 mail postfix/local[1943]: 1755829C805: to=, orig_to=, relay=local, delay=7500, delays=7500/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Apr 27 07:05:03 mail postfix/qmgr[1870]: 1755829C805: removed
Apr 27 07:05:03 mail postfix/qmgr[1870]: 2198D29C806: from=, size=589, nrcpt=1 (queue active)
Apr 27 07:05:03 mail postfix/pickup[1869]: 2B59A29C807: uid=0 from=
Apr 27 07:05:03 mail postfix/cleanup[1998]: 2B59A29C807: message-id=<20100427070503.2b59a29c807@mail.midominio.dyndns.org>
Apr 27 07:05:03 mail postfix/local[1999]: 2198D29C806: to=, orig_to=, relay=local, delay=3896, delays=3896/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Apr 27 07:05:03 mail postfix/qmgr[1870]: 2198D29C806: removed
Apr 27 07:05:03 mail postfix/qmgr[1870]: 2B59A29C807: from=, size=589, nrcpt=1 (queue active)
Apr 27 07:05:03 mail postfix/local[1943]: 2B59A29C807: to=, orig_to=, relay=local, delay=299, delays=299/0/0/0, dsn=2.0.0, status=sent (delivered to maildir)
Apr 27 07:05:03 mail postfix/qmgr[1870]: 2B59A29C807: removed

Como podran ver, por ahi teniamos correos en cola, como ya esta operando un smtp en el sistema, FreeBSD automaticamente lo empieza a utilizar, perece que todo esta operando correctamente.

6; Probando postfix desde otro equipo:

Telnet es un programa inseguro pero dentro de la red es un gran aliado para probar los programas, aqui vuelve a entrar en accion:

%telnet mail 25
Trying 192.168.49.2...
Connected to mail.midominio.dyndns.org.
Escape character is '^]'.
220 mail.midominio.dyndns.org ESMTP Postfix
helo mail.midominio.dyndns.org
250 mail.midominio.dyndns.org
mail from: test1@midominio.dyndns.org
250 2.1.0 Ok
rcpt to:test2@midominio.dyndns.org
250 2.1.5 Ok
data
354 End data with .
Hola.
.
250 2.0.0 Ok: queued as EDEA929B3E6
quit
221 2.0.0 Bye
Connection closed by foreign host.

Que bien todo trabajo sin problemas.

Lo que sigue es mailgraph para ver estadisticas en correos.

Mailgraph

NOTA: Ya deben tener a apache + php operando sin problemas.

Bien ya estamos recibiendo correos, ahora lo que sigue es ver cuantos recibimos, rechazamos etc.
Para ello necesitamos instalar mailgraph.

1; Instalar mailgraph

cd /usr/ports/mail/mailgraph
make install clean

2; Agregarlo para que arranque el reiniciar el servidor:

Para esto ya saben debemos agregar este parametro a /etc/rc.conf

mailgraph_enable="YES"

3; Mover el archivo de nombre mailgraph.cgi hacia /usr/local/www/apache22/cgi-bin

Lo buscan find /usr/local/www -name mailgraph.cgi -print

4; Agregar la bandera de ejecutable a el archivo mailgraph.cgi.

chmod +x mailgraph.cgi

5; Cambiar permiso a el archivo /var/log/maillog

chmod 664 /var/log/maillog

6; Iniciar el servicio.

/usr/local/etc/rc.d/mailgraph start

7; Probar desde el navegador.

http://midimonio.dyndns.org/cgi-bin/mailgraph.cgi

Vacation on squirrelmail

Tenemos un vacation ya en los ports:

mail/vacation

Necesitamos ftp/php5-ldap.










6 comentarios:

emi dijo...

podrias montar un servidor de dominio con FreeBDS q soporte SAMBA?? estoy un poco stuck aqui

muy buen tuto

Pedro Moreno dijo...

Hola emi, claro PDC+Samba es la dupla perfecta en la red, yo asi lo tengo trabajando sin problemas, el PDC requiere samba por ley.

La mayoria de los tutos hablan de linux, pero una vea que entiendes como se configura, ya puedes moverte a cualquier OS, linux, FreeBSD, Unix etc.

Saludos!!!

Anónimo dijo...

Este manual esta testeado ?
Adube buscando un buen rato un manual para freeBSD.. acabo de terminar un pdc en debian, que va de maravilla..

Pero traigo la espinita de hacerlo en *BSD

Pro cierto, felicidades por el manual.

Tyler.

Pedro Moreno dijo...

Hola Tyler, mi dominio todo esta bajo FreeBSD/Jails usando esta instalacion, asi que esta en produccion, si vez algo raro me avisas, saludos.

Anónimo dijo...

Que tal,

Te ha pasado que los usuarios no pueden cambiar su password desde windows ?

Llevo dias atorado, pero no encuentro alguna solucion.

Me puedes dar algun norte ?

Chino

Pedro Moreno dijo...

Google siempre ayuda, saludos.