El servidor perfecto CentOS 8 con Apache, PHP, Postfix, Dovecot, Pure-FTPD, BIND e ISPConfig 3.2

Este tutorial muestra la instalación de ISPConfig 3.2 en un servidor CentOS 8 (64Bit). ISPConfig es un panel de control de alojamiento web que te permite configurar los siguientes servicios a través de un navegador web: Servidor web Apache, PHP, servidor de correo Postfix, MySQL, servidor de nombres BIND, PureFTPd, SpamAssassin, ClamAV, Mailman, y muchos más.

1 Requisitos

Para instalar este sistema necesitarás lo siguiente

  • Un sistema de servidor mínimo Centos 8. Puede ser un servidor instalado desde cero, como se describe en nuestro tutorial sobre servidores mínimos Centos 8, o un servidor virtual o un servidor raíz de una empresa de alojamiento que tenga instalada una configuración mínima de Centos 8.
  • Una conexión rápida a Internet.

2 Nota preliminar

En este tutorial, utilizo el nombre de host servidor1.ejemplo.com con la dirección IP 192.168.0.100 y la puerta de enlace 192.168.0.1. Estas configuraciones pueden ser diferentes en tu caso, por lo que deberás sustituirlas cuando corresponda.

3 Prepara el servidor

Configura la disposición del teclado

