Información blog

Linux, tutoriales, noticias, sistemas, redes y seguridad informática, entre otras cosas.

Mostrando entradas con la etiqueta Raspberry pi. Mostrar todas las entradas
Mostrando entradas con la etiqueta Raspberry pi. Mostrar todas las entradas

jueves, 6 de octubre de 2016

Creando un servidor RADIUS con FreeRadius

Las redes inalámbricas se han convertido en unos elementos indispensables en nuestro día a día gracias a la gran flexibilidad que nos ofrecen... Sin cables, sin estar atados a un lugar en concreto, estamos rodeados de dichas redes sin apenas darnos cuenta de ello, haciendo que la seguridad de éstas sea un elemento muy a tener en cuenta. Anteriormente ya he hablado sobre los peligros de conectarse a una red wifi sin contraseña pero... ¿Qué pasa con aquellas redes en las que hayamos puesto una contraseña cifrada? Existen numerosas medidas de seguridad para asegurarnos que no se conectan personajes indeseados tales como el uso de un cifrado robusto (actualmente el más seguro sería WPA2/AES), el filtrado de direcciones MAC, el ocultamiento del SSID... La combinación de estas medidas nos ofrece un buen nivel de seguridad pero si deseásemos ir un paso más allá y tener una seguridad todavía más robusta, la mejor opción de todas sería el optar por un servidor RADIUS, del cual voy a hablar hoy.

free_radius

RADIUS (Remote Authentication Dial In User Service) es un protocolo que sirve para autenticar y autorizar el acceso a una red. Dicho protocolo puede ser usado en cualquier entorno de red, pero es especialmente recomendando para redes wifi. Al usar dicho protocolo estaríamos enviando un usuario y contraseña a un servidor RADIUS, que tras comprobar si efectivamente las credenciales son correctas, nos autorizaría el acceso a la red y posibilitaría la obtención de IP, máscara de red, puerta de enlace, etc... Esto plasmado gráficamente sería algo como lo siguiente:

Diagrama_RADIUS

Esto ofrece como desventaja el hecho de que requiere un dispositivo que esté permanentemente encendido y conectado a la red, cosa que en un entorno empresarial puede ser sencillo, pero que en entornos domésticos no lo puede ser tanto y que lo que más se puede acercar sería una raspberry pi. Aún así, un dispositivo de tan reducidas dimensiones y características nos podría servir perfectamente como servidor RADIUS con lo que al ser una opción económica y viable, me centraré en instalar un servidor RADIUS en dicho dispositivo; en concreto en una Raspberry pi con Raspian 8 instalado; dicha instalación sería perfectamente válida en sistemas equiparables tales como Debian 8, con lo que en caso de no disponer de una raspberry, podéis probar este concepto sobre una Debian "corriente".

Para empezar es necesario tener instalado un entorno LAMP, pues para que este servidor funcione necesitaremos tener un servidor MySQL y ciertas librerías dependientes de LAMP... No haría falta tenerlo siquiera configurado, únicamente con tener instalados las paquetes sería necesario con lo que lo primero que habría que hacer antes de nada sería:

  1. apt-get update
  2. apt-get install apache2  mysql-server php5

Con los requisitos cumplidos, pasaríamos a instalar la herramienta que convertirá nuestra raspberry en un servidor RADIUS; herramienta que en este caso será FreeRadius. Además, para que FreeRadius se pueda comunicar con la base de datos MySQL, necesitaremos instalar el complemento freeradius-mysql, pues en caso contrario no podrá haber comunicación entre ambos y no podremos configurar el servidor RADIUS correctamente. Esto es tan sencillo como hacer:

  1. apt-get -y install freeradius && service freeradius start
  2. apt-get -y install freeradius-mysql

Con esto tendríamos los componentes instalados, pero ni mucho menos están configurados... Aquí veréis que a cada pequeño paso que vaya haciendo iré haciendo comprobaciones, esto se debe a que es muy fácil equivocarse, y en caso de ir comprobando poco a poco podremos encontrar mucho mejor la causa del problema, ya que si comprobamos que efectivamente funciona tras configurar todo, tendremos que revisar absolutamente todo punto por punto.

Lo primero que haremos será crear un pequeño usuario de prueba que usaremos para ver que, por lo menos podemos realizar la comprobación más básica; una comprobación a nivel local que hará que comprobemos que freeradius es capaz de funcionar con la configuración mínima. Para ello tendremos que editar el fichero /etc/freeradius/users y veremos que hay un usuario cuya información está completamente comentada (es decir que no existe dicho usuario). Simplemente habría que descomentar el nombre de usuario y su contraseña, además de cambiar dichos datos a nuestro gusto tal y como muestro en el siguiente ejemplo:

