Herramientas de usuario

Herramientas del sitio


bloque3:web

Servidores Web y Bases de Datos

Protocolo HTTP

El protocolo HTTP (HyperText Transfer Protocol) es quizá el protocolo más importante que debemos conocer como desarrolladores Web. Fue diseñado para transmitir HTML (HyperText Markup Language) pero hoy en día se utiliza para transmitir todo tipo de documentos (imágenes, audio, video, PDF, etc.) y para crear aplicaciones Web.

HTTP es un protocolo cliente-servidor, lo que significa que el cliente envía una petición al servidor y espera un mensaje de respuesta del servidor. Es un protocolo sin estado, lo que significa que el servidor no guarda información del cliente, cada petición es independiente de las demás.

El puerto habitual de el protocolo HTTP es el 80.

Mensajes HTTP

Un mensaje HTTP (no importa si es de petición o respuesta) se compone de 3 partes:

  • La primera línea (que es diferente para la petición y la respuesta).
  • Los encabezados.
  • El cuerpo (opcional)

La siguiente imagen muestra mejor las partes de cada mensaje:

En el caso del mensaje de petición:

  • El verbo (en este caso GET)
  • El recurso (en este caso /index)
  • La versión de HTTP (en este caso HTTP/1.1)

Y para el mensaje de respuesta:

  • La versión de HTTP (HTTP/1.1)
  • El código de respuesta (200 OK)

La siguiente imagen muestra, en las herramientas de desarrolladores de un navegador, el mensaje de petición y respuesta cuando hacemos una petición a http://google.com.co/lsdifs. Fíjate que el código de respuesta es 404 Not Found:

URL

Un URL (Uniform Resource Locator) se utiliza para ubicar un recurso en Internet. Los URLs no solo se pueden utilizar para el protocolo HTTP, se utilizan en muchos otros protocolos.

  • Esquema: El esquema define el protocolo a utilizar, para HTTP puede ser http o https (el protocolo seguro de HTTP).
  • Host: La IP o el nombre del servidor que se quiere acceder (p.e. 127.0.0.1, localhost, google.com, www.google.com.co, etc.)
  • Puerto: El puerto en el que está escuchando el servidor HTTP. Si se omite se asume que es el 80.
  • Path: La ruta al recurso que se quiere acceder.
  • Query String: Contiene información adicional para el servidor en forma de propiedades (atributo=valor). Las propiedades se separan por &.
  • Fragmento: La referencia a una ubicación interna del documento.

Protocolo HTTPS

A diferencia de HTTP, HTTPS utiliza el certificado de un proveedor externo para asegurar, y proteger, una conexión y así verificar que el sitio sea legítimo. Este certificado de seguridad se conoce como certificado SSL.

SSL es la abreviatura para “Secure Sockets Layer”. Esto crea una conexión segura y cifrada entre un navegador y un servidor, y protege la capa de comunicación entre ambos. Actualmente, HTTPS suele combinarse con el protocolo de la capa de transporte TLS (Transport Layer Security). El puerto habitual de el protocolo HTTPS es el 443.

TLS

Es el protocolo de la capa de transporte que nos permite enviar la información cifrada. Utiliza un sistema de handshake antes de iniciar la transferencia de datos:

Entre cliente y servidor se establece el hadshake del siguiente modo:

  1. Un navegador intenta conectarse a un servior web protegido mediante certificados SSL.
  2. El navegador solicita que el servidor web se identifique.
  3. En respuesta el servidor web envía al navegador una copia de su certificado SSL.
  4. El navegador evalúa si el certificado SSL es confiable. En caso afirmativo, envía una señal al servidor web.
  5. A continuación, el servidor web devuelve un reconocimiento firmado digitalmente para iniciar una sesión cifrada mediante SSL.
  6. Los datos cifrados se comparten entre el navegador o servidor y el servidor web.

Servidor Internet Information Services (IIS)

Internet Information Services (ó IIS) es un servidor web creado por Microsoft para su uso en la familia de sistemas operativos Windows. Soporta los servicios HTTP, HTTPS FTP, SFTP, etc.

