Parte 1: Montando un servidor LNMP (Linux, Nginx, MySQL, PHP) con protección DDoS y PhpMyAdmin en ArchLinux

2



Cuando hablamos de servidores web, generalmente se nos viene a la cabeza una servidor LAMP con Debian, RedHat o CentOS como Sistema Operativo. Sin embargo, es solo la más común (eso no significa que sea necesariamente la más eficiente) de todas las posibles formas de montar nuestro servidor web. Hoy mostrare paso a paso el procedimiento para montar un servidor Web en ArchLinux, usando LNMP (Sí, LNMP = Linux, Nginx, MySQL, PHP), ádemas de como añadir protección DDoS usando fail2ban y también la instalación y configuración de PhpMyAdmin.


Necesitamos tener instalado nuestro ArchLinux (Sin entorno gráfico, ya que no tiene sentido usar recursos en algo que no se usará). Para ello puedes seguir este post de instalación de ArchLinux. Adicionalmente a lo sugerido en ese post, necesitamos instalar un kernel LTS (Longterm Support) para no estar actualizando cada 3 días el kernel. Para ello hacemos lo siguiente cómo root:

pacman -S linux-lts

Una vez finalizada la instalación, es necesario reiniciar nuestro servidor usando el kernel LTS.

1) Instalamos Nginx.

¿Porqué Nginx en lugar de Apache? Aquí pueden encontrar las razones. Además el mismo equipo de Nginx nos ha hecho un tutorial sobre como "tunear" Nginx para rendimiento, leelo.

pacman -S nginx


