El servidor perfecto CentOS 7.6 con Apache, PHP 7.2, Postfix, Dovecot, Pure-FTPD, BIND e ISPConfig 3.1
7 Instalar Dovecot
Dovecot se puede instalar de la siguiente manera:
yum -y install dovecot dovecot-mysql dovecot-pigeonhole
Crea un archivo dovecot-sql.conf vacío y crea enlaces simbólicos:
touch /etc/dovecot/dovecot-sql.conf
ln -s /etc/dovecot/dovecot-sql.conf /etc/dovecot-sql.conf
ln -s /etc/dovecot/dovecot.conf /etc/dovecot.conf
Ahora crea los enlaces de inicio del sistema e inicia Dovecot:
systemctl enable dovecot
systemctl start dovecot
8 Instalar Postfix
Postfix se puede instalar de la siguiente manera:
yum -y install postfix
A continuación, desactiva Sendmail e inicia Postfix y MariaDB (MySQL):
systemctl enable mariadb.service
systemctl start mariadb.service
systemctl stop sendmail.service
systemctl disable sendmail.service
systemctl enable postfix.service
systemctl restart postfix.service
Desactivamos sendmail para asegurarnos de que no se inicie en caso de que esté instalado en tu servidor. Así, el mensaje de error «Fallo al realizar la llamada al método: Unit sendmail.service not loaded» puede ser ignorado.
9 Instalar Getmail
Getmail se puede instalar de la siguiente manera:
yum -y install getmail
10 Establecer las contraseñas de MySQL y configurar phpMyAdmin
Establece las contraseñas para la cuenta raíz de MySQL:
mysql_secure_installation
[root@server1 tmp]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none):
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.
Set root password? [Y/n] <-- ENTER
New password: <-- yourrootsqlpassword
Re-enter new password: <-- yourrootsqlpassword
Password updated successfully!
Reloading privilege tables..
... Success!
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] <-- ENTER
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] <-- ENTER
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] <-- ENTER
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] <-- ENTER
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
[root@server1 tmp]#
Ahora configuramos phpMyAdmin. Cambiamos la configuración de Apache para que phpMyAdmin permita conexiones no sólo desde localhost (comentando las líneas marcadas en rojo):
nano /etc/httpd/conf.d/phpMyAdmin.conf
# phpMyAdmin - Web based MySQL browser written in php
#
# Allows only localhost by default
#
# But allowing phpMyAdmin to anyone other than localhost should be considered
# dangerous unless properly secured by SSL
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin
<Directory /usr/share/phpMyAdmin/>
<IfModule mod_authz_core.c>
# Apache 2.4
# <RequireAny>
# Require ip 127.0.0.1
# Require ip ::1
# </RequireAny>
</IfModule>
<IfModule !mod_authz_core.c>
# Apache 2.2
Order Deny,Allow
Deny from All
Allow from 127.0.0.1
Allow from ::1
</IfModule>
</Directory>
A continuación, cambiamos la autenticación en phpMyAdmin de cookie a http:
nano /etc/phpMyAdmin/config.inc.php
[...] /* Authentication type */ $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.service
Ahora puedes dirigir tu navegador a http://server1.example.com/phpmyadmin/ o http://192.168.0.100/phpmyadmin/ y conectarte con el nombre de usuario root y tu nueva contraseña de root MySQL.
11 Instalar Amavisd-new, SpamAssassin, ClamAV y Postgrey
Para instalar amavisd-new, SpamAssassin y ClamAV, ejecuta el siguiente comando:
yum -y install amavisd-new spamassassin clamav-server clamav-data clamav-update clamav-filesystem clamav clamav-scanner-systemd clamav-devel clamav-lib clamav-server-systemd unzip bzip2 perl-DBD-mysql postgrey re2c
A continuación, iniciamos freshclam, amavisd y clamd.amavisd:
sa-update
freshclam
systemctl enable amavisd.service
systemctl start amavisd.service
systemctl start [email protected]
systemctl enable postgrey.service
systemctl start postgrey.service
12 Instalación de Apache con mod_php, mod_fcgi/PHP, PHP-FPM
ISPConfig 3 te permite utilizar mod_php, mod_fcgi/PHP, cgi/PHP y PHP-FPM en función del sitio web.
Podemos instalar Apache2 con mod_php, mod_fcgid y PHP 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-fpm php-intl php-imagick php-pspell wget
A continuación abrimos /etc/php.ini…
nano /etc/php.ini
… y cambiamos el informe de errores (para que ya no se muestren los avisos), establecemos la zona horaria y descomentamos cgi.fix_pathinfo=1:
[...] ;error_reporting = E_ALL & ~E_DEPRECATED error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PAppp.tldTH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=1
[...]
date.timezone = 'Europe/Berlin' [...]
Activa el httpd y el PHP-FPM para que se inicien en el arranque y arranca el servicio PHP-FPM.
systemctl start php-fpm.service
systemctl enable php-fpm.service
systemctl enable httpd.service
Por último, reiniciamos Apache:
systemctl restart httpd.service
Ahora añadiremos el soporte para Let’s encrypt.
mkdir /opt/certbot
cd /opt/certbot
wget https://dl.eff.org/certbot-auto
chmod a+x ./certbot-auto
Ahora ejecuta el comando certbot-auto que descargará e instalará el software y sus dependencias.
./certbot-auto
El comando te dirá entonces que «no se han encontrado nombres en tus archivos de configuración» y te preguntará si debe continuar, por favor elige «c» para cancelar aquí ya que los certificados serán creados por ispconfig.
13 Instalación de mod_python
El módulo de Apache mod_python no está disponible como paquete RPM, por lo que lo compilaremos desde el código 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-devel
cd /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.0
y luego configurar y compilar el módulo.
./configure
make
Hay un error en el módulo compilado que hará que la instalación falle con el error«version = «fatal: Not a git repository (or any of the parent directories): .git«. Para solucionarlo, ejecuta este comando sed (¡el comando es de una línea!).
sed -e 's/(git describe --always)/(git describe --always 2>\/dev\/null)/g' -e 's/`git describe --always`/`git describe --always 2>\/dev\/null`/g' -i $( find . -type f -name Makefile\* -o -name version.sh )
Luego instala el módulo con este comando
make install
y activa 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
14 Instalar PureFTPd
Puedes instalar PureFTPd con el siguiente comando:
yum -y install pure-ftpd
A continuación, crea los enlaces de inicio del sistema e inicia PureFTPd:
systemctl enable pure-ftpd.service
systemctl start pure-ftpd.service
Ahora configuramos PureFTPd para permitir sesiones FTP y TLS. El FTP es un protocolo muy inseguro porque todas las contraseñas y todos los datos se transfieren en texto claro. Al utilizar TLS, toda la comunicación puede ser encriptada, lo que hace que el FTP sea mucho más seguro.
TLS necesita OpenSSL; para instalar OpenSSL, simplemente ejecutamos
yum install openssl
Abrir /etc/pure-ftpd/pure-ftpd.conf…
nano /etc/pure-ftpd/pure-ftpd.conf
Si quieres permitir sesiones FTP y TLS, establece TLS a 1 eliminando el # delante de la línea TLS. Es muy recomendable habilitar TLS.
[...] # This option can accept three values : # 0 : disable SSL/TLS encryption layer (default). # 1 : accept both traditional and encrypted sessions. # 2 : refuse connections that don't use SSL/TLS security mechanisms, # including anonymous sessions. # Do _not_ uncomment this blindly. Be sure that : # 1) Your server has been compiled with SSL/TLS support (--with-tls), # 2) A valid certificate is in place, # 3) Only compatible clients will log in. TLS 1 [...]
Para utilizar TLS, debemos crear un certificado SSL. Yo lo creo en /etc/ssl/privado/, 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.pem
Nombre del país (código de 2 letras) [XX]: <– Introduce el nombre de tu país (por ejemplo, «DE»).
Nombre del Estado o Provincia (nombre completo) []:<– Introduce el nombre de tu Estado o Provincia.
Nombre de la localidad (por ejemplo, ciudad) [Ciudad por defecto]:<– Introduce tu Ciudad.
Nombre de la organización (p. ej., empresa) [Empresa por defecto]:<– Introduce el Nombre de tu Organización (por ejemplo, el nombre de tu empresa).
Nombre de la unidad organizativa (por ejemplo, sección) []:<– Introduce el Nombre de tu Unidad Organizativa (por ejemplo, «Departamento de Informática»).
Nombre común (por ejemplo, tu nombre o el nombre de host de tu servidor) []:<– Introduce el nombre de dominio completo del sistema (por ejemplo, «servidor1.ejemplo.com»).
Dirección de correo electrónico []:<– Introduce tu dirección de correo electrónico.
Cambia los permisos del certificado SSL:
chmod 600 /etc/ssl/private/pure-ftpd.pem
Crea un archivo DHParam:
openssl dhparam -out /etc/ssl/private/pure-ftpd-dhparams.pem 2048
Por último, reinicia PureFTPd:
systemctl restart pure-ftpd.service
Eso es todo. Ahora puedes intentar conectarte utilizando tu cliente FTP; sin embargo, debes configurar tu cliente FTP para que utilice TLS.
15 Instalar BIND
Podemos instalar BIND de la siguiente manera:
yum -y install bind bind-utils haveged
Haz una copia de seguridad del archivo /etc/named.conf existente 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 // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a localhost DNS resolver only). // // See /usr/share/doc/bind*/sample/ for example named configuration files. // 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 será rellenado posteriormente por ISPConfig si creas zonas DNS en ISPConfig):
touch /etc/named.conf.local
A continuación, creamos los enlaces de inicio y arrancamos BIND:
systemctl enable named.service
systemctl start named.service
systemctl enable haveged.service
systemctl start haveged.service
16 Instalar Webalizer, y AWStats
AWStats se puede instalar de la siguiente manera:
yum -y install webalizer awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder
Edita el archivo/etc/httpd/conf.d/awstats.conf:
nano /etc/httpd/conf.d/awstats.conf
y cambia la línea
Require local
a:
Require all granted
Y reinicia apache:
systemctl restart httpd.service
17 Instalar Jailkit
Jailkit se utiliza para hacer chroot a los usuarios SSH y a los cronjobs. Se puede instalar de la siguiente manera:
cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.20.tar.gz
tar xvfz jailkit-2.20.tar.gz
cd jailkit-2.20
./configure
make
make install
cd ..
rm -rf jailkit-2.20*
18 Instalar Fail2Ban
Esto es opcional pero recomendado, porque el monitor de ISPConfig intenta mostrar el registro.
yum -y install iptables-services fail2ban fail2ban-systemd
systemctl stop firewalld.service
systemctl mask firewalld.service
systemctl disable firewalld.service
systemctl stop firewalld.service
A continuación creamos el archivo /etc/fail2ban/jail.local y habilitamos la monitorización de los servicios ssh, email y ftp.
nano /etc/fail2ban/jail.local
Añade el siguiente contenido al archivo jail.local:
[sshd]
enabled = true
action = iptables[name=sshd, port=ssh, protocol=tcp]
[pure-ftpd]
enabled = true
action = iptables[name=FTP, port=ftp, protocol=tcp]
maxretry = 3
[dovecot]
enabled = true
action = iptables-multiport[name=dovecot, port="pop3,pop3s,imap,imaps", protocol=tcp]
maxretry = 5
[postfix-sasl]
enabled = true
action = iptables-multiport[name=postfix-sasl, port="smtp,smtps,submission", protocol=tcp]
maxretry = 3
A continuación, crea los enlaces de inicio del sistema para fail2ban e inícialo:
systemctl enable fail2ban.service
systemctl start fail2ban.service
19 Instalar rkhunter
Puedes instalar rkhunter de la siguiente manera:
yum -y install rkhunter
20 Instalar Mailman
Si te gusta gestionar listas de correo con Mailman en tu servidor, entonces instala mailman ahora. Mailman es compatible con ISPConfig, por lo que podrás crear nuevas listas de correo a través de ISPConfig más adelante.
yum -y install mailman
Antes de iniciar Mailman, hay que crear una primera lista de correo llamada mailman:
touch /var/lib/mailman/data/aliases
postmap /var/lib/mailman/data/aliases
/usr/lib/mailman/bin/newlist mailman
ln -s /usr/lib/mailman/mail/mailman /usr/bin/mailman
[root@server1 tmp]# /usr/lib/mailman/bin/newlist mailman
Introduce el correo electrónico de la persona que dirige la lista:<– dirección de correo electrónico del administrador, por ejemplo[email protected]
Contraseña inicial de mailman:<– contraseña de administrador de lalista mailman
Para terminar de crear tu lista de correo, debes editartu archivo /etc/aliases (o su equivalente en
) añadiendo 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/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»
Pulsa enter para notificar al propietario de mailman…<–ENTER
[root@server1 tmp]#
Abre después /etc/aliases…
nano /etc/aliases
… y añade 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
newaliases
después y reinicia Postfix:
systemctl restart postfix.service
Ahora abre el archivo de configuración de Mailman Apache /etc/httpd/conf.d/mailman.conf…
nano /etc/httpd/conf.d/mailman.conf
… y añade la línea ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/. Comenta Alias /pipermail/ /var/lib/mailman/archives/public/ y añade la línea Alias /pipermail /var/lib/mailman/archives/public/:
# # httpd configuration settings for use with mailman. # ScriptAlias /mailman/ /usr/lib/mailman/cgi-bin/ ScriptAlias /cgi-bin/mailman/ /usr/lib/mailman/cgi-bin/ <Directory /usr/lib/mailman/cgi-bin/> AllowOverride None Options ExecCGI Order allow,deny Allow from all </Directory> #Alias /pipermail/ /var/lib/mailman/archives/public/ Alias /pipermail /var/lib/mailman/archives/public/ <Directory /var/lib/mailman/archives/public> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all AddDefaultCharset Off </Directory> # Uncomment the following line, to redirect queries to /mailman to the # listinfo page (recommended). # RedirectMatch ^/mailman[/]*$ /mailman/listinfo
Reinicia Apache:
systemctl restart httpd.service
Crea los enlaces de inicio del sistema para Mailman e inícialo:
systemctl enable mailman.service
systemctl start mailman.service
Después de haber instalado ISPConfig 3, puedes acceder a Mailman de la siguiente manera:
Puedes utilizar el alias /cgi-bin/mailman para todos los vhosts de Apache (¡ten en cuenta que suExec y CGI deben estar desactivados para todos los vhosts desde los que quieras acceder a Mailman!), lo que significa que puedes acceder a la interfaz de administración de Mailman para una lista en http://<vhost>/cgi-bin/mailman/admin/<listname>, y la página web para los usuarios de una lista de correo puede encontrarse en http://<vhost>/cgi-bin/mailman/listinfo/<listname>.
En http://<vhost>/pipermail/<listname> puedes encontrar los archivos de las listas de correo.