viernes, 30 de abril de 2010

FreeBSD 8.X: Spam Gateway



Bueno, ya vieron como levantar un servidor de correo con Dovecot + Postfix. Ahora lo que sigue es proteger a nuestro servidor de spam, virus, etc.

Aqui vamos hacer algo sencillo, lo que le llaman un spam gateway, que su funcion principal es protegernos de los spammers y correos con bichos.

Internet->Postfix->amavisd->clamd->spamassassin->pasa || no pasa

La operacion con mas detalles es que todos los correos de entrada seran recibidos por este servidor, es el que se va a llevar la friega, por que tiene que estar desempaquetando, empaquetando, consultando el DNS y mas cuando hay archivos anexos.

La 1ra operacion o filtro lo hara Postfix, ya que el mismo tiene funciones o filtros que les aplica a cada correo, y es un proceso que se lleva a cabo entre smtp vs smtp, y aqui mucho correo de entrada queda descartado.

Enseguida vamos a ir por una aplicacion que hace algo tan sencillo y tambien bloquea otro monton de spam su nombre es postfix-policyd-weight, existen varias aplicaciones con la misma funcion, pero ya cada quien decide cual usar.

Luego sigue el checado de antivirus con clamavis, seguido de spamassassin ambas operaciones son administradas por amavisd, ya de regreso entran las listas BL y con esto vamos a tener un filtro casi al 100%, ya solo es cuestion de mantener a el dia el servidor y sobre todo spamassassin.

Bien, las aplicaciones que vamos a trabajar son las siguientes:

postfix
postfix-policyd-weight
spamassassin
clamavis
amavisd-new

Mas o menos asi vamos trabar conforme la lista.

Postfix

Vamos viendo la version que estamos trabajando y sobre todo FreeBSD:

OS: 8.2 I386.
Postfix: postfix-2.8.2,1

Otro detalle que me gustaria aclarar es que ambos servidores corren bajo Jails de FreeBSD, osea que estan virtualizados y ninguno posee la loopback interface y tienen un arreglo de disco Raid-1 con Satas.

La configuracion de mi src.conf es la siguiente tanto para el spam como el mail:

WITHOUT_ACCT="yes"
WITHOUT_ACPI="yes"
WITHOUT_AMD="yes"
WITHOUT_APM="yes"
WITHOUT_ASSERT_DEBUG="yes"
WITHOUT_ATM="yes"
WITHOUT_AUDIT="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_FORTH="yes"
WITHOUT_FREEBSD_UPDATE="yes"
WITHOUT_GAMES="yes"
WITHOUT_GDB="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_LOCALES="yes"
WITHOUT_LOCATE="yes"
WITHOUT_LPR="yes"
WITHOUT_NCP="yes"
WITHOUT_NDIS="yes"
WITHOUT_NETGRAPH="yes"
WITHOUT_NLS="yes"
WITHOUT_NLS_CATALOGS="yes"
WITHOUT_NS_CACHING="yes"
WITHOUT_PF="yes"
WITHOUT_PMC="yes"
WITHOUT_PPP="yes"
WITHOUT_PROFILE="yes"
WITHOUT_QUOTAS="yes"
WITHOUT_RCMDS="yes"
WITHOUT_RCS="yes"
WITHOUT_RESCUE="yes"
WITHOUT_ROUTED="yes"
WITHOUT_SHAREDOCS="yes"
WITHOUT_SSP="yes"
WITHOUT_SYSINSTALL="yes"
WITHOUT_USB="yes"
WITHOUT_WIRELESS="yes"
WITHOUT_WPA_SUPPLICANT_EAPOL="yes"

Cuando se instala Postfix nos pregunta si deseamos colocar la configuración en /etc, yo no lo acepto en este servidor, si fuera el "mail server" si. Por lo tanto la instalacion se va a:


/usr/local/etc/postfix

Ahora algo que debemos saber es que configuracion nos da Postfix por default? Se supone que casi casi nos da una segura y no un "open-relay" que luego lo vamos a explicar.

Asi esta el archivo main.cf:

postconf -n

command_directory = /usr/local/sbin
config_directory = /usr/local/etc/postfix
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
html_directory =
mail_owner = postfix
mailq_path =
manpage_directory =
newaliases_path =
queue_directory = /var/spool/postfix
readme_directory =
sample_directory =
sendmail_path =
setgid_group =
unknown_local_recipient_reject_code = 550

Ahora si desean ver toda la configuracion completa:

postconf

Pero aqui no lo puedo poner porque esta extensa la salida, ustedes en su maquina pueden hacerlo.

Como tenemos 2 servidores:
  • mail-server 192.168.40.2 Correo Saliente
  • spam-server 192.168.40.3 Correo Entrante
Vamos a usar el dominio: example punto com para seguir la tradicion.

Mi DNS apunta a mi spam-server, ya di de alta el registro PTR de mi IP publico a el nombre de mi spam-server, ya que el es quien recibe todo el correo entrante y envia el correo si pasa todos los filtros a el mail-server, si no tiene el PTR muchos servidores de correo no envian ni reciben correo de servidores que no cumplen esta norma.

---------------------------------------------------------------------------------
NOTA:Aqui ya tengo mi servidor de correo operando sin problemas, solo voy a configurar el spam server.
---------------------------------------------------------------------------------

Vamos a empezar con la 1ra configuracion, habran el archivo main.cf de postfix su corazon:

1; Nombre del hostname:

myhostname = spam.example.com

2; Dominio que voy a proporcionar el servicio.

mydomain = example.com

3;Mi origen.

myorigin = $mydomain

5; Las interfaces que el servidor va a usar para recibir la comunicacion: Por lo regular es en todas las que tengamos.

inet_interfaces = all

6; Destinos:

mydestination =

