Cuando servicios como Yahoo!, GMail de Google o AOL Mail nos han defraudado y vendido nuestros datos, nos queda ahora confiar en servicios nuevos como OpenMailBox, ProtonMail o el conocido Tutanota. Pero si ni eso nos da confianza, podemos entonces crear nuestro propio servidor de correo electrónico, tomar las precauciones de seguridad necesarias y hechar a andar el servicios para uso personal o rentarlo a conocidos.
Este pequeño tutorial es útil para crear tu servidor de correo pero entre detalles, comandos, herramientas y demás, es un mundo completo de investigación que puede ayudarte a conocer mejor tu sistema. Entonces cuando termines de investigar y de construir tu servidor, puedes burlarte de tu agencia de espionaje favorita, o no...
De igual manera, esta es una recopilación personal de herramientas que pienso puedan ayudar a mejorar la seguridad del servidor, tal vez faltan o sobran, estaré equivocada o no.
Vamos entonces a empezar a configurar nuestro servidor de correo, encriptado, con SSH y un buen detector de spam. Necesitamos: Debian, experiencia o conocimientos básicos de Apache o Nginx, acceso a root, conexión a Internet.
También: Postfix, Dovecot, opendkim que implementa la autenticación DKIM, spamd para los malos, z-push para las notificaciones push. MySQL para almacenar información del usuario y dominios, nada invasivo para tu privacidad.
Si no sabes configurar un servidor básico lee esto: http://plusbryan.com/my-first-5-minutes-on-a-server-or-essential-security-for-linux-servers
Configurando DNS
Si tienes un dominio puedes empezar con esto. Crea un subdominio o usa el que tienes para el servidor. Ejemplo: denisse@cyberantigone.net
EncFS
Creamos una carpeta normal para el correo desencriptado y una carpeta cifrada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
$ apt-get install encfs mkdir /encrypted-mail /decrypted-mail chgrp mail /decrypted-mail/ chmod -R g+rw /decrypted-mail/ gpasswd -a mail fuse chgrp fuse /dev/fuse; chmod g+rw /dev/fuse root@li212-205:~# encfs /encrypted-mail /decrypted-mail -o --public Creating new encrypted volume. Please choose from one of the following options: enter "x" for expert configuration mode, enter "p" for pre-configured paranoia mode, anything else, or an empty line will select standard mode. ?> p Paranoia configuration selected. Configuration finished. The filesystem to be created has the following properties: Filesystem cipher: "ssl/aes", version 3:0:2 Filename encoding: "nameio/block", version 3:0:1 Key Size: 256 bits Block Size: 1024 bytes, including 8 byte MAC header Each file contains 8 byte header with unique IV data. Filenames encoded using IV chaining mode. File data IV is chained to filename IV. File holes passed through to ciphertext. -------------------------- WARNING -------------------------- The external initialization-vector chaining option has been enabled. This option disables the use of hard links on the filesystem. Without hard links, some programs may not work. The programs 'mutt' and 'procmail' are known to fail. For more information, please see the encfs mailing list. If you would like to choose another configuration setting, please press CTRL-C now to abort and start over. Now you will need to enter a password for your filesystem. You will need to remember this password, as there is absolutely no recovery mechanism. However, the password can be changed later using encfsctl. New Encfs Password: Verify Encfs Password: |
Postfix
Mostrará información sobre tu nombre de correo, como en mi caso: cyberantigone.net. Instalamos lo necesario:
apt-get install postfix postfix-mysql dovecot-core dovecot-imapd dovecot-mysql mysql-server dovecot-lmtpd
Y en unos minutos ya tenemos servidor, ahora configuramos la contraseña:
doveadm pw -s SHA512-CRYPT
Este comando crea una cadena rara que es tu contraseña.
Creamos tablas y datos con MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
mysqladmin -p create mailserver mysql -p mailserver mysql> GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1' IDENTIFIED BY 'mailuserpass'; mysql> FLUSH PRIVILEGES; mysql> CREATE TABLE `virtual_domains` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE TABLE `virtual_users` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `password` varchar(106) NOT NULL, `email` varchar(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> CREATE TABLE `virtual_aliases` ( `id` int(11) NOT NULL auto_increment, `domain_id` int(11) NOT NULL, `source` varchar(100) NOT NULL, `destination` varchar(100) NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; mysql> INSERT INTO `mailserver`.`virtual_domains` (`id` ,`name`) VALUES ('1', 'cyberantigone.net'); |
Y si queremos, agregamos otros dominios:
1 2 3 4 |
mysql> INSERT INTO `mailserver`.`virtual_users` (`id`, `domain_id`, `password` , `email`) VALUES ('1', '1', '$6$YOURPASSWORDHASH', 'otraDenisse@cyberantigone.net'); |
Vamonos, salimos del servicio con mysql > exit y ahora configuramos Posix:
cp /etc/postfix/main.cf /etc/postfix/main.cf.orig
nano /etc/postfix/main.cf
Comenta “TLS parameters”, y en su lugar escribe esto:
1 2 3 4 5 6 7 |
smtpd_tls_cert_file=/etc/ssl/certs/dovecot.pem smtpd_tls_key_file=/etc/ssl/private/dovecot.pem smtpd_use_tls=yes smtpd_tls_auth_only = yes smtp_tls_security_level = may smtp_tls_loglevel = 2 smtpd_tls_received_header = yes |
Debajo de los parametros de TLS pega esta plasta de texto:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination
Hay una linea asi: mydestination = localhost asegurate que dice localhost. Ya ahora, hasta abajo de todo el texto pega este código:
1 2 3 4 5 |
virtual_transport = lmtp:unix:private/dovecot-lmtp virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf local_recipient_maps = $virtual_mailbox_maps |
Básicamente hace que posix y mySQL se conozcan y salgan en una cita.
Ahora configuramos los tres archivos de arriba:
1 - nano /etc/postfix/mysql-virtual-mailbox-domains.cf
con esta información:
1 2 3 4 5 |
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_domains WHERE name='%s' |
2- nano /etc/postfix/mysql-virtual-mailbox-maps.cf:
1 2 3 4 5 |
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mailserver query = SELECT 1 FROM virtual_users WHERE email='%s' |
3 - nano /etc/postfix/mysql-virtual-alias-maps.cf:
1 2 3 4 5 |
user = mailuser password = mailuserpass hosts = 127.0.0.1 dbname = mailserver query = SELECT destination FROM virtual_aliases WHERE source='%s' |
Reinicia el servicio con: service restart postfix
Dovecot
Primero vamos a respaldar los ficheros de configuración:
1 2 3 4 5 6 |
cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig cp /etc/dovecot/dovecot-sql.conf.ext /etc/dovecot/dovecot-sql.conf.ext.orig cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig |
Editamos el primero: nano /etc/dovecot/dovecot.conf y escribimos al final protocols = imap para habilitar imap.
Siguiente: nano /etc/dovecot/conf.d/10-mail.conf con esta información:
1 2 3 |
mail_location = maildir:/decrypted-mail/%d/%n mail_privileged_group = mail first_valid_uid = 0 |
Ahora el archivo de autenticación: nano /etc/dovecot/conf.d/10-auth.conf
1 2 3 4 5 6 |
disable_plaintext_auth = yes auth_mechanisms = plain login #INSERT a hashtag in front of the following import. This separates your mail server's login from UNIX logins. #!include auth-system.conf.ext #REMOVE the hashtag in front of the following import. This points it at mysql for authentication. !include auth-sql.conf.ext |
Configuramos SQL: nano /etc/dovecot/conf.d/auth-sql.conf.ext
1 2 3 4 5 6 7 8 |
passdb { driver = sql args = /etc/dovecot/dovecot-sql.conf.ext } userdb { driver = static args = uid=mail gid=mail home=/decrypted-mail/%d/%n } |
Otro más: nano /etc/dovecot/dovecot-sql.conf.ext configuramos. Protegemos nuestro password con SHA512, suficientemente bueno para que la NSA se enoje un poco.
1 2 3 4 5 6 7 |
driver = mysql connect = host=127.0.0.1 dbname=mailserver user=mailuser password=mailuserpass default_pass_scheme = SHA512-CRYPT password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'; chown -R mail:dovecot /etc/dovecot chmod -R o-rwx /etc/dovecot |
Ahora : nano /etc/dovecot/conf.d/10-master.conf con esto forzamos a usar un socket seguro:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
service imap-login { inet_listener imap { port = 0 } … service pop3-login { inet_listener pop3 { port = 0 } ... service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { mode = 0666 group = postfix user = postfix } # Create inet listener only if you can't use the above UNIX socket #inet_listener lmtp { # Avoid making LMTP visible for the entire internet #address = #port = #} user=mail } |
Reemplazamos todo el contenido de los archivos “service auth” y “service auth-worker” con:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
service auth { # auth_socket_path points to this userdb socket by default. It's typically # used by dovecot-lda, doveadm, possibly imap process, etc. Its default # permissions make it readable only by root, but you may need to relax these # permissions. Users that have access to this socket are able to get a list # of all usernames and get results of everyone's userdb lookups. unix_listener /var/spool/postfix/private/auth { mode = 0666 user = postfix group = postfix } unix_listener auth-userdb { mode = 0600 user = mail #group = } # Postfix smtp-auth #unix_listener /var/spool/postfix/private/auth { # mode = 0666 #} # Auth process is run as this user. user = dovecot } service auth-worker { # Auth worker process is run as root by default, so that it can access # /etc/shadow. If this isn't necessary, the user should be changed to # $default_internal_user. user = mail } |
Y ahora creamos los certificados SSL:
openssl req -new -x509 -days 1000 -nodes -out "/etc/ssl/certs/dovecot.pem" -keyout "/etc/ssl/private/dovecot.pem
Y los configuramos:
1 2 3 4 |
nano /etc/dovecot/conf.d/10-ssl.conf ssl_cert = </etc/ssl/certs/dovecot.pem ssl_key = </etc/ssl/private/dovecot.pem ssl = required |
Reinciamos el servicio con: service dovecot restart
Hasta ahora hemos configurado lo más básico y basta para recibir y enviar correo electrónico (usando IMAP en el puerto 993). En la segunda parte vamos a implementar un filtro anti spam y varias cosas más.