martes, 8 de diciembre de 2015

Servidor Mail Seguro parte VI

Haciendo todo más "user-friendly":

 Como sabemos, los que hayan seguido esta guía, a estas alturas ya tenemos un servidor de correo electrónico perfectamente funcional, formado por varias capas que escuchan, reciben, redirigen, analizan, filtran, almacenan y envían e-mails de forma (si todo ha ido bien) segura y eficiente. Para quienes necesiten volver sobre otros posts o bien empezar por el principio, dejo aquí un pequeño índice con lo publicado hasta ahora.



- Servidor Mail Seguro parte I: Aquí aprendíamos a instalar y configurar una base de datos MySQL que nos servirá para almacenar datos de usuarios, dominios y alias virtuales. Creábamos el usuario, base de datos y tablas pertinentes para su posterior uso y os dejaba un enlace a un libro para profundizar en este lenguaje para bases de datos.

- Servidor Mail Seguro parte II: En este post instalábamos y configurábamos el MTA (Mail Transport Protocol) que se encarga de enviar y recibir el correo de nuestro servidor. Para este fin utilizábamos el programa Postfix y lo dejábamos listo para interactuar con MySql.

- Servidor Mail Seguro parte III: Seguíamos con el servicio encargado de permitir la interacción de los clientes externos de correo con el servidor; IMAP (Internet Message Access Protocol). Para ello instalábamos y preparábamos el programa Courier junto a su funcionalidad para MySQL y SSL.

- Servidor Mail Seguro parte IV: El modo de gestionar y filtrar el contenido de los correos que llegarán a nuestro servidor es crucial si nos preocupamos por la seguridad del mismo así como la de nuestros clientes. ClamAV, Spam Assassin y Postgrey son tres añadidos para proporcionar un control sobre esto, y junto con Amavis, que se encarga de la comunicación y gestión entre el MTA y los filtros, se explican en este post.

- Servidor Mail Seguro parte V: Para terminar lo que sería la parte mas imprescindible del proyecto, aquí explicaba la implementación de cifrados y capas de autenticación por medio de SASL y TLS.

- Servidor Mail Seguro anexo I: Es difícil, en esto de la administración de sistemas, lograr que un nuevo servicio funcione de manera correcta a la primera. Por ello, esta sección, se la dedicaba a la comprobación y los errores que podían ir surgiendo a lo largo de la guía.

 Entrando en el meollo del que quería tratar aquí, no estaría de más implementar algún añadido que facilitara la vida tanto a los usuarios como a los administradores.


 phpMyAdmin

Una de las cosas que facilitarán el uso de este servidor es phpMyAdmin. A la hora de gestionar nuestra base de datos, puede resultar algo complicado, al menos para los iniciados, hacer todas las tareas desde la línea de comandos. Es de agradecer este programa que, sirviéndose de PHP, se ejecuta en un servidor web y permite la administración de MySQL desde una interfaz gráfica y sencilla. Es obvio que para que todo esto funcione debemos de tener instalado también un servidor web, en esta guía utilizaremos Apache. Para instalarlo junto con phpMyAdmin en sistemas Debian/Ubuntu tecleamos lo siguiente:

sudo apt-get install phpmyadmin apache2 apache2-utils
 Aceptamos la creacción de la base de datos necesaria para phpmyadmin y damos la contraseña de superusuario (root) de MySQL que creamos en el primer apartado de la guia. La siguiente pantalla nos requerirá una nueva contraseña para el usuario phpmyadmin y tras la confirmación se nos preguntará que servidor web vamos a utilizar para proceder a la configuración automática, en nuestro caso apache2.
 Con esto quedará instalado y configurado nuestro administrador PHP, a flata de activarlo en la configuración de Apache, también vamos a activar el módulo mcrypt de PHP5 que cifrará las conexiones entre los distintos servicios. Para ello ejecutamos los siguiente comandos:

sudo a2enconf phpmyadmin
sudo php5enmod mcrypt
sudo /etc/init.d/apache2 restart

 Ahora, si abrimos un navegador y nos dirigimos a http://<dirección de nuestra máquina>/phpmyadmin aparecerá la página de bienvenida requiriéndonos las credenciales de acceso.
 Su uso es bastante intuitivo y no lo explicaré aquí. Si se requiere una guía, este enlace nos lleva a una página con documentación en castellano.
 No obstante aún no hemos terminado con la aplicación. Si nuestro servidor va a estar accesible desde internet, hemos de implementar un par de medidas de seguridad que protejan nuestro servidor de intentos de acceso no autorizados.
 Primero nos vendría bastante bien cambiar la dirección de phpMyAdmin a algo menos obvio que dificulte en cierta manera encontrar la aplicación en el servidor para alguien inexperto. Para ello entraremos en el fichero de configuración de apache /etc/phpmyadmin/apache.conf y, en el bloque referente al alias, cambiaremos /phpmyadmin por algo distinto y a la que tendremos que dirigirnos para entrar en la aplicación.

sudo nano /etc/phpmyadmin/apache.conf

Donde cambiamos a:

Alias /<loquesea> /usr/share/phpmyadmin
 El siguiente paso será añadir un nivel de autenticación adicional con .htaccess . Para ello vamos a editar el fichero de configuración del sitio en Apache:

sudo nano /etc/phpmyadmin/apache.conf

 Donde buscamos la sección:

<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php

 Y añadimos justo debajo la siguiente línea:

AllowOverride All

 Cerramos y guardamos el fichero para despues reiniciar Apache.

sudo /etc/init.d/apache2 restart

 Vamos a crear el fichero htaccess encargado de la configuración de acceso:


sudo nano /usr/share/phpmyadmin/.htaccess

 Donde escribiremos lo siguiente:


AuthType Basic
AuthName "Acceso restringido"
AuthUserFile /etc/phpmyadmin/.htpasswd
Require valid-user

 Aquí dejo una guía en profundidad sobre htaccess para aquellos que quieran saber más sobre el tema.
 Lo siguiente será crear un usuario con htpasswd:


sudo htpasswd -c /etc/phpmyadmin/.htpasswd <TU USUARIO>

 Se nos requerirá una contraseña para el nuevo usuario y las credenciales se guardarán cifradas en .htpasswd dentro de la carpeta de phpMyAdmin. Para añadir usuarios adicionales emplearemos el mismo comando pero sin el atributo -c.
 Ahora, si nos dirigimos con un navegador a phpMyAdmin (Acordarse de que le dimos un nuevo alias) se nos requerirá un usuario y contraseña para poder acceder a este.



Roundcube

 Roundcube es un agente de correo web, que permitirá a nuestros usuarios acceder y gestionar su correo por medio de nuestro servidor web. En un principio pensé en llevar a cabo esta tarea por medio de SquirrelMail pero su diseño, mayor soporte y  las ganas de probar algo nuevo me han llevado a elegir Roundcube para este fin. Para instalarlo en Ubuntu (Para Debian lo detallo más adelante) basta con:

 sudo apt-get install roundcube roundcube-mysql roundcube-plugins

 Nos preguntará si queremos configurar el acceso a la base de datos, elegimos que si y posteriormente que queremos hacerlo por MySQL. Nos preguntará por la contraseña de root de nuestra base de datos y luego por la que queramos elegir para el usuario roundcube que creará.

 
 En Debian:

Creamos directorio de instalación

mkdir /opt/roundcube
cd /opt/roundcube

Descargamos el paquete con wget y descomprimimos con tar:

wget https://downloads.sourceforge.net/project/roundcubemail/roundcubemail/1.1.3/roundcubemail-1.1.3-complete.tar.gz
tar xfz roundcubemail-1.1.3-complete.tar.gz

Movemos lo descomprimido a la carpeta creada y eliminamos el directorio rouncubemail-1.1.3 y el archivo comprimido.