Las aplicaciones necesarias vienen añadidas habitualmente a los sistemas Windows y tan solo debemos activarlas desde el panel de control para empezar a utilizarlas:

Servidor Web Apache

El Apache HTTP Server es un servidor gratuito, de código abierto y multiplataforma (Linux, Windows, MacOS) distribuido bajo la licencia Apache 2.0. Es desarrollado y mantenido por una comunidad abierta de desarrolladores que trabajan bajo los términos de la Apache Software Foundation.

Es el servidor Web más utilizado del mundo junto con el servidor nginx, siendo superado por este último en cuanto a popularidad a lo largo del año 2022, aunque muy lejos del resto de aplicaciones.

La gran mayoría de instancias de servidor Apache corren en distribuciones Linux, aunque las versiones actuales también se pueden ejecutar en sistemas Windows y en una gran variedad de sistemas Unix.

Instalación

Para instalar Apache 2 ejecutaremos:

$ apt-get install apache2

Comprobaremos el estado del servicio mediante el comando systemctl:

$ systemctl status apache2

Para reiniciarlo, en caso de modificar su configuración:

$ systemctl restart apache2

Una vez instalado podemos comprobar si está funcionando escribiendo en la barra de búsqueda de nuestro cliente web: localhost ó 127.0.0.1.

El servidor web impide el acceso a todos los directorios de nuestro sistema excepto a dos lugares, que son los directorios establecidos por defecto en Apache:

  • /var/www: Es el directorio por defecto para alojar los documentos html que servirá nuestro servidor.
  • /usr/share: Es el directorio que utilizan las aplicaciones web instaladas desde Debian.

En caso de pretender añadir mis sitios web y sus directorios debo configurar hosts virtuales.

Firewall

Del mismo modo que tendremos que hacer con todos los servicios de nuestro sistema, debemos controlar los puertos de acceso a nuestros servidores. Si tenemos activo el Firewall Ufw que instalamos para controlar el acceso al servicio FTP del bloque 2, lo configuramos del siguiente modo:

Mediante el siguiente comando podemos ver las aplicaciones disponibles:

$ ufw app list

Respecto a Apache, tenemos 3 posibilidades:

  • WWW: abre solo el puerto 80 (tráfico web normal no cifrado, con http).
  • WWW Full: abre el puerto 80 (tráfico web normal no cifrado, con http) y el puerto 443 (tráfico TLS/SSL cifrado, con https)
  • WWW Secure: abre solo el puerto 443 (tráfico TLS/SSL cifrado, con https)

Dado que nos interesa permitir el trafico mediante Http y Https, vamos a añadir la regla Apache Full.

$ ufw allow "WWW Full"
 
#Tambien podemos abrir los puertos o servicios concretos
$ ufw allow http 
$ ufw allow 80
 
$ ufw allow https 
$ ufw allow 443

Para comprobar el estado del Firewall:

$ ufw status verbose

Configuración del Servidor

Al igual que la mayoría de servidores en los sistemas Linux, Apache se configura en base a ficheros de texto. Todos los ficheros para configurar apache se encuentran en /etc/apache2. A continuación explicamos su estructura:

  • /etc/apache2/apache2.conf: archivo principal de configuración de Apache. Se usa para realizar cambios en la configuración general.
  • /etc/apache2/ports.conf: fichero de puertos en los que Apache escucha solicitudes. Este fichero es cargado desde apache2.conf.
  • /etc/apache2/sites-enabled/: directorio de los ficheros de configuración de hosts virtuales habilitados.
  • /etc/apache2/conf-enabled/: directorio de ficheros de configuración globales del servidor.
  • /etc/apache2/mods-enabled/: directorio con los ficheros de configuración de los módulos habilitados.
  • sites-available, /etc/apache2/conf-available/ y /etc/apache2/mods-available/: estos directorios contienen los ficheros de configuracion de virtual hosts, configuraciones globales y módulos disponibles. Al habilitar estos ficheros, se crea un enlace en el directorio *-enabled correspondiente. Para habilitar o deshabilitar las configuraciones de estos directorios usaremos a2ensite / a2dissite, a2enconf / a2disconf, y a2enmod / a2dissmod.

