miércoles, 7 de diciembre de 2016

domingo, 13 de diciembre de 2015

Próximamente...

¿Qué hacer cuando un haxor de pro toca los huevos a tu servidor un domingo por la tarde?
 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.

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.

sábado, 5 de diciembre de 2015

Bailando entre serpientes.

Pues eso, un poco de código para no oxidarse.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Dec  5 18:26:11 2015

@author: chaosnet
"""

def diccionario_fechas(separador, formato_meses, orden):
    """Devuelve un diccionario basado en combinaciones de fechas delimitado
    por un separador. Toma los parámetro 'separador' como cadena de texto entre
    los días, años y meses, 'formato_meses' con valor 'nombre, numero,
    m_abreviado, a_abreviado_nombre, a_abreviado_numero o t_abreviado' en
    función de como quieran representarse y 'orden' con las combinaciones de
    dma (dia, mes, año)"""

    diccio = []
    dias = [x for x in range(1, 32)]
    meses_nombre = ["enero", "febrero", "marzo", "abril", "mayo", "junio", "julio",
         "agosto", "septiembre", "octubre", "noviembre", "diciembre"]
    meses_numero = [x for x in range(1,13)]
    años = [x for x in range(1945, 2015)]
    años_abr = [x for x in range(10,100)]
    años09 = [x for x in range(0,10)]
    for p in años09:
        años_abr.append("0" + str(p))
       
       
    # Declaramos los casos del parámetro 'formato_meses'
    if formato_meses == "nombre":
        meses = meses_nombre
    elif formato_meses == "numero":
        meses = meses_numero
    elif formato_meses == "m_abreviado":
        meses = []
        for m in meses_nombre:
            meses.append(str(m[0:3:]))
    elif formato_meses == "a_abreviado_nombre":
        años = años_abr
        meses = meses_nombre
    elif formato_meses == "a_abreviado_numero":
        años = años_abr
        meses = meses_numero
    elif formato_meses == "t_abreviado":
        años = años_abr
        meses = []
        for m in meses_nombre:
            meses.append(str(m[0:3:]))       
    else:
        print("El parámetro 'formato_meses' a de ser 'nombre' o 'numero'")
        return None


    # Declaramos los casos del parámetro 'orden'
    if orden == "dma":
        a = dias
        b = meses
        c = años
    elif orden == "mad":
        a = meses
        b = años
        c = dias
    elif orden == "adm":
        a = años
        b = dias
        c = meses
    elif orden == "mda":
        a = meses
        b = dias
        c = años
    elif orden == "dam":
        a = dias
        b = años
        c = meses
    elif orden == "amd":
        a = años
        b = meses
        c = dias
    else:
        print("El parametro orden es incorrecto. Introduzca una cadena tipo 'dma' donde d es dias, m meses y a años.")
        return None

    # Concatenamos las cadenas generando el diccionario.
    for a1 in a:
        for b1 in b:
            for c1 in c:
                     diccio.append(str(a1) + separador + str(b1) + separador + str(c1))
    return diccio

# Aquí se define como actuará si se le llama como principal con argumentos de entrada   
if __name__ == '__main__':
    import sys
    if len(sys.argv) != 4:
        print("Error: Número de parámetros erroneo.")
        print("Utilización: {} 'separador' 'formato_meses' 'orden'.".format(sys.argv[0]))
        print(""" 'Formato_meses', meses y años (nombre, numero,
        m_abreviado, a_abreviado_nombre, a_abreviado_numero o t_abreviado)""")
        print(" 'Orden'. Combinaciones dia, mes, año (dma).")
    else:
        try:
            with open("diccionario_fechas.txt", "w") as fd:
                fd.write(" ".join(diccionario_fechas(sys.argv[1], sys.argv[2], sys.argv[3])))
                print("""Se ha creado el diccionario y ha sido guardado con el nombre de 'diccionario_fechas.txt'""")
        except IOError:
            print("""Algo falló al generar el fichero con la lista de palabras.
            Compruebe que tiene permisos de escritura en el directorio de trabajo actual""")



miércoles, 7 de octubre de 2015

Servidor Mail Seguro parte V

Asegurando nuestro servidor.

 En lo que llevamos de guía (MySQL parte I, Postfix parte II, Courier parte III, Chequeadores parte IV y pruebas Anexo I), deberíamos tener ya un servidor de correo perfectamente funcional y probado que utiliza usuarios virtuales gestionados por MySQL. Pero no hemos acabado aún con él. En este punto, la autenticación y los correos que se envían y reciben en el servidor viajan en texto plano. Esto quiere decir que en caso de que alguien espiara el proceso, podría obtener las calves o el contenido de los mensajes directamente. En este blog, naturalmente, no vamos a correr ese riesgo y vamos a implantar medidas para cifrar todo el contenido susceptible de ser interceptado por algún posible atacante.

SASL

 SASL cumplirá el papel de negociar, de manera externa a Postfix, los modos de autenticación de usuarios así como negociar su cifrado combinado con TLS.Empezamos instalándolo, así como sus librerías:
sudo apt-get install libsasl2-modules libsasl2-modules-sql libgsasl7 libauthen-sasl-cyrus-perl sasl2-bin libpam-mysql
 Seguimos con su configuración. Lo primero que haremos es otorgar permisos a Postfix para hacer posible su comunicación con SASL:
sudo adduser postfix sasl
 Creamos un directorio accesible desde el chroot de Postfix, para SASL.
sudo mkdir -p /var/spool/postfix/var/run/saslauthd
 Ahora editamos el archivo de configuración de Postfix para habilitar las características de autenticación con SASL.
sudo nano /etc/postfix/main.cf
 Donde añadimos las lineas siguientes:
# Habilitamos SASL
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 =
 Sin 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):
# Añadimos permit_sasl_authenticated a las existentes
# 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
 Salimos y guardamos main.cf y nos vamos a configurar en modo de arranque de SASL.
sudo nano /etc/default/saslauthd
  Cambiamos lo siguiente:
START=yes
# 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"
  Lo siguiente es indicar a Postfix como trabajar con SASL
sudo nano /etc/postfix/sasl/smtpd.conf
  Lo dejamos así:
pwcheck_method: saslauthd
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
  Vamos a decirle al módulo PAM como autenticar al SMTP usando MySQL.
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=1
account sufficient pam_mysql.so user=mail passwd=mailPASS host=127.0.0.1 db=maildb table=users usercolumn=id passwdcolumn=crypt crypt=1
  Con 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

 Configurar a SASL para escuchar en las autenticaciones IMAP es algo absurdo ya que la idea es forzar a los usuarios a transmitir los datos de Courier encriptados por TLS así que no voy a profundizar en el tema. Simplemente para los que quieran utilizarlo, hay que editar /etc/courier/imapd y añadir o reemplazar la siguiente linea:
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

TLS

TLS es el protocolo de encriptación que vamos a utilizar para transmitir los datos de nuestro servidor a traves de internet. Sin este protocolo de cifrado, tanto los mensajes como las credenciales de los usuarios se transmitirían a traves de la red en texto plano y legible por cualquier "mirón cotilla".

 En un principio, Ubuntu, crea para Postfix unos certificados que, si bien son úties en las pruebas y perfectamente funcionales, se recomienda cambiarlos por los nuestros a fin de dificultar su suplantación.

 Para generar nuestros certificados (Uno para Postfix y otro para Courier) nos drigimos primero al directorio del servicio y allí procedemos a generarlo.
cd /etc/postfix
sudo openssl req -new -outform PEM -out postfix.cert -newkey rsa:2048 -nodes -keyout postfix.key -keyform PEM -days 999 -x509
 Este 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.

El paso siguiente es indicar a Postfix que debe usar nuestros propios certificados y dónde encontrarlos. Para ello editamos su archivo de configuración:
sudo nano /etc/postfix/main.cf
 Donde cambiaremos las rutas y nos aseguraremos de que se use TLS:
smtpd_tls_cert_file=/etc/postfix/postfix.cert
smtpd_tls_key_file=/etc/postfix/postfix.key
smtpd_use_tls=yes
 Ahora 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.
submission inet n       -       n       -       -       smtpd
  -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
 Ahora seguimos con el otro certificado necesario; el de Courier. Como hemos hecho antes con Postfix, vamos a la carpeta de este y lo generamos:
cd /etc/courier
sudo openssl req -x509 -newkey rsa:1024 -keyout imapd.pem -out imapd.pem -nodes -days 999
 Y editamos su configuración para forzar TLS/SSL e indicar la ruta del certificado:
sudo nano /etc/courier/imapd-ssl
 Cambiando a lo siguiente:
TLS_CERTFILE=/etc/courier/imapd.pem
IMAP_TLS_REQUIRED=1
 Hasta 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.
 ¡Hasta otra!

viernes, 31 de julio de 2015

Privacidad en Android.

Después de cierto tiempo de parón, voy a recuperar la actividad de este blog hablando sobre cómo blindar nuestras comunicaciones desde tabletas o teléfonos Android, de una forma sencilla y sin necesidad de tener permisos "root" en nuestro terminal.
Que la privacidad debe de ser una lucha constante para aquellos que usamos de manera consciente la tecnología, es un hecho sobre el que no voy a profundizar en esta entrada pero, aún así, creo que después de ver las reiteradas acciones "legales" contra usuarios de Twitter (Operación Araña I, II y III), las nuevas enmiendas legales contra la libertad del usuario (Sinde, Ley Mordaza, etc...) que ilegalizan aquello que muchos hacemos en internet (ver películas o series, descargar contenido protegido o meramente informar), el uso no consentido o indebidamente informado de nuestros datos personales, gustos, horas de conexión, localización...  Todo ello hace que cada vez más, cualquier tipo de usuario de la red se preocupe por su privacidad y por quién podría estar interceptando sus comunicaciones.



Cifrando llamadas de voz, Redphone.

En primer lugar, voy a empezar dando una forma para el cifrado de llamadas de voz usando una aplicación. Redphone es un servicio de encriptación end-to-end para llamadas VoIP utilizando el protocolo ZRTP. Gracias a ello, siempre que tengamos una conexión a internet (ya sea por medio de wifi o con datos) tendremos la posibilidad de iniciar una llamada cifrada, imposible de escuchar por nadie más que nuestro interlocutor. Para instalarla en nuestro Android basta con buscar la app en Google Play Store o seguir este enlace desde nuestro terminal:
https://play.google.com/store/apps/details?id=org.thoughtcrime.redphone
Tras aceptar los permisos (Usa lo justo y necesario para poder funcionar) ya la tendremos instalada y podremos proceder a registrar nuestro número de teléfono en su primera ejecución. Tras comprobarlo con un SMS, la aplicación estará lista y gracias a una interfaz intuitiva nos permitirá fácilmente conversar con otro usuario de nuestra lista de contactos que también tenga instalado Redphone en su terminal. Si no lo tuviese, la aplicación nos dará la opción de enviarle un SMS a fin de que la instale.

Cifrando SMS, TextSecure.

Esta aplicación, TextSecure, es de los mismos creadores que la anterior; Open Whisper Systems. Se encarga de proporcionarnos un cifrado end-to-end para nuestros mensajes de texto cortos. Al igual que Redphone, nos pedirá el registro del número de teléfono tras su primera ejecución y solo podremos usarla con los contactos que también dispongan de ella.

Mensajería instantánea segura, ChatSecure.

ChatSecure se encarga de la privacidad de nuestros servicios de mensajería instantánea (Whatsapp es un ejemplo de mensajería instantánea) siempre y cuando usemos el protocolo XMPP. Tranquilidad, nuestra cuenta de Google posee de este servicio y al arrancar por primera vez, nos será fácil añadir nuestra cuenta junto a nuestros contactos. Es una aplicación intuitiva que utiliza cifrado OTR para preservar nuestras comunicaciones siempre que este esté disponible también para el receptor pero sin necesidad de que use la misma app. También tiene opciones de interacción con Orbot (Aplicación para usar la red TOR en Android que veremos más adelante) y es muy sencilla de utilizar.
Mas info: https://ssd.eff.org/es/module/c%C3%B3mo-instalar-y-utilizar-chatsecure

Utilizar VPN, Bitmask.

Lo primero aquí es tener claro qué es una VPN y en Surveillance Self-Defense lo explican bastante bien. Una vez tenemos claro ese punto, BitMask es una aplicación que facilita la conexión a una VPN de calyx.net, oblivia.vc o riseup.net. ¿Que no disponemos de ninguna? No hay problema ya que, una vez elegido el proveedor BitMask nos da la opción de registrarnos con un nombre de usuario y una contraseña.
Mas info: https://bitmask.net/es

TOR en Android, Orbot.

Para los que no tengan idea de lo que es la red TOR vengan por aquí. Para el resto, Orbot es una aplicación destinada a facilitar el uso de un proxy TOR para algunas o todas las aplicaciones de nuestro teléfono o tablet. De un modo eficaz, gestionará nuestras conexiones introduciéndolas en un circuito de routers TOR haciendo que nuestra IP sea, si no imposible, muy dificil de averiguar y proporcionándonos un alto nivel de anonimato en la red.
Mas info: http://hipertextual.com/archivo/2014/02/tor-android-orbot/

Como nota a todo esto, comentar que son aplicaciones que, para un uso efectivo, requieren ejecutarse en segundo plano a fin de que sigan activas después del bloqueo de la pantalla pudiendo así recibir mensajes o gestionar las conexiones. Permitir esto, en algunos dispositivos, requiere de matizar algún que otro ajuste que depende del terminal. Si la aplicación se cierra automáticamente, busca en internet como permitir la ejecución en segundo plano.

¡Saludos!

miércoles, 12 de noviembre de 2014

Servidor Mail Seguro parte IV

Chequeadores de contenido (Anti Spam & Anti Virus)

 Esta cuarta parte de la guía pretende instalar y configurar en nuestro servidor de correo (Que ya debería contar con MySQL para usuarios virtuales, Postfix como agente de correo y Courier como servicio de IMAP) el anti virus ClamAV, las medidas de protección contra spam SpamAssassin y Postgrey y la gestión e implementación en el servidor por parte de Amavisd.

Amavis:

 Vamos a empezar con Amavisd que permitirá interaccionar a nuestro agente de correo con las herramientas de seguridad dentro de nuestro servidor. Es decir, permitirá transportar el correo de un servicio a otro y canalizarlo después para dejarlo en nuestros buzones de correo.
sudo apt-get install amavisd-new
 La configuración por defecto en Ubuntu nos vale perfectamente así que nos limitaremos a leer su documentación para entender cómo funciona y echaremos un vistazo sus opciones predefinidas con un cat:
cd /etc/amavis/conf.d/
 En este directorio podemos ver archivo por archivo la configuración de Amavis pero en principio, nos valen los valores tal como están. Sólo uno de ellos será modificado:
sudo nano /etc/amavisd/50-user
 Añadimos antes de las 2 lineas finales:
@local_domains_acl = qw(.);
$log_level = 2;
$syslog_priority = 'debug';
$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
# $sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 8.0; # triggers spam evasive actions
# $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
$final_spam_destiny = D_PASS;
# $final_spam_destiny = D_REJECT; # default
# $final_spam_destiny = D_BOUNCE; # debian default
# $final_spam_destiny = D_DISCARD; # ubuntu default, recommended as sender is usually faked
 Ahora hemos de permitir a Amavis el acceso a los correos para que pueda chequearlos así que nos vamos a reconfigurar Postfix:
sudo nano /etc/postfix/master.cf
 Añadimos las siguientes líneas al final del archivo. Antes conviene asegurarse de que no estén ya presentes. ¡Ojo! Antes de las opciones -o existen dos espacios.
amavis  unix    -       -       -       -       2       smtp
  -o smtp_data_done_timeout=1200
  -o smtp_send_xforward_command=yes
  -o disable_dns_lookups=yes
  -o max_use=20

127.0.0.1:10025 inet n  -       -       -       -       smtpd
  -o content_filter=
  -o local_recipient_maps=
  -o relay_recipient_maps=
  -o smtpd_restriction_classes=
  -o smtpd_delay_reject=no
  -o smtpd_client_restrictions=permit_mynetworks,reject
  -o smtpd_helo_restrictions=
  -o smtpd_sender_restrictions=
  -o smtpd_recipient_restrictions=permit_mynetworks,reject
  -o smtpd_data_restrictions=reject_unauth_pipelining
  -o smtpd_end_of_data_restrictions=
  -o mynetworks=127.0.0.0/8
  -o smtpd_error_sleep_time=0
  -o smtpd_soft_error_limit=1001
  -o smtpd_hard_error_limit=1000
  -o smtpd_client_connection_count_limit=0
  -o smtpd_client_connection_rate_limit=0
  -o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
 En el mismo archivo buscamos el servicio pickup y añadimos dos líneas, quedándose así:
pickup    unix  n       -       -       60      1       pickup
  -o content_filter=
  -o receive_override_options=no_header_body_checks
 En el otro archivo de configuración de Postfix:
sudo nano /etc/postfix/main.cf
 Añadimos la siguiente línea:

content_filter = amavis:[127.0.0.1]:10024
 Con esta configuración Amavis debería poder tener acceso al correo. Antes de activar el anti virus y el anti spam deberíamos probar que realmente lo tiene. Primero reiniciamos el servicio con un sudo /etc/init.d/amavis restart Ahora hemos de enviar un correo al servidor y buscar en los logs que amavis cumple su función. Recomiendo seguir el Anexo I, en concreto la prueba para ver si Postfix recibe correo conectándonos por telnet y después comprobar syslog con un:
cat /var/log/syslog | grep 'amavisd-new, port 10024'

 Si aparece algún resultado, es que Amavis está recibiendo el correo para su chequeo. Si todo va bien, el paso siguiente es activar las opciones del anti virus y del anti spam en su configuración.
sudo nano /etc/amavis/conf.d/15-content_filter_mode

 Dónde quitaremos el comentario de las siguientes líneas dejándolo como sigue:
@bypass_virus_checks_maps = (
   \%bypass_virus_checks, \@bypass_virus_checks_acl, \$bypass_virus_checks_re);

@bypass_spam_checks_maps = (
   \%bypass_spam_checks, \@bypass_spam_checks_acl, \$bypass_spam_checks_re);
Si ya hemos hecho la comprobación de funcionamiento de Amavis y todo va como debe, podemos proceder a bajar el nivel de registro que alteramos anteriormente:
sudo nano /etc/amavis/conf.d/50-user
 El bloque de configuración que añadimos casi al final cambiará a éste:
@local_domains_acl = qw(.);
$log_level = 1;
$syslog_priority = 'info';
#$sa_tag_level_deflt = 2.0; # add spam info headers if at, or above that level
# $sa_tag2_level_deflt = 6.31; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 8.0; # triggers spam evasive actions
# $sa_dsn_cutoff_level = 10; # spam level beyond which a DSN is not sent
#$final_spam_destiny = D_PASS;
# $final_spam_destiny = D_REJECT; # default
# $final_spam_destiny = D_BOUNCE; # debian default
 $final_spam_destiny = D_DISCARD; # ubuntu default, recommended as sender is usually faked
 Hemos terminado con Amavis. Reiniciamos servicio y pasamos a lo siguiente:
sudo /etc/init.d/amavis restart

SpamAssassin:

 SpamAssassin, como su nombre indica, cumple la misión de identificar y eliminar gestionar por nosotros el correo no deseado. Procedemos a instalarlo con:
sudo apt-get install spamassassin spamc
 La configuración por defecto, una vez más, está bien para empezar y si no deseamos rompernos demasiado la cabeza, la dejaremos tal cual. No obstante, si alguien quiere ir más allá recomiendo un vistazo a su documentación y a la página web del proyecto que he enlazado arriba.
 Vamos a configurarlo para que arranque al inicio.
sudo nano /etc/default/spamassassin
 Dónde cambiamos ENABLED para dejarlo como sigue:

ENABLED=1

 

ClamAV:

 ClamAV será nuestro anti virus. Comprobará que nuestros correos estan limpios de malware y otras amenazas (Claro está, en la medida que puede hacerlo un anti virus). Instalamos:
sudo apt-get install clamav clamav-base libclamav6 clamav-daemon clamav-freshclam
 ClamAv tampoco necesitas grandes cambios. Podemos ver su configuración en /etc/clamav/ pero en principio será más por curiosidad. Freshclam en cambio quizá necesite un pequeño ajuste. Es el servicio que se encarga de la actualización de la base de datos de virus y por defecto viene configurado para hacerlo una vez cada hora (24 por día) lo cual es algo excesivo.
sudo dpkg-reconfigure clamav-freshclam
 Esta línea nos llevará a un asistente de configuración en el que podremos cambiar la tasa a 1 así como elegir un servidor cercano y definir las opciones de conexión.

 Si estamos animados y con ganas quizá interese usar el asistente de configuración de clam-base para definir opciones pero no es necesario:
sudo dpkg-reconfigure clamav-base
 Vamos a añadir el usuario clamav a Amavis para que pueda escanear los ficheros temporales.
sudo adduser clamav amavis
 Con esto está todo. Seguimos con Postgrey.

Postgrey:

Postgrey  es una pequeña herramienta que nos ayudará a evitar correo no deseado con el simple acto de retener los correos entrantes de remitentes no conocidos durante 5 minutos. Normalmente, los servidores de correo legítimo reintentarán mandar el correo unas cuantas veces antes de devolver un error, cosa que en un servidor de envío masivo de spam que genera de manera automática las direcciones de remite falsificadas o usa enormes listas de direcciones, no ocurrirá. Esto puede tener el inconveniente de que quizá ciertos correos de confirmación de alta o similares se retrasen un poco pero es un precio muy bajo por mantener lejos el spam.
sudo apt-get install postgrey
 Dejamos la configuración por defecto y nos vamos a Postfix para añadir normas de interacción con esta nueva herramienta:
sudo nano /etc/postfix/main.cf
 Y ahí buscamos la linea recipient_restrictions y la dejamos como sigue (Una única línea):
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
 Listo.

 Ahora disponemos de un servidor de correo electrónico avanzado que comprueba los correos en busca de amenazas o spam. No está mal, pero falta algo. A mi juicio lo más importante, el cifrado y la autenticación. En el siguiente post hablaremos sobre ello. Por ahora recomiendo comprobar que todo funciona como debe antes de seguir y dar tiempo a que venga el próximo...
¡Saludos!