El directorio de trabajo de Nginx en ArchLinux es /usr/share/nginx/html/* y el directorio de configuración es /etc/nginx/*. Escribimos el comando

echo "<h1>Esto es una prueba de mi servidor web Nginx</h1>" > /usr/share/nginx/html/index.html

Seguido eso iniciamos el servicio usando systemctl start nginx y probamos abriendo la dirección http://localhost; nos deberá aparecer esto.



2) Instalación de PHP.
 

pacman -S php-fpm


Arrancamos el servicio con systemctl start php-fpm, editamos el archivo /etc/nginx/nginx.conf en el apartado de PHP sobre FastCGI para que quede de la siguiente manera.

 

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

location ~ .php$ {
try_files $uri = 404;
root /usr/share/nginx/html;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}





Tambien debemos editar la sección location añadiendo "index.php" para que nginx lo reconozca como archivo del indice del directorio de trabajo.
 

#gzip on;

server {
listen 80;
server_name localhost;

#charset koi8-r;

#access_log logs/host.access.log main;

location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}


Ahora vamos a añadir la funcion phpinfo() a un archivo llamado index.php para realizar nuestra prueba de que php está funcionando correctamente junto a Nginx. Escribimos el comando

echo -e "<?phpnphpinfo();n?>" > /usr/share/nginx/html/index.php

, reiniciamos el servidor con systemctl restart nginx y abrimos la URL http://localhost/index.php, si todo ha salido bien nos aparecerá una pestaña con información así:



Una vez comprobado que el modulo PHP está funcionando correctamente, podemos activar el autoarranque del servicio con systemctl enable php-fpm. Seguidamente debemos instalar un gestor de bases de datos, en este caso MariaDB.


3) Instalación y configuración de MySQL.


El proceso de instalación es sencillo, solo basta con teclear como root: pacman -S mysql, nos va a preguntar que queremos si MariaDB u otro gestor, elegimos MariaDB ya que es 100% compatible con el antiguo MySQL el cual fue quitado de los repositorios por problemas con las politicas de software y esperamos a que finalice la instalación.

Hecho esto necesitamos instalar las DB (Bases de datos) propias de MariaDB que necesita para funcionar, en otros sistemas esta instalación se hace por defecto pero estamos en ArchLinux así que ejecutamos el siguiente comando en una terminal como root:

mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

Luego iniciamos el servicio con systemctl start mysqld e iniciamos el script de configuración con mysql_secure_installation.

Primero de todo nos pide la contraseña actual del root de Mysql (distinta del usuario root del sistema). Como acabamos de instalar MySQL, presionamos enter sin proporcionar ninguna contraseña.
 

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Ahora nos pedira que definamos la contraseña de root, para ello tecleamos Y y presionamos enter. Entonces nos pedirá la contraseña nueva, que le proporcionaremos.

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.

Set root password? [Y/n] Y
New password:


Ahora nos preguntará si deseamos eliminar un usuario anónimo que se ha creado durante la instalación para hacer pruebas. Respondemos afirmatívamente con un Y:

Remove anonymous users? [Y/n] Y


Todo seguido, nos pregunta si sólo deseamos permitir el login del usuario root desde localhost. En mi caso responderé que si aunque quizás te interese acceder como root desde la LAN o desde Internet.

Disallow root login remotely? [Y/n] Y

Con el usuario anonimo se había creado unas tablas de prueba, cuando nos pregunte si deseamos borrarlas, las eliminamos:

Remove test database and access to it? [Y/n] Y

Finalmente nos preguntará si queremos recargar los privilegios de la base de datos. Respondemos afirmativamente.

Reload privilege tables now? [Y/n] Y

Después de finalizar la configuración, reiniciamos nuestro servidor de base de datos con systemctl restart mysqld, ahora que tenemos MariaDB funcionando lo añadimos al inicio del sistema con systemctl enable mysqld.

4) Instalación de PhpMyAdmin

Instalamos:
 

pacman -S phpmyadmin php-mcrypt 

Creamos un enlace simbólico entre nuestro servidor web y phpmyadmin:

ln -s /usr/share/webapps/phpMyAdmin /usr/share/nginx/html/phpmyadmin


Editamos el fichero /etc/php/php.ini. Primero añadimos la carpeta /usr/share/webapps/ a la variable open_basedir para que PHP se ejecute al cargar PHPMyAdmin. Nos tiene que quedar algo así:
 

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/



Después descomentamos las lineas siguientes para que PhpMyAdmin pueda acceder a la base de datos. Quitamos el ; inicial:
 

extension=mcrypt.so
extension=mysqli.so
extension=mysql.so
extension=zip.so
extension=bz2.so



Ahora editamos el fichero /etc/webapps/phpmyadmin/config.inc.php y buscamos estas líneas:
 

$cfg['blowfish_secret'] = '';


Debemos escribir una frase que phpmyadmin usará para encriptar la contraseña en la sessión. Es una medida de seguridad. Por ejempplo puedes poner...
 

$cfg['blowfish_secret'] = 'sechacklabs32.?';


Recomiendo generar esta frase con un generador de contraseñas como por ejemplo la función integrada de KeepassXC (un gestor de contraseñas muy bueno).

Ahora esta línea (Sino está la añadimos):
 

$cfg['Servers'][$i]['connect_type'] = 'tcp';


Substituimos tcp por socket.
 

$cfg['Servers'][$i]['connect_type'] = 'socket';


Y añadimos esta linea:
 

$cfg['Servers'][$i]['socket']= '/var/run/mysqld/mysqld.sock';


Guardamos la configuración y reiniciamos el php-fpm:
 

systemctl restart php-fpm 

Finalmente nos tiene que funcionar la interface de PHPMyAdmin:

   

Ahora introducimos las credenciales que asignamos en el proceso de configuración de MariaDB e ingresamos y obtendremos esto:



Ahora que ya tenemos el servidor web con PHP habilitado y la interficie de PhpMyAdmin para poder manejar las bases de datos, puedes subir la página web que desees a tu servidor y configurarla. En este tutorial no he explicado como configurar un servidor FTP porque no me hace falta, usando SSH se pueden subir ficheros con el protocolo SFTP (que no deja de ser FTP sobre SSH).

Con esto finalizamos nuestra primera parte sobre cómo montar un servidor LNMP en ArchLinux, si tienes algún comentario o recomendación pueden dejarla en los comentarios. Muy pronto estaremos publicando la segunda parte.

Síguenos en FacebookTwitterunete a nuestra charla en Riotúnete a IRC o únete a Telegram y no olvides compartirnos en las redes sociales. También puede hacernos una donación o comprar nuestros servicios.

Acerca del autor

Sociólogo de profesión y un fiel militante en tecnologías de la privacidad, también editor en la wiki de "Archlinux", el blog "El Binario" y para el portal "Security Hack Labs", me puedes contactar en Telegram como @D1nam0 o bien por mail d1nam0@cryptolab.net