A la hora de realizar modificaciones en los ficheros de configuración, apache nos brinda una herramienta para comprobar si la sintaxis de los ficheros es correcta:

$ apache2ctl configtest

Hosts Virtuales

Por defecto, Apache proporciona documentos desde el directorio /var/www/html al escribir la dirección IP de nuestro servidor. Esto se debe a que tiene configurado un virtual host por defecto en el fichero 000-default.conf del directorio sites-available.

Para crear host virtuales debemos crear fichero en el directorio /etc/apache2/sites-available. Cuando habilitamos estos ficheros de configuración, se crea un enlace automáticamente en el directorio /etc/apache2/sites-enabled.

El proceso para habilitar un host virtual es el siguiente:

  1. Crear el fichero de configuración dentro del directorio /etc/apache2/sites-available.
  2. Usar el comando a2ensite [nombre-fichero] para habilitarlo.
  3. El comando anterior creará un enlace al fichero, en el directorio /etc/apache2/sites-enabled.

Los ficheros de hosts virtuales se cargan en orden alfabético (por su nombre de fichero). Siempre que accedamos a nuestro servidor a través la IP, se mostrará el contenido del primer virtual host cargado.

Tipos de Hosts Virtuales

Existen dos tipos de hosts virtuales:

  • Basados en nombre: permite asociar nombres de dominio con directorios web. Probablemente es el planteamiento más habitual.
  • Basados en IP: permite asociar las IPs de las diferentes interfaces de red de mi servidor con directorios web. Requiere que mi servidor tenga diferentes interfaces configuradas.

Host Virtual basado en nombre

Los hosts virtuales basados en nombre se utilizan para poder acceder a diferentes aplicaciones web, que pueden estár localizadas en diferentes directorios, a partir de diferentes nombres de dominio. Por ejemplo, para acceder a las diferentes aplicaciones alojadas en el servidor de Google utilizamos diferentes nombres de dominio:

  • google.com : buscador de Google
  • maps.google.com : Google maps
  • mail.google.com : Gmail
  • drive.google.com : Google Drive
  • youtube.com : Youtube

Hasta ahora para acceder a diferentes aplicaciones dentro de nuestro servidor debemos indicar en el navegador la ruta del directorio al que quiero acceder: 192.168.1.1/dokuwiki o 192.168.1.1/phpmyadmin. Configurando hosts virtuales por nombre, puedo acceder a las diferentes aplicaciones a partir de diferentes nombres.

A continuación vamos a crear un host virtual basado en nombre en el fichero /etc/apache2/sites-available/despliegue.com.conf:

etc/apache2/sites-available/despliegue.com.conf
<VirtualHost *:80>
    ServerAdmin admin@despliegue.com
    ServerName despliegue.com
    ServerAlias www.despliegue.com despliegue.es
    DocumentRoot /var/www/despliegue/public_html
 
    # Para log de errores
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
  • VirtualHost [ip]:80: Indico la ip del servidor. Indicar el puerto 80 es opcional.
  • ServerAdmin: correo electrónico al que pueda acceder el administrador
  • ServerName: dominio base que debería coincidir para esta definición de host virtual
  • ServerAlias: define más nombres de dominio que redirigen a este mismo sitio
  • DocumentRoot: Indicamos la ruta de nuestros documentos (debe estar dentro de los directorios habilitados, sino debo habilitarlos mediante <Directory>…)
  • ErrorLog: Ficheros para log de errores: Por defecto en /var/log/apache2/error.log

También podemos crear hosts virtuales asociados a un puerto diferente, de modo que si indicando diferentes puertos se permite acceder a diferentes sitios: VirtualHost [ip]:8080.

Para habilitar el archivo anterior:

$ a2ensite despliegue.com.conf