En caso de que la distribución del teclado del servidor no coincida con la tuya, puedes cambiar al teclado adecuado (en mi caso «de» para una distribución de teclado alemana, con el comando localectl:

localectl set-keymap de

Para obtener una lista de todos los mapas de teclado disponibles, ejecuta:

localectl list-keymaps

Quiero instalar ISPConfig al final de este tutorial, ISPConfig viene con el script del cortafuegos Bastille que usaré como cortafuegos, por lo que ahora desactivo el cortafuegos por defecto de CentOS. Por supuesto, eres libre de dejar el cortafuegos de CentOS activado y configurarlo según tus necesidades (pero entonces no deberías usar ningún otro cortafuegos más adelante ya que probablemente interferirá con el cortafuegos de CentOS).

Ejecuta…

dnf -y install net-tools wget rsyslog curl
systemctl stop firewalld.service
systemctl disable firewalld.service

para detener y desactivar el cortafuegos de CentOS. No pasa nada si obtienes errores aquí, esto sólo indica que el cortafuegos no estaba instalado.

A continuación, debes comprobar que el cortafuegos se ha desactivado realmente. Para ello, ejecuta el comando:

iptables -L

El resultado debería ser así:

[[email protected] ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

O utiliza el comando firewall-cmd:

firewall-cmd --state
[[email protected] ~]# firewall-cmd --state
not running
[[email protected] ~]#

Ahora voy a instalar el editor de configuración de red y el editor basado en el shell «nano» que utilizaré en los próximos pasos para editar los archivos de configuración:

dnf -y install nano wget NetworkManager-tui yum-utils

Si no has configurado tu tarjeta de red durante la instalación, puedes hacerlo ahora. Ejecuta…

nmtui

… y ve a Editar una conexión:

Selecciona tu interfaz de red:

A continuación, introduce los datos de tu red: desactiva el DHCP e introduce una dirección IP estática, una máscara de red, tu puerta de enlace y uno o dos servidores de nombres, y pulsa Aceptar:

A continuación, selecciona Aceptar para confirmar los cambios que has hecho en la configuración de la red

y Salir para cerrar la herramienta de configuración de red nmtui.

Dejar nmtui

Deberías ejecutar

ifconfig

ahora para comprobar si el instalador ha acertado con tu dirección IP:

[[email protected] ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.100  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::20c:29ff:feee:b665  prefixlen 64  scopeid 0x20<link>
        inet6 2003:e1:bf22:1b00:20c:29ff:feee:b665  prefixlen 64  scopeid 0x0<global>
        ether 00:0c:29:ee:b6:65  txqueuelen 1000  (Ethernet)
        RX packets 2874  bytes 1369892 (1.3 MiB)
        RX errors 0  dropped 546  overruns 0  frame 0
        TX packets 968  bytes 160901 (157.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Si tu tarjeta de red no aparece ahí, entonces no está habilitada en el arranque, En este caso, abre el archivo /etc/sysconfig/network-scripts/ifcfg-eth0

nano /etc/sysconfig/network-scripts/ifcfg-ens33

y pon ONBOOT en sí:

[...]
ONBOOT=yes
[...]

y reinicia el servidor.

Comprueba en tu /etc/resolv. conf si aparecen todos los servidores de nombres que has configurado previamente:

cat /etc/resolv.conf

Si faltan servidores de nombres, ejecuta

nmtui

y vuelve a añadir los servidores de nombres que faltan.

Ahora, a la configuración…

Ajustar /etc/hosts y /etc/hostname

A continuación, editaremos /etc/hosts. Haz que tenga este aspecto:

nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100 server1.example.com server1

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6

Ajusta el nombre de host en el archivo /etc/hostname. El archivo deberá contener el nombre de dominio completo (por ejemplo, servidor1.ejemplo.com en mi caso) y no sólo el nombre corto como «servidor1». Abre el archivo con el editor nano:

nano /etc/hostname

Y establece el nombre de host en el archivo.

server1.example.com

Guarda el archivo y sal de nano.

Poner SELinux en permisivo

SELinux es una extensión de seguridad de CentOS que debería proporcionar seguridad extendida. ISPConfig no viene con un conjunto de reglas de SELinux, por lo tanto lo puse en permisivo (esto es una necesidad si quieres instalar ISPConfig más tarde).

Edita /etc/selinux/config y pon SELINUX=permisivo:

nano /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted

Después debemos reiniciar el sistema:

reboot

4 Habilitar los repositorios adicionales e instalar algunos programas

En primer lugar, importamos las claves GPG de los paquetes de software:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

A continuación, activamos el repositorio EPEL en nuestro sistema CentOS, ya que muchos de los paquetes que vamos a instalar en el transcurso de este tutorial no están disponibles en el repositorio oficial de CentOS 8:

dnf -y install epel-release

Activamos Power Tools:

dnf config-manager --set-enabled powertools

A continuación, actualizamos los paquetes existentes en el sistema:

dnf -y update

Ahora instalamos algunos paquetes de software que son necesarios más adelante:

dnf -y groupinstall 'Development Tools'

5 Cuota

(Si has elegido un esquema de particionamiento diferente al mío, debes ajustar este capítulo para que quota se aplique a las particiones en las que lo necesites).

Para instalar la cuota, ejecutamos este comando:

dnf -y install quota

Ahora comprobamos si la cuota ya está activada para el sistema de archivos donde se almacenan los datos del sitio web (/var/www) y de Maildir (var/vmail). En esta configuración de ejemplo, tengo una gran partición raíz, así que busco ‘ / ‘:

mount | grep ' / '
[[email protected] ~]# mount | grep ' / '
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota)
[[email protected] ~]#

Si tienes una partición /var separada, entonces utiliza :

mount | grep ' /var '

en su lugar. Si la línea contiene la palabra «noquota«, sigue los siguientes pasos para activar la cuota.

Activar la cuota en la partición / (raíz)

Normalmente se habilita la cuota en el archivo /etc/fstab, pero si el sistema de archivos es el sistema de archivos raíz «/», entonces la cuota tiene que ser habilitada por un parámetro de arranque del Kernel de Linux.

Edita el archivo de configuración de grub:

nano /etc/default/grub

Busca la línea que empieza por GRUB_CMDLINE_LINUX y añade rootflags=uquota,gquota a los parámetros de la línea de comandos para que la línea resultante tenga este aspecto

GRUB_CMDLINE_LINUX="crashkernel=auto resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rootflags=uquota,gquota"

y aplica los cambios ejecutando el siguiente comando

cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak
grub2-mkconfig -o /boot/grub2/grub.cfg

y reinicia el servidor.

reboot

Ahora comprueba si la cuota está activada:

mount | grep ' / '
[[email protected] ~]# mount | grep ' / '
/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota)
[[email protected] ~]#

Cuando la cuota está activada, podemos ver«usrquota,grpquota» en la lista de opciones de montaje.

Activar la cuota en una partición /var separada

Si tienes una partición /var separada, edita /etc/fstab y añade ,u quota,gquota a la partición /(/dev/mapper/centos-var):

nano /etc/fstab

#
# /etc/fstab
# Created by anaconda on Sun Sep 21 16:33:45 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 1 1
/dev/mapper/centos-var /var xfs defaults,uquota,gquota 1 2
UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot xfs defaults 1 3
/dev/mapper/centos-swap swap swap defaults 0 0

A continuación, ejecuta

mount -o remount /var
quotacheck -avugm
quotaon -avug

para activar la cuota. Si obtienes un error de que no hay ninguna partición con cuota habilitada, reinicia el servidor antes de continuar.

6 Instala Apache, PHP, MySQL y phpMyAdmin

Activa el repositorio Remi para obtener las nuevas versiones de PHP (actualmente PHP 7.4):

dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf -y install yum-utils
dnf -y module reset php
dnf -y module install php:remi-7.4
dnf update

Podemos instalar los paquetes necesarios con un solo comando:

dnf -y install httpd mod_ssl mariadb-server php php-mysqlnd php-mbstring

Para asegurarnos de que el servidor no puede ser atacado a través de la vulnerabilidad HTTPOXY, desactivaremos la cabecera HTTP_PROXY en apache de forma global.

Añade la regla de cabecera de apache al final del archivo httpd.conf:

echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf

Y reinicia httpd para aplicar el cambio de configuración.

service httpd restart

Instala phpMyAdmin:

cd /tmp
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.2/phpMyAdmin-5.0.2-all-languages.tar.gz
tar xzvf phpMyAdmin-5.0.2-all-languages.tar.gz
mkdir /usr/share/phpmyadmin
mv phpMyAdmin-5.0.2-all-languages/* /usr/share/phpmyadmin/
mkdir /usr/share/phpmyadmin/tmp
chown -R apache:apache /usr/share/phpmyadmin
chmod 777 /usr/share/phpmyadmin/tmp

Opcional: Cambia el módulo MPM de Apache

CentOS 8 utiliza el módulo Apache MPM Event por defecto, esto es bueno por un lado, ya que te permite utilizar el protocolo HTTP/2. Por otro lado, no te permite utilizar el módulo apache mod_php. En general, hoy en día se debería usar PHP-FPM por defecto e ISPConfig lo soporta. En caso de que necesites el antiguo modo mod_php por razones de compatibilidad, entonces puedes cambiar el MPM de Apache así

nano /etc/httpd/conf.modules.d/00-mpm.conf

Añade un # delante de la línea de eventos del MPM para que se vea así:

# LoadModule mpm_event_module modules/mod_mpm_event.so

Luego quita el # delante de la línea de MPM Prefork, para que se vea así:

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

Luego reinicia httpd para aplicar el cambio de configuración.

service httpd restart

7 Instalar Dovecot

Dovecot se puede instalar de la siguiente manera:

dnf -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:

dnf -y install postfix postfix-mysql

A continuación, abre los puertos TLS/SSL y de envío en Postfix:

nano /etc/postfix/master.cf

Descomenta el puertopresentaciónysmtpscomo se indica a continuación y añade líneas donde sea necesario para que esta sección del archivo master.cf tenga el mismo aspecto que el siguiente.IMPORTANTE:Elimina el # delante de las líneas que empiezan por smtps y submission también y no sólo de las líneas -o que hay después de estas líneas.

[...]
submission inet n - n - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
smtps inet n - n - - smtpd
-o syslog_name=postfix/smtps
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=
# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
[...]

A continuación, desactiva Sendmail e inicia Postfix y MariaDB (MySQL):

systemctl enable mariadb.service
systemctl start mariadb.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 «Failed to issue method call: Unit sendmail.service not loaded» puede ser ignorado.

Para habilitar la compatibilidad con dispositivos antiguos/no actualizados, ejecuta este comando (opcional, sólo utilízalo cuando quieras que se conecten dispositivos de correo antiguos, ya que debilita la configuración SSL/TLS al permitir cifrados menos seguros):

update-crypto-policies --set LEGACY

9 Instalar Getmail

Getmail se puede instalar de la siguiente manera:

dnf install python2
cd /tmp
wget http://pyropus.ca/software/getmail/old-versions/getmail-5.14.tar.gz
tar xvfz getmail-5.14.tar.gz
cd getmail-5.14
python2 setup.py build
python2 setup.py install

10 Establecer las contraseñas de MySQL y configurar phpMyAdmin

Establece las contraseñas de la cuenta raíz de MySQL:

mysql_secure_installation
[[email protected] 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!

[[email protected] tmp]#

Ahora configuramos phpMyAdmin. Crea este archivo de configuración de phpMyAdmin:

nano /etc/httpd/conf.d/phpmyadmin.conf

Añade este contenido al archivo:

# 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:

cp -pf /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php
nano /usr/share/phpmyadmin/config.inc.php
[...]
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]

A continuación, creamos los enlaces de inicio del sistema para Apache y lo iniciamos:

systemctl enable httpd
systemctl restart httpd

Ahora puedes dirigir tu navegador a http://server1.example.com/phpmyadmin/ o http://192.168.0.100/phpmyadmin/ y acceder 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:

dnf -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

En el siguiente paso, configuramos postgrey. Abre el archivo /etc/sysconfig/postgrey en un editor

nano /etc/sysconfig/postgrey

y cambia la línea

POSTGREY_TYPE="--unix=/var/spool/postfix/postgrey/socket"

por

POSTGREY_TYPE="--inet=10023"

Guarda el archivo y reinicia postgrey:

service postgrey restart

Para configurar amavisd, edita el archivo /etc/clamd.d/amavisd.conf

nano /etc/clamd.d/amavisd.conf

y cambia la línea

LocalSocket /run/clamd.amavisd/clamd.sock

a

LocalSocket /var/spool/amavisd/clamd.sock

Guarda el archivo de configuración modificado y reinicia ClamAV:

systemctl restart [email protected]

Ahora tenemos que crear una unidad del sistema para el servicio freshclam. Crea un nuevo archivo /usr/lib/systemd/system/freshclam.service

nano /usr/lib/systemd/system/freshclam.service

e introduce el siguiente contenido en ese archivo:

[Unit]
Description = ClamAV Scanner
After = network.target

[Service]
Type = forking
# if you want to scan more than one in a day change the number 1 with your desired number in below line.
ExecStart = /usr/bin/freshclam -d -c 1
Restart = on-failure
PrivateTmp =true

[Install]
WantedBy=multi-user.target

Guarda el archivo y luego habilita e inicia el servicio.

systemctl enable freshclam.service
systemctl start freshclam.service
systemctl status freshclam.service

12 Instalar 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 de cada sitio web.

Podemos instalar Apache2 con mod_php, mod_fcgid y PHP de la siguiente manera:

dnf -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-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. ISPConfig utiliza ahora acme.sh como cliente de Let’s Encrypt. Instala acme.sh con el siguiente comando:

curl https://get.acme.sh | sh -s

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

dnf -y install python3-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 --with-python=/usr/bin/python3
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:

dnf -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

dnf 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 Completamente Cualificado 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:

dnf -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 el BIND:

systemctl enable named.service
systemctl start named.service
systemctl enable haveged.service
systemctl start haveged.service

16 Instalar AWStats

AWStats se puede instalar de la siguiente manera:

dnf -y install awstats perl-DateTime-Format-HTTP perl-DateTime-Format-Builder

La aplicación alternativa de estadísticas web ‘webalizer’ ya no está disponible para CentOS 8, por lo que sólo podrás utilizar AWStats.

17 Instalar Jailkit

Jailkit se utiliza para hacer chroot a los usuarios de SSH y a los cronjobs. Se puede instalar de la siguiente manera:

ln -s /usr/bin/python2 /usr/bin/python
cd /tmp
wget http://olivier.sessink.nl/jailkit/jailkit-2.21.tar.gz
tar xvfz jailkit-2.21.tar.gz
cd jailkit-2.21
./configure
make
make install
cd ..
rm -rf jailkit-2.21*

18 Instalar Fail2Ban

Esto es opcional pero recomendado, porque el monitor de ISPConfig intenta mostrar el registro.

dnf -y install iptables-services fail2ban fail2ban-systemd
systemctl stop firewalld.service
systemctl mask firewalld.service
systemctl disable 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:

dnf -y install rkhunter

20 Instalar Mailman

Si quieres gestionar listas de correo con Mailman en tu servidor, entonces instala ahora Mailman. Mailman es compatible con ISPConfig, por lo que podrás crear nuevas listas de correo a través de ISPConfig más adelante.

dnf -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

[[email protected] 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 editar tu/etc/aliases (o su equivalente en
) añadiendo las siguientes líneas, y posiblemente ejecutando el programa
`newaliases’:

## mailman mailing list
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

[[email protected] 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.

21 Instalar el webmail de Roundcube

Para instalar el cliente de correo web RoundCube, descarga la última versión con wget en la carpeta /tmp:

cd /tmp
wget https://github.com/roundcube/roundcubemail/releases/download/1.4.3/roundcubemail-1.4.3-complete.tar.gz

Descomprime el archivo tar.gz y mueve el código fuente de RoundCube a /usr/share/roundcubemail

tar xfz roundcubemail-1.4.3-complete.tar.gz
mkdir /usr/share/roundcubemail
mv /tmp/roundcubemail-1.4.3/* /usr/share/roundcubemail/
chown -R root:root /usr/share/roundcubemail
chown apache /usr/share/roundcubemail/temp
chown apache /usr/share/roundcubemail/logs

Crea un archivo de configuración roundcubemail.conf con el editor nano:

nano /etc/httpd/conf.d/roundcubemail.conf

Y añade el siguiente contenido a ese archivo

#
# Round Cube Webmail is a browser-based multilingual IMAP client
#

Alias /roundcubemail /usr/share/roundcubemail
Alias /webmail /usr/share/roundcubemail # Define who can access the Webmail # You can enlarge permissions once configured <Directory /usr/share/roundcubemail/> Options none AllowOverride Limit Require all granted </Directory> # Define who can access the installer # keep this secured once configured <Directory /usr/share/roundcubemail/installer> Options none AllowOverride Limit Require all granted </Directory> # Those directories should not be viewed by Web clients. <Directory /usr/share/roundcubemail/bin/> Order Allow,Deny Deny from all </Directory> <Directory /usr/share/roundcubemail/plugins/enigma/home/> Order Allow,Deny Deny from all </Directory>

Reinicia Apache:

systemctl restart httpd.service

Ahora necesitamos una base de datos para el correo de RoundCube, la inicializaremos de la siguiente manera

mysql -u root -p

En el prompt de MariaDB utiliza:

CREATE DATABASE roundcubedb;
CREATE USER [email protected] IDENTIFIED BY 'roundcubepassword';
GRANT ALL PRIVILEGES on roundcubedb.* to [email protected] ;
FLUSH PRIVILEGES;
exit

Estoy utilizando los detalles de la base de datos de RoundCube como ejemplo, por favor, sustituye los valores según tu elección por razones de seguridad.

Ahora instalaremos RoundCube en el navegador en http://192.168.0.100/roundcubemail/installer

Ahora crea el archivo config.inc.php:

nano /usr/share/roundcubemail/config/config.inc.php
<?php

/* Local configuration for Roundcube Webmail */

// ----------------------------------
// SQL DATABASE
// ----------------------------------
// Database connection string (DSN) for read+write operations
// Format (compatible with PEAR MDB2): db_provider://user:[email protected]/database
// Currently supported db_providers: mysql, pgsql, sqlite, mssql, sqlsrv, oracle
// For examples see http://pear.php.net/manual/en/package.database.mdb2.intro-dsn.php
// NOTE: for SQLite use absolute path (Linux): 'sqlite:////full/path/to/sqlite.db?mode=0646'
// or (Windows): 'sqlite:///C:/full/path/to/sqlite.db'
$config['db_dsnw'] = 'mysql://roundcubeuser:[email protected]/roundcubedb';

// ----------------------------------
// IMAP
// ----------------------------------
// The IMAP host chosen to perform the log-in.
// Leave blank to show a textbox at login, give a list of hosts
// to display a pulldown menu or set one host as string.
// To use SSL/TLS connection, enter hostname with prefix ssl:// or tls://
// Supported replacement variables:
// %n - hostname ($_SERVER['SERVER_NAME'])
// %t - hostname without the first part
// %d - domain (http hostname $_SERVER['HTTP_HOST'] without the first part)
// %s - domain name after the '@' from e-mail address provided at login screen
// For example %n = mail.domain.tld, %t = domain.tld
// WARNING: After hostname change update of mail_host column in users table is
// required to match old user data records with the new host.
$config['default_host'] = 'localhost';
$config['smtp_server'] = 'localhost';
$config['smtp_port'] = 25;

// provide an URL where a user can get support for this Roundcube installation
// PLEASE DO NOT LINK TO THE ROUNDCUBE.NET WEBSITE HERE!
$config['support_url'] = '';

// This key is used for encrypting purposes, like storing of imap password
// in the session. For historical reasons it's called DES_key, but it's used
// with any configured cipher_method (see below).
$config['des_key'] = 'pb0UucO0eqjgvhrqYlFTBVjE';

// ----------------------------------
// PLUGINS
// ----------------------------------
// List of active plugins (in plugins/ directory)
$config['plugins'] = array();

// Set the spell checking engine. Possible values:
// - 'googie' - the default (also used for connecting to Nox Spell Server, see 'spellcheck_uri' setting)
// - 'pspell' - requires the PHP Pspell module and aspell installed
// - 'enchant' - requires the PHP Enchant module
// - 'atd' - install your own After the Deadline server or check with the people at http://www.afterthedeadline.com before using their API
// Since Google shut down their public spell checking service, the default settings
// connect to http://spell.roundcube.net which is a hosted service provided by Roundcube.
// You can connect to any other googie-compliant service by setting 'spellcheck_uri' accordingly.
$config['spellcheck_engine'] = 'pspell';
$config['enable_installer'] = true;

Luego pulsa «continuar» en el instalador web. En la siguiente página, pulsa el botón «Inicializar la base de datos».

Por último, desactiva el instalador de Roundecubemail. Cambia el archivo de configuración RoundCube config.inc.php

nano /usr/share/roundcubemail/config/config.inc.php

y cambia la línea

$config['enable_installer'] = true;

a:

$config['enable_installer'] = false;

Roundcube está ahora disponible bajo los alias /webmail y /roundcubemail en tu servidor:

http://192.168.0.100/webmail

El nombre de usuario de RoundCube es la dirección de correo electrónico y la contraseña de una cuenta de correo electrónico que crearás más tarde en ISPConfig.

22 Instalar ISPConfig 3.2

El instalador de ISPConfig configurará todos los servicios como Postfix, Dovecot, etc. por ti.

Ahora también tienes la posibilidad de dejar que el instalador cree un vhost SSL para el panel de control de ISPConfig para que se pueda acceder a ISPConfig usando https:// en lugar de http://. Para conseguirlo, simplemente pulsa ENTER cuando veas esta pregunta: ¿Quieres una conexión segura (SSL) a la interfaz web de ISPConfig (y,n) [y]:.

Para instalar ISPConfig 3.2 nightly build, haz esto:

cd /tmp 
wget -O ispconfig.tar.gz https://www.ispconfig.org/downloads/ISPConfig-3-stable.tar.gz
tar xfz ispconfig.tar.gz
cd ispconfig3*/install/

El siguiente paso es ejecutar:

php -q install.php

Esto iniciará el instalador de ISPConfig 3. El instalador configurará todos los servicios como Postfix, Dovecot, etc. por ti.

[[email protected] install]# php install.php

--------------------------------------------------------------------------------
_____ ___________ _____ __ _ ____
|_ _/ ___| ___ \ / __ \ / _(_) /__ \
| | \ `--.| |_/ / | / \/ ___ _ __ | |_ _ __ _ _/ /
| | `--. \ __/ | | / _ \| '_ \| _| |/ _` | |_ |
_| |_/\__/ / | | \__/\ (_) | | | | | | | (_| | ___\ \
\___/\____/\_| \____/\___/|_| |_|_| |_|\__, | \____/
__/ |
|___/
--------------------------------------------------------------------------------

>> Initial configuration
Operating System: CentOS 8.2
Following will be a few questions for primary configuration so be careful.
Default values are in [brackets] and can be accepted with <ENTER>.
Tap in "quit" (without the quotes) to stop the installer.

Select language (en,de) [en]: <-- Hit Enter
Installation mode (standard,expert) [standard]: <-- Hit Enter
Full qualified hostname (FQDN) of the server, eg server1.domain.tld [server1.example.com]: <-- Hit Enter
MySQL server hostname [localhost]: <-- Hit Enter
MySQL server port [3306]: <-- Hit Enter
MySQL root username [root]: <-- Hit Enter
MySQL root password []: <-- Ente the MySQL root password here
MySQL database to create [dbispconfig]: <-- Hit Enter
MySQL charset [utf8]: <-- Hit Enter
Configuring Postgrey
Configuring Postfix
Generating a 4096 bit RSA private key
................................++
.....................................................................................................................................................................................................................................................................................................................................................++
writing new private key to 'smtpd.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]: <-- Enter 2 Letter country code, e.g. US
State or Province Name (full name) []: <-- Enter anme of State or Province
Locality Name (eg, city) [Default City]: <-- Name of city
Organization Name (eg, company) [Default Company Ltd]: <-- Company name
Organizational Unit Name (eg, section) []: <-- Hit Enter
Common Name (eg, your name or your server's hostname) []: <-- Enter server hostname here, in my case: server1.example.com
Email Address []: <-- Enter Email address
Configuring mailman
Configuring Dovecot
Configuring Spamassassin
Configuring Amavisd
Configuring Getmail
Configuring Jailkit
Configuring Pureftpd
Configuring BIND
Configuring Apache
Configuring vlogger
[INFO] service OpenVZ not detected
Configuring Bastille Firewall
[INFO] service Metronome XMPP Server not detected
Configuring Fail2ban
Configuring Apps vhost
Installing ISPConfig
ISPConfig Port [8080]: <-- Hit Enter
Admin password [fad579a6]: <-- Enter new password for ISPConfig admin user
Re-enter admin password []: <-- Repeat the password
Do you want a secure (SSL) connection to the ISPConfig web interface (y,n) [y]: <-- Hit Enter
Generating RSA private key, 4096 bit long modulus
.................................................................................++
.....++
e is 65537 (0x10001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]: <-- Enter 2 Letter country code, e.g. US
State or Province Name (full name) []: <-- Enter anme of State or Province
Locality Name (eg, city) [Default City]: <-- Name of city
Organization Name (eg, company) [Default Company Ltd]: <-- Company name
Organizational Unit Name (eg, section) []: <-- Hit Enter
Common Name (eg, your name or your server's hostname) []: <-- Enter server hostname here, in my case: server1.example.com
Email Address []: <-- Enter Email address
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: <-- Hit Enter
An optional company name []: <-- Hit Enter
writing RSA key

Configuring DBServer
Installing ISPConfig crontab
Installing ISPConfig crontab
no crontab for root
no crontab for getmail
Detect IP addresses
Restarting services ...
Installation completed.

El instalador configura automáticamente todos los servicios subyacentes, por lo que no es necesaria ninguna configuración manual.

23 Primer acceso a ISPConfig

Después puedes acceder a ISPConfig 3 bajo http(s)://servidor1.ejemplo.com:8080/ o http(s)://192.168.0.100:8080/(http o httpsdepende de lo que hayas elegido durante la instalación).

Accede con el nombre de usuario admin y la contraseña admin (deberías cambiar la contraseña por defecto después de tu primer acceso):

El inicio de sesión de ISPConfig

25 Enlaces

También te podría gustar...