user_radius

Con esto hecho, tendríamos que reiniciar el servicio freeradius para aplicar los cambios:

service freeradius restart

Ahora llegaría el turno de hacer la primera prueba, que sería la más básica y la que menos probabilidades tiene de fallar; toda prueba se realizará mediante el comando radest que siempre tendría la siguiente estructura:

radtest usuario contraseña_usuario ip_de_origen puerto_servidor contraseña_servidor

Para este caso en concreto el comando sería ejecutado localmente (es decir a nivel de localhost) y sería el siguiente:

radtest radius radius 127.0.0.1 1812 testing123

El puerto de escucha siempre sería el 1812, ya sea haciendo pruebas a nivel local (localhost) o remoto. La contraseña del servidor, sería la contraseña que usaría el servidor RADIUS para hacer las pruebas en local, contraseña que por defecto sería testing123 y que no sería necesario cambiar al ser únicamente usada para las pruebas en localhost. La prueba nos tendría que devolver el siguiente mensaje:

autenticar_radtest

Toda prueba que se realice exitosamente tiene que terminar con el mensaje rad_recv: Access-Accept; en caso de que hiciésemos algo incorrecto, dicho mensaje sería rad_recv: Access-Reject, con lo que es muy importante prestar atención al mensaje final, pues dictaminará el resultado de la prueba.

Con la primera prueba pasada exitosamente, tocaría empezar a interactuar con la base de datos a nivel local... De momento hemos hecho una prueba con un usuario de prueba, pero ahora habría que empezar a crear usuarios reales en nuestra base de datos MySQL y ver si la comunicación entre FreeRadius y ésta se realiza exitosamente y si es capaz de validar nuestros usuarios como debe ser. Para ello lo primero que tendremos que hacer será preparar nuestro servicio RADIUS para que sea capaz de comunicarse con la base de datos; esto se consigue editando primero el fichero /etc/freeradius/sites-available/default y descomentando dos líneas en concreto dentro de dicho fichero, dos líneas llamadas sql que van precedidas por el caracter #; carácter que habría que eliminar. Esas líneas se encuentran debajo de las líneas "Authoritation Queries" y "Accounting queries"; para que os situéis mejor os dejo debajo una pequeña unión de dos capturas que muestran tanto una ubicación aproximada como el cómo tendrían que quedar (como veis, sql no está precedida por el caracter #):

sql_enable_radius

Ahora modificaríamos el usuario y contraseña por defecto usada en las conexiones SQL con el fin de evitar que algún fortificar un poco la seguridad. Esto se logra editando los parámetros login y password dentro del fichero /etc/freeradius/sql.conf; en mi caso por ejemplo he puesto las siguientes credenciales:

login_radius

Estas credenciales son ficticias y pueden ser cualquier otras, pero lo realmente importante es cambiar las credenciales de acceso por defecto.

Bien, ahora que tenemos la comunicación con la base de datos preparada, faltaría crear dicha base de datos y llenarla con las tablas y datos correspondientes... Esto puede parecer muy complicado, pero la instalación de freeradius-mysql incluye una serie de SQLs que acelerarán en gran medida dicha tarea, pues dichos SQLs crearán las tablas correspondientes en nuestra base de datos; tablas vacías, pero tablas al fin y al cabo. Comencemos entrando a MySQL... Esto realmente sencillo pues el comando sería:

mysql -u root -p

La contraseña sería aquella que nos habrán pedido introducir durante la instalación de mysql-server, no aquella que hemos puesto ahora en sql.conf, pues son credenciales completamente distintas con diferentes propósitos. Dentro de MySQL, el primer paso e indispensable sería la creación de la base de datos en cuestión... freeradius apunta por defecto a la base de datos radius, con lo que nosotros crearemos una base de datos con dicho nombre:

create database radius

La base de datos está creada, pero necesitamos que freeradius pueda acceder a ésta... Es por eso que necesitamos crear un usuario; un usuario con las mismas credenciales que las puestas antes es sql.conf y que tenga permisos para manejar la base de datos a su antojo. Esto se logra mediante estos dos comandos:

  1. create user ivan@localhost identified by "ivan";
  2. grant all on radius.* to ivan@localhost;

