Pues si, todavía siguen intentando ataques con diccionario para usuarios y contraseñas...
Así al menos he recordado que me quedaba por hacer una entrada sobre firewalls y otras defensas que poder implementar a nuestro servidor de correo.
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.sudo a2enconf phpmyadmin
sudo php5enmod mcrypt
sudo /etc/init.d/apache2 restart
sudo nano /etc/phpmyadmin/apache.conf
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 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á.
mkdir /opt/roundcube
cd /opt/roundcube
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
mv roundcubemail-1.1.3/* .
mv roundcubemail-1.1.3/.htaccess .
rmdir roundcubemail-1.1.3
rm roundcubemail-1.1.3-complete.tar.gz
chown -R www-data:www-data /opt/roundcube
mysql -u root -pCREATE DATABASE roundcubemail;
GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY 'TU_CONTRASEÑA_AQUI';
flush privileges;
quit;
mysql --defaults-file=/etc/mysql/debian.cnf roundcubemail < /opt/roundcube/SQL/mysql.initial.sql
cd /opt/roundcube/config
cp -pf config.inc.php.sample config.inc.php
nano config.inc.php
$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,
);
nano /etc/apache2/conf-available/roundcube.conf
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>
a2enconf roundcube
service apache2 reload
sudo apt-get install libsasl2-modules libsasl2-modules-sql libgsasl7 libauthen-sasl-cyrus-perl sasl2-bin libpam-mysqlSeguimos con su configuración. Lo primero que haremos es otorgar permisos a Postfix para hacer posible su comunicación con SASL:
sudo adduser postfix saslCreamos un directorio accesible desde el chroot de Postfix, para SASL.
sudo mkdir -p /var/spool/postfix/var/run/saslauthdAhora editamos el archivo de configuración de Postfix para habilitar las características de autenticación con SASL.
sudo nano /etc/postfix/main.cfDonde añadimos las lineas siguientes:
# Habilitamos SASLSin salir del archivo buscamos y comprobamos las siguientes lineas en busca de la autenticación SASL (Ya deberían estar correctamente si se a copiado de anteriores post de esta guia):
smtpd_sasl_auth_enable = yes
# Si tus clientes van a utilizar Outlook Express o más antiguos
# esto necesitará ser cambiado a yes
broken_sasl_auth_clients = no
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain =
# Añadimos permit_sasl_authenticated a las existentesSalimos y guardamos main.cf y nos vamos a configurar en modo de arranque de SASL.
# reglas de smtpd_sender_restrictions
smtpd_sender_restrictions = permit_sasl_authenticated, permit_mynetworks, warn_if_reject reject_non_fqdn_sender, reject_unknown_sender_domain, reject_unauth_pipelining, permit
# Añadimos permit_sasl_authenticated a las existentes
# reglas de smtpd_recipient_restrictions
smtpd_recipient_restrictions = reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_non_fqdn_recipient, reject_unknown_recipient_domain, reject_unauth_destination, check_policy_service inet:127.0.0.1:10023, permit
sudo nano /etc/default/saslauthdCambiamos lo siguiente:
START=yesLo siguiente es indicar a Postfix como trabajar con SASL
# Indicamos, en la última línea del fichero, el directorio de trabajo
# en el que creamos anteriormente dentro de spool de Postfix y
# añadimos -r para indicar que el domino es parte del nombre de usuario
OPTIONS="-r -c -m /var/spool/postfix/var/run/saslauthd"
sudo nano /etc/postfix/sasl/smtpd.confLo dejamos así:
pwcheck_method: saslauthdVamos a decirle al módulo PAM como autenticar al SMTP usando MySQL.
mech_list: plain login cram-md5 digest-md5
log_level: 7
allow_plaintext: true
auxprop_plugin: sql
sql_engine: mysql
sql_hostnames: 127.0.0.1
sql_user: mail
sql_passwd: mailPASS # Contraseña de tu usuario mail en MySQL
sql_database: maildb
sql_select: select crypt from users where id='%u@%r' and enabled = 1
sudo nano /etc/pam.d/smtp
# El siguiénte código ha de estar en dos líneas y hay que acordarse de sustiruir 'mailPASS' por nuestra contraseña del usuario mail en mySQL.
auth required pam_mysql.so user=mail passwd=mailPASS host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1Con esto hemos terminado la configuración de SASL en Postfix. Recomiendo poner a prueba su funcionamiento, mandando y recibiendo correo como se indica en el Anexo I pero estando atento a los registros de /var/log/mail.log , /var/log/mysql.log y /var/log/auth.log
account sufficient pam_mysql.so user=mail passwd=mailPASS host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1
IMAP_CAPABILITY="IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA AUTH=CRAM-MD5 AUTH=CRAM-SHA1 IDLE"Una vez realizada la configuración de SASL, reiniciamos los servicios afectados:
sudo /etc/init.d/saslauthd restart
sudo /etc/init.d/postfix restart
cd /etc/postfixEste comando nos servirá para generar una clave PEM encriptada con el algoritmo RSA de 2048 bits con una valided de casi 3 años, suficiente. Nos pedirá una serie de requisitos antes de hacerlo siendo estos; El código de el país (dos letras), estado o provincia, ciudad, compañía, nombre del dominio (FQDN) y e-mail. Lo anterior se puede dejar vacío o con valores por defecto pulsando intro, excepto el nombre del dominio para el que sirve la clave.
sudo openssl req -new -outform PEM -out postfix.cert -newkey rsa:2048 -nodes -keyout postfix.key -keyform PEM -days 999 -x509
sudo nano /etc/postfix/main.cfDonde cambiaremos las rutas y nos aseguraremos de que se use TLS:
smtpd_tls_cert_file=/etc/postfix/postfix.certAhora le toca al fichero master.cf donde buscaremos las líneas "smtps" y "submission" (el cual forzaremos también a usar TLS) asegurándonos que sean como sigue o cambiandolas en su defecto.
smtpd_tls_key_file=/etc/postfix/postfix.key
smtpd_use_tls=yes
submission inet n - n - - smtpdAhora seguimos con el otro certificado necesario; el de Courier. Como hemos hecho antes con Postfix, vamos a la carpeta de este y lo generamos:
-o smtpd_sasl_auth_enable=yes
# Si no quieres forzar a submission a utilizar únicamente TLS
# Añade un comentario a la siguiente línea
-o smtpd_tls_auth_only=yes
# -o smtpd_tls_security_level=encrypt
# -o header_checks=
# -o body_checks=<
-o smtpd_client_restrictions=permit_sasl_authenticated,reject_unauth_destination,reject
-o smtpd_sasl_security_options=noanonymous,noplaintext
-o smtpd_sasl_tls_security_options=noanonymous
# -o milter_macro_daemon_name=ORIGINATING<
smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_tls_auth_only=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sasl_security_options=noanonymous,noplaintext
-o smtpd_sasl_tls_security_options=noanonymous
# -o milter_macro_daemon_name=ORIGINATING
cd /etc/courierY editamos su configuración para forzar TLS/SSL e indicar la ruta del certificado:
sudo openssl req -x509 -newkey rsa:1024 -keyout imapd.pem -out imapd.pem -nodes -days 999
sudo nano /etc/courier/imapd-sslCambiando a lo siguiente:
TLS_CERTFILE=/etc/courier/imapd.pemHasta aquí ya hemos configurado por completo el servidor de correo, quedaría reiniciar los servicios con la nueva configuración y probarlo todo (Anexo 1). No es poca cosa... No obstante esta no va a ser la última entrada de la guía ya que para un correcto funcionamiento y una fácil administración hace falta hablar de PHPmyAdmin y crear usuarios y alias necesarios para el correo local etc. Además quiero incluir el cliente web SquirrelMail para proporcionar acceso IMAP/POP3 a los usuarios por medio de nuestra web.
IMAP_TLS_REQUIRED=1