Deshabilitamos el fichero de host virtual por defecto:

$ a2dissite 000-default.conf

Finalmente reiniciamos el servidor.

Recordemos que cuando accedemos al servidor por un nombre que no coincide con ningún virtual host, o mediante la IP, se mostrará el contenido del primer Virtual Host cargado (alfabéticamente).

Fichero hosts

Cuando realizamos configuraciones en entornos de pruebas privados, es probable que no tengamos acceso a ellos desde internet, por lo que no podremos utilizar nombres de dominio TLD. Sin embargo, podemos asociar nombres de dominio a direcciones IPs sin necesidad de instalar y configurar servidores DNS, mediante el fichero de hosts. Se puede considerar como el fichero DNS local.

Este fichero se encuentra en:

  • Linux: /etc/hosts
  • Windows: c:\Windows\System32\Drivers\etc\hosts

Su estructura es la siguiente:

c:\Windows\System32\Drivers\etc\hosts
#Dirección IP   nombres de dominio separados por espacio
 
102.54.94.97    rhino.acme.com rhino.acme.es      
38.25.63.10     x.acme.com   
 
ip_servidor     nombre1.dominio nombre2.mi.dominio         

Este fichero debe ser configurado en el equipo cliente, ya que es el equipo que debe conocer las direcciones ip's a las que se va a conectar.

Una vez modificado con los nombres de dominio deseados, los sistemas operativos revisarán el fichero antes de hacer una solicitud al servidor DNS. Sin embargo a los navegadores web actuales debemos forzarles a que lo comprueben también.

Acceder a directorios

Cómo hemos dicho, en el fichero /etc/apache2/apache2.conf se indican los directorios a los que apache concede acceso. Si queremos crear un host virtual en otros directorios, o modificamos el fichero apache2.conf, o añadimos la configuración de directorios al fichero de host virtual:

etc/apache2/sites-available/despliegue.com.conf
<VirtualHost *:80>
    ServerAdmin admin@despliegue.com
    ServerName personal.despliegue.com
    ServerAlias www.directorio.despliegue.com
    DocumentRoot /home/despliegue/public_html
    . . . 
 
    <Directory "/home/despliegue/public_html">
        Options Indexes FollowSymLinks
        Require all granted
        AllowOverride All
    </Directory>
</VirtualHost>

Control de Acceso

Otra de las funcionalidades del servidor Apache nos permite controlar el acceso a ciertos directorios por parte de los clientes. Principalmente tenemos dos planteamientos:

  • Control de acceso: permite indicar si el cliente tiene acceso o no a un recurso.
  • Autenticación: permite solicitar unas credenciales al cliente para acceder a los recursos.

Los dos planteamientos anteriores son complementarios.

Control de acceso

Se realiza a la hora de ofrecer recursos mediante el servidor Apache, y se aplica sobre directorios mediante la directiva Require:

# Todos los clientes acceden
<Directory /var/www/directorio>
Require all granted
</Directory>
 
# Solo el cliente con dicha ip accede
<Directory /var/www/directorio>
Require all denied
Require ip 192.168.1.45
</Directory>

Estas configuraciones se pueden aplicar en los diferentes fichero de configuración, como podría ser el de un host virtual.

El resultado es:

Autenticación

Para crear un sistema de autenticación que controle el acceso a un directorio tenemos que crear un fichero .htaccess en el directorio que queremos proteger. En el siguiente ejemplo vamos a utilizar un sistema de autenticación basado en fichero, pero podríamos autenticar contra una base de datos, u otros métodos.

/var/www/miweb/.htaccess
AuthType Basic
AuthName "Acceso Restringido"
AuthUserFile /var/www/miweb/.htpasswd
Require valid-user

A continuación, daré de alta un usuario junto con su contraseña y lo guardaré en el fichero AuthUserFile cuya ruta he definido en la configuración anterior: AuthUserFile /var/www/directorio1/.htpasswd. Si quiero añadir más usuarios posteriormente, uso el comando sin la opción -c:

