====== Servidor smtp con Postfix y OpenLDAP ====== **(Trabajo en progreso)** ===== Introducción ===== Para un administrador de red suele ser engorroso tener que administrar diferentes servicios, cada uno con su propio listado de usuarios. Adicionalmente, hay quienes prefieren evitar crear usuarios reales en un servidor, si no han de a trabajar en éste. Una manera de solucionar ambos problemas consiste en preparar una base centralizada de usuarios, y luego configurar los servicios para que utilicen esta base. Se pueden utilizar varias bases: mySQL, PostgreSQL, LDAP, etc. En este tutorial utilizaremos OpenLDAP, pues es eficiente, liviano y muchas aplicaciones soportan la integración con el. Para ejemplificarlo, mostraremos cómo configurar Postfix, el popular agente de transporte de correos, a fin de crear un servidor ''smtp'' relativamente seguro, que requiera que para poder enviar mensajes, los usuarios necesiten autenticarse y que las contraseñas no se transmitan por la red de manera insegura. === Algunas cosas que se asumen en este tutorial: === * Tenemos instalado Debian 6.x "Squeeze", y disponemos de acceso al repositorio de programas * Nuestro dominio es ''midominio.org'' * El PC donde instalaremos los servicios utiliza para su interfaz interna (la que da hacia la LAN) la dirección IP ''192.168.0.2'' * Trabajaremos con el usuario ''root'' para el proceso de instalación y configuración ===== Preparativos preliminares ===== Primeramente, modificaremos el archivo ''/etc/hosts'' para incluir algunas entradas. ((La resolución de nombres de dominio también puede gestionarse instalando un DNS, pero para mayor simplicidad, esto no lo trataremos en este tutorial.)) editor /etc/hosts Añadiremos a dicho archivo el siguiente contenido: 192.168.0.2 ldap.midominio.org ldap 192.168.0.2 correo.midominio.org correo Esto creará dos direcciones virtuales que resultarán más intuitivas durante la configuración del acceso a cada uno de los servicios. Ahora, instalaremos algunos programas básicos para efectuar diagnósticos: aptitude install ssh nmap telnet La instalación del resto de las aplicaciones se puede hacer de una vez o en dos partes; para facilitar la comprensión, dividiremos la instalación de OpenLDAP y Postfix. ===== Instalación y configuración de OpenLDAP ===== Procedemos a instalar el servicio slapd y las utilidades para gestionarlo, así como algunas aplicaciones relacionadas con el proceso de autenticación: aptitude install slapd ldap-utils libnss-ldap libpam-ldap unscd Durante el proceso de instalación, el asistente nos debe solicitar la contraseña de administración de OpenLDAP, que será necesaria posteriormente para cualquier modificación del servicio, de manera que la que utilicemos, debemos recordarla o guadarla de una manera segura.((Explicar cómo guardar archivos de manera es un tema que se extiende más allá de este tutorial, por lo que no será tratado aquí.)) Una vez finalizada la instalación, mediante el comando ''nmap'' podemos comprobar que el servicio esté funcionando: nmap -p 389 localhost Si obtenemos un resultado como el siguiente, significa que el servicio se está ejecutando: Starting Nmap 5.00 ( http://nmap.org ) at 2011-05-25 10:04 UTC Interesting ports on localhost (127.0.0.1): PORT STATE SERVICE 389/tcp open ldap Nmap done: 1 IP address (1 host up) scanned in 0.18 seconds Ahora editamos el archivo de configuración de OpenLDAP: editor /etc/ldap/ldap.conf Modificamos estas entradas, o las agregamos si no existen: BASE dc=midominio,dc=org URI ldap://ldap.midominio.org/ ldapi://ldap.midominio.org/ ldaps://ldap.midominio.org/ ==== Preparación de la base de datos ==== A diferencia de versiones anteriores, en Debian Squeeze la manera recomendada de configurar OpenLDAP es mediante archivos LDIF, lo cual permite que cualquier cambio realizado sea efectivo inmediatamente, incluso mientras el servicio se ejecuta. Comenzaremos creando un directorio temporal y dentro de este un archivo LDIF para modificar la configuración por defecto de la base de datos: mkdir -p /var/tmp/ldap editor /var/tmp/ldap/00_olc-config.ldif Como contenido de dicho archivo, colocaremos esto: # 1. dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: stats # 2.1. dn: olcDatabase={1}hdb,cn=config changetype: modify add: olcDbIndex olcDbIndex: uid eq - # 2.2. add: olcDbIndex olcDbIndex: cn eq - # 2.3. add: olcDbIndex olcDbIndex: ou eq - # 2.4. add: olcDbIndex olcDbIndex: dc eq Esto básicamente establece un nivel de trazas más detallado para ''syslog'', y crea índices para acelerar las futuras consultas a la base de datos. ((Las líneas que contienen sólo un guión actúan como un separador de modificaciones que se aplican a una misma entrada del directorio.)) Una vez creado el archivo, procedemos a importarlo a LDAP, para lo cual ejecutamos este comando: ldapmodify -QY EXTERNAL -H ldapi:/// -f /var/tmp/ldap/00_olc-config.ldif A continuación detallaremos los parámetros que se han utilizado en este comando: ^ Parámetro ^ Propósito ^ | Q | Habilitar SASL en modo silencioso. | | Y | Especificar el mecanismo SASL para utilizar en la autenticación (en este caso, EXTERNAL). | | H | Especificar la URI al servidor de ldap. | | f | Especificar el archivo que contiene la información (de lo contrario se utiliza la entrada estándar). | Para comprobar que se efectuaron los cambios, ejecutamos el siguiente comando: ldapsearch -LLLQY EXTERNAL -H ldapi:/// -b cn=config "(|(cn=config)(olcDatabase={1}hdb))" En este caso se añade el parámetro **L:** la primera L hace que los resultados se muestren en formato LDIF, la segunda L deshabilita los comentarios, y la tercera L hace que no se muestre la versión de LDIF. ==== Unidades organizativas ==== Ahora crearemos un archivo LDIF para las unidades organizativas: editor /var/tmp/ldap/01_ou.ldif En este caso utilizaremos dos unidades organizativas, una para las cuentas de usuarios, y otra para los grupos de cuentas. El contenido del archivo quedaría así: dn: ou=usuarios,dc=midominio,dc=cu ou: usuarios objectClass: organizationalUnit dn: ou=grupos,dc=midominio,dc=cu ou: grupos objectClass: organizationalUnit Una vez terminado, procedemos a aplicarlo: ldapadd -cxWD cn=admin,dc=midominio,dc=cu -f /var/tmp/ldap/01_ou.ldif A continuación detallaremos los parámetros que se han utilizado en este comando: ^ Parámetro ^ Propósito ^ | c | Continuar si se encuentran errores. | | x | Utilizar la autenticación simple (por defecto se utiliza SASL). | | W | Solicitar la contraseña al usuario. | | D | Establecer el DN (nombre distinguido) con el cual enlazar al servidor OpenLDAP. | | f | Especificar el archivo que contiene la información (de lo contrario se utiliza la entrada estándar). | ==== Grupos ==== A continuación crearemos el archivo para los grupos de cuentas: editor /var/tmp/ldap/02_grupos.ldif Para ejemplificar, solamente crearemos dos grupos, uno para los informáticos y otro para el resto de los empleados de la empresa, de modo que como contenido de este archivo, colocaremos algo como esto: # grupo 1: cn=informaticos,ou=grupos,dc=midominio,dc=org dn: cn=informaticos,ou=grupos,dc=midominio,dc=org cn: informaticos description: Cuentas de informáticos gidnumber: 1100 objectclass: posixGroup # grupo 2: cn=empleados,ou=grupos,dc=midominio,dc=org dn: cn=empleados,ou=grupos,dc=midominio,dc=org cn: empleados description: Cuentas de empleados gidnumber: 1200 objectclass: posixGroup Ahora procederemos a importar el archivo en OpenLDAP: ldapadd -cxWD cn=admin,dc=midominio,dc=org -f /var/tmp/ldap/02_grupos.ldif ==== Usuarios ==== Una vez creados los grupos, necesitamos poblarlos, y para esto crearemos otro archivo: editor /var/tmp/ldap/03_usuarios.ldif Como contenido de dicho archivo colocaremos los detalles de cada usuario. En este tutorial crearemos solamente un informático y un contador, y para esto utilizaremos la clase de LDAP **inetOrgPerson**, pues ofrece muchos campos útiles que nos evitarán tener que agregar más clases. Aquí solamente llenaremos algunos de estos campos, aunque posteriormente pueden agregarse muchos más, los cual puede resultar más cómodo mediante herramientas como [[http://phpldapadmin.sourceforge.net|phpLDAPadmin]], por ejemplo. dn: uid=sysadmin,ou=usuarios,dc=midominio,dc=org uid: sysadmin cn: sysadmin givenName: System sn: Administrator displayName: System Administrator title: Especialista en informática description: Administrador del sistema mail: sysadmin@midominio.org gidNumber: 1200 uidNumber: 1201 homeDirectory: /home/sysadmin loginShell: /bin/bash objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount dn: uid=juanperez,ou=usuarios,dc=midominio,dc=org uid: juanperez cn: juanperez givenName: Juan sn: Pérez González displayName: Juan Pérez González title: Lic. en contabilidad description: Contador principal mail: juanperez@midominio.org gidNumber: 1200 uidNumber: 1202 homeDirectory: /home/juanperez loginShell: /usr/sbin/nologin objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount Nótese que el contador podrá utilizar los diferentes servicios que le sean habilitados porque posee una cuenta en el sistema, pero por motivos de seguridad, no podrá iniciar sesión en el propio servidor a causa del parámetro ''loginShell: /usr/sbin/nologin''. Una vez más, para aplicar estos cambios, importaremos el archivo LDIF: ldapadd -cxWD cn=admin,dc=midominio,dc=org -f /var/tmp/ldap/03_usuarios.ldif ===== Instalación y configuración de Postfix ===== Ahora procederemos a instalar Postfix junto con algunas utilidades y librerías, y posteriormente editamos el archivo de configuración principal de postfix. aptitude install postfix postfix-{doc,ldap,pcre} mailutils libsasl2-modules nano /etc/postfix/main.cf Modificamos estas entradas, o las agregamos si no existen: # Parámetros principales mail_owner = postfix default_privs = nobody mydomain = midominio.org myorigin = $mydomain myhostname = correo.$mydomain inet_interfaces = $myhostname, localhost mydestination = $myhostname, $mydomain, localhost mynetworks = 192.168.0.0/24, 127.0.0.0/8 smtpd_banner = $myhostname ESMTP # Establecer el mapeo de aliases tanto desde archivos como desde LDAP alias_database = hash:/etc/postfix/aliases alias_maps = hash:/etc/postfix/aliases, ldap:/etc/postfix/ldap-aliases.cf # Habilitar la verificación de cabeceras header_checks = regexp:/etc/postfix/header_checks # Establecer el tamaño máximo del mensaje en 2 MiB message_size_limit = 2097152 # Establecer el directorio para la cola de Postfix queue_directory = /var/spool/postfix # Algunas opciones de seguridad strict_rfc821_envelopes = yes smtpd_sender_restrictions = reject_unlisted_sender, reject_non_fqdn_sender smtpd_recipient_restrictions = reject_unlisted_recipient, reject_non_fqdn_recipient, reject_unauth_destination smtpd_client_restrictions = permit_mynetworks, reject_unknown_client_hostname smtpd_reject_footer = Consulte al administrador de la red. # Parámetros TLS smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level = encrypt smtpd_tls_mandatory_protocols = TLSv1 smtpd_tls_mandatory_ciphers = high smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_session_cache_timeout = 7200s smtp_tls_note_starttls_offer = yes smtp_tls_loglevel = 1 Para que toda la configuración relacionada con Postfix esté junta, movemos los alias al directorio de configuración de Postfix, y posteriormente generamos la base de datos de los alias: mv /etc/aliases /etc/postfix/aliases postalias /etc/postfix/aliases ==== Integración con OpenLDAP ==== Para que Postfix utilice las cuentas que se creen virtualmente mediante OpenLDAP, crearemos un archivo para colocar la información de los alias: editor /etc/postfix/ldap-aliases.cf Como contenido de este archivo utilizaremos esto: server_host = ldap.midominio.org search_base = dc=midominio,dc=org start_tls = yes version = 3 Finalmente, refrescamos la base de datos de los alias: newaliases