mv roundcubemail-1.1.3/* .
mv roundcubemail-1.1.3/.htaccess .
rmdir roundcubemail-1.1.3
rm roundcubemail-1.1.3-complete.tar.gz

Cambiamos el propietario.

chown -R www-data:www-data /opt/roundcube

Ahora creamos la base de datos en mysql:

mysql -u root -p
CREATE DATABASE roundcubemail;
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'TU_CONTRASEÑA_AQUI';
flush privileges;
quit;

Importamos las tablas de RoundCube desde el archivo mysql.initial.sql hasta la nueva base de datos:


mysql --defaults-file=/etc/mysql/debian.cnf roundcubemail < /opt/roundcube/SQL/mysql.initial.sql

Entramos en la carpeta de configuración y copiamos el archivo de ejemplo para después editarlo:

cd /opt/roundcube/config
cp -pf config.inc.php.sample config.inc.php
nano config.inc.php

Buscamos la linea que se encarga de la base de datos, comienza por $config['dsnw']. Ponemos la contraseña que creamos para el usuario RoundCube en mysql dejándolo como sigue:

$config['db_dsnw'] = 'mysql://roundcube:TU_CONTRASEÑA_AQUI@localhost/roundcubemail';
Buscamos el siguiente parámetro: smtp_server y dejamos la linea así:

$config['smtp_server'] = 'localhost';

Para configurar nuestras conexiones por medio de ssl añadimos lo siguiente:

$config['default_host'] = 'ssl://<NOMBRE_DE_DOMINIO_DE_TU_CRT>';

$config['default_port'] = 993;

$config['imap_auth_type'] = PLAIN;

$config['imap_conn_options'] = array(
 'ssl'         => array(
     'verify_peer'       => false,
     'verfify_peer_name' => false,
);


Ahora le toca a Apache. Creamos el siguiente fichero en la carpeta conf-aviable:

nano /etc/apache2/conf-available/roundcube.conf

Con lo siguiente:

Alias /roundcube /opt/roundcube
Alias /webmail /opt/roundcube

<Directory /opt/roundcube>
 Options +FollowSymLinks
 # AddDefaultCharset UTF-8
 AddType text/x-component .htc

 <IfModule mod_php5.c>
 AddType application/x-httpd-php .php
 php_flag display_errors Off
 php_flag log_errors On
 # php_value error_log logs/errors
 php_value upload_max_filesize 10M
 php_value post_max_size 12M
 php_value memory_limit 64M
 php_flag zlib.output_compression Off
 php_flag magic_quotes_gpc Off
 php_flag magic_quotes_runtime Off
 php_flag zend.ze1_compatibility_mode Off
 php_flag suhosin.session.encrypt Off
 #php_value session.cookie_path /
 php_flag session.auto_start Off
 php_value session.gc_maxlifetime 21600
 php_value session.gc_divisor 500
 php_value session.gc_probability 1
 </IfModule>

 <IfModule mod_rewrite.c>
RewriteEngine On
 RewriteRule ^favicon\.ico$ skins/larry/images/favicon.ico
 # security rules:
 # - deny access to files not containing a dot or starting with a dot
 # in all locations except installer directory
 RewriteRule ^(?!installer)(\.?[^\.]+)$ - [F]
 # - deny access to some locations
 RewriteRule ^/?(\.git|\.tx|SQL|bin|config|logs|temp|tests|program\/(include|lib|localization|steps)) - [F]
 # - deny access to some documentation files
 RewriteRule /?(README\.md|composer\.json-dist|composer\.json|package\.xml)$ - [F]
</IfModule>

 <IfModule mod_deflate.c>
 SetOutputFilter DEFLATE
 </IfModule>

 <IfModule mod_expires.c>
 ExpiresActive On
 ExpiresDefault "access plus 1 month"
 </IfModule>
 FileETag MTime Size

 <IfModule mod_autoindex.c>
 Options -Indexes
 </ifModule>

 AllowOverride None
 Require all granted
</Directory>

<Directory /opt/roundcube/plugins/enigma/home>
 Options -FollowSymLinks
 AllowOverride None
 Require all denied
</Directory>

<Directory /opt/roundcube/config>
 Options -FollowSymLinks
 AllowOverride None
 Require all denied
</Directory>

<Directory /opt/roundcube/temp>
 Options -FollowSymLinks
 AllowOverride None
 Require all denied
</Directory>

<Directory /opt/roundcube/logs>
 Options -FollowSymLinks
 AllowOverride None
 Require all denied
</Directory>




Ahora podremos acceder al servicio con los dos Alias declarados al principio del archivo (webmail y roundcube) si guardamos, cargamos y reinicamos apache:



a2enconf roundcube
service apache2 reload


 Con esto doy por terminada esta sección. Quizá con el tiempo vaya agregando alguna que otra cosa al manual pero, de momento, si todo ha ido bien, ya tenemos cumplidos los objetivos marcados así que:
 Un saludo y hasta otra.

No hay comentarios:

Publicar un comentario