HowTo: Debian+OpenSSL+Bind9+Postfix+OpenLDAP+Courier

UPDATE 22/02/2008: lo prometido es deuda. Actualizado con la última parte (por ahora, hasta que Basaburu escriba más 🙂 del HowTo que enseña a instalar paso a paso un completo servidor con servicios Bind, OpenLDAP, Postfis y Courier IMAP.

UPDATE 21/02/2008: tras recibir una queja de mi amigo Basaburu (el autor del artículo) por tardar en publicar la sección de OpenLDAP que él escribió hace tiempo ya, aprovecho este post para pedirle disculpas por la tardanza en la publicación, para alabar el enorme trabajo que se está pegando con este extraordinario artículo y pedir a todos los lectores de DiarioLinux que se estudien detalladamente todo lo que él publica aquí, en especial la nueva sección que he añadido hoy (aunque Basaburu la escribió ¡hace ya un mes!): la sección sobre configuración y puesta a punto de un servidor y cliente OpenLDAP. Mañana mismo, sin falta, actualizaré la última parte del artículo, sobre instalación de Postfix.

UPDATE 6/01/2008: añadida la sección «Crear nuestra CA particular y los certificados de cliente y servidor»
UPDATE 3/01/2008: añadida la sección de configuración de Bind9 en chroot. Mañana más.

BasaBuru, como regalo al terminar la rotación alrededor del Sol:

Copyleft 15-11-2007 por BasaBuru y Sramos ver. 0.5

Este HowTo es la consecuencia de una tragedia, he perdido mi server casero. Con lo que no me queda otra que volver a montarlo.

En consecuencia he decidido dedicarle algo más de tiempo y documentar el proceso desde cero. Y que así esta tragedia pueda ser reutilizada por otros.

Este HowTo se lo dedico con todo mi cariño, afecto y admiración a la comunidad de sistemas de mi curro: igomez, pastelero, sramos, moebius, snaker, lynks, dvazquez y apardo. Pues ellos han sido mi apoyo, acicate y sostén intelectual los últimos 24 meses. Además a ellos les he dado mucho la brasa…. pero que mucho, sobre todo a sramos, igomez y pastelero y esta dedicatoria es una forma de mostrarles mi agradecimiento por sus muestras de solidaridad afectuosa.

Evidentemente este es un servidor casero lo que quiere decir que le faltan muchas de las virguerias que nuestras Hackers de sistemas meten en nuestras máquinas en producción. Pero como server casero suficiente, en mi opinión

La verdad es que uno se queda mucho mejor, pero que mucho, cuando comparte con los demás. Para todos vosotros que lo disfrutéis y que le saquéis algo de jugo.

Ahhhhhh y lo más importante que matéis todos los bichos que encontréis.

Lo he dividido en dos partes, ésta comprende hasta la instalación y configuración de los buzones pop3 courier. En la siguiente entrega el resto.

Instalación de alai server

Alai server está alojada en un k7 1800, con 80Gb de disco, con ip fija, bajo el dominio alai.org. Es una máquina imaginaria que como su nombre indica (alai=alegre en euskera) es alegre y feliz 🙂 por que confía en que dejemos todo como debe ser sin que “nada” de problemas. A ver que hacemos… je, je.

Bueno sobre la elección de una debian me abstengo de explicar por qué; soy debianero, a Chessy, por ejemplo, le va Fedora y somos amigos que nos llevamos muy bien, para gustos los colores, vive libre. Sobre el proceso de instalación hay documentación más que de sobra, así que no comentaré nada al respecto.

Como una referencia podéis consultar: The Perfect Setup – Debian Etch (Debian 4.0)

Se instala una Debian 4.0 r1 etch (otra cosa que stable para un server es una imprudencia) por medio de una iso net-install dejando un sistema básico (esto es seleccionando solo “sistema estandar” en tasksel). Lo vamos a ir instalando todo poco a poco, servicio a servicio según necesidades.

Solo señalar que el disco se particiona en cuatro, /boot, /, /var y /swap. Y como es un server con una partición /var bien hermosa.

Servicios en alai server

  • bind9 DNS para la resolución de nombres y como secundario de un dominio
  • Servidor web apache2
  • OpenSSL Entidad certificadora CA, llaves y certificados
  • OpenLDAP slapd
  • Cyrus-SASL autentificación
  • PHP 5
  • Servidor de correo postfix
  • Buzones de correo Courier
  • Servidor de bases de datos MySql
  • Servidor de Backup BackupPc
  • Servidor de listas de correo sympa
  • Servidor de contenidos Drupal
  • Wiki DokuWiki
  • WebDav
  • Servidor CUPS

Como cuestión previa dado que Debian etch no lo instala por defecto en el “Sistema base” y necesitamos trabajar en remoto con el server, instalamos ssh y openssh-server:

alai:~# apt-get install ssh openssh-server

Y vamos a hacer una instalación inicial de apache2 para ir tirando mientras vamos montando cosas, para phpldapadmin por ejemplo. El tema de apache2 se tratará con detalle cuando le toque 🙂


alai:~# apt-get install apache2
Se instalarán los siguientes paquetes NUEVOS:
apache2 apache2-mpm-worker apache2-utils apache2.2-common libapr1 libaprutil1 libexpat1 libpq4 libsqlite3-0

DNS bind9 enjaulado

Primero el bind9 DNS mas que nada porque actua como secundario del dominio y se resuelven nombres más rápidamente en la red local que usando los DNS del ISP y por que la peña se me queja de que no anda internet igual desde que mate nuestro server casero. 80)

Así que no siendo estrictamente necesario ser el primer paso….. empezamos por aquí