Allí donde pone ivan@ deberíamos poner el usuario puesto en el apartado login de sql.conf y en la sección identified by habría que poner la contraseña puesta en el dicho fichero. Es muy importante que la contraseña se encuentre entre comillas tal y como he puesto en el ejemplo. Con todos los preparativos de la base de datos listos, llegaría el turno de usarla e insertarle las nuevas tablas que se obtiene de un sql llamado schema.sql, alojado dentro de /etc/freeradius/sql/mysql/, junto con otros sqls que contienen otras tablas. Todo esto se logra tal que así:

  1. use radius;
  2. source schema.sql;

Esto creará un buen número de tablas vacías que podemos ver mediante el comando:

show tables;

La tabla que nos interesaría a nosotros en concreto sería la tabla radcheck, pues contiene el listado de usuarios que puede acceder al servidor RADIUS. La mejor forma de saber qué añadir aquí, es conociendo primero que campos tiene esta tabla.

describe radcheck

radcheck

Es importante tener en cuenta el significado de cada campo:

  • id: Identificador único que no tenemos necesidad de introducir pues es un valor numérico  incremental (1,2,3...).
  • username: Nombre de usuario.
  • attribute: Este campo SIEMPRE tiene que tener el valor 'password'. 
  • op: Este campo SIEMPRE tiene que tener el valor '=='.
  • value: Contraseña.

Teniendo estos conceptos claros, podemos preparar una query de inserción que añada una nueva línea a la tabla con los datos del nuevo usuario; por ejemplo:

INSERT INTO radcheck(username,attribute,op,value) VALUES('admin','password','==','admin');

Si la inserción es exitosa solamente tendríamos que salir.

exit

Con todo esto realizado, al haber hecho también varios cambios en freeradius, reiniciaremos el servicio freeradius de nuevo.

service freeradius restart

Ahora llegaría el turno de la segunda prueba, esta prueba comprobará si el usuario que hemos creado se puede autenticar correctamente en freeradius; esta prueba se haría en local, con lo que la prueba se parecerá bastante a la anterior con excepción del usuario.

radtest admin admin 127.0.0.1 1812 testing123

En caso de habernos dado un resultado exitoso podríamos continuar; en caso contrario tendríamos que volver a revisar los pasos realizados y ver en qué nos hemos podido equivocar. Como veis la única diferencia es que en este caso estaríamos autenticándonos con un usuario que hemos almacenado dentro de la base de datos sql.