$ htpasswd -c /var/www/miweb/.htpasswd nombre_usuario

Los ficheros .htaccess sobrescriben las configuraciones por defecto de los sitios web habilitados en mi servidor. Debo añadir las siguientes lineas al fichero de configuración de mi virtual host:

<Directory /var/www/miweb/>
  AllowOverride All
</Directory>

El resultado es:

Módulos

Apache tiene una configuración basada en módulos: permite cargar diferentes funcionalidades para el servidor según las necesidades de cada sitio web. Algunos módulos habituales que podemos necesitar pueden ser el módulo php para que el servidor permita ejecutar scripts, o el modulo ssl o tls, para permitir transferencias cifradas.

Para permitir que Apache use un módulo:

  1. Instalar el paquete del módulo: ejemplo → apt-get install libapache2-mod-php
  2. Al instalar un paquete se crearán los ficheros de configuracion en /etc/apache2/mods-available
  3. Habilitar el módulo en el servidor: a2enmod php
  4. Al habilitarlo se creará un enlace a los ficheros en el directorio /etc/apache2/mods-enabled

Puedo configurar qué modulos utilizar en cada virtual host.

PHP

Para instalar PHP en mi sistema debian me basta con indicar el paquete php. Sin embargo, si quiero que el servidor apache permita ejecutar scripts php ante solicitudes http, debo instalar el módulo libapache2-mod-php. Además, si quiero que esos scripts puedan conectarse a mi servidor de bases de datos compatible con mysql, debo instalar el paquete php-mysql. El módulo php-xml habilita las funcionalidades de XML. Lo puedo hacer todo en una misma linea:

$ apt-get install php libapache2-mod-php php-mysql php-xml
 
# Una vez instalado puedo comprobar la versión
php -v

* Debo tener en cuenta que si no indico ninguna versión de paquete php, se instalará la versión estable del repositorio de Debian.

Para comprobar que mi servidor ahora ejecuta scripts php, crearé uno sencillo:

<php?
   phpinfo();
?>

Emplazaré ese fichero en una ruta accesible en el servidor, y comprobaré si muestra la información.

Permisos de usuario Apache

Los lenguajes de servidor como PHP tienen la capacidad de escribir o modificar ficheros del servidor. Por lo tanto para que un script creado en PHP pueda escribir en el sistema de archivos del servidor, debo tener en cuenta los permisos del script.

El siguiente script PHP contiene un formulario HTML con un campo de texto. Al pulsar el botón creará un fichero que contiene el texto introducido. Intentemos ejecutar el siguiente fichero PHP en nuestro servidor y veamos qué ocurre:

index.php
<html>
  <body>
    <form action="index.php" method="post">
      <input type="text" name="texto" required />
      <input type="submit" value="Escribir en Fichero" />
    </form>
  </body>
</html>
 
<?php
  ini_set('display_errors',1); //Muestra los errores
  if(isset($_POST['texto'])){
    $fichero = fopen("fichero.txt", "a+");
    fwrite($fichero, $_POST['texto']);
    fclose($fichero);
  }
?>

Para permitir que mi script tenga permisos de escritura sobre directorios o ficheros debo asegurarme que el usuario de Apache tiene permisos sobre los ficheros o directorios que se desean modificar. El usuario que tiene asociado el servidor Apache se llama www-data:

$ chown -R www-data:www-data /var/www/html/directorio_con_php

La instrucción anterior asignará al usuario y al grupo www-data como propietarios del directorio “directorio_con_php” y de todo su contenido (opción -R : Recursivo).

Bases de Datos

Si tenemos una aplicación web dinámica es bastante habitual que accedan a una base de datos. A continuar vamos a habilitar esta funcionalidad.

Instalación y Configuración de MariaDB

El SGBD de bases de datos MySQL dejó de ser el SGBD estándar en las distribuciones linux. Cuando queramos instalar MySQL (paquete default-mysql-server), lo que se nos instalará será MariaDB, el fork del proyecto inicial de MySQL. Debian usa únicamente software libre en sus repositorios por lo que el actual sistema compatible con MySQL es MariaDB.