alai:~# apt-get install bind9
Desempaquetando bind9 (de .../bind9_1%3a9.3.4-2etch1_i386.deb) ...
Configurando bind9 (9.3.4-2etch1) ...
Adding group `bind' (GID 104) ...
Hecho.
Adding system user `bind' (UID 104) ...
Adding new user `bind' (UID 104) with group `bind' ...
Not creating home directory `/var/cache/bind'.
wrote key file "/etc/bind/rndc.key"
Starting domain name service...: bind.

Bueno así lo deja debian. Vamos a configurar.
Si fuera un primario la cosa se complicaría pero siendo un secundario, chupao.
Editamos el fichero de configuración local, esto es: /etc/bind/named.conf.local


//
// Do any local configuration here
//
zone "alai.org" {
type slave;
file "bigarren.alai.org";
allow-query { any; };
masters { 23.211.45.78; };
};

// Consider adding the 1918 zones here, if they are not used in your
// organization
//include «/etc/bind/zones.rfc1918»;
Osea le decimos que la zona es alai.org, que es un esclavo y que el fichero para guardar la info es bigarren.alai.org (bind9 lo mete en /var/cache/bind) que permitimos cualquier pregunta y le decimos quien es nuestro maestro (su ip).

Enjaulando a bind9
Vamos a meter a bind9 en una jaula. De esta forma conseguimos mas seguridad, en el caso de que bind9 se vea comprometido y dado que sus actividades están limitadas a la jaula las consecuencias se minimizan.

Empezamos por parar el servicio

alai:~# /etc/init.d/bind9 stop

Editamos el fichero /etc/default/bind9 para hacer que el demonio corra como el usuraio bind sin privilegios encerrado en una jaula en /var/lib/named.
Y substituimos la línea OPTIONS=”-u bind” por la nuestra OPTIONS=”-u bind -t /var/lib/named”

alai:~# vim /etc/default/bind9

Ahora creamos la jaula, sus directorios:

alai:~# mkdir -p /var/lib/named/etc
alai:~# mkdir /var/lib/named/dev
alai:~# mkdir -p /var/lib/named/var/cache/bind
alai:~# mkdir -p /var/lib/named/var/run/bind/run

Movemos el directorio de configuraciones desde /etc a /var/lib/named/etc

alai:~# mv /etc/bind /var/lib/named/etc

Creamos un enlace simbólico del nuevo directorio de configuraciones desde la vieja localización (para evitar problemas cuando bind sea actualizado en el futuro)

alai:~# ln -s /var/lib/named/etc/bind /etc/bind

Creamos los dispositivos null y random. Fijamos también los permisos de los directorios:

alai:~# mknod /var/lib/named/dev/null c 1 3
alai:~# mknod /var/lib/named/dev/random c 1 8
alai:~# chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
alai:~# chown -R bind:bind /var/lib/named/var/*
alai:~# chown -R bind:bind /var/lib/named/etc/bind

Necesitamos modificar /etc/default/syslogd a fin de que podamos seguir recibiendo mensajes registrados en el registro del sistema.
Hay que modificar la línea: SYSLOGD=”” por esta otra: SYSLOGD=”-a /var/lib/named/dev/log”:

Abrís el fichero con vuestro editor favorito y hacéis las modificaciones

alai:~# vim /etc/default/syslogd
#
#
# Top configuration file for syslogd
#
#
#
# Full documentation of possible arguments are found in the manpage
# syslogd(8).
#
#
#
# For remote UDP logging use SYSLOGD="-r"
#
#SYSLOGD=""
#
SYSLOGD="-a /var/lib/named/dev/log"

Rearrancamos el servicio:

alai:~# /etc/init.d/sysklogd restart

Arrancamos bind, y chequeamos /var/log/syslog en busca de posibles errores

alai:~# /etc/init.d/bind9 start

Enlaces de interés sobre Bind9 y su jaula
De todas formas si alguna necesita bregar con un primario o documentarse sobre la jaula para bind9, ahí van unos enlaces.
* DNS, BIND, DHCP, LDAP and Directory Services (bind9.net)
* Howto: Debian Root Server with Virtual Hosting (VHCS) on Debian «etch»
* DNS Installation and Setup using BIND9
* [Debian Sarge] Installing A Bind9 Master/Slave DNS System
* Traditional DNS Howto
* Bind-Chroot-Howto (Debian)
* Building A Debian DNS System
* Chroot-BIND HOWTO


OpenSSL Crear nuestra CA particular y los certificados

Después de pensármelo mucho, he decidido colocar al principio del HowTo la creación de la Entidad Certificadora CA, las llaves y los certificados. Puesto que lo que se pretende es tener un server razonablemente seguro, utilizar TSL, SSL, etc. y necesitamos los certificados para configurar los servicios.

Como esto es un server casero pues como que vamos a usar un certificado para todo. Se puede y en teoría se debe certificar por servicios, virtual hosts, etc. Pero para “alai” le vale y da menos curro. 8=}

OpenSSL es quien nos proporciona la posibilidad de comunicaciones encriptadas entre diferentes máquinas y servicios utilizando criptografía asimétrica, es decir, claves públicas y privadas.

Además nos permite crear entidades certificadoras que aseguran que una llave pertenece a quien dice pertenecer. Con lo que tenemos encriptación y autentificación.

Hay un poco de ‘oscuridad’ con esto de las entidades certificadoras y los certificados para que veáis: instantssl (EV SSL 1 Year: €849). Si pagamos nos hacen uno y además lo meten en los navegadores, etc. Vamos a pasar de gastar dinero y con OpenSSL nos montamos nuestra CA, el “inconveniente” reside en que nuestros certificados no serán reconocidos automáticamente y los usuarios deberán incluirlos manualmente en el listado de certificados. Y que les aparecerá un aviso de que no se reconoce la entidad certificadora. Tampoco es problemático, se le dice que lo acepte permanentemente y ya está.

Bueno al tema…. Instalando……..


alai:~# apt-get install openssl

(NOTA: Esto, de crear una CA, solo debe hacerse la primera vez. En el caso de que ya dispongamos de una autoridad certificadora, hay que pasar directamente a la generación del certificado.)

(AVISO: En la mayoría de las situaciones las páginas man son de gran ayuda, en este caso inestimables, “man openssl”, “man req”, “man ca”, “man rsa”, etc)

El primer paso para la creación de certificados, es crear una Autoridad Certificadora (CA), que será la encargada de validar la autenticidad del certificado generado. Crearemos una CA particular que valide todos los certificados generados en nuestro servidor.

En primer lugar elegimos un directorio apropiado para almacenar la entidad certificadora y todos los certificados generados. En este caso, este lugar es /etc/ssl/alaiCA.

Los pasos para generar la autoridad certificadora son (todos los comandos ejecutados en el home dir de la CA /etc/ssl/alaiCA ):

  • Crear la estructura de directorios y generar los ficheros de control de certificados:alai:/etc/ssl/# mkdir /etc/ssl/alaiCA/
    alai:/etc/ssl/# mkdir /etc/ssl/alaiCA/certs
    alai:/etc/ssl/# mkdir /etc/ssl/alaiCA/private
    alai:/etc/ssl/# mkdir /etc/ssl/alaiCA/newcerts
    alai:/etc/ssl/# mkdir /etc/ssl/alaiCA/crl
    alai:/etc/ssl/# echo "01" > /etc/ssl/alaiCA/alaica.serial
    alai:/etc/ssl/# touch /etc/ssl/alaiCA/alaica.index
  • Definir en el fichero de configuración de certificados de nuestra CA (openssl-alaiCA.cnf) las variables correctas (solo se muestran las modificaciones sobre el original /etc/ssl/openssh.cnf):Copiáis el fichero de configuración por defecto que deja el paquete openssl como openssl-alaiCA.cnf al directorio de la CA que estamos creando.
    alai:/etc/ssl/# cp openssl.cnf alaiCA/openssl-alaiCA.cnf
  • Ahora con vuestro editor favorito abrís el fichero y editáis.

    [ CA_default ]
    dir = /etc/ssl/alaiCA # Where everything is kept / donde se mete todo lo de alaiCA
    certs = $dir/certs # Where the issued certs are kept
    database = $dir/alaica.index # database index file.
    new_certs_dir = $dir/newcerts # default place for new certs.
    certificate = $dir/certs/alaica.crt # The CA certificate / Certificado de la CA
    serial = $dir/alaica.serial # The current serial number
    crl = $dir/crl.pem # The current CRL
    #crlnumber = $dir/crlnumber # the current crl number must be
    private_key = $dir/private/alaicakey.pem # The private key / la clave privada de la CA
    default_days = 3650 # how long to certify for
    #
    [ req ]
    default_bits = 2048
    default_keyfile = alaicakey.pem
    #
    [ req_distinguished_name ]
    countryName = EH
    countryName_default = EH
    #
    stateOrProvinceName = Nafarroa Garai
    stateOrProvinceName_default = Nafarroa garai
    #
    localityName_default = Etxarri Aranatz
    #
    0.organizationName = Alai.org
    0.organizationName_default = Alai.org
    #
    organizationalUnitName = Sistemak
    organizationalUnitName_default = Sistemak
    #
    commonName = BasaBuru
    #
    emailAddress = BasaBuru@alai.org
    #
    #unstructuredName = An optional company name
    #
    [ server ]
    basicConstraints=CA:FALSE
    nsCertType = server
    nsComment = "OpenSSL Generated Server Certificate"
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer:always
    #
    [ client ]
    basicConstraints=CA:FALSE
    nsCertType = client
    nsComment = "OpenSSL Generated Client Certificate"
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer:always
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment

    Luego existen un montón de opciones más, el nombre del responsable de la CA, organización, departamento responsable, e-mail, definir el uso de los certificados, el uso por los clientes, etc, etc. Pero con estos cambios ya podemos hacer certificados.

    De todas formas de cara a la fiabilidad y confiabilidad de terceros sobre la CA y sus certificados se deben cumplimentar todos los datos de identificación y responsabilidad.

  • Exportar la variable de entorno que permita utilizar el fichero anterior:alai:/etc/ssl/# export OPENSSL_CONF=/etc/ssl/alaiCA/openssl-alaiCA.cnf
  • Generar la key y el certificado de la entidad certificadora (en el ejemplo se genera con una validez de 10 años). Mucho ojo… la password asociada a la clave privada de la entidad CA es necesaria más tarde para poder firmar los certificados que generemos:
    alai:/etc/ssl/alaiCA/# openssl req -x509 -newkey rsa:2048 -keyout private/alaicakey.pem -out certs/alaica.crt -outform PEM -days 3650

    Conviene echarle un vistazo a man req req – PKCS#10 certificate request and certificate generating utilityMediante este comando crearemos una CA para certificados X.509 con un algoritmo de cifrado RSA de 2048 bytes. El parámetro keyout indica el fichero donde se almacenará la clave privada del CA (alaicakey.pem) y el parámetro out indica el fichero de almacenamiento de la clave pública (alaica.crt). Con el parámetro days indicamos la validez temporal, en días, del CA (10 años en nuestro caso).
  • Asignar los permisos adecuados a la clave de la entidad y a los ficheros de controlalai:/etc/ssl/alaiCA/# chmod 600 private/alaicakey.pem
    alai:/etc/ssl/alaiCA/# chmod 600 alaica.index
    alai:/etc/ssl/alaiCA/# chmod 600 alaica.serial

Certificado de Servidor

Para generar un certificado de servidor, en primer lugar habrá que revisar si la configuración del fichero de configuración de certificados (/etc/ssl/openssl.cnf) es la correcta. Después:

  • Exportar la variable de entorno que permita utilizar el fichero anterior:alai:/etc/ssl/alaiCA/# export OPENSSL_CONF=/etc/ssl/alaiCA/openssl-alaiCA.cnf
  • Generar la clave y la petición de certificado para el servidor:
    Antes de generar un certificado, ha de hacerse una petición del mismo. Dicha petición definirá al propietario del certificado.
    alai:/etc/ssl/alaiCA/# openssl req -newkey rsa:2048 -keyout private/tempkey.pem -keyform PEM -out alaiserver.csr -outform PEM -extensions serverCon este comando openssl generamos una nueva (newkey) petición de certificado X.509 y una nueva clave privada. Con rsa:2048 una clave rsa de 2048 bits. -keyout define el nombre de la clave su ubicación en nuestro caso el dir /etc/ssl/alaiCA/private -keyform PEM formato de la clave. Para terminar, -out escribirá la petición en alaiserver.csr
  • Convertir la clave al formato sin passwordNecesitamos que la clave del certificado del server esté sin password. De otra manera cuando uno de los servicios que la usa se rearranque o lo haga la máquina, esta se quedaría bloqueada esperando que introdujéramos el password manualmente.alai:/etc/ssl/alaiCA/# openssl rsa < private/tempkey.pem > private/alaiserver-key.pemOs pide el password de la clave tempkey, no os confundáis con el password de la clave del certificado de la CA alaicakey.pem
  • Firmar el certificado del servidor con la clave privada de la entidad certificadora (necesitaremos la password asociada a la clave privada de la CA):alai:/etc/ssl/alaiCA# openssl ca -in alaiserver.csr -out certs/alaiserver.crt -extensions serverCogemos la petición de certificado alaiserver.csr sacamos el certificado alaiserver.crt con las características que hemos definido en la sección [ server ] del openssl.cnf
  • Borrar la peticion de certificado y la clave del servidor encriptada (con password):alai:/etc/ssl/alaiCA/# rm -f private/tempkey.pem
    alai:/etc/ssl/alaiCA/# rm -f alaiserver.csr
  • Combinar la clave y el certificado en un solo fichero e incluir en él Diffi-Holfman:alai:/etc/ssl/alaiCA/# cat private/alaiserver-key.pem certs/alaiserver.crt > certs/alaiserver.pem
    alai:/etc/ssl/alaiCA/# openssl gendh >> certs/alaiserver.pem
    Los ficheros que contienen la clave privada del certificado (alaiserver.pem y alaiserver-key.pem), deben estar especialmente protegidos, ya que el acceso a estos puede provocar una suplantación de identidad del servidor, o una violación de la confidencialidad de las comunicaciones SSL.Los archivos necesarios para cada uno de los servicios son:

    • Para Apache: Se usa el alaiserver.crt y el alaiserver-key.pem
    • Para Courier: Se usa el alaiserver.pem con los parametros Diffie-Hellman
    • Para Postfix: Se usa el alaiserver.crt, el alaiserver-key.pem y el alaica.cert
    • Para LDAP: Se usa el alaiserver.crt, el alaiserver-key.pem y el alaica.crt

Certificado de Cliente

  • Exportar la variable de entorno:alai:/etc/ssl/alaiCA/# export OPENSSL_CONF=/etc/ssl/alaiCA/openssl-alaiCA.cnf
  • Generar las claves:
    alai:/etc/ssl/alaiCA/# openssl req -nodes -new -keyout private/alaiclient.key -out alaiclient.csr -extensions client
  • Firmarlas con la clave privada de la entidad certificadora:
    alai:/etc/ssl/alaiCA/# openssl ca -out certs/alaiclient.crt -in alaiclient.csr -cert certs/alaica.crt -keyfile private/alaicakey.pem
    Si quisieramos generar un certificado de tipo PKCS#12 para utilizar el correo con S/MIME, necesitamos en primer lugar generar el fichero .pem con la combinación de la clave y el certificado ya firmado:
    alai:/etc/ssl/alaiCA/# cat private/alaiclient.key certs/alaiclient.crt > alaiclient.pem

    tras lo que haríamos la generación del PKCS#12:
    alai:/etc/ssl/alaiCA/# openssl pkcs12 -export -in alaiclient.pem -out alaiclient.p12 -name "User PKCS#12 Certificate"

    NOTA: dado que hemos generado la clave privada del certificado sin password (opción -nodes), basta con pulsar intro cuando esta se pida.Para salsear un poco (cambiad el nombre del fichero -in):openssl x509 -in alaica.crt -noout -textopenssl x509 -in alaica.crt -noout -datesopenssl x509 -in alaica.crt -noout -purpose
    alai:/etc/ssl/alaiCA/# openssl x509 -in certs/alaica.crt -noout -purpose
    Certificate purposes:
    SSL client : Yes
    SSL client CA : Yes
    SSL server : Yes
    SSL server CA : Yes
    Netscape SSL server : Yes
    Netscape SSL server CA : Yes
    S/MIME signing : Yes
    S/MIME signing CA : Yes
    S/MIME encryption : Yes
    S/MIME encryption CA : Yes
    CRL signing : Yes
    CRL signing CA : Yes
    Any Purpose : Yes
    Any Purpose CA : Yes
    OCSP helper : Yes
    OCSP helper CA : YesVamos que nuestra CA sirve para todo 8=O}

Enlaces de interés para la certificación

Unos enlaces para profundizar este tema:

* openssl
* Creating and Using a self signed SSL Certificates in debian
* How do I create SSL certificates with OpenSSL on the command line?
* Entidad certificadora personal con OpenSSL
* OpenSSL y los certificados digitales

OpenLDAP

  1. Instalar slapd sus librerias y las utilidades

  2. Instalar sasl

  3. Instalar soporte PHP 5

  4. Instalar phpldapadmin

  5. Configurar LDAP

Instalando……..

alai:~# apt-get install slapd ldap-utils libldap2 libpam-ldap slapd phpldapadmin
libsasl2-modules libsasl2-2 libsasl2-modules-ldap sasl2-bin
Se instalarán los siguientes paquetes NUEVOS:
apache-common apache2-mpm-prefork ldap-utils libapache-mod-php5 libapache2-mod-php5
libiodbc2 libldap-2.3-0 libltdl3 libmysqlclient15off libpam-ldap libperl5.8
libsasl2-modules libsasl2-modules-ldap libslp1 libsqlite0 libxml2
mysql-common php5-common php5-ldap phpldapadmin slapd sasl2-bin

Debconf os pedirá datos de preinstalación para slad, podéis hacer dos cosas, buscarlos en esta sección o bien, podéis pasar, lo configuraremos mas abajo. La ventaja es que tendréis que escribir menos debconf lo hará por vosotras

Sobre sasl nos dice:
Configurando sasl2-bin (2.1.22.dfsg1-8) ...
aviso: se ha utilizado --update pero no existe /var/run/saslauthd
* To enable saslauthd, edit /etc/default/saslauthd and set START=yes

Así que editamos el fichero y fijamos la variable START a yes. Y rearrancamos saslauthd

alai:~# /etc/init.d/saslauthd restart

El proceso de levantar nuestro openldap lo vamos a realizar en varios pasos.

  1. Primero configuraremos el servidor, que se realiza en el fichero /etc/ldap/slapd.conf le pondremos nombre, que tipo de encriptación para los passwords, el DN de root, etc, etc.

  2. En segundo lugar crearemos la estructura de la base de datos e introduciremos las primeras entradas.

  3. Y en tercer lugar implementaremos la seguridad del servidor.

  4. Unos cuantos enlaces de interés para el tema que nos ocupa

  5. Un interface mas “amigable” para tratar con OpenLdap, la herramienta php phpldapadmin

Configurar slapd.conf

Así que abrís con vuestro editor favorito /etc/ldap/slapd.conf para editar las variables que nos interesan (solo se muestran las modificaciones sobre el original que deja el paquete deb):

# Allow LDAPv2 binds

allow bind_v2# Schema and objectClass definitions

include         /etc/ldap/schema/core.schema

include         /etc/ldap/schema/cosine.schema

include         /etc/ldap/schema/nis.schema

include         /etc/ldap/schema/inetorgperson.schema

# este schema es de courier define las clases para manejar el correo

# include         /etc/ldap/schema/authldap.schema

# Schema check allows for forcing entries to

# match schemas for their objectClasses's

schemacheck     on

#Password Format - vamos a usar md5 me convence mas

password-hash {MD5}

Ahora definiremos openldap. Utiliza una jerarquia en arbol que se escribe igual que los dominios, esto es de derecha a izquierda por lo tanto en nuestro caso para el dominio alai.org será dc=alai,dc=org

# The base of your directory in database #1

suffix          "dc=alai,dc=org"# rootdn directive for specifying a superuser on the database. This is needed

# for syncrepl.

# este es el nombre distintivo para root como veis se añade a la izquierda del nombre del server

rootdn          "cn=admin,dc=alai,dc=org"

rootpw          {MD5}E2diZmY8xmTKVB0s9p4tuQ==

Para generar las claves se utiliza la herramienta slappasswd en nuestro caso asi:

alai~:# /usr/sbin/slappasswd -h {MD5}

Os pide el pass y que repitaís, el resultado lo pegaís como argumento de rootpw. Es una herramienta que vais a usar mucho 🙂 sobre todo cuando se olviden el pass vuestras usuarias.

# Indexing options for database #1

index		uid eq

index		uidNumber eq

index		mail pres,eq

index           objectClass eq# The admin dn has full write access, everyone else

# can read everything.

access to *

        by dn="cn=admin,dc=alai,dc=org" write

        by * read

# For Netscape Roaming support, each user gets a roaming

# profile for which they have write access to

#access to dn=".*,ou=Roaming,o=morsnet"

#        by dn="cn=admin,dc=alai,dc=org" write

#        by dnattr=owner write

#------------------------------------------------#

#----------------- Rama People ------------------#

#------------------------------------------------#

access to dn="ou=people,dc=alai,dc=org"

         by self read

         by group/groupOfUniqueNames/uniqueMember="cn=admin,dc=alai,dc=org" write

El tema del ACL en openldap es muy potente y a la vez complicadillo.

Para más información sobre el uso y sintaxis de los ACLs es necesario consultar el manual de OpenLDAP.

Comprobar la configuración

Utilizamos el comando slaptest consultar la página man man slaptest “slaptest – Check the suitability of the slapd.conf file”

alai:~# slaptest -v

Configurar /etc/ldap/ldap.conf

#

# LDAP Defaults

## See ldap.conf(5) for details

# This file should be world readable but not world writable.

BASE   dc=alai, dc=org

URI    ldap://localhost

#SIZELIMIT      12

#TIMELIMIT      15

#DEREF          never

TLS_CACERT /etc/ssl/alaiCA/certs/alaica.crt

TLS_CACERTDIR /etc/ssl/alaiCA/

TLS_REQCERT never

### revisar como ha dejado debconf el /etc/pam_ldap.conf##

Configurar /etc/default/slapd

Guardáis el fichero y hacéis que slapd se levante de nuevo:

alai:~# /etc/init.d/slapd restart

Y hemos dado el primer paso, si alguien obtiene errores cuando se levante de nuevo slapd que revise el slapd.conf o tiene comentada una opción o no tiene una que debería, o hay un error tipográfico, etc, etc, etc. 8=} no debería fallar pero…. al final de esta sección pongo unos cuantos enlaces en la documentación de referencia, podéis empezar a mirar por ahí. Y por los códigos de error http://focus.ac-toulouse.fr/annuaire/returnCodes.html

Estructura base de datos OpenLDAP

Vamos a dar un saltito… resulta que para meter los usuarios necesitamos activar el schema de courier. Si no, no podemos asignar “objectClass: CourierMailAccount” a las nuevas entradas del server OpenLDAP.

Así que instalamos courier-authlib-ldap y copiamos el schema.

alai:~# apt-get install courier-authlib-ldapSe instalarán los siguientes paquetes NUEVOS:

  courier-authlib courier-authlib-ldap

movemos el schema

alai:~# gunzip -d /usr/share/doc/courier-authlib-ldap/authldap.schema.gz -c > /etc/ldap/schema/authldap.schema

Y descomentamos la entrada en el slapd.conf en la sección ”# Schema and objectClass definitions” que teníamos comentada.
include /etc/ldap/schema/authldap.schema

Guardamos y rearrancamos el slapd

La estructura de la base de datos es muy “sencilla”, pero se puede complicar mucho, se configura como un arbol invertido con distintas ramas en función del uso al que se destinen.

Hay dos formas de hacer esto, una en línea y otra fuera de linea. En el caso de la en línea, bien en consola o utilizando phplapdadmin. En el caso de fuera de linea (nuestro caso) utilizando un fichero ldif, vamos a definir la estructura y las entradas, para luego enchufarle el fichero ldif al OpenLDAP, por consola (pero también se puede cargar el fichero desde phplapdadmin).

Ya he dicho que esto es un server casero, la complejidad a la que puede llegar una base de datos OpenLDAP es tal que se dividen en distintos servidores las ramas convirtiendo la base de datos en un ente distribuido.

Para acercase un poco al formato ldif visitad estas páguinas:

LDIF format requirements

8.3. The LDIF text entry format

Vamos a utilizar solo tres ramas, mas una subrama. Osea que vamos a tener cuatro unidades organizacionales “ou = organizationalUnit”

Abrís con vuestro editor favorito un fichero nuevo: /etc/ladp/primer.ldif y empezamos a meter texto.

# empezamos por las unidades organizacionales
# people, alai, org
dn: ou=people,dc=alai,dc=org
objectClass: top
objectClass: organizationalUnit
objectClass: simpleSecurityObject
userPassword: (pass en MD5 dejar solo el pass quitar esta chapa) -> ya sabéis con el comando slappasswd -h {MD5}
ou: people

# groups, alai, org
dn: ou=groups,dc=alai,dc=org
objectClass: top
objectClass: organizationalUnit
ou: groups

# Postfix, alai, org
dn: ou=Postfix,dc=alai,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Postfix

# Alias, Postfix, alai, org
dn: ou=Alias,ou=Postfix,dc=alai,dc=org
objectClass: top
objectClass: organizationalUnit
ou: Alias

# Ahora un usuario

dn: uid=basaburu,ou=people,dc=alai,dc=org
uid: basaburu
givenName: BasaBuru
displayName: BasaBuru
sn: Basatu
cn: BasaBuru
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
objectClass: CourierMailAccount
gidNumber: 20000
homeDirectory: /home/basaburu
uidNumber: 10001
shadowExpire: -1
shadowFlag: 0
shadowInactive: -1
shadowMax: 999999
shadowMin: -1
shadowWarning: 7
mail: basaburu@alai.org
mailbox: alai.org/basaburu/
defaultdelivery: /var/vmail
userPassword: {MD5}zjdaBCfOfeJ+Yam/ziecSYnA==
loginShell: /bin/bash
l: Etxarri Ararantz
telephoneNumber: 948000000
mobile: 0000000
st: Nafarroa
postalAddress: Nagusia 1, 1
postalCode: 31820

# repitendo por cada usuario a dar de alta

# ahora alias de correo en nuestra subrama Alias

# postmaster@alai.org, Alias, Postfix, alai
dn: mail=postmaster@alai.org,ou=Alias,ou=Postfix,dc=alai,dc=org
objectClass: CourierMailAlias
objectClass: person
cn: postmaster@alai.org
sn: postmaster@alai.org
mail: postmaster@alai.org
maildrop: basaburu@alai.org

Evidentemente debéis hacer la adaptaciones necesarias e incluir vuestras ramas, usuarios y alias de correo. Asignarle un pass al objeto “ou=people,dc=alai,dc=org” nos permitirá que todos los servicios puedan acceder al ldap sin comprometer la rootpw, puesto que los ficheros de configuración de acceso van con los pass en claro. Y además no tendrán permisos de escritura.

Cargamos el primer.ldif para situarse con “ldapadd” lo mejor como siempre, vuestro amigo man: “man ldapadd”

El DN de root “cn=admin,dc=alai,dc=org” que hemos asignado a root como nombre distintivo DN en slapd.conf es lo que usamos como binddn (sería como el usuario con que nos conectamos a slapd).

alai:~# ldapadd -x -D "cn=admin,dc=alai,dc=org" -W -f  /etc/ldap/primer.ldif

Os pide el pass de rootdn, osea la rootpw.

adding new entry “ou=Postfix,dc=alai,dc=org”

adding new entry “ou=Alias,ou=Postfix,dc=alai,dc=org”

adding new entry “ou=groups,dc=alai,dc=org”

adding new entry “ou=people,dc=alai,dc=org”

adding new entry “uid=basaburu,ou=people,dc=alai,dc=org”

adding new entry “mail=postmaster@alai.org,ou=Alias,ou=Postfix,dc=alai,dc=org”

Bueno pues ya tenemos las tres ramas, la subrama, un usuario y un alias de correo.

Implementamos la seguridad del servidor

La implementación de ldap+TLS y de ldaps está descrita en:

documentación de OpenLDAP.

OpenLDAP Software 2.4 Administrator’s Guide / TSL

Si tenéis interés en conocer más sobre los métodos de autentificación podéis consultar el rcf4513:

Authentication Methods and Security Mechanisms

En el fichero /etc/ladp/slapd.conf vamos a incluir al final del fichero los enlaces para usar los certificados openssl que hemos creado antes y vamos a especificar TLS como método de asegurar la integridad y la confidencialidad de las comunicaciones.

TLSCipherSuite HIGH:MEDIUM:+SSLv3:+TLSv1
TLSCACertificateFile /etc/ssl/alaiCA/certs/alaica.crt
TLSCertificateFile /etc/ssl/alaiCA/certs/alaiserver.crt
TLSCertificateKeyFile /etc/ssl/alaiCA/private/alaiserver-key.pem
TLSVerifyClient never

Ahora descomentamos en el fichero: /etc/default/slapd la línea que activa la escucha en el puerto seguro 636

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"

Cyrus SASL2 < > LDAP

Ahora es conveniente instalar la doc de cyrus-sasl para aquellas interesadas en profundizar sobre este tema

alai:~# apt-get install cyrus-sasl2-doc

Que os instalará /usr/share/doc/cyrus-sasl2-doc/LDAP_SASLAUTHD.gz documento que explica como autentificar con sasl2 contra un openldap.

Editaremos el fichero ”/etc/default/saslauthd” para modificar el mecanismo de autentificación por defecto a ldap

MECHANISMS="ldap"
CONFIG_FILE="/etc/saslauthd.conf"

Editamos (o creamos si no exite) el fichero /etc/saslauthd.conf para activar la autentificación SASL-LDAP sobre la rama people:

ldap_servers: ldap://localhost/
ldap_bind_dn: ou=people,dc=alai,dc=org
ldap_bind_pw: (password en claro de ou=people,dc=alai,dc=org)
ldap_search_base: ou=people,dc=alai,dc=org
ldap_filter: (&(mail=%u@%d)(objectClass=CourierMailAccount))
ldap_password_attr: userPassword

Rearrancamos el demonio de sasl: # /etc/init.d/saslauthd restart Rearrancamos el demonio de openldap: # /etc/init.d/slapd restart


Enlaces de interés OpenLdap

Manual de OpenLdap:

OpenLDAP Software 2.4 Administrator’s Guide

HowTos:

Step-by-step OpenLDAP Installation and Configuration

Instalación y configuración de OpenLDAP

LDAP Linux HOWTO

OpenLDAP Software 2.4 Administrator’s Guide

LDAP Authentication

Comunidad hispanohablante:

http://www.ldap-es.org/

Curso:

Curso OpenLDAP

LDAP Server Return Codes:

http://focus.ac-toulouse.fr/annuaire/returnCodes.html

 

herramienta web phpldapadmin

Para poder interactuar con openldap de una forma más amigable tenemos phpldapadmin una herramienta php. Hemos instalado php y phpldapadmin al comienzo de esta sección.

Desde vuestro navegador favorito cargáis el phpldapadmin supongamos que la ip del server es: 192.168.1.2

http://192.168.1.2/phpldapadmin

Os aparece una interface que os pide como quién vais a entrar. En este caso como rootdn cn=admin,dc=alai,dc=org y su password (rootpw).

Desde aquí podéis crear, añadir, quitar, etc.

A mi me gusta mas la consola, pero reconozco que es más “cómodo”

Postfix (ver 2.3.8) MTA de correo

Dice la wikipedia:

Postfix es un Agente de Transporte de Correo (MTA) de software libre / código abierto, un programa informático para el enrutamiento y envío de correo electrónico, creado con la intención de que sea una alternativa más rápida, fácil de administrar y segura al ampliamente utilizado Sendmail.

El home site es: http://www.postfix.org/ con infinidad de documentación que vamos a usar profusamente, sitio a visitar.

Vamos a configurar nuestro postfix para trabajar con alias virtuales, Mailboxes virtuales y con Dominios virtuales (lo que le permitirá trabajar con varios dominios a la vez). Nuestros usuarios de correo no van a tener cuentas shell en la máquina. Nuestro MTA autentificara contra sasl y obtendrá la autorizaciones de nuestro OpenLdap y utilizará TSL para asegurar las comunicaciones. Además de correr enjaulado en un chroot.

Empezamos por instalar el software:

alai:~# apt-get install postfix postfix-ldap postfix-doc

Se instalarán los siguientes paquetes extras:
  ssl-cert

Paquetes sugeridos:
  postfix-mysql postfix-pgsql postfix-pcre resolvconf postfix-cdb

Los siguientes paquetes se ELIMINARÁN:
  exim4 exim4-base exim4-config exim4-daemon-light

Se instalarán los siguientes paquetes NUEVOS:
  postfix postfix-doc postfix-ldap ssl-cert

Como veis se elimina el MTA por defecto de Debian exim4. Y hemos elegido también la documentación y postfix-ldap (autentificamos contra sasl-ldap como recordaréis). Nos mete el paquete ssl-cert que es una dependencia de postfix (apt-cache show postfix)

Debconf nos pregunta el tipo genérico de configuración, elegimos Sitio Internet porque vamos a configurar todo nosotras sobre la configuración genérica que nos deja Debian.

Para manejarnos con postfix aquí van unos comandos básicos:

  • postfix stop # Este comando para el servidor.

  • postfix start # Este comando arranca el servidor.

  • postfix reload # Este comando hace que el servidor relea la configuración sin parar el servicio.

  • mailq # Para ver la cola de mensajes.

  • postfix flush # Fuerza el envío de mensajes de la cola de espera.

  • postmap # Este comando sirve para construir los ficheros auxiliares de Postfix.

  • postconf # Muestra toda la configuración de Postfix.

  • newaliases # Este comando reconstruye la base de datos de alias.

 

Configuración de main.cf

La referencia inicial es: Configuración Básica

Tened en cuenta que estamos configurando para la versión 2.3.8 de postfix, si consultáis información en la red (hay mucha) aseguraros para que versión de postfix esta escrita, porque os puede pasar que en teoría vuestra config es correcta pero vuestro posftix no os entiende. Con lo que la cosa irá mal y os costará encontrar el bug, postfix desde la versión 2.3 para adelante a cambiado cosas.

Para consultar parámetros de configuración: Postfix Configuration Parameters

Vamos con ello, abrís con vuestro editor favorito /etc/postfix/main.cf

Como explica la primera línea del fichero en /usr/share/postfix/ tenéis ficheros de ejemplo, el que os sugiere main.cf.dist que esta profusamente comentado. Nosotras crearemos nuestro fichero AdHoc.

Para ir viendo los efectos de los cambios en la configuración en los ficheros main.cf y master.cf sin parar el server usad

# postfix reload

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian_GNU/Linux)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

# avisos a postmaster
notify_classes = bounce, delay, policy, protocol, resource, software

# Configuraciones de red y origen/destino
mydomain = alai.org
myhostname = mail.alai.org
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
# metemos nuestra red local
mynetworks = 127.0.0.0/8
inet_interfaces = all

# Gestor de buzones con formato Maildir
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
home_mailbox = Maildir/

# The mail_spool_directory parameter specifies the directory where
# UNIX-style mailboxes are kept. The default setting depends on the
# system type.
#
#mail_spool_directory = /var/mail/

# encolar el correo que no se puede entregar durante tres dias
maximal_queue_lifitime = 3d

# Alias virtuales
virtual_maps = ldap:/etc/postfix/valiases

# Alias reales
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# If you change the alias database, run "postalias /etc/aliases" (or
# wherever your system stores the mail alias file), or simply run
# "newaliases" to build the necessary DBM or DB file.
# este es un buen consejo, lo digo por experiencia, se olvida hacer

# Mailboxes Virtuales
virtual_transport = virtual
virtual_mailbox_base = /var/vmail
virtual_mailbox_maps = ldap:/etc/postfix/vmailbox
virtual_minimum_uid = 100

virtual_uid_maps = ldap:/etc/postfix/vuid
virtual_gid_maps = static:20000

# Mailboxes Reales
local_transport = local
local_recipient_maps = unix:passwd.byname $alias_maps

#local_recipient_maps = $alias_maps, ldap:/etc/postfix/ldap_local_recipient
# sacado del /usr/share/postfix/main.cf.dist
unknown_local_recipient_reject_code = 450

# Dominios Virtuales
virtual_mailbox_domains = hash:/etc/postfix/vmaildomains

# Configuracion para mailman
#relay_domains = lists.alai.org
#transport_maps = hash:/etc/postfix/transport
#mailman_destination_recipient_limit = 1

# Activación de SASL Autenticación en Postfix SMTP server
smtpd_sasl_auth_enable = yes
smtpd_sasl_path = smtpd
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname

#smtpd_sasl_authenticated_header = yes Note: the SASL login names will be shared with the entire world

# Activación de SASL Autenticación en Postfix SMTP client
#smtp_sasl_auth_enable = yes
#smtp_sasl_type = cyrus
#smtp_sasl_security_options = noanonymous
#smtp_sender_dependent_authentication = yes

# Comunicaciones TLS Postfix SMTP server
smtpd_tls_cert_file = /etc/ssl/alaiCA/certs/alaiserver.crt
smtpd_tls_key_file = /etc/ssl/alaiCA/private/alaiserver-key.pem
smtpd_tls_CAfile = /etc/ssl/alaiCA/certs/alaica.crt
smtpd_tls_CApath = /etc/ssl/alaiCA/certs
# usad el log level 3 en caso de problemas, lo "normal" es 0 cuando todo anda bien.
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_security_level = may
smtpd_tls_ask_ccert = yes
smtpd_tls_req_ccert = yes
smtpd_tls_ccert_verifydepth = 1
# To maintain compatibility with non-TLS clients set no
smtpd_tls_auth_only = yes
smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
smtpd_tls_session_cache_timeout = 3600s
#smtpd_tls_mandatory_ciphers = medium
smtpd_starttls_timeout = 300s
smtpd_tls_mandatory_protocols = SSLv3, TLSv1

# Comunicaciones TLS Postfix SMTP client
#smtp_tls_cert_file = /etc/ssl/alaiCA/certs/alaiclient.crt
#smtp_tls_key_file = /etc/ssl/alaiCA/private/alaiclient.key
#smtp_tls_CAfile = /etc/ssl/alaiCA/certs/alaica.crt
#smtp_tls_CApath = /etc/ssl/alaiCA/certs
# nivel de tls log. Poner 2 hasta que todo funcione bien
#smtp_tls_loglevel = 5
#smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
#smtp_tls_session_cache_timeout = 3600s
#smtp_tls_security_level = may
#smtp_helo_name = $myhostname
#smtp_always_send_ehlo = $myhostname
#smtp_sasl_type = cyrus
#smtp_tls_note_starttls_offer = yes
#smtp_tls_scert_verifydepth = 1
#smtp_starttls_timeout = 300s
#smtp_helo_name = $myhostname
#smtp_helo_timeout = 300s
#smtp_enforce_tls = yes
#smtp_use_tls=yes
#smtp_tls_note_starttls_offer = yes

# fuente de entropia (hay sistemas que no tienen /dev/urandom)
tls_random_source = dev:/dev/urandom
tls_random_bytes = 32

# Restricciones de acceso
smtpd_recipient_restrictions =  permit_mynetworks,
                                reject_non_fqdn_sender,
                                reject_unauth_destination,
                                reject_non_fqdn_recipient,
                                permit_sasl_authenticated,
                                permit_mynetworks,
                                reject_unauth_destination,
                                check_policy_service inet:127.0.0.1:60000

He dejado comentadas las entradas relativas a mailman, nosotras vamos a usar sympa pero alguna puede preferir mailman

 

Comunicación entre Postfix y OpenLdap

A nuestro Postfix le hemos dicho que va a trabajar con dominios, usuarios y buzones virtuales, la información de ellos la alojamos en nuestro OpenLadp. Para que pueda consultarla y utilizarla, necesita hablar con OpenLdap. Para lo cual hemos definido una serie de ficheros auxiliares donde puede averiguar donde esta la información que necesita y como acceder a ella.

Nos toca pues crear esos ficheros y hacerlos legibles para Posftix.

Le hemos dicho en la configuración que estos son los ficheros que tiene que usar:

Empecemos, abrid vuestro editor favorito y vamos a crearlos.

/etc/postfix/valiases

server_host = localhost
server_port = 389
bind = yes
bind_dn = ou=people,dc=alai,dc=org
bind_pw = (password en claro de ou=people,dc=alai,dc=org)
search_base = ou=Alias,ou=Postfix,dc=alai,dc=org
query_filter = (&(mail=%s)(objectClass=CourierMailAlias))
result_attribute = maildrop

/etc/postfix/vmailbox

server_host = localhost
server_port = 389
bind = yes
bind_dn = ou=people,dc=alai,dc=org
bind_pw = (pasword en claro de ou=people,dc=alai,dc=org)
search_base = ou=people,dc=alai,dc=org
scope = one
query_filter = (&(mail=%s)(!(quota=-1))(objectClass=CourierMailAccount))
result_attribute = mailbox

/etc/postfix/vuid

server_host = localhost
server_port = 389
bind = yes
bind_dn = ou=people,dc=alai,dc=org
bind_pw = (pass en claro de ou=people,dc=alai,dc=org)
search_base = ou=people,dc=alai,dc=org
scope = one
query_filter = (&(mail=%s)(!(quota=-1))(objectClass=CourierMailAccount))
result_attribute = uidNumber

/etc/postfix/vgid

server_host = localhost
server_port = 389
bind = yes
bind_dn = ou=people,dc=alai,dc=org
bind_pw = (password en claro de ou=people,dc=alai,dc=org)
search_base = ou=people,dc=alai,dc=org
scope = one
query_filter = (&(mail=%s)(!(quota=-1))(objectClass=CourierMailAccount))

Así que vamos a hacer comprensibles para postfix todos estos ficheros auxiliares que hemos creado.

alai:~# postmap /etc/postfix/valiases alai:~# postmap /etc/postfix/vmailbox alai:~# postmap /etc/postfix/vuid alai:~# postmap /etc/postfix/vgid alai:~# postmap /etc/postfix/vmaildomains alai:~# postmap /etc/postfix/transport Estos ficheros vamos a protegerlos un poco cambiando permisos.También el main.cf

alai:~# chmod 600 /etc/postfix/valiases alai:~# chmod 600 /etc/postfix/vmailbox alai:~# chmod 600 /etc/postfix/vuid alai:~# chmod 600 /etc/postfix/vgid alai:~# chmod 600 /etc/postfix/main.cf

result_attribute = gidNumber

/etc/postfix/vmaildomains

alai.org      req

/etc/postfix/transport

lists.alai.org   mailman:

Ahora ha llegado el momento de usar nuestro primer comando postfix: postmap (este comando sirve para construir los ficheros auxiliares de Postfix). Si los editáis (los fichero auxiliares) tenéis que correr de nuevo postmap.

Configuración de master.cf

/etc/postfix/master.cf es el otro fichero de configuración de postfix, se encarga de los procesos maestros de postfix.

Solo os mostraré el cambio sobre el fichero original que deja debian.

#
# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master").
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)   (never) (100)
# ==========================================================================
smtp      inet  n       -       -       -       -       smtpd -v

Hemos añadido a la línea “smtp” un -v esto le dice a postfix que logee mucho más profusamente. Con lo que tendréis un mail.log mucho mas detallado. Es un medida temporal, puesto que os cansaréis de tanto logeo, pero ahora viene bien cuando esta empezando la vida de este server.

Como os habréis dado cuenta nuestro postfix corre enjaulado, opción por defecto (cuarta columna de la línea smtp: chroot) no tiene una n de no.

Ahora protegéis un poco el fichero cambiando sus permisos

alai:~# chmod 600 /etc/postfix/master.cf

Chroot, autentificación y seguridad

Creamos el fichero /etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: PLAIN LOGIN

Meter al usuario postfix en el grupo sasl

alai:~# adduser postfix sasl

Ahora vamos a crear una entrada en el /etc/fstab para que al arrancar monte /var/run/saslauthd en /var/spool/postfix/var/run/saslauthd con el objetivo de que el socket unix de saslauthd este accesible en el entorno chroot y en el normal del sistema.

Editamos el fichero /etc/fstab y añadimos al final esta línea

  /var/run/saslauthd /var/spool/postfix/var/run/saslauthd bind bind 0 0

Activar la previamente creada entrada en el /etc/fstab

alai:~#  cd /var/spool/postfix
alai:/var/spool/postfix/#  mkdir -p var/run/saslauthd
alai:~# mount /var/spool/postfix/var/run/saslauthd

No necesitamos copiar librerías al choort puesto que los paquetes debian ya lo han hecho. Estan en /var/spool/postfix/lib/

Toda la parte de ficheros de configuración de postfix en /etc/postfix no es necesario meterla en la jaula, ya que postfix los lee y carga antes de enjaularse.

Para correr dentro de una jaula chroot Postfix necesitan copias de ficheros de configuración de sistema dentro del directorio de la cola de correo. vamos a chequear que debian (da gusto trabajar con debian) los a metido y que están correctos.

alai:~# ls -all --color /var/spool/postfix/etc

-rw-r--r--  1 root root   260 2007-11-21 11:12 hosts
-rw-r--r--  1 root root   946 2007-11-21 11:12 localtime
-rw-r--r--  1 root root   475 2007-11-21 11:12 nsswitch.conf
-rw-r--r--  1 root root    47 2007-11-21 11:12 resolv.conf
-rw-r--r--  1 root root 18274 2007-11-21 11:12 services

los chequeáis ….

alai:~# cat /var/spool/postfix/etc/fichero

En /etc/hosts vamos a tocar un poco. Corregimos esta línea:

127.0.1.1 mail.alai.org alai.org alai

El resolv.conf depende de la configuración de red que tengáis, pero como hemos montado nuestro dns la primera entrada debería ser nameserver 192.168.1.2 suponiendo que alai esta en la 192.168.1.2 y luego los dns de vuestro proveedor ISP.

Vamos con el tema de como minimizar en lo posible el spam

He encontrado un HowTo de Paco Brufal que se titula guía rapida de postfix. En él Paco explica de una manera muy clara como levantar el método Greylisting.

El método es pasivo de ahí su interés, pero muy efectivo contra el spam. Así que lo incluyo en este HowTo

Greylisting

Greylisting es el método por el cual se deniega el primer envío de un remitente desconocido, mediante un código de error 450 (deferred). Muchos de los virus y spammers no siguen el protocolo SMTP correctamente, con lo que nunca volverán a enviar ese mensaje. Mediante el greylisting podemos evitar que nos lleguen mensajes de virus y proxies abiertos, pero no podemos evitar que nos lleguen de servidores de correo mal configurados que permiten relay, aunque con un poco de suerte en el siguiente reenvío ese servidor ya esté en alguna lista RBL y podremos evitarlo.

El funcionamiento es como sigue:

  • Llega un correo con remitente desconocido

  • Se deniega con un error 450 (intentar más tarde)

  • Se guarda la IP, el From y el To en un fichero

  • Si el correo era un spam o un virus, es muy raro que nos lo vuelvan a enviar

  • Si el correo viene de un servidor SMTP, será enviado de nuevo pasados unos minutos

  • Cuando llega de nuevo el correo, lo dejará pasar

Veamos cómo implementar el greylisting en un servidor Debian Sid (unstable) Postfix 2.1 o superior (las versiones anteriores no soportan esta característica):

Instalamos el paquete postgrey

alai:~# apt-get install postgrey

Editamos el fichero /etc/postfix/main.cf y lo dejamos tal que así:

    [...]
    smtpd_recipient_restrictions =
    [...]
            reject_unauth_destination,
            check_policy_service inet:127.0.0.1:60000
    [...]

Con esto configuramos Postfix para que compruebe cada correo que llega mediante el demonio greylist, que está escuchando en el puerto 60000 de la IP 127.0.0.1

Reiniciamos Postfix y ya lo tendremos funcionando.

Puedes obtener más información sobre greylisting en http://greylisting.org

 

testeo, monitoreo y seguimiento

Para chequear la instalación podéis usar el comando postconf consultar la página man para ver las posibilidades que os ofrece el comando.

Una forma de chequear si el server esta funcionando correctamente, cuando detectáis algún problema es mandar un mensaje a echo@rediris.es os devolverá un mail con una cabecera detallada en el cuerpo del mensaje. Hace un reply automático.

Bueno el fichero fundamental para monitorear postfix es donde logea, el /var/log/mail.log

Si habéis puesto niveles de log altos, hay mucho donde mirar.

Usaremos isoqlog para hacerle un seguimiento por web a /var/log/mail.log

Description: Mail Transport Agent log analysis program

alai:~ # apt-get install isoqlog

Para hacer un seguimiento en consola facilitando la visibilidad de esta tarea, podéis colorear el log, Usaremos ccze si hacéis un apt-cache show ccze os dice:

Description: A robust, modular log coloriser CCZE is a robust and modular log coloriser, with plugins for apm, exim, fetchmail, httpd, postfix, procmail, squid, syslog, ulogd, vsftpd, xferlog and more.

Así que instalamos:

alai:~# apt-get install ccze

Para ver coloreado el mail.log

alai:~# cat /var/log/mail.log | ccze -m ansi

Para verlo en tiempo real

alai:~# tail -f /var/log/mail.log | ccze -m ansi

En el tema de seguimiento también vamos a usar gráficos.

mailgraph → Description: Mail statistics RRDtool frontend for Postfix

queuegraph → Description: a RRDtool frontend for Postfix queue-statistics

alai:~# apt-get install mailgraph queuegraph libft-perl

Enlaces de interés sobre Postfix

http://www.postfix.org/documentation.html
http://www.postfix.org/BASIC_CONFIGURATION_README.html
http://www.postfix.org/STANDARD_CONFIGURATION_README.html
http://www.postfix.org/TLS_README.html
http://www.postfix.org/LDAP_README.html
http://www.howtoforge.com/mailgraph_pflogsumm_debian_etch
http://www.howtoforge.com/howto_postfix_smtp_auth_tls_howto
http://www.servitux.org/view.php/page/postfix
http://bulma.net/body.phtml?nIdNoticia=1621
http://postfix.wiki.xs4all.nl/index.php?title=Main_Page


Buzones de correo Courier

Como cuestión previa prepararemos el directorio donde se almacenará el correo, y como propietario del directorio 10000, grupo 20000 y fijaremos los permisos.

alai:~# mkdir /var/vmail
alai:~# chown 10000.20000 /var/vmail
alai:~# chmod 2775 /var/vmail

Empezamos instalando:

alai:~# apt-get install courier-pop-ssl courier-base courier-authdaemon courier-ldap courier-doc
Creando árbol de dependencias... Hecho
Se instalarán los siguientes paquetes extras:
  courier-authlib-userdb courier-pop courier-ssl libfam0
Paquetes recomendados
  fam
Se instalarán los siguientes paquetes NUEVOS:
  courier-authdaemon courier-authlib-userdb courier-base courier-doc courier-ldap courier-pop courier-pop-ssl
  courier-ssl libfam0

courier-authlib-ldap ya lo hemos instalado configurando OpenLdap

Nos dice debconf:

 │                                    Se necesita un certificado SSL                                             │
 │                                                                                                               │
 │ Para utilizar POP e IMAP sobre SSL necesitan un certificado X.509 válido y firmado. Si es necesario, durante  │
 │ la instalación de courier-pop-ssl y courier-imap-ssl respectivamente se generará un certicado X.509. Para     │
 │ usarlo en producción el certificado debe ser firmado por una autoridad certificadora reconocida, de forma     │
 │ que los clientes de correo lo acepten. Las ubicaciones predeterminadas para este certificado son              │
 │ /etc/courier/pop3d.pem y /etc/courier/imapd.pem respectivamente.

Le vamos a decir a courier pop3d que use nuestro certificado alaiserver.pem con los parámetros Diffie-Hellman

editamos /etc/courier/pop3d-ssl y modificamos tres líneas:

# le quitamos el comentario y le decimos donde esta el fichero
TLS_DHCERTFILE=/etc/ssl/alaiCA/certs/alaiserver.pem

TLS_CERTFILE=/etc/ssl/alaiCA/certs/alaiserver.pem

TLS_PROTOCOL=TLS1

editamos /etc/courier/pop3d y modificamos dos líneas:

POP3AUTH="LOGIN PLAIN"

POP3AUTH_TLS="LOGIN PLAIN"

En el fichero /etc/courier/authdaemonrc editamos para meter estas líneas:

authmodulelist="authldap"
# ahora al comienzo de este server veamos como va subimos el debug_login a 1
DEBUG_LOGIN=1

LDAPTLS_CACERT=/etc/ssl/alaiCA/certs/alaica.crt
LDAPTLS_REQCERT=demand
LDAPTLS_CERT=/etc/ssl/alaiCA/certs/alaiclient.crt
LDAPTLS_KEY=/etc/ssl/alaiCA/private/alaiclient.key

En el fichero /etc/courier/authldaprc editamos para hacer modificaciones:

Solo muestro los cambios con respecto al original que deja el paquete debian

LDAP_URI                ldap://localhost

LDAP_BASEDN             ou=people,dc=alai,dc=org

LDAP_BINDDN             ou=people,dc=alai,dc=org
LDAP_BINDPW             password en claro de ou=people,dc=alai,dc=org

LDAP_FILTER           (objectClass=CourierMailAccount)

LDAP_UID              uidNumber
LDAP_GID              gidNumber

LDAP_CLEARPW            password en claro de ou=people,dc=alai,dc=org
LDAP_CRYPTPW            {MD5}JsEdañlkfjñjDDEa==

Vamos a proteger un poco /etc/courier/authldaprc

alai:~# chmod 600 /etc/courier/authldaprc

Bueno pues con la herramienta maildirmake vamos a crear los buzones. Son directorios Maildir con características especiales por eso hay que usar esta herramienta.

alai:~# mkdir /var/vmail/alai.org
alai:~# chown 10000.20000 /var/vmail/alai.org

Ahora los buzones, el propietario de cada buzón y de los directorios que hay bajo el tiene que ser el mismo que el uid que tenga el usuario en el OpenLdap, si no, virtual no puede entregar el correo.

alai:~# maildirmake /var/vmail/alai.org/basaburu
alai:~# chown -R 10001.20000 /var/vmail/alai.org/basaburu

Y así con todos los usuarios que tengáis. Los sysadmin se montan sus scripts o programillas php para manejar muchos usuarios

 

 

enlaces de interés Courier

Instalación y configuración de Courier

Courier Mail Server

3. Courier IMAP y POP

22 comentarios en «HowTo: Debian+OpenSSL+Bind9+Postfix+OpenLDAP+Courier»

  1. Ahora está el software transitando de Debian (oldstable) a Ubuntu. Para la próxima LTS debería estar migrada eBox a Ubuntu… Haz una comparación a ver si te convence o no 🙂 (http://www.eboxplatform.com/) Ah! Y si tienes sugerencias de seguridad, seguro que son bien recibidas 😉

    Que pesado soy, eh? O:-) Un saludo y feliz año 🙂

  2. Pues que quieres que te diga…… todo eso lo hace desde hace años una debian. Y con niveles de seguridad y eficiencia dificilmente alcanzables.

    Cuando montas un server debian…. sabes que es una roca, y roca segura.

    Y en mi caso lo de debian es fundamentalmente político.

    Un saludo

    BasaBuru

  3. Muy, muy bueno. Me lo he encontrado navegando la web y el caso es que me ha encantado. Además, soy otro «Debianita» casi incondicional, con lo que todavía mejor.

    Saludos desde aquí al lado, o sea, Cantabria 🙂

  4. Muy buen HowTo, realmente interesante y útil. Sigue así, creo que sería interesante si pudieses profundizar más y comentar alguna de esas maravillas que han instalado los cracks de tu curre y así poder «profesionalizar» un poco el server.

    Un saludo.

  5. Hola, muy bueno el howto.
    Lo que estaría muy bueno es que implementen una «vista para imprimir» y/o una versión en PDF para tener una mejor visualización al momento de consultar el artículo.
    Saludos.

  6. Estimado BasaBuru gracias por su tan excelente articulo le tengo una preguntita como comprobar que el servidor OpenLDAP esta corriendo en modo seguro al hacer netstat -alnp | grep slapd tengo la siguiente salida
    tcp 0 0 127.0.0.1:389 0.0.0.0:* LISTEN 3092/slapd

    tcp 0 0 127.0.0.1:636 0.0.0.0:* LISTEN 3092/slapd

    tcp 0 0 127.0.0.1:389 127.0.0.1:4726 ESTABLISHED3092/slapd

    es esto correcto como puedo testear el modo seguro de openldap antes de pasar a trabajar con postfix.
    gracias por adelantado

  7. En el transcurrir de esta semana ejecutare este manual paso a paso, y espero y ruego a Dios que no sea como otros manuales que lo dejan a uno traumado, pero lo que si puedo decir que las palabras y la consistencia de ideas utilizadas en este manual son muy buenas, adicional he leído a BasaBuru en varios solicitudes y no suena nada loco, se le nota mucho profesionalismo.

    BasaBuru Gracias por este tema. Les estaré informando como me fue.

    Pregunta:
    Cuantos usuario puede soportar LDAP en un buen funcionamiento?
    Cual seria un buen correo para una corporación con mas de 17 mil usuarios activos?

  8. CGG

    En principio ldap puede manejar cientos de miles de usuarios. Lo que pasa es que depende de los recursos que tengas. Es lo de siempre. Si haces cosas grandes necesitas soluciones grandes.

    Un solución suele ser partir en trozos la base de datos y que varios ldap trabajen juntos. Por eso te digo que cientos de miles. De forma que cada uno maneja una rama. A nivel exterior se ve como un solo ldap.

    Posfix puede hacer muy bien esa tarea. Pero otra opción puede ser qmail, pero no es libre. solo puedes obtener los binarios. El colega es un punto paranóico, mira su web site.

    De todas formas no se si vale mucho mi opinión en este caso, puesto que te he dado la del manual :=/

    No tengo experiencia en movidas tan grandes. Lo siento.

    Y aquí la experiencia es lo que cuenta. Es otra metodología de trabajo, es alta disponibilidad y muchos, muchos usuarios. Vamos que tienes que tirar de scritping específico al problema para manejar el sarao. Eso sí hay mucho hecho son cosas básicas por lo tanto hay mucha docu.

    Un saludo

    BasaBuru

    P.D. He decidido dejar la segunda parte pendiente para la liberación de Lenny. Reescribiré esta primera parte y la segunda. Así que el howto saldrá sobre Debian Lenny

  9. Estimado Basaburu tengo un problemita el cual es el siguiente:

    Jul 10 22:50:28 mydebiannt postfix/local[3705]: 61A18426E7: to=, orig_to=, relay=local, delay=0.11, delays=0.09/0/0/0.01, dsn=5.1.1, status=bounced (unknown user: «cgg»)

    Todos los usuarios del LDAP me arrojan este error, pero si creo un usuario local pues recibe el correo en /var/vmail

    tu crees que me falte algo como esto «virtual_alias_maps = ldap:/etc/postfix/valiases»

    Amigo disculpa la molestia.

    NOTA: no estoy utilizando los niveles de seguridad del tls y el sasl, debido que solamente quiero que me funcione en mi hogar con mis usuario creados en el LDAP

  10. Estimado Basaburu, no logro saber que estoy haciendo mal.
    No tengo ningun dominio, solo utilizo a dyndns, para que mi PC se pueda ver por la internet con el nombre que me otorgo dyndns.
    Tu crees que mi problema sea este?

    BasaBuru, por favor ayuda me,

  11. Aupa CGG.

    Lamento el lag, me acaban de avisar de que había preguntas. No sigo el articulo. Además esta aparcado hasta que se libere lenny.

    Con respecto a lo que comentas no lo sé, puede, te puedo asegurar que tal y como está redactado el howto funciona.

    Ahora bien, no he usado nunca dyndns……… no he tenido necesidad y por lo tanto solo se que existe.

    Mi recomendación es que si estas usando Debian…… mires el historico de la lista debian-user-spanish se que se ha comentado sobre el.

    A lo del ldap, pues si. Si sigues el howto, estas montando un sistema de usuarios virtuales.

    Un saludo

    BasaBuru

  12. Hola, he seguido el manual y todo correcto, el problema que tengo es a la hora de crear «empezamos por las unidades organizacionales»

    $ ldapadd -x -D «cn=admin,dc=laregion,dc=net» -W -f people.ldif
    Enter LDAP Password:
    adding new entry «ou=people,dc=laregion,dc=net»
    ldap_add: No such object (32)

    No hay espacios, que sé que por eso suele dar error… Pero no consigo solucionarlo, gracias de ante mano

  13. Un gran trabajo, solo os escribo por que he detectado varios errores.

    1.-«Así que vamos a hacer comprensibles para postfix» En este segmento de texto si os fijaís la configuración continua bajo, un mal copiado simplemente.

    2.-«LDAP_CLEARPW password en claro de ou=people,dc=alai,dc=org
    LDAP_CRYPTPW {MD5}JsEdañlkfjñjDDEa==»
    En esta parte estos datos con incorrectos los correctos son:

    «LDAP_CLEARPW clearPassword
    LDAP_CRYPTPW userPassword»

    Sin más un saludo y continuar haciendo los manuales de esta calidad.

    Un saludo. Denos.

  14. Ahora ldap en denny se compila con gnutls y no con openssl, por lo que toca hacer los certificados con certtool. Acostumbrado a trabajar con openssl que aunque hacia bastantes preguntas, tampoco era muy pesado. Pero gnutls… no me habian hecho tantas preguntas en mi vida jejeje

  15. Conseguí instalarlo todo y que funcionase, sin embargo el correo no se me guarda en /var/vmail/dominio/usuario/* . En realidad no se donde se guarda…El log me muestra lo siguiente:
    May 25 18:16:16 tfc postfix/virtual[5491]: B6B463AE302: to=, orig_to=, relay=virtual, delay=0.02, delays=0.01/0/0/0, dsn=5.1.1, status=bounced (unknown user: «amhs.cat/didac/@amhs.cat»)
    May 25 18:16:16 tfc postfix/bounce[5492]: warning: B6B463AE302: undeliverable postmaster notification discarded
    May 25 18:16:16 tfc postfix/qmgr[5360]: B6B463AE302: removed

Responder a CGG Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.