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
- 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 control
alai:/etc/ssl/alaiCA/# chmod 600 private/alaicakey.pem
alai:/etc/ssl/alaiCA/# chmod 600 alaica.index
alai:/etc/ssl/alaiCA/# chmod 600 alaica.serial
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.
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 server
Con 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.pem
Os 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 server
Cogemos 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
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:
alai:/etc/ssl/alaiCA/# openssl gendh >> certs/alaiserver.pem- 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
Certificate purposes:
alai:/etc/ssl/alaiCA/# openssl x509 -in certs/alaica.crt -noout -purpose
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
-
Instalar slapd sus librerias y las utilidades
-
Instalar sasl
-
Instalar soporte PHP 5
-
Instalar phpldapadmin
-
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.
-
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. -
En segundo lugar crearemos la estructura de la base de datos e introduciremos las primeras entradas.
-
Y en tercer lugar implementaremos la seguridad del servidor.
-
Unos cuantos enlaces de interés para el tema que nos ocupa
-
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:
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:
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
OpenLDAP Software 2.4 Administrator’s Guide
Comunidad hispanohablante:
Curso:
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
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 🙂
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
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 🙂
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.
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.
¿Y el firewall?
je,je…….. pa eso esta el freeBSD en un soekris con una flash de 512mb
Pero si igual pa la segunda parte lo meto.
Un saludo
Buenísimo
Enhorabuena la gente como vosotros nos haceis la vida más facil al resto
Muchas gracias por publicarlo
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
Excelente tutorial
muchas gracias por compartir tus conocimientos
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?
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
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
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,
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
Muy bueno este how to, pero te flato revisar tu ortografia, ya que te quedaroon palabras incompletas
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
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.
Hola basaburu, solo para recordarte que lenny lo liberaron el día de los enamorados, estas atrasado!
Buenisimo trabajo, un saludo!
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
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
Podrías hacer un manual de SQUID+SARG ?… proxy transparente