Servidor Perfecto · 13 min read · Oct 27, 2025
El Servidor Perfecto – CentOS 7 (Apache2, Dovecot, ISPConfig 3) - Página 2
10 Instalar Dovecot
Dovecot se puede instalar de la siguiente manera:
yum -y install dovecot dovecot-mysql dovecot-pigeonholeCrea un archivo vacío dovecot-sql.conf y un enlace simbólico:
touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.confAhora crea los enlaces de inicio del sistema y comienza Dovecot:
systemctl enable dovecot
systemctl start dovecot11 Instalar Postfix
Postfix se puede instalar de la siguiente manera:
yum -y install postfixLuego apaga Sendmail y comienza Postfix y Mariadb (MySQL):
systemctl enable mariadb.service
systemctl start mariadb.servicesystemctl stop sendmail.service
systemctl disable sendmail.service
systemctl enable postfix.service
systemctl restart postfix.serviceDeshabilitamos sendmail para asegurarnos de que no se inicie en caso de que esté instalado en tu servidor. Por lo tanto, el mensaje de error “Failed to issue method call: Unit sendmail.service not loaded.” se puede ignorar.
12 Instalar Getmail
Getmail se puede instalar de la siguiente manera:
yum -y install getmail13 Establecer Contraseñas de MySQL y Configurar phpMyAdmin
Establece contraseñas para la cuenta root de MySQL:
mysql_secure_installation[root@server1 tmp]# mysql_secure_installation
NOTA: ¡SE RECOMIENDA EJECUTAR TODAS LAS PARTES DE ESTE SCRIPT PARA TODOS LOS SERVIDORES MariaDB EN USO DE PRODUCCIÓN! ¡LEA CADA PASO CUIDADOSAMENTE!Para iniciar sesión en MariaDB y asegurarla, necesitaremos la contraseña actual para el usuario root. Si acabas de instalar MariaDB, y no has establecido la contraseña root aún, la contraseña estará en blanco, así que solo debes presionar enter aquí.Introduce la contraseña actual para root (presiona enter para ninguno):
OK, se utilizó la contraseña con éxito, continuando...Establecer la contraseña root asegura que nadie pueda iniciar sesión en el usuario root de MariaDB sin la autorización adecuada.
¿Establecer contraseña root? [Y/n] <-- ENTER
Nueva contraseña: <-- tucontraseñadeSQLroot
Reingresar nueva contraseña: <-- tucontraseñadeSQLroot
¡Contraseña actualizada con éxito!
Recargando tablas de privilegios..
... ¡Éxito!
Por defecto, una instalación de MariaDB tiene un usuario anónimo, permitiendo que cualquiera inicie sesión en MariaDB sin tener que tener una cuenta de usuario creada para ellos. Esto está destinado solo para pruebas, y para hacer que la instalación sea un poco más fluida. Debes eliminarlos antes de pasar a un entorno de producción.
¿Eliminar usuarios anónimos? [Y/n] <-- ENTER
... ¡Éxito!
Normalmente, root solo debería poder conectarse desde 'localhost'. Esto asegura que alguien no pueda adivinar la contraseña root desde la red.
¿Deshabilitar el inicio de sesión remoto de root? [Y/n] <-- ENTER
... ¡Éxito!
Por defecto, MariaDB viene con una base de datos llamada 'test' a la que cualquiera puede acceder. Esto también está destinado solo para pruebas, y debe ser eliminado antes de pasar a un entorno de producción.
¿Eliminar la base de datos de prueba y el acceso a ella? [Y/n] <-- ENTER
- Eliminando base de datos de prueba...
... ¡Éxito!
- Eliminando privilegios en la base de datos de prueba...
... ¡Éxito!
Recargar las tablas de privilegios asegurará que todos los cambios realizados hasta ahora surtan efecto de inmediato.
¿Recargar tablas de privilegios ahora? [Y/n] <-- ENTER
... ¡Éxito!
Limpiando...
¡Todo listo! Si has completado todos los pasos anteriores, tu instalación de MariaDB debería estar ahora segura.
¡Gracias por usar MariaDB!
[root@server1 tmp]#Ahora configuramos phpMyAdmin. Cambiamos la configuración de Apache para que phpMyAdmin permita conexiones no solo desde localhost (comentando las dos líneas “Require ip” y agregando la nueva línea “Require all granted” en el bloque
nano /etc/httpd/conf.d/phpMyAdmin.conf# phpMyAdmin - Navegador MySQL basado en web escrito en php
#
# Solo permite localhost por defecto
#
# Pero permitir phpMyAdmin a cualquiera que no sea localhost debe considerarse
# peligroso a menos que esté debidamente asegurado por SSL
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
# Apache 2.4
# Require ip 127.0.0.1
# Require ip ::1
Require all granted
# Apache 2.2
Order Deny,Allow
Deny from All
Allow from 127.0.0.1
Allow from ::1
A continuación, cambiamos la autenticación en phpMyAdmin de cookie a http:
nano /etc/phpMyAdmin/config.inc.php[...]
/* Tipo de autenticación */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]Luego creamos los enlaces de inicio del sistema para Apache y lo iniciamos:
systemctl enable httpd.service
systemctl restart httpd.serviceAhora puedes dirigir tu navegador a http://server1.example.com/phpmyadmin/ o http://192.168.0.100/phpmyadmin/ e iniciar sesión con el nombre de usuario root y tu nueva contraseña root de MySQL.
14 Instalar Amavisd-new, SpamAssassin y ClamAV
Para instalar amavisd-new, spamassassin y clamav, ejecuta el siguiente comando:
yum -y install amavisd-new spamassassin clamav clamd clamav-update unzip bzip2 unrar perl-DBD-mysqlEdita el archivo de configuración freshclam /etc/freshclam.conf
nano /etc/freshclam.confy comenta la línea “Example”
[....]
# Example
[....]Luego comenzamos freshclam, amavisd y clamd.amavisd:
sa-update
freshclam
systemctl enable amavisd.service15 Instalación de Apache2 con mod_php, mod_fcgi/PHP5, PHP-FPM y suPHP
ISPConfig 3 te permite usar mod_php, mod_fcgi/PHP5, cgi/PHP5 y suPHP en una base por sitio web.
Podemos instalar Apache2 con mod_php5, mod_fcgid y PHP5 de la siguiente manera:
yum -y install php php-devel php-gd php-imap php-ldap php-mysql php-odbc php-pear php-xml php-xmlrpc php-pecl-apc php-mbstring php-mcrypt php-mssql php-snmp php-soap php-tidy curl curl-devel perl-libwww-perl ImageMagick libxml2 libxml2-devel mod_fcgid php-cli httpd-devel php-fpmA continuación, abrimos /etc/php.ini…
nano /etc/php.ini… y cambiamos el informe de errores (para que las notificaciones ya no se muestren), establecemos la zona horaria y descomentamos cgi.fix_pathinfo=1:
[...]
;error_reporting = E_ALL & ~E_DEPRECATED
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
[...]
; cgi.fix_pathinfo proporciona soporte *real* para PATH_INFO/PATH_TRANSLATED para CGI. PHP's
; el comportamiento anterior era establecer PATH_TRANSLATED en SCRIPT_FILENAME, y no entender
; lo que es PATH_INFO. Para más información sobre PAppp.tldTH_INFO, consulta las especificaciones de cgi. Establecer
; esto en 1 hará que PHP CGI corrija sus rutas para ajustarse a la especificación. Un ajuste
; de cero hace que PHP se comporte como antes. El valor predeterminado es 1. Debes corregir tus scripts
; para usar SCRIPT_FILENAME en lugar de PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=1
[...]
date.timezone = 'Europe/Berlin'
[...]A continuación, instalamos suPHP (hay un paquete mod_suphp disponible en los repositorios, pero desafortunadamente no es compatible con ISPConfig, por lo tanto, tenemos que construir suPHP nosotros mismos):
cd /usr/local/src
wget http://suphp.org/download/suphp-0.7.2.tar.gz
tar zxvf suphp-0.7.2.tar.gzCentOS 7 utiliza apache-2.4, por lo que necesitamos un parche suphp antes de poder compilarlo contra Apache. El parche se aplica así:
wget -O suphp.patch https://lists.marsching.com/pipermail/suphp/attachments/20130520/74f3ac02/attachment.patch
patch -Np1 -d suphp-0.7.2 < suphp.patch
cd suphp-0.7.2
autoreconf -if[root@server1 suphp-0.7.2]# autoreconf -if
libtoolize: poniendo archivos auxiliares en AC_CONFIG_AUX_DIR, config'. libtoolize: copiando archivoconfig/ltmain.sh’
libtoolize: Considera agregar AC_CONFIG_MACRO_DIR([m4])' a configure.ac y libtoolize: volviendo a ejecutar libtoolize, para mantener los macros de libtool correctos en el árbol. libtoolize: Considera agregar-I m4’ a ACLOCAL_AMFLAGS en Makefile.am.
configure.ac:9: advertencia: AM_INIT_AUTOMAKE: las formas de dos y tres argumentos están en desuso. Para más información, consulta:
configure.ac:9: http://www.gnu.org/software/automake/manual/automake.html#Modernize-AM_005fINIT_005fAUTOMAKE-invocation
configure.ac:24: instalando ‘config/config.guess’
configure.ac:24: instalando ‘config/config.sub’
configure.ac:9: instalando ‘config/install-sh’
configure.ac:9: instalando ‘config/missing’
src/Makefile.am: instalando ‘config/depcomp’
[root@server1 suphp-0.7.2]#
Se aplicará el parche, ahora podemos compilar la nueva fuente de la siguiente manera:
./configure --prefix=/usr/ --sysconfdir=/etc/ --with-apr=/usr/bin/apr-1-config --with-apache-user=apache --with-setid-mode=owner --with-logfile=/var/log/httpd/suphp_log
make
make installLuego agregamos el módulo suPHP a nuestra configuración de Apache…
nano /etc/httpd/conf.d/suphp.confLoadModule suphp_module modules/mod_suphp.so… y creamos el archivo /etc/suphp.conf de la siguiente manera:
nano /etc/suphp.conf[global]
;Ruta al archivo de registro
logfile=/var/log/httpd/suphp.log
;Nivel de registro
loglevel=info
;Usuario bajo el cual se ejecuta Apache
webserver_user=apache
;Ruta donde deben estar todos los scripts
docroot=/
;Ruta a chroot() antes de ejecutar el script
;chroot=/mychroot
; Opciones de seguridad
allow_file_group_writeable=true
allow_file_others_writeable=false
allow_directory_group_writeable=true
allow_directory_others_writeable=false
;Verificar si el script está dentro de DOCUMENT_ROOT
check_vhost_docroot=true
;Enviar mensajes de error menores al navegador
errors_to_browser=false
;Variable de entorno PATH
env_path=/bin:/usr/bin
;Umask a establecer, especificar en notación octal
umask=0077
; UID mínimo
min_uid=100
; GID mínimo
min_gid=100
[handlers]
;Controlador para scripts php
x-httpd-suphp="php:/usr/bin/php-cgi"
;Controlador para scripts CGI
x-suphp-cgi="execute:!self"Edita el archivo /etc/httpd/conf.d/php.confto para habilitar el análisis de php solo para phpmyadmin, roundcube y otros paquetes del sistema en /usr/share pero no para sitios web en /var/www ya que ISPConfig activará PHP para cada sitio web individualmente.
nano /etc/httpd/conf.d/php.confcambia las líneas:
SetHandler application/x-httpd-php
por:
SetHandler application/x-httpd-php
Para que el controlador PHP esté encerrado por la directiva Directory.
Habilita httpd y PHP-FPM para que se inicien al arrancar y comienza el servicio PHP-FPM.
systemctl start php-fpm.service
systemctl enable php-fpm.service
systemctl enable httpd.serviceFinalmente reiniciamos Apache:
systemctl restart httpd.service15.1 Instalación de mod_python
El módulo de apache mod_python no está disponible como paquete RPM, por lo tanto, lo compilaremos desde la fuente. El primer paso es instalar los archivos de desarrollo de python y descargar la versión actual de mod_python como archivo tar.gz
yum -y install python-develcd /usr/local/src/
wget http://dist.modpython.org/dist/mod_python-3.5.0.tgz
tar xfz mod_python-3.5.0.tgz
cd mod_python-3.5.0y luego configurar y compilar el módulo
./configure
make
make instally habilitar el módulo en apache
echo 'LoadModule python_module modules/mod_python.so' > /etc/httpd/conf.modules.d/10-python.conf
systemctl restart httpd.service 16 Instalar PureFTPd
PureFTPd se puede instalar con el siguiente comando:
yum -y install pure-ftpdLuego crea los enlaces de inicio del sistema y comienza PureFTPd:
systemctl enable pure-ftpd.service
systemctl start pure-ftpd.serviceAhora configuramos PureFTPd para permitir sesiones FTP y TLS. FTP es un protocolo muy inseguro porque todas las contraseñas y todos los datos se transfieren en texto claro. Al usar TLS, toda la comunicación puede ser cifrada, haciendo que FTP sea mucho más seguro.
OpenSSL es necesario para TLS; para instalar OpenSSL, simplemente ejecutamos:
yum install opensslAbre /etc/pure-ftpd/pure-ftpd.conf…
vi /etc/pure-ftpd/pure-ftpd.confSi deseas permitir sesiones FTP y TLS, establece TLS en 1:
[...]
# Esta opción puede aceptar tres valores :
# 0 : deshabilitar la capa de cifrado SSL/TLS (predeterminado).
# 1 : aceptar tanto sesiones tradicionales como cifradas.
# 2 : rechazar conexiones que no usen mecanismos de seguridad SSL/TLS,
# incluyendo sesiones anónimas.
# No _descomentes_ esto a ciegas. Asegúrate de que :
# 1) Tu servidor ha sido compilado con soporte SSL/TLS (--with-tls),
# 2) Un certificado válido está en su lugar,
# 3) Solo clientes compatibles iniciarán sesión.
TLS 1
[...]Para usar TLS, debemos crear un certificado SSL. Lo creo en /etc/ssl/private/, por lo que primero creo ese directorio:
mkdir -p /etc/ssl/private/Después, podemos generar el certificado SSL de la siguiente manera:
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pemNombre del país (código de 2 letras) [XX]: <– Ingresa el nombre de tu país (por ejemplo, “DE”).
Nombre del estado o provincia (nombre completo) []: <– Ingresa el nombre de tu estado o provincia.
Nombre de la localidad (por ejemplo, ciudad) [Default City]: <– Ingresa tu ciudad.
Nombre de la organización (por ejemplo, empresa) [Default Company Ltd]: <– Ingresa el nombre de tu organización (por ejemplo, el nombre de tu empresa).
Nombre de la unidad organizativa (por ejemplo, sección) []: <– Ingresa el nombre de tu unidad organizativa (por ejemplo, “Departamento de TI”).
Nombre común (por ejemplo, tu nombre o el nombre de host de tu servidor) []: <– Ingresa el Nombre de Dominio Completo del sistema (por ejemplo, “server1.example.com”).
Dirección de correo electrónico []: <– Ingresa tu dirección de correo electrónico.
Cambia los permisos del certificado SSL:
chmod 600 /etc/ssl/private/pure-ftpd.pemFinalmente reinicia PureFTPd:
systemctl restart pure-ftpd.serviceEso es todo. Ahora puedes intentar conectarte usando tu cliente FTP; sin embargo, debes configurar tu cliente FTP para usar TLS.
17 Instalar BIND
Podemos instalar BIND de la siguiente manera:
yum -y install bind bind-utilsHaz una copia de seguridad del archivo existente /etc/named.conf y crea uno nuevo de la siguiente manera:
cp /etc/named.conf /etc/named.conf_bak
cat /dev/null > /etc/named.conf
nano /etc/named.conf// named.conf\
//\
// Proporcionado por el paquete bind de Red Hat para configurar el servidor DNS ISC BIND named(8)\
// como un servidor de nombres solo en caché (como un resolvedor DNS localhost solamente).\
//\
// Consulta /usr/share/doc/bind*/sample/ para ejemplos de archivos de configuración named.\
//\
options {\
listen-on port 53 { any; };\
listen-on-v6 port 53 { any; };\
directory "/var/named";\
dump-file "/var/named/data/cache_dump.db";\
statistics-file "/var/named/data/named_stats.txt";\
memstatistics-file "/var/named/data/named_mem_stats.txt";\
allow-query { any; };\
allow-recursion {"none";};\
recursion no;\
};\
logging {\
channel default_debug {\
file "data/named.run";\
severity dynamic;\
};\
};\
zone "." IN {\
type hint;\
file "named.ca";\
};\
include "/etc/named.conf.local";Crea el archivo /etc/named.conf.local que se incluye al final de /etc/named.conf (/etc/named.conf.local se llenará más tarde por ISPConfig si creas zonas DNS en ISPConfig):
touch /etc/named.conf.localLuego creamos los enlaces de inicio y comenzamos BIND:
systemctl enable named.service
systemctl start named.service18 Instalar Webalizer y AWStats
Webalizer y AWStats se pueden instalar de la siguiente manera:
yum -y install webalizer awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder19 Instalar Jailkit
Jailkit se utiliza para chroot usuarios SSH y cronjobs. Se puede instalar de la siguiente manera (importante: Jailkit debe ser instalado antes de ISPConfig - ¡no se puede instalar después!):
cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.17.tar.gz
tar xvfz jailkit-2.17.tar.gz
cd jailkit-2.17
./configure
make
make install
cd ..
rm -rf jailkit-2.17*20 Instalar fail2ban
Esto es opcional pero recomendado, porque el monitor de ISPConfig intenta mostrar el registro:
yum -y install fail2banLuego crea los enlaces de inicio del sistema para fail2ban y comienza:
systemctl enable fail2ban.service
systemctl start fail2ban.service21 Instalar rkhunter
rkhunter se puede instalar de la siguiente manera:
yum -y install rkhunter22 Instalar Mailman
Desde la versión 3.0.4, ISPConfig también te permite gestionar (crear/modificar/eliminar) listas de correo de Mailman. Si deseas hacer uso de esta función, instala Mailman de la siguiente manera:
yum -y install mailmanAntes de que podamos iniciar Mailman, se debe crear una primera lista de correo llamada mailman:
touch /var/lib/mailman/data/aliases
/usr/lib/mailman/bin/newlist mailman[root@server1 tmp]# /usr/lib/mailman/bin/newlist mailman
Introduce el correo electrónico de la persona que ejecuta la lista: <– dirección de correo electrónico del administrador, por ejemplo, [email protected]
Contraseña inicial de mailman: <– contraseña de administrador para la lista de mailman
Para terminar de crear tu lista de correo, debes editar tu archivo /etc/aliases (o equivalente) agregando las siguientes líneas, y posiblemente ejecutando el programa newaliases:
lista de correo mailman
mailman: “|/usr/lib/mailman/mail/mailman post mailman”
mailman-admin: “|/usr/lib/mailman/mail/mailman admin mailman”
mailman-bounces: “|/usr/lib/mailman/mail/mailman bounces mailman”
mailman-confirm: “|/usr/lib/mailman/mail/mailman confirm mailman”
mailman-join: “|/usr/lib/mailman/mail/mailman join mailman”
mailman-leave: “|/usr/lib/mailman/mail/mailman leave mailman”
mailman-owner: “|/usr/lib/mailman/mail/mailman owner mailman”
mailman-request: “|/usr/lib/mailman/mail/mailman request mailman”
mailman-subscribe: “|/usr/lib/mailman/mail/mailman subscribe mailman”
mailman-unsubscribe: “|/usr/lib/mailman/mail/mailman unsubscribe mailman”
Presiona enter para notificar al propietario de mailman… <– ENTER
[root@server1 tmp]#
Abre /etc/aliases después…
vi /etc/aliases… y agrega las siguientes líneas:
[...]
mailman: "|/usr/lib/mailman/mail/mailman post mailman"
mailman-admin: "|/usr/lib/mailman/mail/mailman admin mailman"
mailman-bounces: "|/usr/lib/mailman/mail/mailman bounces mailman"
mailman-confirm: "|/usr/lib/mailman/mail/mailman confirm mailman"
mailman-join: "|/usr/lib/mailman/mail/mailman join mailman"
mailman-leave: "|/usr/lib/mailman/mail/mailman leave mailman"
mailman-owner: "|/usr/lib/mailman/mail/mailman owner mailman"
mailman-request: "|/usr/lib/mailman/mail/mailman request mailman"
mailman-subscribe: "|/usr/lib/mailman/mail/mailman subscribe mailman"
mailman-unsubscribe: "|/usr/lib/mailman/mail/mailman unsubscribe mailman"Ejecuta
newaliasesdespues y reinicia Postfix:
systemctl restart postfix.serviceAhora abre el archivo de configuración de Apache de Mailman /etc/httpd/conf.d/mailman.conf…
nano /etc/httpd/conf.d/mailman.conf… y agrega la línea ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Comenta Alias /pipermail/ /var/lib/mailman/archives/public/ y agrega la línea Alias /pipermail /var/lib/mailman/archives/public/:
#
# configuraciones de httpd para usar con mailman.
#
ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/
ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/
AllowOverride None
Options ExecCGI
Order allow,deny
Allow from all
#Alias /pipermail/ /var/lib/mailman/archives/public/
Alias /pipermail /var/lib/mailman/archives/public/
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
AddDefaultCharset Off
# Descomenta la siguiente línea, para redirigir consultas a /mailman a la
# página de listinfo (recomendado).
# RedirectMatch ^/mailman[/]*$ /mailman/listinfoReinicia Apache:
systemctl restart httpd.serviceCrea los enlaces de inicio del sistema para Mailman y comienza:
systemctl enable mailman.service
systemctl start mailman.serviceDespués de haber instalado ISPConfig 3, puedes acceder a Mailman de la siguiente manera:
Puedes usar el alias /cgi-bin/mailman para todos los vhosts de Apache (ten en cuenta que suExec y CGI deben estar deshabilitados para todos los vhosts desde los cuales deseas acceder a Mailman), lo que significa que puedes acceder a la interfaz de administración de Mailman para una lista en http://
Bajo http://
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.