Para asegurarnos compatibilidad a largo plazo, en lugar de usar el paquete default-mysql-server, instalaremos directamente el paquete mariadb-server.

$ apt-get install mariadb-server

Su directorio de configuracion es /etc/mysql

Además, a la hora de trabajar con MariaDB, se recomienda limitar el uso del usuario root del sistema. Para ello vamos a crear un usuario standard que pertenezca al grupo sudo:

Para ello instalamos la herramienta sudo:

$ apt-get install sudo
 
# Después añadimos nuestro usuario al grupo "sudo"
$ adduser "nombre_usuario" sudo

A partir de aquí se recomienda utilizar nuestro usuario con permisos administrativos, en lugar del usuario root.

Una vez instalado el servidor MariaBD, se recomienda ejecutar el script de seguridad que viene con dicho servidor. Nos ayudará a eliminar algunas configuraciones por defecto del servidor y asegurar el acceso a nuestro SGBD:

$ mysql_secure_installation

Este script nos irá preguntando una serie de cuestiones. Las más importantes son las tres primeras:

  • La primera nos pide contraseña del usuario root de la base de datos. Como no lo vamos a utilizar, debemos dejar este campo en blanco y pulsar intro.
  • A continuación nos pide indicar si queremos usar unix_socket_authentication a lo que respondemos 'n'.
  • Por último nos pide si queremos cambiar la contraseña del usuario root de MariaDB, a lo que responderemos 'n'.
  • A partir de aquí responderé yes a todas las preguntas (desactivar usuarios anónimos, evitar conexiones desde fuera del servidor, eliminar la bbdd test, y recargar la tabla de permisos).

Ahora, podré administrar el servidor de bases de datos con el usuario root, o con cualquier usuario del sistema operativo con permisos administrativos (sudo). Tampoco permitiremos que ningún cliente (applicación) pueda conectarse a mariadb desde fuera del servidor.

* La forma segura de trabajar contra un servidor de bbdd es crear usuarios concretos para cada aplicacion web y con acceso a la base de datos concreta esa aplicación web.

Conectarme al servidor

Finalmente, para conectarme al servidor MariaDB usaré el cliente de linea de comandos. Debo tener permisos:

$ mariadb

Crear bases de datos

Para crear una base de datos, una vez que nos hemos conectado mediante el cliente, utilizaremos el lenguaje SQL como de constumbre.

En caso de que tengamos un fichero con un script SQL ya creado, también podemos “pasarselo” al cliente mariadb directamente, y nos lo ejecutará, creando la base de datos que contenga el script SQL:

$ mariadb < script.sql

Crear usuarios en MariaDB

Como hemos dicho, cada aplicación web que trabaje con una base de datos, debe utilizar un usuario concreto con permisos sobre esa base de datos. De este modo evito utilizar tener problemas de seguridad provocados por usuarios que tienen permisos sobre todas las bases de datos. Para crear usuarios utilizo la sentencia CREATE USER:

-- Crear usuario
CREATE USER 'nombre_usuario'@'localhost' IDENTIFIED BY 'password';
 
-- Dar permisos
GRANT ALL ON nombre_base_datos.* TO 'nombre_usuario'@'localhost';

A cada usuario de cada aplicación web, debo darle permisos solamente sobre su base de datos.

A continuación vamos a ver cómo configurar la aplicación phpMyAdmin para facilitar la gestión del servidor de bases de datos.

Gestor PhpMyAdmin

Es una aplicación web para administrar servidores de bases de datos compatibles con mysql. Como es una aplicación web, para poder instalarlo necesito un servidor web compatible con php y un SGBD compatible con MySql.

phpmyadmin no se encuentra en los repositorios estándar de debian, aunque podría añadir su repositorio al ficheros sources.list de debian. En este caso vamos a optar por realizar una configuración segura, ya que al estar en nuestro servidor web público es objetivo de ataques de seguridad.

Dependencias

