Montando un Servidor Web con Ubuntu

En este documento veremos el proceso y comandos básicos para instalar servicios en un sistema operativo Ubuntu.


Partiremos de un Ubuntu Server al cual accederemos vía SSH.

Tecnologías a implementar

SERVER – HOST

En la primera fase prepararemos el sistema para acceso remoto con seguridad baja. En la segunda fase securizaremos el servidor.

Servicios y herramientas:

  • SSH
  • Apache2
  • PHP
  • MySQL
  • FTP
  • CMD o PuTTY para conexión SSH
  • Workbench
  • VS Code vía SSH
  • FileZilla cliente

1. Conexión SSH

Primero comprobamos si SSH está instalado:

dpkg -l | grep openssh-server

Si aparece openssh-server, está instalado. Si no:

sudo apt install ssh

Una vez instalado, desde Windows o PuTTY:

ssh usuario@ipdelservidor

2. Instalación de Apache2

Instalamos Apache:

sudo apt install apache2

Esto permitirá responder a peticiones HTTP por el puerto 80.

Si la máquina usa IP dinámica, consulta la IP con:

ifconfig

(Instalar net-tools si no lo tienes: sudo apt install net-tools)

Al acceder desde un navegador a la IP del servidor, deberías ver la página por defecto de Apache.

La carpeta web se encuentra en:

/var/www/html

Aquí podrás crear tus documentos HTML.


3. Instalación de MySQL Server

Instalamos MySQL:

sudo apt install mysql-server

Ejecutamos script de configuración:

mysql_secure_installation

Las preguntas:

  1. Set root password? → Y
  2. Remove anonymous users? → Y
  3. Disallow root login remotely? → Y
  4. Remove test database? → Y
  5. Reload privilege tables now? → Y

Reinicia el servicio:

sudo systemctl restart mysql

Acceso:

sudo mysql -u root -p

3.1 Conexión remota a MySQL

Debemos modificar el archivo mysqld.cnf:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Busca:

bind-address = 127.0.0.1

Cámbialo por:

0.0.0.0

(Así permitimos conexiones remotas.)

Políticas de contraseñas MySQL

Valores: LOW = 0, MEDIUM = 1, STRONG = 2.

Ver configuración actual:

SHOW VARIABLES LIKE 'validate_password%';

Cambiar política:

SET GLOBAL validate_password.policy=LOW;

También puedes personalizar los requisitos:

SET GLOBAL validate_password.length = 6;
SET GLOBAL validate_password.number_count = 0;

Según queramos podemos cambiar el valor por LOW, MEDIUM o STRONG
Ejemplos de contraseñas:

LOW:
12345678
password

MEDIUM
Estudiante123@
Codificador NINZA$100
demoPass#00

Esta es la recomendada, por defecto solicita

  • La contraseña debe tener al menos 8 caracteres.
  • El recuento de mayúsculas y minúsculas es 1 (al menos 1 letra en minúscula y 1 letra enmayúscula)
  • El recuento de números es 1
  • El número mínimo de caracteres especiales es 1

Otra forma de cambiar la politica de contraseñas sería:

mysql>SET GLOBAL validate_password.policy=0;
mysql>SET GLOBAL validate_password.policy=1;
mysql>SET GLOBAL validate_password.policy=2;

Tambien podemos personalizar los requisitos de cada una, ejemplo:

mysql>SET GLOBAL validate_password.length = 6;
mysql>SET GLOBAL validate_password.number_count = 0;

Ahora que las reglas para una contraseña válida están claras, puedes crear un usuario con
una contraseña válida


3.2 Creación de usuario MySql

Crear usuario:

CREATE USER 'user'@'127.0.0.1' IDENTIFIED BY 'Estudiante123@';
CREATE USER 'user'@'%' IDENTIFIED BY 'Estudiante123@';

Al crear el usuario ponemos entre la @ primero el nombre y luego desde donde vamos a
permitir que se conecte. si es desde localhost, una ip determinada o cualquier sitio.

Ejemplos:

CREATE USER ‘user’@’127.0.0.1’ IDENTIFIED BY ‘Estudiante123@’;

crearemos un usuario con contraseña MEDIUM y que solo se pueda conectar desde
localhost

CREATE USER ‘user’@’%%’ IDENTIFIED BY ‘Estudiante123@’;

Asignar permisos:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD 
ON *.* TO 'user'@'%' WITH GRANT OPTION;

Aplicar cambios:

FLUSH PRIVILEGES;

3.3 Conexión desde Workbench

Ahora que ya tenemos configurado nuestro gestor de mysql y hemos puesto que se pueda
acceder desde cualquier Ip, instalamos Workbench en nuestro host y nos conectamos.

En el cliente, instala Workbench y conecta usando:

  • IP del servidor
  • Puerto 3306
  • Usuario creado
  • Contraseña asignada

4. Instalación del servicio FTP (VSFTPD)