¿Por que en blanco?, como queremos tanta seguridad como sea posible, vamos a deshabilitar el envio local, por ello no damos de alta nuestro dominio aqui, pero vamos a ver mas adelante como habilitar el envio local para recibir mensajes del root del spam-server.

Para habilitar el envio local del root y cuentas de administradores como:
  • postmaster
  • abuse
Deshabilitamos el parametro dejandolo en blanco:

local_recipient_maps =

Ahora si deseo que ciertos usuarios locales puedan recibir correos como los anteriores, vamos hacer uso del parametro este:

virtual_alias_maps = hash:/usr/local/etc/postfix/virtual_alias_maps

Como parametro le damos el archivo en formato binario que se lo indicamos usando la palabra "hash", ahora vamos a crear ese archivo y le agregamos la informacion asi:

postmaster postmaster@example.com
abuse abuse@example.com

Salvamos el archivo en la ruta indicada arriba y crea el formato que nos pide postfix con el comando postmap, asi:

postmap hash:/usr/local/etc/postfix/virtual_alias_maps

Si revisan su directorio van a ver los 2 archivos:

-rw-r--r-- 1 root wheel 141 Apr 14 12:24 virtual_alias_maps
-rw-r--r-- 1 root wheel 65536 Apr 14 12:24 virtual_alias_maps.db

El que tiene extension "db" es el creado con el comand anterior y es el que usa postfix, todos estos archivos son creados usando BDB para esta funcion son excelentes y es mas veloces su acceso que si hicieramos uso de una DB como mysql, por ello se opto por este formato.

Cuando alguien fuera del dominio busque enviar correos a cuentas locales podemos personalizar el mensaje con el parametro:

local_transport

Por default tiene un texto asi:

local_transport = error:local mail delivery not available

Pero pueden poner el texto que gusten como:

local_transport = error:No molestar envio local esta deshabilitado

Con esto el servidor podra enviar correos a las cuentas arriba dadas de alta de lo contrario ni eso podria ser posible.

Ya para rematar debemos eliminar el envio demonio que se encarga de los envios locales, abran el archivo de nombre master.cf y deshabiliten la linea

#local unix - n n - - local

Poniendo un "#" para convertirla a comentario.

7; Datos de nuestra red.

mynetworks = 192.168.40.2/32

Aqui colocamos el IP de nuestro mail-server interno, solo a el vamos a servir, ya que si colocamos nuestro rango de red, ejemplo 192.168.40.0/24 cualquier usuario interno podra usar este servidor como relay y hacer maldades, con este dato descartamos esta posibilidad.

8; Domino que podemos habilitar el relay.

relay_domains = example.com

9; Usuarios validos que pueden recibir correo externo.

relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients

Este parametro es una pieza clave que deberan mantener al dia, ya que aqui le indicamos que usuarios del dominio pueden recibir correo, antes de que el spam-server envie el correo a el mail-server revisa este parametro y si la cuenta o "recipient" no esta aqui, rechaza el correo, aqui vamos a eliminar mucho spam, ya que los spammers tienen programas que generan cuentas de usuario aleatoriamente, ya con eso les paramos su kalabaza.

Por lo tanto, como ven de nuevo necesitamos crear ese archivo con los usuarios validos, en mi caso tengo solo 3 y el archivo tiene este formato:

usuario1@example.com OK
usuario2@example.com OK
usuario3@example.com OK

Creamos el archivo en formato BDB:

postmap hash:/usr/local/etc/postfix/relay_recipients

10; Alias

alias_maps = hash:/usr/local/etc/postfix/aliases

De nuevo necesitan crear el archivo con postmap, ya no se los voy a repetir, el archivo esta en blanco aun no hemos hecho uso de el.

11; Alias Databases

alias_database = hash:/usr/local/etc/postfix/aliases

Igual en blanco ya que no hemos hecho uso de el, pero si deben crear el archivo en formato BDB.

12; Banner

smtpd_banner = $myhostname ESMTP $mail_name

Cuando nuestro servidor de correo necesite comunicarse con otro smtp, el RFC pide que nos presentemos usando el HELO y nuestro nombre, este parametro hace eso.

13; Rutas.

sendmail_path = /usr/local/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/local/bin/mailq
setgid_group = maildrop
manpage_directory = /usr/local/man
sample_directory = /usr/local/etc/postfix
readme_directory = /usr/local/share/doc/postfix

14; Habiltando el envio de correo a el mail-server.

transport_maps = hash:/usr/local/etc/postfix/transport

Como pueden observar, necesitamos crear ese archivo con los datos de nuestro mail-server, como sigue:

example.com smtp:[mail.example.com]

Creamos el BDB.

Este ultimo paso es donde le indicamos a nuestro spam-server que envie todos los correos aceptados a este hostname, si no tienen un DNS operable pueden poner el IP si gustan, en mi caso mi DNS esta funcionando sin problemas.

15; Revisamos el sintaxis de postfix.

postix check

Si no hay problema, ya pueden iniciar su servicio y primero que nada buscar sitios publicos donde probar si nuestro servidor no es un "open-relay" que significa que nadie de fuera puede usarlo para enviar correos.

http://www.abuse.net/relay.html

Le dan su IP o nombre del spam-server tal cual lo tiene dado de alta en su DNS y esperen los resultados, van a ver muchas pruebas que le hacen y a el final obtendran un mensaje como este:

Relay test result
All tests performed, no relays accepted.

Pero hagan mas pruebas, existen varios sitios publicos que nos proporcionan este servicio publico.

Tambien revisen su log para que vean lo que postfix logea cuando quieren penetrarlo para openrelay:

May 6 00:09:29 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:32 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:35 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=
May 6 00:09:38 spam postfix/smtpd[3333]: NOQUEUE: reject: RCPT from verify.abuse.net[64.57.183.77]: 554 5.7.1 : Relay access denied; from= to= proto=SMTP helo=