Antes de obtener la aplicación necesitamos descargar unos paquetes que nos permitirán activar algunas funcionalidades:

  • php-mbstring: extensión PHP para trabajar con cadenas de texto no-ASCII
  • php-zip: módulo de PHP para subir archivos zip a phpmyadmin
  • php-gd: módulo PHP para dar soporte a librerías de imágenes
$ apt-get install php-mbstring php-zip php-gd

Descarga

A continuación debemos ir a la web de descargas de phpmyadmin https://www.phpmyadmin.net/downloads/ y seleccionar la versión que deseamos instalar. Debemos fijarnos que la versión sea compatible con la versión de PHP que hemos instalado previamente. Si queremos phpmyadmin en español debo descargar una versión all-languages.

Para descargarlo tenemos dos opciones:

  • Desde un navegador en otra máquina y transferirlo a mi sistema Linux
  • Directamente desde el terminal de Linux

Para descargarlo directamente desde Linux, copiamos el enlace de descarga del archivo tar.gz con la versión que queremos:

# Para descargar 
$ wget https://files.phpmyadmin.net/phpMyAdmin/5.2.1/phpMyAdmin-5.2.1-all-languages.tar.gz
# Para desempaquetar
$ tar xvf phpMyAdmin-5.2.1-all-languages.tar.gz
 
# Renombro el directorio a phpmyadmin y lo muevo a /usr/share
$ mv phpMyAdmin-5.2.1-all-languages/ /usr/share/phpmyadmin

El directorio base por defecto para alojar phpmyadmin es /usr/share. Recordad que apache ofrece dos rutas por defecto (fichero apache2.conf) para alojar aplicaciones web: /var/www/ y /usr/share.

Configuración manual

Crear el directorio donde phpmyadmin alojará sus archivos temporales

$ mkdir -p /var/lib/phpmyadmin/tmp

Modifica el propietario de ese directorio al usuario www-data. Es el usuario que Apache utiliza en los sistemas Debian:

$ chown -R www-data:www-data /var/lib/phpmyadmin

Ahora vamos a modificar el fichero de configuracion de phpmyadmin. Vamos a realizar una copia de la plantilla de configuración config.sample.inc.php y la guardaremos con el nombre config.inc.php:

$ cp /usr/share/phpmyadmin/config.sample.inc.php /usr/share/phpmyadmin/config.inc.php

Ahora debemos editar el fichero de configuración config.inc.php:

/usr/share/phpmyadmin/config.inc.php
. . .
# Indico una clave de 32 caracteres que usará el algoritmo de encriptacion AES
$cfg['blowfish_secret'] = 'ABDCEFGHIJKLMNÑOPQRSTUVWYZ123456'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
. . .
# Descomento todas las lineas del siguiente apartado

/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
. . .
# Añado esta linea al fichero indicando el directorio temporal creado antes
. . .
$cfg['TempDir'] = '/var/lib/phpmyadmin/tmp';

Tambien podemos generar una clave secreta (blowfish_secret) de 32 bytes exactos para este fichero con el comando: openssl rand -base64 22

Base de datos PhpMyAdmin

PhpMyAdmin necesita su propia base de datos y el usuario creado previamente para trabajar. En el directorio de instalación de la aplicación usr/share/phpmyadmin/sql tengo el script sql con la base de datos para ejecutarla sobre nuestro servidor mariadb:

$ mariadb < /usr/share/phpmyadmin/sql/create_tables.sql

Configuración de Apache

En el directorio de configuración de Apache /etc/apache2/conf-available/ almacenamos los ficheros de configuraciones de nuestro servidor web. Ahora quiero añadir una configuración para mi sitio phpMyadmin, por lo que voy a crear un fichero llamado phpmyadmin.conf en la ruta anterior. Entre otras cosas, en este fichero indicaré la URL que debo usar para acceder a PhpMyAdmin:

/etc/apache2/conf-available/phpmyadmin.conf
# phpMyAdmin default Apache configuration
 
