Exim (EXperimental Internet Mailer) es un agente de transporte de correo (Mail Transport Agent, usualmente MTA) desarrollado por la Universidad de Cambridge y puede ser utilizado en la mayoría de los sistemas Unix (entre ellos GNU/Linux). Si bien puede compilarse en sistemas operativos Windows, se recomienda que sea utilizado en producción sobre sistemas operativos de la familia Unix.
Se distribuye sin costo bajo la licencia GNU GPL por lo que es, además, software libre.
En este post vamos a instalar un servidor de correo basado en Exim, MySQL, Cyrus-Imapd y Horde. El sistema será capaz de dar servicio HTTP, HTTPS, SMTP, TLS, SMTP-AUTH, IMAP, y clientes POP3, además de ser capaz de alojar y gestionar más de un dominio en el sistema.
El cliente de webmail IMP provee un potente interfaz con libreta de direcciones, calendario, y la habilidad de resetear las contraseñas, todo con un gran sistema de configuración, y la posibilidad de modificar la aparencia de la interfaz.
Lo primero que debemos de hacer es actualizar el sistema (opcional).
yum update
Para instalar los paquetes y dependencias necesarias debemos usar el repo de RPMforge, para ello debemos de ejecutar el siguiente comando.
rpm -Uhv http://apt.sw.be/redhat/el5/en/i386/rpmforge/RPMS/ rpmforge-release-0.3.6-1.el5.rf.i386.rpm
Lo mejor es dejar el repositorio desactivado y simplemente llamarlo cuando sea necesario. Esta operación la realizamos para que los paquetes que existan en los repositorios originales no sean “machacados” por los de RPMforge.
En mi caso la ruta es la siguiente: vim /etc/yum.repos.d/rpmforge.repo Aunque también es posible encontrar el fichero en la siguiente ruta: vi /etc/yum.d/rpmforge.repo
Una vez que estamos dentro del fichero tenemos que cambiar la linea que ponga enabled=1 por enabled=0
Debemos de instalar Apache con todos los servicios y dependencias necesarios para entrelazar los diferentes servicios y servidores, si ha teneis instalado apache no pasa nada ya que no lo instalará de nuevo, aunque por si acaso os recomiendo que hagais una copia del fichero httpd.conf. Aunque si quereis eliminais del comando apache.
yum install httpd php php-mysql php-xml php-imap php-mbstring php-mcrypt \ php-pecl-Fileinfo php-pear-DB php-pear-File php-pear-Log php-pear-Mail-Mime \ php-pear-Auth-SASL php-pear-Date php-pear-HTTP-Request php-pear-Mail php-pear-Net-Sieve \ php-pear-Net-Socket php-pear-Net-SMTP openssl mod_ssl -y
Instalamos Exim y las dependencias necesarias.
yum install exim system-switch-mail -y
Si todavía no habeis instalado MySQL este es el momento
yum install mysql mysql-server -y
Ahora instalaremos el interfaz web Horde (servicio webmail) y los módulos necesarios.
yum install horde imp-h3 ingo-h3 turba-h3 kronolith-h3 -y wget ftp://ftp.horde.org/pub/passwd/passwd-h3-3.0.1.tar.gz tar xzvf passwd-h3-3.0.1.tar.gz -C /usr/share/horde mv /usr/share/horde/passwd-h3-3.0.1 /usr/share/horde/passwd
Ahora instalaremos Cyrus-Imapd y sus dependencias.
yum install db4-utils cyrus-imapd cyrus-imapd-perl cyrus-imapd-utils -
Es preferible instalar las versiones rpm ya que contienen numerosas mejoras frente a las que se incluyen en los repositorios de CentOS o RPMforge. En nuestro caso por facilidad y sencillez hemos optado por instalar las estandard.
Instalar Pam-MySQL
rpm -Uvh http://www.topdog-software.com/oss/pam_mysql/pam_mysql-0.7RC1-1.i386.rpm
Instalar ClamAV
yum --enablerepo=rpmforge install clamav clamav-db clamd -y
Instalar Spamassassin
yum install spamassassin -y
Configurar Apache
Ahora lo primero que debemos hacer es habilitar el VirtualHost de Apache editando su archivo de configuración y crear el DefaultVirtualHost.
vi /etc/httpd/conf/httpd.conf
NameVirtualHost *:80 <VirtualHost *:80> ServerAdmin webmaster@dominio.com </VirtualHost>
Creamos un VirtualHost para el Horde.
<VirtualHost *:80> Servername mail.dominio.com DocumentRoot /usr/share/horde ErrorLog logs/mail-error_log CustomLog logs/mail-access_log common </VirtualHost>
Tenemos habilitar las opciones de seguridad de Horde que se encuentran en su archivo de configuración.
vi /etc/httpd/conf.d/horde.conf
#Alias /horde /usr/share/horde <Directory /usr/share/horde> Options +FollowSymLinks php_admin_flag safe_mode off php_admin_flag magic_quotes_runtime off php_flag session.use_trans_sid off php_flag session.auto_start off php_admin_flag file_uploads on #php_admin_flag allow_url_fopen on php_value post_max_size 20M php_value upload_max_filesize 10M php_admin_value open_basedir "/usr/share/horde:/usr/share/horde/config:/usr/share/pear:/tmp" php_admin_flag register_globals off </Directory> <Directory /usr/share/horde/config> Order Deny,Allow Deny from all </Directory> <DirectoryMatch "^/usr/share/horde/(.*/)?(config|lib|locale|po|scripts|templates)/(.*)?"> Order Deny,Allow Deny from all </DirectoryMatch>
Y aumentar el limite de la menoria de PHP si fuera necesario.
vi /etc/php.ini
memory_limit = 64M
OPCIONAL: Ahora habilitaremos el Horde para que use SSL añadiendo las siguientes lineas al Default VirtualHost entre
Servername mail.dominio.com:443 DocumentRoot /usr/share/horde
Configurar Exim
Debemos cambiar el sistema de mail de MTA a Exim, para ello lo haremos con el siguiente comando.
system-switch-mail Y selectionamos exim
Antivirus / Seguridad
Debemos de configurar Exim para que revise los correos entrantes y salientes en busca de virus con ClamAV, por defecto esto suele estar activado pero por si acaso lo revisamos.
vi /etc/exim/exim.conf
av_scanner = clamd:/var/run/clamav/clamd.sock
Configurar las Listas Negras
Seguimos editando el fichero exim.conf, buscamos la línea acl_check_rcpt y justo debajo añadimos lo siguiente:
drop message = REJECTED because $sender_host_address is in a black list spamhaus.org dnslists = zen.spamhaus.org drop message = REJECTED because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text dnslists = bl.spamcop.net drop message = REJECTED because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text dnslists = dnsbl.sorbs.net
Anti-Spam
Si deseamos rechazar los mensajes de aquellos servidores que no tengan configurado correctamente las DNS inversas, seguidamente de las líneas anteriores añadimos lo siguiente:
drop message = REJECTED - We don't accept messages from hosts without reverse DNS log_message = No reverse DNS domains = ! lsearch;/etc/exim/checks_exempt_hosts !verify = reverse_host_lookup !verify = sender/callout=2m,defer_ok !condition = ${if eq{$sender_verify_failure}{}}
Si deseamos rechazar los mensajes de servidores que no respondan a las peticiones de HELO/EHLO debemos de añadir las siguientes líneas.
drop message = REFUSED - no HELO/EHLO greeting log_message = remote host did not present greeting condition = ${if def:sender_helo_name {false}{true}}
Limitamos la cantidad de conexiones al servidor añadiendo las siguentes líneas bajo acl_check_connect
deny ratelimit = 250 / 15m / strict message = You can only send $sender_rate per $sender_rate_period log_message = RATE: $sender_rate/$sender_rate_period (max $sender_rate_limit) accept
Detenemos los robots de spam que buscan en el servidor.
smtp_accept_max_nonmail = 30 smtp_max_unknown_commands = 1
No avisar a los tuneles.
pipelining_advertise_hosts =
Habilitamos las comprobaciones de Spamassassin
spamd_address = /var/run/spamassassin/spamd.sock
Rechazamos todos los mensajes con una puntuación de 6 (acl_check_data)
accept condition = ${if >={$message_size}{100000} {1}} add_header = X-Spam-Note: SpamAssassin run bypassed due to message size warn spam = nobody/defer_ok add_header = X-Spam-Flag: YES accept condition = ${if !def:spam_score_int {1}} add_header = X-Spam-Note: SpamAssassin invocation failed warn add_header = X-Spam-Score: $spam_score ($spam_bar)\n\ # X-Spam-Report: $spam_report drop condition = ${if >{$spam_score_int}{60} {1}} message = Your message scored $spam_score SpamAssassin point. Report follows:\n\ $spam_report
Enrutar Correo
Habilitamos el acceso a la Base de Datos MySQL
hide mysql_servers = localhost/horde/horde/hordepassword
Modificamos la ruta de entrega local a Cyrus verificando previamente que el usuario exista antes de entregar el correo. (exim.conf)
localuser: driver = accept local_parts = ${lookup mysql {SELECT REPLACE(user_uid,'${quote_mysql:@$domain}','') \ as user FROM horde_users WHERE user_uid='${quote_mysql:$local_part@$domain}'}{$value}} transport = local_delivery cannot_route_message = Unknown user
Creamos un transporte para entregar el correo a Cyrus a través de un socket lmpt
local_delivery: driver = lmtp socket = /var/lib/imap/socket/lmtp batch_max = 50 user = cyrus
Autenticación SMTP
Añadimos las siguientes líneas en la sección de authentication en /etc/exim/exim.conf
plain: driver = plaintext public_name = PLAIN server_prompts = : server_set_id = $2 server_condition = ${if saslauthd{{$2}{$3}{pop}}{1}{0}} server_advertise_condition = true login: driver = plaintext public_name = LOGIN server_prompts = "Username:: : Password::" server_condition = ${if saslauthd{{$1}{$2}{pop}}{1}{0}} server_set_id = $1 server_advertise_condition = true
Configurar MySQL
Deshabilitamos TCP Networking en la sección de MySQL.
vi /etc/my.cnf
skip-networking
Asignamos el password de root
/usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h your_host_name password 'new-password' -p
Configurar Horde
Editamos el archivo sql y cambiamos la password de MySQL para el usuario de Horde
cp /usr/share/horde/scripts/sql/create.mysql.sql . vi create.mysql.sql
REPLACE INTO user (host, user, password) VALUES ( 'localhost', 'horde', -- IMPORTANT: Change this password! PASSWORD('hordepassword') );
Creamos el usuario de Horde en MySQL
mysql -p < create.mysql.sql
Nos conectamos a MySQL
mysql -u root -pclave
Creamos las tablas para Turba (Libreta de Direcciones)
mysql -p horde < /usr/share/horde/turba/scripts/sql/turba_objects.mysql.sql
Creamos las tablas para Kronolith (Calendario)
mysql -p horde < /usr/share/horde/kronolith/scripts/sql/kronolith similares a la viagra.mysql.sql
Creamos la configuración base de Horde
vi /usr/share/horde/config/conf.php
Modificamos la configuración existente por la siguiente, podeis eliminar todas las líneas e insertar estas nuevas
$conf['debug_level'] = E_ALL; $conf['max_exec_time'] = 0; $conf['compress_pages'] = true; $conf['umask'] = 077; $conf['use_ssl'] = 2; $conf['server']['name'] = $_SERVER['SERVER_NAME']; $conf['server']['port'] = $_SERVER['SERVER_PORT']; $conf['session']['name'] = 'Horde'; $conf['session']['use_only_cookies'] = true; $conf['session']['cache_limiter'] = 'nocache'; $conf['session']['timeout'] = 0; $conf['cookie']['domain'] = $_SERVER['SERVER_NAME']; $conf['cookie']['path'] = '/'; $conf['sql']['username'] = 'horde'; $conf['sql']['password'] = 'hordepassword'; $conf['sql']['socket'] = '/var/lib/mysql/mysql.sock'; $conf['sql']['protocol'] = 'unix'; $conf['sql']['database'] = 'horde'; $conf['sql']['charset'] = 'iso-8859-1'; $conf['sql']['phptype'] = 'mysqli'; $conf['auth']['admins'] = array('Administrator', 'andrew@home.topdog-software.com'); $conf['auth']['checkip'] = true; $conf['auth']['checkbrowser'] = true; $conf['auth']['alternate_login'] = false; $conf['auth']['redirect_on_logout'] = false; $conf['auth']['params']['driverconfig'] = 'horde'; $conf['auth']['params']['table'] = 'horde_users'; $conf['auth']['params']['username_field'] = 'user_uid'; $conf['auth']['params']['password_field'] = 'user_pass'; $conf['auth']['params']['encryption'] = 'md5-hex'; $conf['auth']['params']['show_encryption'] = false; $conf['auth']['driver'] = 'sql'; $conf['signup']['allow'] = false; $conf['log']['priority'] = PEAR_LOG_NOTICE; $conf['log']['ident'] = 'HORDE'; $conf['log']['params'] = array(); $conf['log']['name'] = '/tmp/horde.log'; $conf['log']['params']['append'] = true; $conf['log']['type'] = 'file'; $conf['log']['enabled'] = true; $conf['log_accesskeys'] = false; $conf['prefs']['params']['driverconfig'] = 'horde'; $conf['prefs']['driver'] = 'sql'; $conf['datatree']['params']['driverconfig'] = 'horde'; $conf['datatree']['driver'] = 'sql'; $conf['group']['driver'] = 'datatree'; $conf['cache']['default_lifetime'] = 1800; $conf['cache']['params']['dir'] = Horde::getTempDir(); $conf['cache']['params']['gc'] = 86400; $conf['cache']['driver'] = 'file'; $conf['token']['driver'] = 'none'; $conf['mailer']['params']['auth'] = '0'; $conf['mailer']['type'] = 'smtp'; $conf['vfs']['params']['driverconfig'] = 'horde'; $conf['vfs']['type'] = 'sql'; $conf['sessionhandler']['params']['persistent'] = false; $conf['sessionhandler']['params']['rowlocking'] = true; $conf['sessionhandler']['params']['socket'] = '/var/lib/mysql/mysql.sock'; $conf['sessionhandler']['params']['protocol'] = 'unix'; $conf['sessionhandler']['params']['hostspec'] = 'localhost'; $conf['sessionhandler']['params']['username'] = 'horde'; $conf['sessionhandler']['params']['password'] = 'hordepassword'; $conf['sessionhandler']['params']['database'] = 'horde'; $conf['sessionhandler']['type'] = 'mysql'; $conf['problems']['email'] = 'webmaster@home.topdog-software.com'; $conf['problems']['maildomain'] = 'home.topdog-software.com'; $conf['problems']['tickets'] = false; $conf['menu']['apps'] = array(); $conf['menu']['always'] = true; $conf['menu']['links']['help'] = 'authenticated'; $conf['menu']['links']['help_about'] = true; $conf['menu']['links']['options'] = 'authenticated'; $conf['menu']['links']['problem'] = 'never'; $conf['menu']['links']['login'] = 'all'; $conf['menu']['links']['logout'] = 'authenticated'; $conf['hooks']['permsdenied'] = false; $conf['hooks']['username'] = false; $conf['hooks']['preauthenticate'] = false; $conf['hooks']['postauthenticate'] = false; $conf['hooks']['authldap'] = false; $conf['portal']['fixed_blocks'] = array(); $conf['accounts']['driver'] = 'null'; $conf['imsp']['enabled'] = false; $conf['kolab']['enabled'] = false;
Cambiamos las preferencias de Horde para hacer que Webmail sea la aplicación por defecto.
vi /usr/share/horde/config/prefs.php
Buscamos $_prefs[‘initial_application’] y modificamos el código para que sea igual que el que os dejo a continuación.
$_prefs['initial_application'] = array( 'value' => 'imp', 'locked' => true, 'shared' => true, 'type' => 'select', 'desc' => sprintf(_("What application should %s display after login?"), $GLOBALS['registry']->get('name')) );
Hacemos que Horde trabaje desde fuera del directorio raiz del servidor web.
vi /usr/share/horde/config/registry.php
Modificamos $this→applications[‘horde’] como sigue a continuación.
$this->applications['horde'] = array( 'fileroot' => dirname(__FILE__) . '/..', 'webroot' => '', 'initial_page' => 'login.php', 'name' => _("Horde"), 'status' => 'active', 'templates' => dirname(__FILE__) . '/../templates', 'provides' => 'horde' );
Configuración IMP
Crear la configuración base de IMP.
Creamos la configuración de servidores IMP. Eliminamos el resto.
vi /usr/share/horde/imp/config/servers.php
'localserver', 'server' => 'localhost', 'hordeauth' => 'full', 'protocol' => 'imap/notls', 'port' => 143, 'maildomain' => '', 'smtphost' => 'localhost', 'smtpport' => 25, 'realm' => '', 'preferred' => '', 'admin' => array( 'params' => array( 'login' => 'cyrus', 'password' => '', 'userhierarchy' => 'user.', 'protocol' => 'imap/notls', 'hostspec' => 'localhost', 'port' => 143 ) ), 'quota' => array( 'driver' => 'cyrus', 'params' => array(), ), 'acl' => array( 'driver' => 'rfc2086', ), );
Evitamos que la ventana de composición aparezca como una ventana emergente
vi /usr/share/horde/imp/config/prefs.php
Cambiamos la variable $_prefs[‘compose_window’] para que quede como sigue.
$_prefs['compose_popup'] = array( 'value' => 0, 'locked' => true, 'shared' => true, 'type' => 'checkbox', 'desc' => _("Compose messages in a separate window?"));
Configurar Kronolith
Crear el archivo de configuración base de Kronolith
vi /usr/share/horde/kronolith/config/conf.php
$conf['calendar']['params']['table'] = 'kronolith_events'; $conf['calendar']['params']['driverconfig'] = 'horde'; $conf['calendar']['driver'] = 'sql'; $conf['storage']['params']['table'] = 'kronolith_storage'; $conf['storage']['params']['driverconfig'] = 'horde'; $conf['storage']['driver'] = 'sql'; $conf['metadata']['keywords'] = false; $conf['reminder']['server_name'] = 'home.topdog-software.com'; $conf['reminder']['from_addr'] = 'postmaster@home.topdog-software.com'; $conf['autoshare']['shareperms'] = 'none'; $conf['menu']['print'] = true; $conf['menu']['import_export'] = true; $conf['menu']['apps'] = array('imp', 'ingo', 'kronolith', 'turba');
Configuración de Turba
Configuramos la configuración base de Turba.
vi /usr/share/horde/turba/config/conf.php
Configurar Ingo
Configurar la configuración base de Ingo.
vi /usr/share/horde/ingo/config/conf.php
Configurar el Backend de Ingo para usar timsieved. Eliminar el resto de Backends
vi /usr/share/horde/ingo/config/backends.php
'timsieved', 'preferred' => 'localhost', 'hordeauth' => 'full', 'params' => array( 'hostspec' => 'localhost', 'logintype' => 'PLAIN', 'usetls' => true, 'port' => 2000, 'scriptname' => 'ingo', ), 'script' => 'sieve', 'scriptparams' => array() );
Configurar Passwd
Configurar la configuración base de Passwd
vi /usr/share/horde/passwd/config/conf.php
Configurar el Backend de Passwd para usar la base de datos MySQL de Horde. Eliminar el resto.
vi /usr/share/horde/passwd/config/backends.php
'Horde Authentication', 'preferred' => '', 'password policy' => array( 'minLength' => 5, 'maxLength' => 8, 'maxSpace' => 0, 'minUpper' => 1, 'minLower' => 1, 'minNumeric' => 1, 'minSymbols' => 1 ), 'driver' => 'sql', 'params' => array_merge($conf['sql'], array('table' => 'horde_users', 'user_col' => 'user_uid', 'pass_col' => 'user_pass', 'show_encryption' => false)), );
Asegurar la instalación de Horde
chown apache:root -R /usr/share/horde/config chown apache:root -R /usr/share/horde/*/config chmod -R go-rwx /usr/share/horde/config chmod -R go-rwx /usr/share/horde/*/config chown -R root:root /usr/share/horde/scripts chown -R root:root /usr/share/horde/*/scripts chmod -R go-rwx /usr/share/horde/scripts chmod -R go-rwx /usr/share/horde/*/scripts chmod a-rwx /usr/share/horde/test.php chmod a-rwx /usr/share/horde/*/test.php find /usr/share/horde/ -iname readme -exec rm -f {} ; find /usr/share/horde/ -iname todo -exec rm -vf {} ; find /usr/share/horde/ -iname license -exec rm -vf {} ; find /usr/share/horde/ -iname copying -exec rm -vf {} ; find /usr/share/horde/ -iname docs -exec rm -vrf {} ;
Configurar Cyrus-imapd
El sistema de cyrus-imapd viene con el VirtualHosting activado, scripts, quota fijada a 10MB, auto creación y auto suscripción de los buzones con las carpetas, etc.
Crear el archivo e configuración.
vi /etc/imapd.conf
Crear la configuración con el siguiente contenido.
configdirectory: /var/lib/imap servername: TDS-IMAP/POP3 partition-default: /var/spool/imap virtdomains: on defaultdomain: localhost.localdomain admins: andrew@home.topdog-software.com postmaster: support@home.topdog-software.com quotawarn: 85 lmtp_over_quota_perm_failure: 1 lmtp_strict_quota: 1 autocreatequota: 10240 createonpost: 1 autocreateinboxfolders: sent-mail|drafts|spam|trash autosubscribeinboxfolders: sent-mail|drafts|spam|trash autocreate_sieve_script: /etc/default_sieve autocreate_sieve_compiledscript: /etc/default_sieve_script.bc sievedir: /var/lib/imap/sieve md5_dir: /var/lib/imap/md5 #sievenotifier: sms #sendsms: /usr/bin/mysmsprog sendmail: /usr/sbin/sendmail hashimapspool: true sasl_pwcheck_method: saslauthd sasl_mech_list: PLAIN allowplainwithouttls: 0 tls_cert_file: /etc/pki/cyrus-imapd/cyrus-imapd.pem tls_key_file: /etc/pki/cyrus-imapd/cyrus-imapd.pem tls_ca_file: /etc/pki/tls/certs/ca-bundle.crt loglevel: info
Crear el archivo.
START { # do not delete this entry! recover cmd="ctl_cyrusdb -r" # this is only necessary if using idled for IMAP IDLE idled cmd="idled" # replication # syncclient cmd="/usr/lib/cyrus-imapd/sync_client -r" } # UNIX sockets start with a slash and are put into /var/lib/imap/sockets SERVICES { # add or remove based on preferences imap cmd="imapd" listen="imap" prefork=1 proto=tcp maxchild=100 maxfds=1000 provide_uuid=1 # imaps cmd="imapd -s" listen="imaps" prefork=1 pop3 cmd="pop3d" listen="pop3" prefork=1 proto=tcp maxchild=100 maxfds=1000 provide_uuid=1 # pop3s cmd="pop3d -s" listen="pop3s" prefork=1 sieve cmd="timsieved" listen="localhost:sieve" prefork=0 proto=tcp maxfds=1000 provide_uuid=1 # these are only necessary if receiving/exporting usenet via NNTP # nntp cmd="nntpd" listen="nntp" prefork=3 # nntps cmd="nntpd -s" listen="nntps" prefork=1 #fud # fud cmd="fud" listen="fud" prefork=1 proto="udp" # at least one LMTP is required for delivery # lmtp cmd="lmtpd" listen="lmtp" prefork=0 lmtpunix cmd="lmtpd" listen="/var/lib/imap/socket/lmtp" prefork=1 maxfds=1000 provide_uuid=1 # this is only necessary if using notifications notify cmd="notifyd" listen="/var/lib/imap/socket/notify" proto="udp" prefork=1 # replication } EVENTS { # this is required checkpoint cmd="ctl_cyrusdb -c" period=30 maxfds=1000 # this is only necessary if using duplicate delivery suppression, # Sieve or NNTP delprune cmd="cyr_expire -E 3" at=0400 # this is only necessary if caching TLS sessions #tlsprune cmd="tls_prune" at=0400 squat cmd="squatter" period=30 }
Configurar Pam-mysql
Pam-mysql será usado para autenticar los servicios de Cyrus-imapd con la base de datos de MySQL.
Habilitar la configuración de los servicios realizando los siguientes cambios.
vi /etc/pam.d/imap
auth optional pam_mysql.so user=horde passwd=hordepassword =/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3 account required pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3
vi /etc/pam.d/pop
auth optional pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3 account required pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3
vi /etc/pam.d/sieve
auth optional pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3 account required pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3
vi /etc/pam.d/lmtp
vi /etc/pam.d/csync
auth optional pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3 account required pam_mysql.so user=horde passwd=hordepassword host=/var/lib/mysql/mysql.sock db=horde table=horde_users usercolumn=user_uid passwdcolumn=user_pass crypt=3
Configurar Saslauthd
Editar y modificar el siguiente archivo como sigue
vi /etc/sysconfig/saslauthd
SOCKETDIR=/var/run/saslauthd # Mechanism to use when checking passwords. Run "saslauthd -v" to get a list # of which mechanism your installation was compiled to use. MECH=pam # Additional flags to pass to saslauthd on the command line. See saslauthd(8) # for the list of accepted flags. FLAGS="-r -n 0 -c"
Configurar ClamAV
Añadir el usuario de ClamAV al grupo de Exim
usermod -G exim clamav
Cambiar la localización del socket y deshabilitar el TCP
vi /etc/clamd.conf
LocalSocket /var/run/clamav/clamd.socket #TCPSocket 3310 #TCPAddr 127.0.0.1
Instalar las firmas de seguridad
wget http://www.sanesecurity.co.uk/clamav/update_sanesecurity.txt -O /usr/local/bin/update_sanesecurity.sh chmod +x /usr/local/bin/update_sanesecurity.sh ln -s /usr/local/bin/update_sanesecurity.sh /etc/cron.hourly/ /usr/local/bin/update_sanesecurity.sh
Es posible que no podais ejecutar el comando wget sobre la url: http://www.sanesecurity.co.uk/clamav/update_sanesecurity.txt debido a que el servidor donde esta alojada la web bloquea el comando wget, si esto sucede acceder a la url: http://www.sanesecurity.co.uk/clamav/update_sanesecurity.txt copiar todo el contenido y pegarlo el fichero vim /usr/local/bin/update_sanesecurity.sh y después ejecutar el resto de comandos.
Habilitar el módulo local selinux para ClamAV. Crear el archivo clamdlocal.te y añadir el siguiente código.
module clamdlocal 1.0; require { type proc_t; type var_t; type sysctl_kernel_t; type var_spool_t; type clamd_t; class dir { write search read remove_name add_name }; class file { write getattr read lock create unlink }; } #============= clamd_t ============== allow clamd_t proc_t:file { read getattr }; allow clamd_t sysctl_kernel_t:dir search; allow clamd_t sysctl_kernel_t:file read; allow clamd_t var_spool_t:dir read; allow clamd_t var_spool_t:file { read getattr }; allow clamd_t var_t:dir { write read add_name remove_name }; allow clamd_t var_t:file { write getattr read lock create unlink };
Compilar y cargar el módulo.
checkmodule -M -m -o clamdlocal.mod clamdlocal.te semodule_package -o clamdlocal.pp -m clamdlocal.mod semodule -i clamdlocal.pp
Si al ejecutar el comando checkmodule -M -m -o clamdlocal.mod clamdlocal.te se os reproduce el error:
[root@javierandres etc]# checkmodule -M -m -o clamdlocal.mod clamdlocal.te -bash: checkmodule: command not found
Se debe a que no teneis instalado el comando checkmodules, para instalarlo teneis que instalar checkpolicy que contiene checkmodule.
yum install checkpolicy
Configurar Spamassassin
Modificar como sigue las opciones de inicio.
vi /etc/sysconfig/spamassassin
SPAMDOPTIONS=" -l -d -c -m5 -H -m 10 --socketpath=/var/run/spamassassin/spamd.sock --socketowner=exim"
Habilitar el módulo local spamd para spamassassin, crear el archivo spamdlocal.te y añadir lo siguiente.
module spamdlocal 1.0; require { type spamd_t; type spamd_var_run_t; class capability { fowner chown kill }; class sock_file { write create unlink getattr setattr }; } #============= spamd_t ============== allow spamd_t self:capability { fowner chown kill }; allow spamd_t spamd_var_run_t:sock_file { write create unlink getattr setattr };
Compilar e instalar el módulo.
checkmodule -M -m -o spamdlocal.mod spamdlocal.te semodule_package -o spamdlocal.pp -m spamdlocal.mod semodule -i spamdlocal.pp
Retoques finales, ya queda poco
Habilitar los servicios
chkconfig --level 234 exim on chkconfig --level 234 mysqld on chkconfig --level 234 spamassassin on chkconfig --level 234 clamd on chkconfig --level 234 httpd on chkconfig --level 234 saslauthd on chkconfig --level 234 cyrus-imapd on
service mysqld restart service saslauthd restart service spamassassin restart service clamd restart service exim restart service cyrus-imapd restart service httpd restart
Para crear el usuario Admin crear el archivo admin.sql y añadir el siguiente contenido.
USE horde; REPLACE INTO horde_users (user_uid,user_pass) VALUES ( 'usuario@dominio.com', -- Change this md5('verystrongpassword') );
Añadir el usuario a la base de datos.
mysql -p horde < admin.sql
Para el cortafuegos. Añadir las siguientes reglas.
vi /etc/sysconfig/iptables
*raw :PREROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] COMMIT *mangle :PREROUTING ACCEPT [0:0] :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] COMMIT *filter :FORWARD DROP [0:0] :INPUT DROP [0:0] :OUTPUT DROP [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m multiport -j ACCEPT --dports 80,443,25,110,143 -A INPUT -p icmp -m icmp -m limit --icmp-type 8 --limit 5/min -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -s 192.168.1.4 -j ACCEPT COMMIT
One Reply to “Instalar Exim en CentOS”
Podrias decirme que campos tienen que llevar las tablas, que se crean con estos Scripts “Creamos las tablas para Turba (Libreta de Direcciones)
mysql -p horde < /usr/share/horde/turba/scripts/sql/turba_objects.mysql.sql
Creamos las tablas para Kronolith (Calendario)
mysql -p horde < /usr/share/horde/kronolith/scripts/sql/kronolith.mysql.sql"
No se menciona en el post que campos deben tener