Tabla de Contenidos
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:
- Un navegador intenta conectarse a un servior web protegido mediante certificados SSL.
- El navegador solicita que el servidor web se identifique.
- En respuesta el servidor web envía al navegador una copia de su certificado SSL.
- El navegador evalúa si el certificado SSL es confiable. En caso afirmativo, envía una señal al servidor web.
- A continuación, el servidor web devuelve un reconocimiento firmado digitalmente para iniciar una sesión cifrada mediante SSL.
- 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:
- Crear el fichero de configuración dentro del directorio
/etc/apache2/sites-available
. - Usar el comando
a2ensite
[nombre-fichero] para habilitarlo. - 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 administradorServerName
: dominio base que debería coincidir para esta definición de host virtualServerAlias
: define más nombres de dominio que redirigen a este mismo sitioDocumentRoot
: 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.
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>
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:
- Instalar el paquete del módulo: ejemplo →
apt-get install libapache2-mod-php
- Al instalar un paquete se crearán los ficheros de configuracion en
/etc/apache2/mods-available
- Habilitar el módulo en el servidor:
a2enmod php
- 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-ASCIIphp-zip
: módulo de PHP para subir archivos zip a phpmyadminphp-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 ficheroAuthName
: Mensaje que mostrará el dialogo de autenticaciónAuthUserFile
: Ruta del fichero con las clavesRequire 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