Alias /phpmyadmin /usr/share/phpmyadmin
 
<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
 
    <IfModule mod_php5.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>
 
        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
    <IfModule mod_php.c>
        <IfModule mod_mime.c>
            AddType application/x-httpd-php .php
        </IfModule>
        <FilesMatch ".+\.php$">
            SetHandler application/x-httpd-php
        </FilesMatch>
 
        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    </IfModule>
 
</Directory>
 
# Authorize for setup
<Directory /usr/share/phpmyadmin/setup>
    <IfModule mod_authz_core.c>
        <IfModule mod_authn_file.c>
            AuthType Basic
            AuthName "phpMyAdmin Setup"
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        </IfModule>
        Require valid-user
    </IfModule>
</Directory>
 
# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/setup/lib>
    Require all denied
</Directory>

* Si vamos a copiar código como el anterior y pegarlo en un terminal conectado por SSH, puede que haya errores con los caracteres de salto de linea. Eliminarlos en destino.

Una vez creado y guardado, activamos esa configuración en el servidor, y lo reiniciamos:

$ a2enconf phpmyadmin.conf
$ systemctl reload apache2

En este momento podremos acceder a phpmyadmin desde un cliente web:

http://dominio_o_ip_servidor/phpmyadmin

Usuario administrador

Por último, vamos a crear un usuario para administrar phpmyadmin. Como usuario administrador, necesitamos que tenga permisos para crear otros usuarios y darles permisos. Por ello añadimos WITH GRANT OPTION:

# Desde el terminal de mariadb
GRANT ALL PRIVILEGES ON *.* TO 'fer'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Desde este usuario podré dar de alta a otros usuarios para cada aplicación, con permisos únicamente sobre la bbdd de la aplicación.

Ahora podemos loguearnos en PhpMyAdmin, con el usuario administrador, o con otros usuarios existentes de mariadb.

Controlar acceso a PhpMyAdmin

Dado que phpmyadmin es objetivo de ataques de seguridad, vamos a poner una puerta de enlace delante de nuestra aplicación mediante el uso de las funcionalidades de autenticación de los ficheros .htaccess

Editaremos de nuevo el fichero de configuración de apache, creado anteriormente:

/etc/apache2/conf-available/phpmyadmin.conf
<Directory /usr/share/phpmyadmin>
    Options FollowSymLinks
    DirectoryIndex index.php
    # añadimos la siguiente linea
    AllowOverride All
 
    <IfModule mod_php5.c>
    . . .
$ systemctl restart apache2

A continuación vamos a crear el fichero .htaccess en la directorio de la aplicación phpmyadmin: /usr/share/phpmyadmin/.htaccess. Su contenido será el siguiente:

/usr/share/phpmyadmin/.htaccess
AuthType Basic
AuthName "Acceso restringido"
AuthUserFile /usr/share/phpmyadmin/.htpasswd
Require valid-user
  • AuthType Basic: Tipo de autenticación → Clave almacenada en fichero
  • AuthName: Mensaje que mostrará el dialogo de autenticación
  • AuthUserFile: Ruta del fichero con las claves
  • Require valid-user: Solo los usuarios registrados podrán acceder

Como la ruta del fichero de claves que hemos indicado es: /usr/share/phpmyadmin/.htpasswd, vamos a crearlo con la aplicación htpasswd:

$ htpasswd -c /usr/share/phpmyadmin/.htpasswd nombre_usuario

Nos pedirá creación y confirmación de contraseña. Este usuario es distinto a los demás y se usa por el fichero .htaccess. Si quiero añadir más usuarios, ejecuto el comando anterior eliminando la opción -c.

Ahora puedo volver a acceder a mi servidor:

http://dominio_o_ip_servidor/phpmyadmin

Pero con la diferencia de que el navegador me solicitará un logín antes de permitirme acceder:


Prácticas

  • Práctica 3: Configuración y despliegue en Servidores Web

© 2024 Fernando Valdeón

bloque3/web.txt · Última modificación: 2023/02/19 22:20 por fernando