Esto es solo una parte de los logs, familiaricense con ellos, son importantisimos.

Vamos observando como nos queda la configuracion despues de estos primeros cambios:

postconf -n
alias_database = hash:/usr/local/etc/postfix/aliases
alias_maps = hash:/usr/local/etc/postfix/aliases
command_directory = /usr/local/sbin
config_directory = /usr/local/etc/postfix
daemon_directory = /usr/local/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
html_directory = /usr/local/share/doc/postfix
inet_interfaces = all
local_recipient_maps =
mail_owner = postfix
mailq_path = /usr/local/bin/mailq
manpage_directory = /usr/local/man
mydestination =
mydomain = example.com
myhostname = spam.example.com
mynetworks = 192.168.40.2/32
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = /usr/local/share/doc/postfix
relay_domains = example.com
relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients
sample_directory = /usr/local/etc/postfix
sendmail_path = /usr/local/sbin/sendmail
setgid_group = maildrop
smtpd_banner = $myhostname ESMTP $mail_name
transport_maps = hash:/usr/local/etc/postfix/transport
unknown_local_recipient_reject_code = 550

Pueden compararla con la primera que mostramos y notaran la diferencia.

Restricciones
1; Helo.

Podemos por regla solicitar a el otro smtp que siempre que trate de entablar comunicacion con nosotros, se presente haciendo uso de su nombre, para ello usamos el parametro:

smtpd_helo_required = yes

Con esto le pedimos que nos mande su hostname, asi dicen los RFC.

Por default postfix no lo pide, pero nosotros si, muchos spammers no les gusta esto y mucho menos obedecer reglas, si asi nos gusta a nosotros ni modo asi va a hacer.

Ahora vean lo que pasa cuando otro smtpd se conecta y es irrespetuoso, vamos a usar un equipo externo para hacer las pruebas, para ver la info en los logs de postfix que en mi caso estan en:

/var/log/maillog

Necesito prender el log de postfix abriendo el archivo de nombre:

master.cf

Y busca la siguiente linea y le agrego el parametro -v, asi quedaria:

smtp inet n - n - - smtpd -v

En este caso es la 1ra.

Aqui si reinicio el servicio.

Ahora, me conecto del otro cliente e intento mandar un correo sin mandar el HELO:

telnet example.com 25
Trying XXX.YYY.ZZZ.WWW...
Connected to example.com (IP-Publica).
Escape character is '^]'.
220 spam.example.com ESMTP Postfix
mail from:
503 5.5.1 Error: send HELO/EHLO first

Esto aparece de lado del otros smtp, ahora vemos los logs de postfix, si va a logear mucho pero aqui estamos aprediendo y no hay como saber leer los logs de cada uno de nuestros servidores de los contrario no somos buenos administradores:

May 9 22:50:53 spam postfix/smtpd[68766]: > mail.example2.com[IP-Publica]: 220 spam.example.com ESMTP Postfix
May 9 22:51:16 spam postfix/smtpd[68766]: < mail.example2.com[IP-Publica]: mail from:
May 9 22:51:16 spam postfix/smtpd[68766]: > mail.example2.com[IP-Publica]: 503 5.5.1 Error: send HELO/EHLO first

Ahi esta nuestra primer restriccion trabajando, asi que funciona.

Panorama de la comunicacion de un correo y lugar donde aplica cada tipo de restriccion, ver siguiente figura:

Figura 1. Ubicacion de restricciones de un correo en postfix.

En base a la figura 1, vamos a seguir este tutorial.

warn_if_reject

Este parametro se creo con el fin de debugear las restricciones, se ponen 1ro que la restriccion y solo nos logea un mensaje como este:

connect from mail.example2.com[IP-publica]
May 9 23:27:29 spam postfix/smtpd[69200]: NOQUEUE: reject_warning:
RCPT from mail.example2.com[IP-publica]: 554 5.7.1
: Client host rejected: Access denied; from=
to= proto=ESMTP helo=

Este pequeño parametro es de gran utilidad, ya que nos avisa si la regla funciona y si la pocision es adecuada y sobre todo que no rechaza el correo es simple informacion en los logs.

warn_if_reject restriccion_deseada

2; Client Restrictions.

Restricciones del cliente, que opciones por default tiene postfix, vamos revisandola:

postconf -d smtpd_client_restrictions
smtpd_client_restrictions =

Ninguna, entonces vamos empezando a ver que nos sirve, aunque aqui se manejan muchas, no todas vamos usar ya que muchas no tiene aplicacion para mi aun.

check_client_access

smtpd_client_restrictions=
warn_if_reject check_client_access hash:/usr/local/etc/postfix/access_clients
permit

Creamos el archivo con un dominio que no deseo aceptar, ejemplo

hotmail.com REJECT

Ya saben es hash, ya saben que tienen que hacer.

reload a postfix, mandamos un correo desde una cuenta de hotmail y vemos log.

connect from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]
May 9 23:45:21 spam postfix/smtpd[69404]: NOQUEUE: reject:
RCPT from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]:
554 5.7.1 :
Client host rejected: Access denied;
from= to=
proto=ESMTP helo=
May 9 23:45:21 spam postfix/smtpd[69404]: disconnect
from snt0-omc3-s32.snt0.hotmail.com[65.55.90.171]

Dentro de hotmail recibiran un correo con el subject:

Delivery Status Notification (Failure)‏

Y con el body:

This is an automatically generated Delivery Status Notification.
Delivery to the following recipients failed.
usera-texample.com

Ahora si tiene una cuenta de correo que no sea hotmail, prueben:

connect from mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/smtpd[69410]: 1D55BC16786: client=mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/cleanup[69413]: 1D55BC16786:
message-id=<6101993aafcd9f28f8b610475feca52b.squirrela-twww.otrodominio.com>
May 9 23:53:27 spam postfix/qmgr[69390]: 1D55BC16786:
from=, size=946, nrcpt=1 (queue active)
May 9 23:53:27 spam postfix/smtpd[69410]: disconnect
from mail.otrodominio.com[ippublica]
May 9 23:53:27 spam postfix/smtp[69414]: 1D55BC16786:
to=, relay=mail.example.com[192.168.40.4]:25,
delay=0.09, delays=0.02/0.01/0.02/0.04, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 2DA714E0015)
May 9 23:53:27 spam postfix/qmgr[69390]: 1D55BC16786: removed

Como podran ver rechazo un dominio que es basura desde el 1er filtro segun la figura 1, ahora porque si facebook esta prohibido en su empresa no bloquearlo para no aceptar ninguna invitacion por correo, ya vieron como hacerlo...

NOTA: De los logs voy a quitar "@" y lo voy a remplazar por la palabra a-t, muchos sabran por que.


Ahora veo como queda mi 1er restriccion:

postconf -h smtpd_client_restrictions
check_client_access hash:/usr/local/etc/postfix/access_clients permit

El parametro permit le indica a postfix que si el cliente pasa las reglas anteriores pueden seguir su camino con las demas restricciones si hay.

3; smtpd_recipient_restrictions.

Aqui es donde la mayor parte de las restricciones entran, ya que si revisan la figura 1 en cada nivel postfix tiene filtros, pero segun los expertos aqui es donde van la mayoria. Ahora que es lo hace postfix por default para que nuestro smtpd no sea un "open relay"?,

Vamos primero revisando viendo los parametros por default que nos da esta restriccion:

postconf -d smtpd_recipient_restrictions
smtpd_recipient_restrictions =
permit_mynetworks, reject_unauth_destination

Como podran ver solo existen 2, postfix divide sus restricciones en 2 capas:

nombre_de_restriccion =
----Restricciones que aplica tanto a clientes internos como externos.
permit_mynetworks
----
Restricciones que aplica solo a clientes externos.
permit

Por ello coloca esta restriccion:

reject_unauth_destination

Enseguida de:

permit_mynetworks

Estos dos parametros hacen que nuestro smtp no sea un openrelay y asi viene por default postfix.

El parametro reject_unauth_destination se encarga de eso, verificando que tanto el RCPT TO: su dominio o destinatarios sean de nuestro dominio, de lo contrario son rechazados.

Entonces vamos armando nuestro siguiente filtro y quedaria asi:

smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
permit

Pongan lo anterior en el archivo main.cf.

4; Exigir que a otros smtp que sigan las reglas del RFC y cuando manden su nombre en el HELO/EHLO venga en forma FQDN.

mail.example.com

De lo contrario sera rechazado, nosotros ponemos las reglas, el parametro usado es:

reject_non_fqdn_hostname

Quedaria asi:

smtpd_recipient_restrictions =
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
permit

Reload y probamos.

connect from mail.example2.com[pub-ip]
May 12 22:03:33 spam postfix/smtpd[8895]: NOQUEUE: reject_warning:
RCPT from mail.example2.com[pub-ip]:
504 5.5.2 : Helo command rejected: need fully-qualified hostname;
from= to= proto=SMTP helo=
May 12 22:03:33 spam postfix/smtpd[8895]: 4EC1BC16786:
client=mail.example2.com[pub-ip]

5; Ahora vamos a pedirles a otros smtp que usen nombres validos en el hostname usando este parametro:

reject_invalid_hostname

Es parecido a el #4 y util.

Reload y probamos.

6; Hasta aqui hemos atacado el smtp, pero ahora sigue el sender o el "from:", asi como le pedimos a los smtp externos que tengan nombres en forma FQDN, tambien se lo vamos a exigir a los remitentes usando este parametro:

reject_non_fqdn_sender

Y lo vamos a colocar arriba de permit_mynetworks, para que sea a todos, tanto los externos como internos, por si por alguna razon postfix falle no me vaya a causar problemas por error de dedo o de aplicacion, mejor se lo aplico a todos.

Quedaria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_sender
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y probamos.

connect from mail.example2.com[ip-pub]
May 12 22:31:50 spam postfix/smtpd[9269]: NOQUEUE:
RCPT from mail.example2.com[ip-pub]: 504 5.5.2 :
Sender address rejected: need fully-qualified
address; from= to=
proto=SMTP helo=
May 12 22:31:50 spam postfix/smtpd[9269]:
96E4DC16786: client=mail.example2.com[ip-pub]
May 12 22:31:56 spam postfix/smtpd[9269]:
lost connection after UNKNOWN from mail.example2.com[ip-pub]
May 12 22:31:56 spam postfix/smtpd[9269]:
disconnect from mail.example2.com[ip-pub]

