Documente Academic
Documente Profesional
Documente Cultură
# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
########################################################################
# Utilitarios
########################################################################
Antes de instalar algo debemos instalar los utilitarios básicos o herramientas que
necesitaremos para nuestro trabajo:
# apt-get install arj bzip2 cabextract cpio file gzip nomarch pax rar unrar
unzip zoo zip p7zip-full mc
########################################################################
# Grupo y usuario
########################################################################
Comenzamos con añadir el grupo de nuestros sistema de correo al que llamaré vmail:
########################################################################
# Soporte Web
########################################################################
Cambiar:
# a2enmod headers
Para evitar mostrar la version de Apache así como algún otro detalle importante a
cualquier atacante...
date.timezone = "America/Havana"
# /etc/init.d/apache2 restart
# touch /var/www/html/.htaccess
RewriteEngine On
# Redirect all HTTP traffic to HTTPS.
RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Esto hará que todo tráfico hacia nuestro sitio, sea con ssl.
<webmail.conf>
<VirtualHost *:443>
ServerName webmail.nauta.cu
ServerAdmin webmaster@localhost
DocumentRoot /usr/share/roundcube
<Directory /usr/share/roundcube>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
LogLevel info
ErrorLog ${APACHE_LOG_DIR}/webmail-error.log
CustomLog ${APACHE_LOG_DIR}/webmail-access.log combined
</VirtualHost>
</webmail.conf>
# a2ensite webmail.conf
MySQL
Editar/Agregar en /etc/mysql/my.cnf
max_connections = 100
max_user_connections = 100
query_cache_limit = 10M
query_cache_size = 64M
general_log_file = /var/log/mysql/mysql.log
general_log = 1
# mv /var/log/mysql.log /var/log/mysql/
# mv /var/log/mysql.err /var/log/mysql/
# /etc/init.d/mysql restart
Loguearnos en PHPMyAdmin.
########################################################################
# SASL
########################################################################
Como bien nos dice el instalador de saslauthd debe iniciar con el sistema por lo
que debemos
hacerlo en /etc/default/saslauthd
START=yes
Guardamos y salimos
Ahora debemos modificar la carpeta donde va a trabajar Postfix con SASL, hay que
hacerle algunos pequeños ajustes:
# mkdir -p /var/spool/postfix/var/run/saslauthd
# rm -rf /var/run/saslauthd
# ln -s /var/spool/postfix/var/run/saslauthd /var/run/saslauthd
Ahora bien, debemos crear el fichero para extraer las contraseñas encriptadas de la
base de datos con los datos del
usuario, contraseña, base de datos, tabla, la columna donde se encuentra el usuario
y la columna donde se encuentra
la contraseña.
# touch /etc/pam.d/smtp
<smtp>
</smtp>
Cada sentencia anterior debe ir en una sola línea. Es decir, el fichero smtp sólo
debe contener dos líneas.
Y reiniciamos SASL
# /etc/init.d/saslauthd restart
########################################################################
# PostfixAdmin
########################################################################
Directivas...
$CONF['configured'] = true;
$CONF['default_language'] = 'es';
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfix';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['quota'] = 'YES';
$CONF['quota_multiplier'] = '1048576';
Esta directiva se usa cuando aún no se tiene nombre de dominio así el postfixadmin
no
chequea el dominio de email del administrador que sea válido. Se usa para pruebas
solamente...
$CONF['emailcheck_resolve_domain']='YES';
$CONF['used_quotas'] = 'YES';
Esta directiva se usa desde Dovecot 1.2 o superior, si usted tiene dovecot >=1.1
poner a NO
$CONF['new_quota_table'] = 'YES';
En el navegador ir a http://ip_del_server/postfixadmin/
- Loguearnos con la info del administrador del sitio
- Lo primero es ir a "Lista de dominios/Nuevo dominio" y rellenar los datos
- Después ir a "Lista de direcciones virtuales/Añadir buzón" y rellenar los
datos
- Añadir cuantos buzones sean necesarios...
- Listo!
Seguridad:
Denegar el acceso al setup.php después de haberlo configurado totalmente
touch /usr/share/postfixadmin/.htaccess
<Files "setup.php">
deny from all
</Files>
########################################################################
# Roundcube
########################################################################
NOTA:
En caso de usar "*" en los password debemos editar la config y arreglar ese
detalle puesto que php nos genera
el caracter html para el * y cuando roundcube intenta conectarse a la base de
datos no va a poder
-
$config['plugins'] = array('password');
-
Ir a /usr/share/roundcube/plugins/password y renombrar config.inc.php.dist
-
# mv config.inc.php.dist config.inc.php
-
Editar:
$config['password_driver'] = 'sql';
$rcmail_config['password_db_dsn'] =
'mysql://postfix:contraseña_de_postfixdb@localhost/postfix';
$rcmail_config['password_query'] = 'UPDATE mailbox SET password=
%c,modified=NOW() WHERE username=%u LIMIT 1';
Ahora, cuando un usuario desee cambiarse el password solamente debe ir a
"Configuración/Contraseña", rellenar los
campos y listo.
########################################################################
# Dovecot
########################################################################
Dovecot antes nos creaba un certificado autofirmado válido por 10 años[ya NO].
Existe un script en /usr/share/dovecot llamado mkcert.sh
que se encarga de esa tarea, pero la primera vez que instalé Dovecot no sabía esto
y usé openssl directamente para crearlo:
# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout dovecot.pem
-out /etc/dovecot/dovecot.pem
Y después de completar toda la info que nos pide openssl para crear el certificado,
lo tendremos disponible en:
/etc/dovecot/dovecot.pem
# mkdir -p /var/log/dovecot/
# touch /var/log/dovecot/dovecot.log
# touch /var/log/dovecot/dovecot-info.log
# touch /var/log/dovecot/dovecot-deliver.log
# touch /var/log/dovecot/dovecot-debug.log
Doveconf genera una configuración bastante acertada, pero demasiado pobre, por lo
que hay que pasarle la mano
para que quede a nuestro gusto.
La configuración de Dovecot:
<dovecot.conf>
# 2.2.13: /etc/dovecot/dovecot.conf
# OS: Linux 3.16.0-4-amd64 x86_64 Debian 8.3 ext4
listen = *
protocols = imap pop3
login_log_format = %$: %s
login_log_format_elements = user=<%u> method=%m rip=%r lip=%l %c
deliver_log_format = msgid=%m: %$ : Subject: %s
mail_access_groups = vmail
mail_location = maildir:/home/vmail/%d/%n/Maildir:INDEX=/home/vmail/%d/
%n/Maildir
mail_log_prefix = "%Us(%u): "
maildir_stat_dirs = yes
log_path = /var/log/dovecot/dovecot.log
info_log_path = /var/log/dovecot/dovecot-info.log
log_timestamp = "%Y-%m-%d %H:%M:%S "
ssl = required
ssl_protocols = !SSLv2 !SSLv3
# Good bye SSLv3
ssl_cipher_list = ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-
SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-
GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-
ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-
SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-
RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-
SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-
SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-
SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-
RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/dovecot.pem
verbose_proctitle = no
verbose_ssl = no
mail_temp_dir = /tmp
disable_plaintext_auth = yes
auth_username_chars =
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@
auth_mechanisms = plain login
auth_verbose = no
auth_debug = no
auth_debug_passwords = no
auth_verbose_passwords = plain
# For debbugging purposes only, set to yes
mail_debug = no
debug_log_path = /var/log/dovecot/dovecot-debug.log
first_valid_gid = 2
first_valid_uid = 2
last_valid_gid = 5000
last_valid_uid = 5000
service imap-login {
inet_listener imap {
address = *
port = 143
}
inet_listener imaps {
address = *
port = 993
ssl = yes
}
service_count = 1
}
service imap {
process_limit = 512
vsz_limit = 1 G
}
service pop3-login {
inet_listener pop3 {
address = *
port = 110
}
inet_listener pop3s {
address = *
port = 995
}
service_count = 1
}
service pop3 {
process_limit = 512
vsz_limit = 1 G
}
service dict {
unix_listener dict {
mode = 0600
user = vmail
group = vmail
}
}
namespace {
type = private
separator = /
prefix =
#location defaults to mail_location.
inbox = yes
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
# Trash
mailbox Trash {
auto = subscribe
special_use = \Trash
}
# Junk
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Spam {
auto = no
special_use = \Junk
}
mailbox "Junk E-mail" {
auto = no
special_use = \Junk
}
# Archive
mailbox Archive {
auto = subscribe
special_use = \Archive
}
mailbox Archives {
auto = no
special_use = \Archive
}
}
protocol imap {
mail_max_userip_connections = 10
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins = $mail_plugins imap_quota imap_acl
imap_client_workarounds = tb-extra-mailbox-sep
}
protocol pop3 {
mail_max_userip_connections = 10
pop3_client_workarounds = outlook-no-nuls oe-ns-eoh
pop3_logout_format = top=%t/%p, retr=%r/%b, del=%d/%m, size=%s
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins = $mail_plugins
pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
auth_socket_path = /var/run/dovecot/auth-master
hostname = correo.nauta.cu
lda_mailbox_autocreate = yes
info_log_path = /var/log/dovecot/dovecot-deliver.log
log_path = /var/log/dovecot/dovecot.log
mail_plugin_dir = /usr/lib/dovecot/modules
mail_plugins = $mail_plugins
postmaster_address = postmaster@nauta.cu
sendmail_path = /usr/lib/sendmail
}
passdb {
driver = sql
args = /etc/dovecot/dovecot-sql.conf
}
service auth {
unix_listener /var/spool/postfix/private/dovecot-auth {
group = postfix
mode = 0660
user = postfix
}
unix_listener auth-master {
group = vmail
mode = 0660
user = vmail
}
user = root
}
userdb {
args = /etc/dovecot/dovecot-sql.conf
driver = sql
}
dict {
quotadict = mysql:/etc/dovecot/dovecot-quota.conf
}
quota_full_tempfail = yes
plugin {
quota = dict:User quota::proxy::quotadict
quota_rule = *:storage=10M:messages=1000
quota_rule2 = Trash:storage=+10%
service quota-warning {
executable = script /etc/dovecot/scripts/quota-warning.sh
user = vmail
unix_listener quota-warning {
user = vmail
}
}
</dovecot.conf>
<dovecot-sql.conf>
driver = mysql
connect = host=localhost dbname=db_name user=db_user
password=db_user_password
default_pass_scheme = md5-crypt
</dovecot-sql.conf>
Obtener la quota
<dovecot-quota.conf>
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
</dovecot-quota.conf>
<trash.conf>
1 Spam
2 Trash
</trash.conf>
########################################################################
# Postfix
########################################################################
smtpd_tls_dh1024_param_file = /etc/postfix/certs/dh_1024.pem
smtpd_tls_dh512_param_file = /etc/postfix/certs/dh_512.pem
# mkdir /etc/postfix/certs
# cd /etc/postfix/certs
# openssl req -x509 -nodes -days 3650 -newkey rsa:4096 -keyout postfix.pem
-out postfix.pem
# openssl gendh -out /etc/postfix/certs/dh_1024.pem -2 1024
# openssl gendh -out /etc/postfix/certs/dh_512.pem -2 512
# touch /etc/postfix/sasl/smtpd.conf
<smtpd.conf>
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
log_level: 7
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: password_usuario_mysql
sql_database: postfix
sql_select: select password from mailbox where username = '%u'
</smtpd.conf>
Y los permisos:
Como estamos instalando postfix contra mysql debemos crear los archivos que
vinculen a postfix con mysql
# mkdir -p /etc/postfix/sql
# cd /etc/postfix/sql/
# touch mysql_sender_login_maps.cf
Nota: Este fichero va a contener la query que chequea y evita la suplantación de
identidad
<mysql_sender_login_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
port = 3306
dbname = postfix
query = SELECT mailbox.username FROM mailbox,domain WHERE
mailbox.username='%s' AND mailbox.domain='%d' AND mailbox.domain=domain.domain AND
mailbox.active=1 AND domain.backupmx=0 AND domain.active=1
</mysql_sender_login_maps.cf>
# touch mysql_virtual_alias_domainaliases_maps.cf
Nota: Este fichero va a contener la query de los alias de dominio
<mysql_virtual_alias_domainaliases_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
dbname = postfix
query = SELECT goto FROM alias,alias_domain WHERE
alias_domain.alias_domain = '%d' AND alias.address=concat('%u', '@',
alias_domain.target_domain) AND alias.active = 1
</mysql_virtual_alias_domainaliases_maps.cf>
# touch mysql_virtual_alias_maps.cf
Nota: Este fichero va a contener la query de los alias de correo virtuales
<mysql_virtual_alias_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
dbname = postfix
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
</mysql_virtual_alias_maps.cf>
#touch mysql_virtual_domains_maps.cf
Nota: Este fichero va a contener la query de los dominios de correo virtuales
<mysql_virtual_domains_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
</mysql_virtual_domains_maps.cf>
# touch mysql_virtual_mailbox_domainaliases_maps.cf
Nota: Este fichero va a contener la query de los alias de buzón virtuales
<mysql_virtual_mailbox_domainaliases_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
dbname = postfix
query = SELECT maildir FROM mailbox, alias_domain WHERE
alias_domain.alias_domain = '%d' AND mailbox.username=concat('%u', '@',
alias_domain.target_domain ) AND mailbox.active = 1
</mysql_virtual_mailbox_domainaliases_maps.cf>
# touch mysql_virtual_mailbox_maps.cf
Nota: Este fichero va a contener la query de los buzones virtuales
<mysql_virtual_mailbox_maps.cf>
user = postfix
password = postfix_db_password
hosts = 127.0.0.1
dbname = postfix
query = SELECT maildir FROM mailbox, alias_domain WHERE
alias_domain.alias_domain = '%d' AND mailbox.username=concat('%u', '@',
alias_domain.target_domain ) AND mailbox.active = 1
</mysql_virtual_mailbox_maps.cf>
<main.cf>
###################################################
# Banner y configs aleatorias[GENERALES]
###################################################
biff = no
readme_directory = no
# Correos de error
bounce_template_file = /etc/postfix/warn/bounce.msg
###################################################
# Notificaciones [ESPECIFICO]
###################################################
###################################################
# Network Config [ESPECIFICO]
###################################################
mynetworks_style = subnet
# host
mynetworks = 127.0.0.0/8
inet_interfaces = all
inet_protocols = ipv4
# all -> for ipv4 & ipv6
###################################################
# Configuraciones del relayhost[ESPECIFICO]
###################################################
#relayhost =
###################################################
# Configuraciones del dominio[ESPECIFICO]
###################################################
mydomain = nauta.cu
myhostname = correo.$mydomain
myorigin = /etc/mailname
mydestination = $myorigin, $myhostname, localhost, localhost.$mydomain,
$myorigin
###################################################
# Configuracion de los usuarios virtuales@MySQL[ESPECIFICO]
###################################################
virtual_minimum_uid = 5000
virtual_mailbox_base = /home/vmail
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_transport = dovecot
virtual_alias_maps = mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
mysql:/etc/postfix/sql/mysql_virtual_alias_domainaliases_maps.cf
virtual_mailbox_domains =
mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
mysql:/etc/postfix/sql/mysql_virtual_mailbox_domainaliases_maps.cf
show_user_unknown_table_name = no
#NEW, testing
strict_rfc821_envelopes = yes
invalid_hostname_reject_code = 554
multi_recipient_bounce_reject_code = 554
non_fqdn_reject_code = 554
relay_domains_reject_code = 554
unknown_address_reject_code = 554
unknown_client_reject_code = 554
unknown_hostname_reject_code = 554
unknown_relay_recipient_reject_code = 554
unknown_virtual_alias_reject_code = 554
unknown_virtual_mailbox_reject_code = 554
unverified_recipient_reject_code = 554
unverified_sender_reject_code = 554
recipient_delimiter = +
enable_original_recipient = no
mailbox_size_limit = 0
message_size_limit = 1572864
# Dovecot
dovecot_destination_recipient_limit = 1
###################################################
# Chequeos de mensajes[ESPECIFICO] con RE
###################################################
body_checks = pcre:/etc/postfix/rules/body_checks,
regexp:/etc/postfix/rules/avchk, pcre:/etc/postfix/rules/avchkre
header_checks = pcre:/etc/postfix/rules/header_checks,
pcre:/etc/postfix/rules/headerchkmsg
mime_header_checks = pcre:/etc/postfix/rules/mime_header_checks
###################################################
# Parametros de seguridad SASL/TLS[GENERALES]
###################################################
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_sasl_auth_enable = no
smtpd_reject_unlisted_recipient = yes
smtpd_reject_unlisted_sender = yes
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_sasl_authenticated_header = yes
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/dovecot-auth
#smtpd_sasl_path = smtpd
smtpd_sasl_local_domain = nauta.cu
smtpd_sasl_security_options = noanonymous
#siempre poner esta proxima en no, puede dar errores con otras configs
smtpd_tls_auth_only = yes
smtpd_enforce_tls = yes
smtpd_use_tls = yes
smtp_use_tls = yes
smtp_enforce_tls = no
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 0
smtp_tls_loglevel = 0
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
############################################################################
# Config TLS/SSL protocols[ESPECIFICO]
############################################################################
smtpd_tls_CAfile = /etc/postfix/certs/postfix.pem
smtpd_tls_cert_file = /etc/postfix/certs/postfix.pem
smtpd_tls_key_file = /etc/postfix/certs/postfix.pem
tls_random_source = dev:/dev/urandom
###################################################
# Parametros de seguridad[GENERALES]
###################################################
# Disable the SMTP VRFY command. This stops some techniques used to
# harvest email addresses.
disable_vrfy_command = yes
###################################################
# EVITAR SUPLANTACION DE IDENTIDAD AL ENVIAR
###################################################
smtpd_sender_login_maps = mysql:/etc/postfix/sql/mysql_sender_login_maps.cf
###################################################
# Restricciones de envio[n/i]/recepcion/suplantacion
###################################################
###################################################
# Parametros de seguridad[RESTRICCIONES]
###################################################
smtpd_helo_required = yes
policy-spf_time_limit = 3600s
smtpd_data_restrictions = reject_unauth_pipelining,
reject_multi_recipient_bounce
smtpd_etrn_restrictions = reject
###################################################
# Configuracion de ID en los mensajes[ESPECIFICO]
###################################################
enable_long_queue_ids = yes
###################################################
# Configuracion de SMTP[GENERALES]
###################################################
smtp_mx_address_limit = 5
# from 0 to 5
smtp_connect_timeout = 30
smtp_helo_timeout = 60s
smtp_rcpt_timeout = 240s
smtp_quit_timeout = 240s
smtp_rset_timeout = 20s
###################################################
#
# Configuraciones de alias+mailman[ESPECIFICO]
#
###################################################
alias_maps = hash:/etc/aliases
#, hash:/var/lib/mailman/data/aliases
alias_database = hash:/etc/aliases
# Mailman
transport_maps = hash:/etc/postfix/transport
mailman_destination_recipient_limit = 1
owner_request_special = no
###################################################
#
# Otras configuraciones[ESPECIFICO]
#
###################################################
queue_directory = /var/spool/postfix
command_directory = /usr/sbin
daemon_directory = /usr/lib/postfix
data_directory = /var/lib/postfix
setgid_group = postdrop
mail_owner = postfix
default_privs = nobody
unknown_local_recipient_reject_code = 550
in_flow_delay = 1s
home_mailbox = Maildir/
mail_spool_directory = /var/spool/mail
# Debug
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
xxgdb $daemon_directory/$process_name $process_id & sleep 5
debug_peer_level = 1
debug_peer_list = $mynetworks
sendmail_path = /usr/sbin/sendmail
newaliases_path = /usr/bin/newaliases
mailq_path = /usr/bin/mailq
mailbox_command = /usr/lib/dovecot/deliver
</main.cf>
# Dovecot
dovecot unix - n n - - pipe
flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -d ${recipient}
# Mailman
mailman unix - n n - - pipe
flags=FR user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py
${nexthop} ${user}
# SPF
policy-spf unix - n n - - spawn
user=nobody argv=/usr/sbin/postfix-policyd-spf-perl
Al terminar todos los cambios en el server, reiniciar los servicios y revisar los
log para
chequear que todo está funcionando como debe ser...
# /etc/init.d/apache2 restart
# /etc/init.d/mysql restart
# /etc/init.d/saslauthd restart
# /etc/init.d/dovecot restart
# /etc/init.d/postfix restart