Blog sobre seguridad informática, privacidad, anonimato, hacking ético, programación y sistemas operativos en general.

jueves, 24 de agosto de 2017

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














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.

1) 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.

2) 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 "<?php\nphpinfo();\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.

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 comando mysql_install_db --user=mysql --basedir=/usr --datadir=/var/lib/mysql en una terminal como root. 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.
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 KeepassX (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 interfície de PHPMyAdmin:
Ahora introducimos las credenciales que asignamos en el proceso de configuracion 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 Facebook, Twitter y unete a nuestra charla en Riot. También puedes dejar su donación a nuestra cuenta Paypal.

0 comentarios:

Publicar un comentario