Instalar:

sudo apt install vsftpd

Hacemos backup del archivo de configuración:

sudo cp /etc/vsftpd.conf /etc/vsftpd.conf_old

Editar configuración:

sudo nano /etc/vsftpd.conf

Pegar:

listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
ssl_enable=NO
pasv_enable=YES
pasv_min_port=10000
pasv_max_port=10100
allow_writeable_chroot=YES

Como hemos realizado una copia de seguridad podemos borrar su contenido, otro truco
para muchos archivos de configuración en linux es comentar las lineas anteriores con #, o
simplemente poner la nueva configuración al final del documento.


*Ubuntu en algunas versiones, viene con un firewall llamado UFW. En este caso le debemos
de decir que abra el puerto 20, 21 y los del 10000 al 10100 para su correcto funcionamiento

Abrir puertos en UFW:

sudo ufw allow from any to any port 20,21,10000:10100 proto tcp

Reiniciar servicio:

sudo systemctl restart vsftpd

4.1 Acceso vía FTP desde el cliente

Para transmitir archivos via FTP al servidor podemos usar cualquier programa de
transmisión de archivos como Filezilla-client

Utiliza FileZilla-client y conecta usando:

  • IP del servidor
  • Usuario FTP
  • Contraseña
  • Puerto 21

Cada usuario tendrá acceso a su carpeta.


4.2 Acceso FTP a la carpeta web de Apache

Dado que nuestro objetivo es montar un servidor web, debemos tener la opción de poder
acceder a las carpetas de de apache html, para poder transmitir los archivos de una web,
imagenes, etc.


Existe varios modos, veamos el que considero mas sencillo para inicial. Que consiste en
crear un usuario donde su carpeta personal sea la www de Apache2 y dar permisos a esta
carpeta.

Creamos un usuario cuyo directorio sea la carpeta web:

sudo useradd -m ftpuser
sudo passwd ftpuser

*Con la opción -m indicamos que nos cree una carpeta para el usuario

Finalmente, podemos editar el archivo /etc/passwd para cambiar la carpeta al que el usuario
tendrá acceso.

sudo nano /etc/passwd   ← Cambia el directorio del usuario.

También podrías jugar con los grupos de usuarios en Linux, para dar acceso a diferentes
usuarios, algunos comandos útiles que podrías repasar podrían ser:

Modificar grupos/permisos:

sudo chgrp -R ftpuser www
sudo groupadd grupo
sudo adduser usuario grupo
sudo chmod -R 775 www

5. Instalación del intérprete PHP

Instalamos PHP y módulos:

sudo apt install php libapache2-mod-php php-mysql php-cli

php: el propio interprete, si queremos una versión especifica podriamos poner php8.1, php7,
etc.


libapache2-mod-php: Libreria que permite trabajar a apache2 con php (Imprescindible en
nuestro caso)

php-mysql: Libreria que permite hacer conexiones desde php a mysql (Imprescindible si
hacemos app con acceso a bases de datos).

php-cli: Aunque para un servidor web no es necesario, si es util para ejecutar scripts de php
directamente en la terminal, para temas de mantenimiento, tareas crontab, envio de
mensajes, etc.

Una vez instalado puede comprobar la versión instalada con:

php -v

Crear archivo de prueba:

sudo nano /var/www/html/version.php

Contenido:

<?php
phpinfo();
?>

Dar permisos:

sudo chmod 775 version.php

Probar desde el navegador: http://IP/version.php


Ejecución PHP desde terminal

Crear archivo:

sudo nano infosys.php

Contenido:

<?php 
$os = php_uname(); 
$cpu = shell_exec('cat /proc/cpuinfo | grep "model name" | head -n 1'); 
$memTotal = shell_exec('cat /proc/meminfo | grep MemTotal'); 
$memFree = shell_exec('cat /proc/meminfo | grep MemFree'); 
$disk = shell_exec('df -h'); 

echo "Información del Sistema:\n";
echo "Sistema Operativo: $os\n";
echo "Procesador: $cpu\n"; 
echo "Memoria Total: $memTotal"; 
echo "Memoria Libre: $memFree\n"; 
echo "Espacio en Disco:\n$disk\n"; 
?>

Ejecutar:

php infosys.php

6. Acceso por SSH desde un IDE – Visual Studio Code

Instalar VSCode: https://code.visualstudio.com/Download

Instalar extensión: Remote – SSH

Crear conexión:

  1. Clic en icono de conexión remota.
  2. Add New SSH Host.
  3. Indicar un nombre sin espacios.
  4. Elegir dónde guardar el archivo de configuración.
  5. Indicar sistema operativo remoto (Linux).
  6. Escribir parámetros:
Host Mi_conexion
  HostName 192.168.x.x
  User ubuntu

Una vez guardado, podrás acceder desde VS Code, abrir carpetas del servidor y usar la terminal integrada.