Ahora quedaría un último paso, y es que esta autenticación pueda realizarse por equipos remotos... De nada sirve que preparemos todo esto si únicamente podemos autenticarnos a nivel local... Es por eso que tenemos que preparar freeradius para que los clientes remotos puedan interactuar con éste. Para ello lo primero que habría que hacer sería habilitar la autenticación de clientes remotos en freeradius, lo cual se hace descomentando (eliminando la #) la línea readclients=yes dentro del fichero /etc/freeradius/sql.conf. He aquí una captura de dicha sección:

read_clients

Además, cuando habilitamos la autenticación de clientes remotos, hacemos que la base de datos tenga que consultar qué clientes remotos pueden autenticarse, clientes que consulta dentro de la tabla nas. Desgraciadamente carecemos de dicha tabla en nuestra base de datos, de momento, con lo que lo primero que tendremos que hacer será crearla para después introducir datos en ésta. Para ello tendremos que entrar en la base de datos radius que hemos creado antes:

mysql -u root -p radius

Dentro de la base de datos habría que "importar" dos nuevos sqls: nas.sql y ippool.sql.

  1. source ippool.sql;
  2. source nas.sql;

Con estos nuevos sources, ahora tendremos que consultar la tabla nas, tal y como hemos hecho antes con radcheck, con el fin de saber qué campos tiene la susodicha.

describe nas;

tabla_nas

Los campos que nos interesarían serían:

  • id: Identificador único que no tenemos necesidad de introducir pues es un valor numérico  incremental (1,2,3...).
  • nasname: IP/hostname del cliente que se va a conectar desde el exterior al servidor radius y a través del cual se enviarán las credenciales de autenticación enviadas desde los equipos que se conecten a la red wifi. Esto generalmente será la IP del router, si bien para probar que funciona tenemos que poner la ip de nuestra raspberry, pues si nos conectamos desde una ip que no esté presente en la tabla y que no sea localhost, freeradius nos denegará cualquier interacción con él.
  • shortname: Un nombre descriptivo del cliente radius.
  • type: Este valor SIEMPRE será other.
  • secret: Clave que el cliente RADIUS (generalmente el router) tendrá que usar para autenticarse con el servidor RADIUS y ser capaz de transmitirle las peticiones de autenticación de aquellos que se van a conectar a la red inalámbrica.
A sabiendas de esto, podemos usar usar esta query para insertar una nueva línea válida en la tabla:

INSERT INTO nas (nasname, shortname, type, secret) VALUES ('192.168.1.5','test','other','radius');

En caso de ser una sentencia válida, podriamos salir de MySQL mediante:

exit

Una vez más tocaría reiniciar freeradius para aplicar los cambios que hemos realizado antes en el fichero sql.conf:

service freeradius restart

Ahora llegaría el turno de la prueba final, con la cual ya verificaremos que nuestro servicio freeradius es plenamente funcional tanto para autenticaciones internas como externas; la prueba se haría una vez más con radtest, pero variando la ip de origen y la contraseña de acceso para el servidor radius:

radtest admin admin 192.168.1.5 1812 radius

En caso de ser exitoso, ya tendríamos el servidor RADIUS preparado para recibir autenticaciones desde el exterior; únicamente tendríamos que añadir una nueva línea en la tabla nas que hiciese referencia a la ip del autentico cliente RADIUS (router) y configurar dicho cliente para que apuntase al servidor RADIUS en las tareas de autenticación, cuyo procedimiento variaría dependiendo del modelo y marca del router.

Espero que os haya resultado útil.

Saludos.

domingo, 21 de febrero de 2016

Cómo tener un DNS dinámico con Noip + Linux

En numerosas ocasiones deseamos crearnos un servidor dedicado para hacer pruebas o simplemente trastear con algunas cosas; dicho servidor puede ser desde un potente servidor con montaje en rack etc... (raro, pero hay gente para todo) hasta una raspberry pi. La cuestión está en que en muchas ocasiones deseamos acceder desde el exterior a dichos servidores, ya sea para seguir haciendo pruebas o simplemente descargarnos un archivo por ftp, y no podemos debido a que nuestros routers poseen ips dinámicas que cambian cada vez que son reiniciados, y desconocemos la ip actual del equipo. Dicho problema se puede solventar con facilidad mediante el uso de DNSs dinámicos

Un DNS dinámico, es simplemente un dominio cuya ip va actualizándose en función que el equipo que se asocie a dicho dominio cambie su ip pública. Esto permite que siempre se pueda acceder al equipo sin importar cuantas veces cambie de ip ya que nosotros simplemente tendremos que acceder al nombre del dominio; un concepto muy parecido al usado en la creación de servidores DNS, con la diferencia de que aquí la ip del dominio en cuestión va actualizándose de cuando en cuando.

DDNS

Lo primero que tenemos que hacer es escoger el servicio que nos hará de DNS dinámico... Hay muchísimos en el mercado; algunos de pago aunque muchos otros son gratuitos. La variedad es muy amplia y aquí uno tiene que ir valorando qué servicio puede ajustarse más a sus necesidades, ya sea por la confianza que le da el sitio, geolocalización, ventajas y desventajas, etc... Tras estar mirando varias alternativas por Internet, yo en mi caso en concreto me he decantado por Noip, pues se integra muy bien con Linux; la única desventaja es que los nombres de dominio gratuitos expiran en 30 días y hay que renovarlos, pero quitando eso por lo general no he tenido problemas.

Para ello lo primero que habría que hacer sería registrarse en la página Noip.com y añadir un nombre de dominio a nuestro gusto dentro de la gestión de nuestra cuenta.


El hostname se asociaría automáticamente a la ip pública desde la que hemos creado el host, pero claro, esta ip siempre sería la misma, con lo que tras reiniciar el router dicho asociamiento sería inválido. Para actualizar dicha ip necesitaríamos usar el cliente de actualización de ip otorgado por este servicio, el cual podemos descargar desde la consola (por si no contásemos con entorno gráfico en el cliente en cuestión) escribiendo la siguiente línea:

wget https://www.noip.com/client/linux/noip-duc-linux.tar.gz

El fichero estaría comprimido en formato tar.gz, con lo que para poder usarlo lo primero que habría que hacer sería descomprimirlo. Esto se realiza con este simple comando:

tar -xzf noip-duc-linux.tar.gz

Esto descomprimiría el archivo y crearía una carpeta denominada (en mi caso): noip-2.1.9-1. Esta carpeta posee una serie de ficheros que necesitaríamos compilar e instalar, lo cual se hace mediante una de las combinaciones más clásicas cuando hablamos de estos dos conceptos; la combinación de make y make install.

make && make install

Durante el proceso de instalación veremos que  nos pedirán tres datos fundamentales:
  • Nombre de la cuenta o e-mail.
  •  Contraseña.
  •  Intervalo de actualización de la ip pública. Por defecto son 30 minutos, pero se puede poner un intervalo menor. 
Con esto ya tendríamos nuestro DNS dinámico actualizando la ip periódicamente para que el hostname se asocie a la ip correcta; ahora faltaría configurar el router para que redireccionase el tráfico a dicho equipo, cosa que varía dependiendo del modelo del router; a dicho concepto se le denomina generalmente como port forwarding. ¡Eso sí, siempre que vayais a recurrir a cualquier tipo de redirección, nunca os olvidéis de establecer un buen cortafuegos!

Espero que os haya resultado útil.

Saludos.

martes, 22 de diciembre de 2015

Spotify casero con subsonic en raspian

Las herramientas de servicio de música digital se han puesto en auge durante los últimos años, herramientas entre las cuales siempre ha habido un claro ganador: spotify. Obviamente spotify tiene sus limitaciones y si bien no deja de ser una excelente herramienta, siempre cabe la posibilidad de que queramos nuestro propio servicio de música digital para uso propio. Hace relativamente poco mostré como poder stremear contenido multimedia gracias a VLC, pero en este caso, en vez de recurrir a dicha herramienta y a conocimientos de multicast, realizaremos algo más simple y que claramente está orientado hacia únicamente la música. Para ello existe una herramienta gratuita, que si bien tiene una versión premium con más funcionalidades, su funcionamiento básico puede satisfacer las necesidades de la mayoría de los usuarios: Subsonic

Subsonic_logo

Subsonic es una utilidad muy parecida a spotify que puede ser instalada en cualquier equipo o servidor; luego simplemente habría que almacenar la música en dicho dispositivo y podría ser accedida desde cualquier punto que tenga acceso a dicho dispositivo... Al ser algo que va a tener tendencia a estar largo tiempo encendido, es recomendable tener un dispositivo que sepamos que va a estar largo tiempo encendido... En este caso por ejemplo una raspberry pi (no importa que sea la 1 o la 2) puede satisfacer nuestras necesidades sin problemas, pues sus pequeñas dimensiones y su bajo consumo hace que sea muy factible tener un dispositivo de este tipo en casa. Concretamente me he centrado en el sistema operativo raspian, pues es el sistema más usado de todos en estos dispositivos. Aún así, esta utilidad también puede ser instalada en cualquier otro entorno sin problema alguno, siempre y cuando seamos conscientes de que éste tendrá que estar siempre encendido si queremos tener acceso "ilimitado" él.

Su instalación es extremadamente sencilla, pues únicamente requiere de dos cosas:

La primera sería el tener instalado el paquete openjdk-7-jre; pues sin dicho paquete no podríamos siquiera instalar el paquete. Afortunadamente el paquete está incluido en los repositorios oficiales del sistema, con lo que simplemente habría que escribir:

apt-get install openjdk-7-jre

El segundo consistiría en a la descarga del paquete referente a subsonic, aunque en este caso, éste no está incluido en repositorio alguno, con lo que habría que descargar éste desde la página oficial. El software en sí ya está preparado en un paquete únicamente habría que recurrir a dpkg para instalarlo; esto significa que el proceso de instalación del paquete subsonic  se reduce a dos pasos:

  1. wget http://subsonic.org/download/subsonic-5.3.deb
  2. dpkg -i subsonic-5.3.deb

Simple y efectivo... Aún así esto no es suficiente para que podamos disfrutar de nuestro servidor de música, ya que por defecto está configurado para trabajar con root, cosa insegura... Además aunque tenemos el servicio de música preparado, la carpeta con la que éste trabaja por defecto /var/music, no existe por defecto. Con lo que antes de usar la utilidad, es recomendable modificarla y prepararla para que esté todo a punto.

Lo primero y más importante es corregir el problema con root; pues es una grave falla de seguridad y puede causar problemas. Para ello habría que modificar el comportamiento por defecto de la aplicación subsonic; comportamiento que se especificaría en el fichero: /etc/default/subsonic. Allí existe un parámetro llamado SUBSONIC_USER el cual está establecido por defecto como root; dicho valor tendría que ser cambiado para mejorar la seguridad, valor al que le tendríamos que asignar cualquier otro usuario, como por ejemplo ivan dejándolo de la siguiente forma:

SUBSONIC_USER=ivan

Por otro lado, el puerto de escucha por defecto de subsonic es el 4040; cosa problemática ya que los usuarios que NO son root únicamente puede acceder a los puertos inferiores al 1024; con lo que para poder acceder a subsonic tendremos que darle a la carpeta de éste permisos de escritura.

chmod +w -R /usr/share/subsonic/

Por otro lado, habría que crear la carpeta que contendrá los archivos de música; carpeta que subsonic por defecto considera que es /var/music. Además dicha carpeta tiene que pertenecer, obviamente, al mismo usuario que el que hemos asignado en /etc/default/subsonic. Esto lo lograremos mediante estos dos comandos:

  1. mkdir /var/music
  2. chown ivan:ivan /var/music/

Por último, pero no menos importante, habría que reiniciar subsonic, pues ahora mismo sigue estando configurado para funcionar con root, cosa que no cambiará hasta que el servicio se reinicie. Esto es tan sencillo como escribir:

sudo service subsonic restart

Con esto ya tendríamos un servidor de música muy sencillo pero funcional. Si se quisiese acceder a éste desde la red local únicamente habría que escribir en el navegador web la ip _del_servidor:4040; por ejemplo:

192.168.1.5:4040

Mientras que si se desease acceder desde el exterior sería necesario recurrir a un port forwarding en el router; también conocido como redirección de puertos.

Espero que os haya resultado útil.

Saludos.

sábado, 4 de julio de 2015

Cómo configurar un servidor de correo en Raspian

En esta ocasión vengo a hablaros sobre un proceso muy interesante, pero al mismo tiempo delicado. Se trata de la creación y configuración de un servidor de correo en un sistema Linux. En mi caso en particular he optado en hacerlo en Raspian, pues en mi opinión representa un pequeño servidor "casero"¨que puede estar todo el día encendido gracias a su bajo consumo y rendimiento; y puede emular un servidor real a una muchísima menor escala. Aún así, he probado también a implantarlo sobre una máquina Debian y no he observado ningún problema, con lo que perfectamente puede aplicarse el contenido que voy a explicar a continuación en un sistema Debian "normal". Como aviso para aquellos que deseen hacer la prueba con un VPS (Virtual Private Server), os aviso que la mayoría tienen los puertos cerrados por defecto, con lo que probablemente tengáis poneros en contacto con los administradores del sitio para que os abran dichos puertos, los cuales son los: 993, 143 y 25.

Portada-correo

Para tener un servidor de correo funcional necesitaremos combinar dos herramientas; ambas muy populares entre los usuarios de Linux: Dovecot y Postfix. El primero haría de servidor IMAP, mientras que el otro haría la función de servidor SMTP. Ambas herramientas no están incluidas en Debian ni en Raspian, pero sí en sus repositorios con lo que habría que comenzar con la instalación de éstas mediante nuestro gran gestor de paquetes apt:

  1. apt-get install dovecot-imapd postfix

La instalación de dovecot es automática y no posee misterio alguno; Postfix en cambio sí que realiza un par de preguntas que es importante tener en cuenta. La primera pregunta hace referencia al tipo de servidor. Dependiendo de lo que se escoja, Postfix se encargará de realizar algunas configuraciones automáticas que se adaptarán a nuestras necesidades. El caso más común de todos, y el que nosotros usaremos, será el Sitio de Internet, pues sería lo equivalente a un servidor de correo que envía y recibe correos mediante SMTP.

Modo-correo

La segunda pregunta haría referencia al nombre de dominio que usaremos... Este dato equivaldría a el nombre que aparecería después del carácter '@', con lo que si por ejemplo quisiésemos que nuestro correo fuese usuario@raspmail.com, nuestro nombre de dominio sería raspmail, tal y como se muestra a continuación:

nombre-dominio

Con estas preguntas respondidas, la instalación de las ambas herramientas se podría dar por concluida, aunque obviamente no estaríamos preparados para enviar o recibir ningún correo, ya que de base ambas herramientas están preparadas para trabajar únicamente en local. Es por ello que habría que empezar con su configuración, empezando por el servidor IMAP, es decir, por dovecot.


Configurando dovecot

Si nuestro sistema no soporta IPv6 o lo tiene inhabilitado, dovecot será incapaz de funcionar. Eso es debido a que esta herramienta está configurada para funcionar bajo las arquitecturas ipv4 e ipv6 por defecto y cuando arranca está diseñado para aceptar a cualquier ip, sea cual sea su arquitectura. Para solucionar dicho error habría que dirigirse al fichero /etc/dovecot/dovecot.conf y modificar la línea en la que se muestra el parámetro listen.

La configuración por defecto sería esta:
  1. #listen = *, ::

Si queremos que funcione solo bajo IPv4, habría que modificarla de esta forma
  1. listen = *

Dovecot usa una configuración basada en pequeños módulos independientes con el fin de tener todo mejor dividido y poder gestionar cada apartado con mayor comodidad; también posee de un fichero de configuración principal, pero la cantidad de parámetros configurables dentro de éste son muy pocos y muy genéricos. Toda la información referente a esta herramienta se encuentra dentro de la ruta /etc/dovecot, y tal y como he dicho antes, su fichero principal, dovecot.conf, no nos es de gran utilidad (a menos que hayamos tenido el problema mencionado anteriormente), sino que los módulos de configuración presentes en la carpeta conf.d. Esta carpeta contiene muchos módulos, pero solo necesitaremos modificar unos pocos para tener un servidor IMAP completamente funcional.

El primer fichero importante es el 10-ssl.conf. Este fichero almacena los certificados SSL, los cuales son necesarios para realizar la conexión. Por fortuna, durante la instalación ya se instalan unos certificados generados de forma automática, pero se ha de tener en cuenta que estos certificados, aunque sólidos, tienen una validez de 10 años. Un tiempo más que considerable, pero que hay que tener en cuenta si se quisiese tener un servidor de correo "valido" durante más tiempo. La creación de unos certificados nuevos se desviarían por completo del propósito de este post, pero si que voy a resaltar las dos líneas que hacen referencia a dichos certificados por si en algún momento se deseasen cambiar:

  1. ssl_cert = </etc/dovecot/dovecot.pem
  2. ssl_key = </etc/dovecot/private/dovecot.pem

Por otro lado tendríamos el fichero de configuración de los "buzones", llamado 10-mail.conf. Este fichero posee configuración referente a todo lo relacionado a nuestro buzón, desde su ubicación a parámetros de optimización. El parámetro que, en mi opinión, es más interesante aquí es la localización del buzón. Eso es debido a que la localización que pone por defecto es muy genérica y aunque es perfectamente funcional, sería mejor poner algo que el usuario pudiese gestionar con mayor facilidad. Para ello habría que modificar el parámetro mail_location, el cual aparece entre las primeras líneas de configuración. Dicho parámetro especifica el directorio que almacena los mensajes, lo cual queda en manos del usuario, pero puede resultar ser una buena idea almacenar los mensajes en una carpeta llamada, por ejemplo, Maildir dentro del directorio personal de cada usuario. Esto haría que el parámetro en cuestión quedase de la siguiente forma:

  1. mail_location = maildir:~/Maildir


Es aconsejable que, para evitarnos dolores de cabeza, configuremos los "mailboxes" para que cuando queramos hacer cualquier prueba no tengamos problemas por falta de buzones. Para ello habría que acceder al fichero 15-mailboxes.conf, y modificar sus parámetros por defecto para crear y relacionar automáticamente todos los buzones. Eso haría que el contenido dicho fichero fuese este:

  1. # These mailboxes are widely used and could perhaps be created automatically:
  2.   mailbox Drafts {
  3.     auto=subscribe
  4.     special_use = \Drafts
  5.   }
  6.   mailbox Junk {
  7.     auto=subscribe
  8.     special_use = \Junk
  9.   }
  10.   mailbox Trash {
  11.     auto=subscribe
  12.     special_use = \Trash
  13.   }
  14.   mailbox Sent {
  15.     auto=subscribe
  16.     special_use = \Sent
  17.   }
  18.   mailbox "Sent Messages" {
  19.     auto=subscribe
  20.     special_use = \Sent
  21.   }

Además habría establecer la relación entre el servidor IMAP y SMTP, para que ambos se puedan comunicar entre sí y que el servidor SMTP se pueda autenticar con dovecot. Para ello habría que dirigirse al fichero 10-master.conf y habilitar la autenticación SMTP desde postfix. Dicho parámetro se halla en la línea 96 y por defecto se encuentra comentado (es decir con # al principio), con lo que habría que descomentarlo para dejarlo con el siguiente aspecto:

  1. #   Postfix smtp-auth
  2.   unix_listener /var/spool/postfix/private/auth {
  3.     mode =0666
  4.   }

Con esta configuración ya tendríamos lo necesario para que nuestro servidor IMAP funcione, pero aunque tenemos todo configurado, carecemos de los buzones que almacenarán nuestros mensajes. Cada usuario debe de tener su propio buzón particular, lo que puede llegar a ser engorroso... Además es necesario configurar el sistema para que en caso de añadir un nuevo usuario, este posea su propio buzón... Para evitar dolores de cabeza, he aquí un pequeño script que nos ahorrará todas las molestias, al que he llamado buzon.sh:

  1. #!/bin/bash
  2. cat /etc/passwd |grep home |cut -d ":" -f 1 > /tmp/usuarios.txt
  3. while read USUARIO
  4. do
  5.         su - ${USUARIO} -c 'maildirmake.dovecot ~/Maildir'
  6. done < /tmp/usuarios.txt
  7. rm /tmp/usuarios.txt
  8. maildirmake.dovecot /etc/skel/Maildir

Ahora sí. Dovecot se encuentra listo para ser completamente funcional. Únicamente habría que aplicar los cambios mediante el comando:

  1. /etc/init.d/dovecot restart


Configurando postfix

Con dovecot operativo, nos faltaría configurar postfix para que funcione correctamente. A diferencia de dovectot, en postfix, la mayoría de la configuración se almacena en un solo fichero; este fichero se llama main.cf, y se almacena en el fichero /etc/dovecot/.´En este fichero no sólo habrá que modificar algunos parámetros existentes, sino que también habrán que añadir algunos más.

Comenzaremos con dos aspectos fundamentales; las ips de escucha y las redes de confianza. El primer parámetro no aparece representado y es necesario añadirlo, ya que por defecto solamente está escuchando en la ip 127.0.0.1; Para ello habría que añadir el parámetro inet_interfaces de la siguiente forma:

  1. inet_interfaces = 127.0.0.1, 192.168.1.5

Además habría que modificar el parámetro mynetworks, que hace referencia a las redes de confianza. De momento postfix solo confía en sí mismo; Habría que ampliarlo para que todas las ips de nuestra red de área local sean consideradas de confianza. En mi caso por ejemplo dicha ips serían aquellas dentro del rango 192.168.1.0 y 192.168.1.255, lo cual nos lleva a modificar el parámetro tal que así:

  1. mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.1.0/24

Aquí no es necesario eliminar toda referencia a ipv6, pues postfix se encarga de deshabilitar el soporte a ipv6 en caso de que el sistema no esté capacitado para soportar dicho tipo de ip. También es necesario especificar cual es el buzón que usaremos en postfix; buzón que debe de ser el mismo que el usado con dovecot, tal y como muestro a continuación con el parámetro home_mailbox, el cual no está definido por defecto, lo que significa que habría que añadir el susodicho:

  1. home_mailbox = Maildir/

De forma opcional, podemos definir también nuestros propios certificados SSL, al igual que con dovecot. Aún así, los certificados instalados por defecto son perfectamente válidos. Aún así, si quisiésemos usar otros certificados, los parámetros que habría que modificar serían estos dos:

  1. smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
  2. smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Por último, habría que añadir algunas directivas de seguridad; directivas que no están contempladas por defecto, pero que es importante poner si queremos tener al menos una seguridad básica. Obviamente habría que añadir más medidas de seguridad si se quisiese exponer el servidor a muchas personas; una combinación de fail2ban e iptables entre otras cosas. Eso no significa que debamos prescindir de estas medidas en caso de tener de un buen cortafuegos:

  1. smtpd_client_restrictions = permit_mynetworks,
  2.                             permit_sasl_authenticated,
  3.                             reject
  4. smtpd_recipient_restrictions = permit_mynetworks,
  5.                                permit_sasl_authenticated,
  6.                                reject_unauth_destination
  7. smtpd_helo_restrictions = reject_unknown_sender_domain
  8. smtpd_sender_restrictions = reject_unknown_sender_domain

Con todo esto especificado, simplemente habría que reiniciar postfix mediante el comando:

  1. /etc/init.d/postfix restart


Con esto ya tendríamos las bases de la creación de un servidor de correo en un entorno basado en Debian. A partir de aquí uno debería ver si por ejemplo desea darle un uso local o si en cambio prefiere mandar correos al exterior mediante un servidor SMTP externo; todo depende de las necesidades y gustos de cada uno.

Espero que os resulte útil.

Saludos.