7; Ahora vamos a validar la existencia de los dominios de los otros smtp`s. Con este parametro:

smtpd_recipient_restrictions =
reject_non_fqdn_sender
reject_unknown_sender_domain
permit_mynetworks
reject_unauth_destination
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y probamos.

connect from mail.exmaple2.com[pub-ip]
May 13 06:44:14 spam postfix/smtpd[15311]: NOQUEUE: reject:
RCPT from mail.exmaple2.com[pub-ip]: 450 4.1.8
: Sender address rejected:
Domain not found; from=
to=
proto=SMTP helo=
May 13 06:44:19 spam postfix/smtpd[15311]:
lost connection after RCPT from mail.exmaple2.com[pub-ip]
May 13 06:44:19 spam postfix/smtpd[15311]:
disconnect from mail.exmaple2.com[pub-ip]

Claro que aqui postfix necesita hacer unos queries a el DNS pero no importa vale la pena.

8; Ahora vamos a verficar que el dominio de los destinos existan, ya se que sabemos que no va a pasar, pero para que dejar que la comunicacion sigan procesandose si puede pararla antes mejor, asi me ahorro CPU/memoria/tiempo.

Quedaria asi:

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

Reload y revisamos logs, les aparecera algo asi:

user@dominio.malo.com>: Recipient address rejected: Domain not found

Hasta aqui hemos creado un grupo de restriciones, las cuales creanme van a bloquar parte de los spammers, pero este es solo la 1er barrera, vamos a seguirle.

10; Validando remitentes.

Ahora vamos a pedirle a postfix que antes de aceptar un correo para un usuario de nuestro dominio lo verifique, para ello tenemos 2 formas, usuarios locales y usuarios del dominio, anteriormente hablamos de los 1eros y configuramos a nuestro smtp para que no acepte nada a cuentas locales, asi que aqui me enfocare a los usuarios del dominio.

El parametro:

relay_recipient_maps = hash:/usr/local/etc/postfix/relay_recipients

Le estamos dando un archivo donde tenemos las cuentas que pueden realmente recibir correos, aqui esta un ejemplo:

user1@example.com OK
user2@example.com OK

Ya saben como deben crear el archivo que requiere postfix, reload y prueban.

connect from mail.example2.com[ip-pub]
May 14 15:35:01 spam postfix/smtpd[32991]: NOQUEUE: reject: RCPT from
mail.example2.com[ip-pub]: 550 5.1.1 :
Recipient address rejected: User unknown in relay
recipient table; from=
to= proto=SMTP helo=
May 14 15:35:08 spam postfix/smtpd[32991]:
lost connection after RCPT from mail.example2.com[ip-pub]
May 14 15:35:08 spam postfix/smtpd[32991]:
disconnect from mail.example2.com[ip-pub]

Se preguntaran, como podre sacar mi lista de usuarios? bueno aqui cada debe saber como tenerla a el dia.

11;Vamos a agregar otros parametros y al ver su nombre ustedes van a saber lo que hacen:

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

Reload y prueban.

12; Envio a multiples destinatarios.

Dice el RFC que uno nunca debe de bloquear el correo de remitentes en esta forma:

<>

Ya que este correo lo usan los mismos smtp para comunicarse, pero muchos spammers abusan y tratan de usarlo para aprovecharse de este atributo y ademas trataran de usarlo para enviar correos a multiples destinatarios, por ello existe este parametro:

reject_multi_recipient_bounce

Su funcion es esa y nuestra configuracion seria asi:

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_multi_recipient_bounce
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload y prueban.

connect from mail.example2.com[pub-ip]
May 15 22:01:11 spam postfix/smtpd[64455]: 3D706C16E22:
client=mail.example2.com[pub-ip]
May 15 22:01:23 spam postfix/smtpd[64455]:
3D706C16E22: reject: RCPT from mail.example2.com[pub-ip]:
550 5.5.3 : Recipient address rejected:
Multi-recipient bounce; from=<> to=
proto=SMTP helo=
May 15 22:01:28 spam postfix/smtpd[64455]:
lost connection after RCPT from mail.example2.com[pub-ip]
May 15 22:01:28 spam postfix/smtpd[64455]:
disconnect from mail.example2.com[pub-ip]

13; Helo Checks.

Muchos spammers trataran de pasarse de listos y quedran enviar en el HELO/EHLO el nombre de nuestro smtp, por lo tanto vamos deteniendo este detalle creando un archivo con los siguientes caracteres raros:

/^spam\.example\.com$/ REJECT You are not in the server room

# Somebody HELO'ing with our IP address?
/^W\.X\.Y\.Z$/ REJECT You are not my IP
/^\[W.X.Y\.Z\]$/ REJECT You are not my IP
/^[0-9.]+$/ REJECT U are not RFC2821 compliant

Donde W.X.Y.Z es el ip publico de mi spam server, no el interno.

Y dentro de postfix usamos el parametro:

check_helo_access

Asi:

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_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
permit

Reload.

Si se dan cuenta, postfix genera un archivo con la extension .pcre de helo_checks.

Ahora revisamos el log:

connect from mail.example2.com[pub-ip]
May 15 22:45:43 spam postfix/smtpd[59312]: NOQUEUE: reject:
RCPT from mail.example2.com[pub-ip]:
554 5.7.1 :
Helo command rejected: You are not in the server room;
from=
to=
proto=SMTP helo=

14; Listras negras de DNS.

Postfix nos permite a nosotros hacer uso de sitios externos para saber si el smtp externo que desea tener comunicacion con nuestro smtp no esta en alguna lista negra. Hay varios parametros y lista de este tipo existen varias, yo en lo particular estoy usando:

http://www.spamhaus.org/index.lasso

Me ha servido mucho y es mucho el spam que me bloquean y no he tenido problemas con ninguno de nuestros clientes en el sentido que este filtro los este bloqueando.

Bien, esta funcion es desgastante en tiempo pero vale la pena, y me refiero a esto porque nuestro smtp tendra que hacer algunos queries a el dns, asi que si ven lentitud vayan pensando en levantar un cache DNS.

Como quedaria my configuracion:

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_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
reject_rbl_client zen.spamhaus.org
permit

En mi caso quiero que sea la ultima que se lleve a cabo por lo mismo del tiempo precioso que necesita que son segundos, pero cuando tienes 20 conexiones x segundo ya pesa.

Reload y voy a mostrar un log de cuando este operacion entra en juego:

May 15 23:01:39 spam postfix/smtpd[2968]:
NOQUEUE: reject: RCPT from unknown[PUB-IP]:
554 5.7.1 Service unavailable; Client host
[PUB-IP] blocked using zen.spamhaus.org;
http://www.spamhaus.org/query/bl?ip=PUB-IP;
from= to=
proto=SMTP helo=<456.subnet24-432-789.speedy.telkom.net.id>

15; No permitir usar mi dominio a el remitente.

Ahora vamos a verificar que los smtp no traten de usar mi dominio en sus remitentes, para ello vamos a crear un archivo con estos datos:

example.com 554 No usar mi dominio en tu remitente

Y nuestro configuracion seria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
check_sender_access hash:/usr/local/etc/postfix/no_usar_mi_dominio
reject_unauth_destination
reject_multi_recipient_bounce
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_non_fqdn_hostname
reject_invalid_hostname
reject_rbl_client zen.spamhaus.org
permit

Por que ahi? Bien yo quiero que si alguien quiere usar mi dominio en su remitente, no deseo investigar mas ya que ese smtp ha tratado de fingir ser "yo" por lo tanto lo rechazo antes de seguir gastando mi precioso tiempo, CPU, memoria por ello le doy prioridad a esta regla.

Reload y vamos a ver que dice el log:

connect from mail.example2.com[pub-ip]
May 15 23:44:39 spam postfix/smtpd[64295]:
NOQUEUE: reject: RCPT from mail.example2.com[pub-ip]:
554 5.7.1 :
Sender address rejected: No usar mi dominio en tu remitente;
from=
to=
proto=SMTP helo=


16;
Filtros Externos

Ahora vamos hacer uso de programas externos y deseo darles una tecnica que a muchos les parece algo exagerada pero a mi punto de vista la veo muy util, la cual se basa en un funcion de los smtp, la cual funciona asi.

Cuando un smtp se comunica con otro, y este otro esta muy saturado, este ultimo le puede responder a el 1er smtp diciendole que esta muy cargado que espero un poco de tiempo. El rfc tiene contemplado esto.

Asi de simple, pero a que viene esto?

Muchos spaammers les pagan por enviar correos, mientras mas envien mas les pagan o llegan a su cuota, por ello muchos crean su programas para que no obedezcan los RFC de lo contrario serian ejecutables muy grandes y rapidamente detectados.

Y ademas, ellos reciben su paga por enviar y no por confirmar si llego o no, en las palabras anteriores esta la clave.

Para llevar a cabo esta tecnica vamos hacer uso de un programa llamado: Postgrey de este sitio.

http://postgrey.schweikert.ch/

Por ello postfix nos da este parametro:

check_policy_service

Aqui es donde le decimos que haga uso de algo externo.

Lo que hace postgrey es lo siguiente. Cuando un remitente externo(otro smtp) trata de enviarnos por primera vez correos a un destinatario de nuestro dominio, una vez pasado por todas las reglas y llegado a el check_policy_service, postgrey en su bd verifica que haya un par de parametros:

remitente destinatario

Si no hay ninguno, este le retorna el mensaje a el otro smtp que debe esperar, por default postgrey tienen una poliza de 5 minutos, asi que si el otro smtp trata de hacerlo antes postgrey ya lo tiene en su lista de espera y lo vuelve a rechazar hasta que haya pasado ese periodo de gracia.

Una vez que el otro smtp lo intenta en el tiempo especificado ya postgrey le permite el paso por que ya tiene un par de llaves en su bd.

Asi de simple, como les comente anteriormente los spammers no les interesa saber si si correo llego o no, muchos menos detenerse para volver enviar el correo, por ello esta tecnica tambien les va a bloquear un bloque de spam.

Su unico incoveniente es que la 1ra vez que su amigo les envie el correo van a tardar 5 minutos en entrar, pero todos los smtp que siguen las reglas van a respetar nuestras reglas y volver a enviar el correo en el tiempo especificado asi que no van a tener problemas.

Ustedes son los que saben como operar su servidor y que es lo mejor para su compañia asi que si un empleado sale lloron solo tienen que convencer a su jefe la importancia para su compañia de este pequeño truco.

Para ponerlo a trabajar ya solo voy a rc.conf y lo doy de alta:

postgrey_enable="yes"

La bd de datos que usa es BDB, postgrey no es el unico que existen hay muchos, pero para este funcion yo lo elegi a el.

Lo hecho a volar.

Mi configuracion quedaria asi:

smtpd_recipient_restrictions =
reject_non_fqdn_recipient
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_unknown_recipient_domain
permit_mynetworks
check_sender_access hash:/usr/local/etc/postfix/no_usar_mi_dominio
reject_unauth_destination
check_helo_access pcre:/usr/local/etc/postfix/helo_checks
reject_multi_recipient_bounce
reject_non_fqdn_hostname
reject_invalid_hostname
check_policy_service inet:192.168.40.5:10023
reject_rbl_client zen.spamhaus.org
permit

Lo coloco antes del _rbl_client ya que prefiero que los queries externos sea lo ultimo que haga mi spam server.

Reload y van a ver logs como este:

connect from second3.fotuicatan.com[173.246.141.201]
May 16 07:07:39 spam postgrey[18480]: action=greylist, reason=new,
client_name=second3.fotuicatan.com,
client_address=173.246.141.201,
sender=dentalcarea-tfotuicatan.com,
recipient=usera-texample.com
May 16 07:07:40 spam postfix/smtpd[14371]:
NOQUEUE: reject: RCPT from second3.fotuicatan.com
[173.246.141.201]: 450 4.2.0 :
Recipient address rejected: Greylisted, see
http://postgrey.schweikert.ch/help/example.com.html;
from= to=
proto=ESMTP helo=

Clamavis

Ahora vamos a configurar el antivirus open source ClamAV, en este servidor estamos hablando de la version 0.97, y como todo usuario de FreeBSD siempre nos preguntamos y que opciones usamos cuando ejecutemos:

make install clean

Bien aqui pongo las que estoy usando:

Figura 2.

Bien una vez instalado vamos a la configuracion, la instalacion coloca 2 archivos por default en la ruta default: /usr/local/etc/, esto son:

-r--r--r-- 1 root wheel 13986 Mar 23 02:06 clamd.conf.default
-r--r--r-- 1 root wheel 7507 Mar 23 02:06 freshclam.conf.default

Solo compeanos cada a otro archivo sin la extension .default.

Freshclam

Clamav instala 2 servicios:

freshclam clamd.

El 1ro es el encargado de actualizar las firmas del antivirus, asi que este servidor cada cierto tiempo se estara conectado para bajar las firmas mas nuevas.

Su configuracion es la siguiente:

DatabaseDirectory /var/db/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogFileMaxSize 2M
LogTime yes
LogVerbose yes
LogSyslog yes
PidFile /var/run/clamav/freshclam.pid
DatabaseOwner clamav
AllowSupplementaryGroups yes
DatabaseMirror db.us.clamav.net
DatabaseMirror database.clamav.net
MaxAttempts 5
NotifyClamd /usr/local/etc/clamd.conf

Crear el archivo log si no existe, los demas parametros y comentarios los deje tal cual estan.

El directorio donde se guardan los logs debe tener el siguiente permiso:

drwxr-xr-x 2 clamav clamav 1024 May 17 00:00 clamav

Ahora lo damos de alta en el rc.conf

clamav_freshclam_enable="YES"

Aqui ya lo tenemos listo para proibar.

Clamav

Este programa es el que se encarga de llevar la tarea sucia y revisar nuestros archivos de cosas malas.

Vamos mostrando la configuracion que estoy usando:

LogFile /var/log/clamav/clamd.log
LogFileMaxSize 2M
LogTime yes
LogSyslog yes
LogVerbose yes
ExtendedDetectionInfo yes
PidFile /var/run/clamav/clamd.pid
DatabaseDirectory /var/db/clamav
LocalSocket /var/run/clamav/clamd.sock
FixStaleSocket yes
TCPAddr 192.168.40.5
StreamMaxLength 10M
MaxDirectoryRecursion 20
User clamav
AllowSupplementaryGroups yes
ScanMail yes

Todos los demas parametros los estoy dejando con sus valores por default, aqui solo muestro los que yo uso y eliminando comentarios, ademas tengo habilitado el verbose ya cuando termine de configurar todo lo voy a poner lo mas bajo posible.

FreeBSD crea el usuario y grupo de clamav, ya solo falta agregar el servicio a rc.conf:

clamav_clamd_enable="YES"

Ahora si vamos poniendo ambos en operacion, el1ro es el freshclam y lo ejecutamos a mano, este servicio usa el puerto 80 para bajar sus archivos, asi que su firewall debe permitirle salir por el puerto 80.

freshclam -v

freshclam -v
Current working dir is /var/db/clamav
Max retries == 5
ClamAV update process started at Tue May 17 22:51:02 2011
Using IPv6 aware code
Querying current.cvd.clamav.net
TTL: 422
Software version from DNS: 0.97
main.cvd version from DNS: 53
main.cvd is up to date (version: 53, sigs: 846214, f-level: 53, builder: sven)
daily.cvd version from DNS: 13086
daily.cld is up to date (version: 13086, sigs: 118614, f-level: 60, builder: guitar)
bytecode.cvd version from DNS: 143
bytecode.cld is up to date (version: 143, sigs: 40, f-level: 60, builder: edwin)

Ahora sigue clamd:

/usr/local/etc/rc.d/clamav-clamd start

Starting clamav_clamd.

Vemos el log:

Tue May 17 22:28:26 2011 -> +++ Started at Tue May 17 22:28:26 2011
Tue May 17 22:28:26 2011 -> clamd daemon 0.97 (OS: freebsd8.2, ARCH: i386, CPU: i386)
Tue May 17 22:28:26 2011 -> Running as user clamav (UID 106, GID 106)
Tue May 17 22:28:26 2011 -> Log file size limited to 2097152 bytes.
Tue May 17 22:28:26 2011 -> Reading databases from /var/db/clamav
Tue May 17 22:28:26 2011 -> Not loading PUA signatures.
Tue May 17 22:28:32 2011 -> Loaded 963507 signatures.
Tue May 17 22:28:34 2011 -> LOCAL: Unix socket file /var/run/clamav/clamd.sock
Tue May 17 22:28:34 2011 -> LOCAL: Setting connection queue length to 200
Tue May 17 22:28:34 2011 -> Limits: Global size limit set to 104857600 bytes.
Tue May 17 22:28:34 2011 -> Limits: File size limit set to 26214400 bytes.
Tue May 17 22:28:34 2011 -> Limits: Recursion level limit set to 16.
Tue May 17 22:28:34 2011 -> Limits: Files limit set to 10000.
Tue May 17 22:28:34 2011 -> Limits: Core-dump limit is 4294967295.
Tue May 17 22:28:34 2011 -> Archive support enabled.
Tue May 17 22:28:34 2011 -> Algorithmic detection enabled.
Tue May 17 22:28:34 2011 -> Portable Executable support enabled.
Tue May 17 22:28:34 2011 -> ELF support enabled.
Tue May 17 22:28:34 2011 -> Mail files support enabled.
Tue May 17 22:28:34 2011 -> OLE2 support enabled.
Tue May 17 22:28:34 2011 -> PDF support enabled.
Tue May 17 22:28:34 2011 -> HTML support enabled.
Tue May 17 22:28:34 2011 -> Self checking every 600 seconds.
Tue May 17 22:28:34 2011 -> Listening daemon: PID: 90556
Tue May 17 22:28:34 2011 -> MaxQueue set to: 100
Tue May 17 22:28:34 2011 -> Set stacksize to 1114112

Verificamos:

/usr/local/etc/rc.d/clamav-clamd status
clamav_clamd is running as pid 90556.

Vemos si esta el servicio arriba:

ps -ax | grep clam
90596 ?? IsJ 0:00.00 /usr/local/sbin/clamd

Probamos localmente:

clamscan /usr/local/etc/
/usr/local/etc/screenrc: OK
/usr/local/etc/pkgtools.status-pkg.sh: OK
/usr/local/etc/pkgtools.conf.sample: OK
/usr/local/etc/pkgtools.conf: OK
/usr/local/etc/rarfiles.lst: OK
/usr/local/etc/amavisd.conf-dist: OK
/usr/local/etc/amavisd.conf-sample: OK
/usr/local/etc/amavisd.conf-default: OK
/usr/local/etc/amavisd-custom.conf-dist: OK
/usr/local/etc/amavisd.conf: OK
/usr/local/etc/amavisd-custom.conf: OK
/usr/local/etc/clamd.conf.default: OK
/usr/local/etc/freshclam.conf.default: OK
/usr/local/etc/clamd.conf: OK
/usr/local/etc/freshclam.conf: OK
/usr/local/etc/policyd-weight.conf.sample: OK
/usr/local/etc/my.cnf: OK
/usr/local/etc/nss_ldap.conf.sample: OK
/usr/local/etc/nss_ldap.conf: OK
/usr/local/etc/ldap.conf.dist: OK
/usr/local/etc/policyd-weight.conf: OK
/usr/local/etc/ldap.conf: Symbolic link
/usr/local/etc/portaudit.conf.sample: OK

----------- SCAN SUMMARY -----------
Known viruses: 963507
Engine version: 0.97
Scanned directories: 1
Scanned files: 22
Infected files: 0
Data scanned: 0.59 MB
Data read: 0.33 MB (ratio 1.79:1)
Time: 8.726 sec (0 m 8 s)

Ahora si ejecutamos el demonio de freshclam:

/usr/local/etc/rc.d/clamav-freshclam restart
Starting clamav_freshclam.

Revisamos ambos servicios:

ps -ax | grep clam
90828 ?? IsJ 0:02.74 /usr/local/bin/freshclam --daemon -p /var/run/clamav/freshclam.pid
90850 ?? IsJ 0:00.00 /usr/local/sbin/clamd

Ahora los sockets:

sockstat -4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
clamav clamd 90850 3 tcp4 192.168.40.5:21989 192.168.40.4:389
clamav freshclam 90828 3 tcp4 192.168.40.5:31452 192.168.40.4:389

Como mi red depende de LDAP, aqui veo que ambos estan teniendo comunicacion eon mi servidor LDAP.

En la configuracion de freshclam viene una parte donde dice que una vez que actualice firmas debe informar a clamd sobre esto, sus logs van a mostrar algo asi:

Tue May 17 22:43:04 2011 -> Current working dir is /var/db/clamav
Tue May 17 22:43:04 2011 -> Max retries == 5
Tue May 17 22:43:04 2011 -> ClamAV update process started at Tue May 17 22:43:04 2011
Tue May 17 22:43:04 2011 -> Using IPv6 aware code
Tue May 17 22:43:04 2011 -> Querying current.cvd.clamav.net
Tue May 17 22:43:04 2011 -> TTL: 900
Tue May 17 22:43:04 2011 -> Software version from DNS: 0.97
Tue May 17 22:43:04 2011 -> main.cvd version from DNS: 53
Tue May 17 22:43:04 2011 -> main.cvd is up to date (version: 53, sigs: 846214, f-level: 53, builder: sven)
Tue May 17 22:43:04 2011 -> daily.cvd version from DNS: 13086
Tue May 17 22:43:04 2011 -> Retrieving http://db.us.clamav.net/daily-13086.cdiff
Tue May 17 22:43:04 2011 -> connect_error: getsockopt(SO_ERROR): fd=6 error=61: Connection refused
Tue May 17 22:43:04 2011 -> Can't connect to port 80 of host db.us.clamav.net (IP: 194.47.250.218)
Tue May 17 22:43:04 2011 -> Trying to download http://db.us.clamav.net/daily-13086.cdiff (IP: 168.143.19.95)
Tue May 17 22:43:04 2011 -> Downloading daily-13086.cdiff [100%]
Tue May 17 22:43:04 2011 -> cdiff_apply: Parsed 21 lines and executed 21 commands
Tue May 17 22:43:05 2011 -> Loading signatures from daily.cld
Tue May 17 22:43:05 2011 -> Properly loaded 118614 signatures from new daily.cld
Tue May 17 22:43:05 2011 -> daily.cld updated (version: 13086, sigs: 118614, f-level: 60, builder: guitar)
Tue May 17 22:43:05 2011 -> bytecode.cvd version from DNS: 143
Tue May 17 22:43:05 2011 -> bytecode.cld is up to date (version: 143, sigs: 40, f-level: 60, builder: edwin)
Tue May 17 22:43:08 2011 -> Database updated (964868 signatures) from db.us.clamav.net (IP: 168.143.19.95)
Tue May 17 22:43:08 2011 -> Clamd successfully notified about the update.

Y la configuracion tambien muestra cada cuanto se va a estar actualizando.

Parece que clamav esta listo para ser usado por amavisd.

SpamAssasin

Viene una pieza angular de este servidor, SA abreviado, es una aplicacion opensource que tiene mucho reconocimiento a nivel mundial, hasta empresas de renombre hacen uso de el.

Amavisd le llama a sa cuando empieza a recibir mensajes de Postfix, sa es un software de autoaprendizaje asi que conforme recibe mensajes va memorizando la comunicacion de cada usuario.

Su configuracion tiene varios achivos en:

/usr/local/etc/mail/spamassassin/

El principal es local.cf




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.