IAW - LAMP Stack (Teoría)

José Juan Sánchez Hernández

IES Celia Viñas (Almería) - 2019/2020

2 Práctica 1: LAMP Stack (Teoría)

LAMP es el acrónimo usado para describir un sistema de infraestructura de Internet que usa las siguientes herramientas:

3 Linux

Todas las prácticas de este módulo las vamos a realizar sobre Ubuntu Server.

3.1 Primeros pasos con: apt

3.1.1 apt update

Actualiza la lista de paquetes:

sudo apt update

3.1.2 apt upgrade

Actualiza los paquetes instalados a sus últimas versiones disponibles:

sudo apt upgrade

3.1.3 apt full-upgrade

Realiza actualizaciones que impliquen cambiar dependencias, agregar o quitar nuevos paquetes según sea necesario.

sudo apt full-upgrade

3.1.4 apt install

Instala un paquete determinado:

sudo apt install <package name>

3.1.5 apt remove

Desinstala un paquete:

sudo apt remove <package name>

3.1.6 apt purge

Desinstala un paquete determinado y elimina los archivos de configuración asociados:

sudo apt purge <package name>

Busca un paquete entre las descripciones de los paquetes:

sudo apt search <package name>

3.1.8 apt show

Muestra los detalles de un paquete:

sudo apt show <package name> 

3.2 Instalación de un GUI Desktop

Unity desktop:

sudo apt install ubuntu-desktop

GNOME desktop:

sudo apt install ubuntu-gnome-desktop

KDE desktop:

sudo apt install kubuntu-desktop

Otros escritorios que podemos instalar son: xubuntu-desktop, lubuntu-desktop, edubuntu-desktop, etc.

3.3 Instalación de un servidor SSH

sudo apt install ssh

3.4 Cómo iniciar, parar y consultar el servicio de SSH

3.4.1 Método 1. systemctl

sudo systemctl start ssh
sudo systemctl stop ssh
sudo systemctl status ssh

3.4.2 Método 2. /etc/init.d/ssh

sudo /etc/init.d/ssh start
sudo /etc/init.d/ssh stop
sudo /etc/init.d/ssh status

3.5 Instalación de git

sudo apt install git

4 Apache

4.1 Instalación de Apache

sudo apt install apache2

4.2 Cómo iniciar, parar y consultar el estado de Apache

4.2.1 Método 1. systemctl

sudo systemctl start apache2
sudo systemctl stop apache2
sudo systemctl restart apache2
sudo systemctl status apache2

4.2.2 Método 2. /etc/init.d/apache

sudo /etc/init.d/apache2 start
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/apache2 reload
sudo /etc/init.d/apache2 status

4.2.3 Método 3. service

sudo service apache2 start
sudo service apache2 stop
sudo service apache2 restart
sudo service apache2 reload
sudo service apache2 status

4.3 Archivo de configuración de Apache

/etc/apache2/apache2.conf

4.4 Archivos de log de Apache

4.4.1 access.log

El servidor almacena en el registro de acceso información sobre todas las peticiones que procesa.

/var/log/apache2/access.log

4.4.2 error.log

El registro de errores del servidor.

/var/log/apache2/error.log

4.4.3 Mensajes de error más detallados en Apache

Para poder localizar un error debemos configurar que los archivos de log sean más detallados. Para ello, debemos cambiar o añadir la línea LogLevelen el archivo /etc/apache2/apache2.conf. Los argumentos posibles se detallan a continuación. Por ejemplo:

LogLevel debug

Existen varios niveles jerárquicos en los registros de error disponibles, cada uno de ellos identificado por su propia clave. El valor por defecto de LogLevel es warn. A continuación se describen los valores posibles, ordenados de manera descendente según su grado de importancia.

emerg es el valor que graba el menor número de información y debug el que más. El problema es que debug graba mucha información que no tiene nada que ver con el problema, por lo que es conveniente cambiar el valor una vez que hayamos resuelto dicho problema.

5 MySQL Server

5.1 Instalación de MySQL Server

sudo apt install mysql-server

5.2 Cómo iniciar, parar y consultar el estado de MySQL Server

5.2.1 Método 1. systemctl

sudo systemctl start mysql
sudo systemctl stop mysql
sudo systemctl restart mysql
sudo systemctl status mysql

5.2.2 Método 2. /etc/init.d/mysql

sudo /etc/init.d/mysql start
sudo /etc/init.d/mysql stop
sudo /etc/init.d/mysql restart
sudo /etc/init.d/mysql reload
sudo /etc/init.d/mysql force-reload
sudo /etc/init.d/mysql status

5.3 Archivos de configuración de MySQL Server

/etc/mysql/mysql.cnf

También podemos encontrar archivos de configuración en los directorios:

/etc/mysql/conf.d/
/etc/mysql/mysql.conf.d/

5.4 Archivos de log de MySQL Server

/var/log/mysql/error.log

5.5 Cómo acceder a MySQL Server desde consola con el usuario root

Una vez que hemos instalado MySQL Server en nuestro sistema vamos a acceder a la consola de MySQL. En primer lugar vamos a iniciar una sesión como root:

sudo su

Una vez que hemos iniciado una sesión como root vamos a iniciar la consola de MySQL también como root sin necesidad de indicarle ningún password (no es necesario usar el modificaor -p).

mysql -u root

Una vez hecho esto ya tendríamos acceso a la consola de MySQL como root.

5.6 Cómo cambiar la contraseña del usuario root

En primer lugar accedemos a la consola de MySQL como root y seleccionamos la base de datos mysql.

USE mysql;

Vamos a revisar los usuarios que existen en MySQL y qué método tienen establecido para autenticar.

SELECT User, Host, plugin FROM user;

+------------------+-----------+-----------------------+
| User             | Host      | plugin                |
+------------------+-----------+-----------------------+
| root             | localhost | auth_socket           |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| debian-sys-maint | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
4 rows in set (0.00 sec)

Podemos ver que para el usuario root@localhost el método de autenticación es auth_socket. Esto quiere decir que el usuario root usará las mismas credenciales que tiene en el sistema operativo.

Si queremos cambiar la contraseña de root tendremos que cambiar el método de autenticación a mysql_native_password.

UPDATE user SET plugin='mysql_native_password' WHERE User='root';

Una vez que hemos actualizado el valor de la columna plugin a mysql_native_password actualizamos la columna authentication_string para asignar cuál será la nueva contraseña. Tendrá que sustituir nueva_contraseña por la contraseña que desee.

UPDATE user SET authentication_string=password('nueva_contraseña') where user='root';

Después habrá que ejecutar el siguiente comando para que las actualizaciones realizadas tengan efecto.

FLUSH PRIVILEGES;

5.7 Algunos comandos útiles para MySQL Server desde consola

5.7.1 Listar todas las bases de datos disponibles

SHOW DATABASES;

5.7.2 Crear una nueva base de datos

CREATE DATABASE <database>;

5.7.3 Borrar una base de datos

DROP DATABASE <database>;

5.7.4 Seleccionar una base de datos

USE <database>;

5.7.5 Listar las tablas que contiene una base de datos

SHOW TABLES;

5.7.6 Mostrar la estructura de una tabla

DESCRIBE <table>;

5.7.7 Cerrar la sesión y salir

exit
quit

5.8 Ejecutar un script .sql desde la consola

Desde la consola de Linux:

mysql -u root -p < script.sql

Desde la consola de MySQL:

mysql> source script.sql

5.9 Usuarios y permisos en MySQL Server desde consola

5.9.1 Tipos de permisos que podemos aplicar

5.9.2 Crear un nuevo usuario

Habrá que reemplazar nombre_usuario y contraseña por los datos del nuevo usuario que desea crear:

CREATE USER 'nombre_usuario'@'localhost' IDENTIFIED BY 'contraseña';

Una vez que hemos creado el usuario hay que asignarle permisos para que pueda acceder a la/s base/s de datos que queramos.

5.9.3 Eliminar un usuario

DROP USER 'nombre_usuario'@'localhost';

5.9.4 Asignar permisos a un usuario

GRANT [permiso] ON [nombre_base_de_datos].[nombre_tabla] TO 'nombre_usuario'@'localhost';

Por ejemplo:

GRANT ALL PRIVILEGES ON *.* TO 'nombre_usuario'@'localhost';

En este comando, los asteriscos indican que estamos aplicando el permiso ALL PRIVILEGES al usuario nombre_usuario para todas las tablas de cada una de las bases de datos. bases de datos y tablas.

Después de este comando habrá que ejecutar el siguiente comando para refrescar todos los privilegios a los usuarios.

FLUSH PRIVILEGES;

5.9.5 Eliminar permisos a un usuario

REVOKE [permiso] ON [nombre_base_de_datos].[nombre_tabla] FROM 'nombre_usuario'@'localhost';

5.9.6 Consultar los usuarios creados en MySQL Server

Los usuarios de MySQL se almacenan en la tabla mysql.user. La clave primaria de esta tabla está formada por los valores user y host, de modo que cada fila vendrá identificada por un nombre de usuario y el host desde el que puede conectarse.

La siguiente consulta nos devuelve el listado de usuarios que tenemos en MySQL y desde qué host pueden conectarse:

SELECT user,host FROM mysql.user;

En nuestra caso la consulta anterior devuelve el siguiente resultado:

+------------------+--------------+
| user             | host         |
+------------------+--------------+
| root             | %            |
| root             | localhost    |
| debian-sys-maint | localhost    |
| phpmyadmin       | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
+------------------+--------------+

También podemos consultar qué permisos específicos tiene un determinado usuario. La siguiente consulta nos devuelve los permisos que tiene el usuario root:

SHOW GRANTS FOR root;
+------------------------------------------------+
| Grants for root@%                              |
+------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'      |
+------------------------------------------------+

6 PHP

6.1 Instalación de módulos PHP

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

Para averiguar lo que hace el módulo libapache2-mod-php, podríamos escribir esto:

sudo apt show libapache2-mod-php

6.2 Comprobar que la instalación se ha realizado correctamente

Crea un archivo llamado info.php en el directorio /var/www/html.

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

Añade el siguiente contenido:

 <? php

phpinfo ();

?>

Ahora accede desde un navegador a la URL: http://localhost/info.php

7 Otras herramientas relacionadas con la pila LAMP

7.1 Instalar phpMyAdmin para acceder vía web a MySQL

Para instalar phpMyAdmin es necesario tener instalado en nuestro sistema composer que es un gestor de dependencias para PHP.

7.1.1 Instalación de composer con apt y phpMyAdmin

Instalamos composer (A dependency Manager for PHP).

sudo apt install composer

Clonamos el repositorio de phpMyAdmin usando Git.

git clone https://github.com/phpmyadmin/phpmyadmin.git

Nos situamos dentro del directorio de phpmyadmin que es donde estará el archivo composer.json con todas las dependencias que necesitamos instalar.

cd phpmyadmin

Instalamos las dependencias con la herramienta composer.

composer update

Podemos evitar instalar las herramamientas de desarrollo con el modificador --no-dev.

composer update --no-dev

Puede encontrar más información en la documentación oficial de phpMyAdmin.

7.1.2 Instalación de composer desde la web oficial y phpMyAdmin

Paso 1

Descargamos el instalador y lo renombramos como composer-setup.php.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

Paso 2

Comprobamos que el hash SHA384 del archivo que acabamos de descargar de la web es correcto.

php -r "if (hash_file('SHA384', 'composer-setup.php') === '93b54496392c062774670ac18b134c3b3a95e5a5e5c8f1a9f115f203b75bf9a129d5daa8ba6a13e2cc8a1da0806388a8') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"

Paso 3

Ejecutamos el instalador.

php composer-setup.php

Una vez finalizado este paso deberemos tener un archivo llamado composer.phar en el directorio donde hemos ejecutado el instalador.

Paso 4

Eliminamos el instalador.

php -r "unlink('composer-setup.php');"

Paso 5

Clonamos el repositorio de phpMyAdmin usando Git.

git clone https://github.com/phpmyadmin/phpmyadmin.git

Nos situamos dentro del directorio de phpmyadmin que es donde estará el archivo composer.json con todas las dependencias que necesitamos instalar.

cd phpmyadmin

Instalamos las dependencias con la herramienta composer.

php composer.phar update

Podemos evitar instalar las herramamientas de desarrollo con el modificador --no-dev.

php composer.phar update --no-dev

Puede encontrar más información en la documentación oficial de phpMyAdmin.

7.2 Instalar Adminer para acceder vía web a MySQL

Adminer es una alternativa a phpMyAdmin. Tiene la ventaja que se distribuye en un único archivo .php. Sólo hay que descargarse el arhivo Adminer para MySQL que está disponible en la web del proyecto y guardarlo en el directorio /var/www/html.

7.3 Instalar un analizador de logs para Apache Server

Investiga cuáles son los analizadores de logs que existen para Apache Server e instala uno de ellos.

Posibles soluciones:

7.3.1 GoAccess

Para instalar la última versión de GoAccess añadimos los repositorios oficiales del proyecto:

7.3.1.1 Instalación de GoAccess

echo "deb http://deb.goaccess.io/ $(lsb_release -cs) main" | sudo tee -a /etc/apt/sources.list.d/goaccess.list
wget -O - https://deb.goaccess.io/gnugpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install goaccess

7.3.1.2 Uso de GoAccess

Una vez que hemos instalado la utilidad podemos usarla para procesar los archivos de log access.log de Apache HTTP Server.

7.3.1.2.1 Desde el terminal

El siguiente comando parsea el archivo de log access.log y muestra la información del log en tiempo real en el terminal en modo texto.

goaccess /var/log/apache2/access.log -c
7.3.1.2.2 Creación de un archivo HTML estático

El siguiente comando parsea el archivo de log access.log y genera un archivo HTML estático.

goaccess /var/log/apache2/access.log -o /var/www/html/report.html --log-format=COMBINED
7.3.1.2.3 Creación de un archivo HTML en tiempo real

El siguiente comando parsea el archivo de log access.log y genera un archivo HTML en tiempo real.

goaccess /var/log/apache2/access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html

7.4 Control de acceso a un directorio con .htaccess

Crea un directorio llamado stats dentro del directorio /var/www/html donde se podrán consultar los informes generados con goaccess. El acceso a este directorio deberá estar controlado y solo se podrá acceder mediante un usuario y una contraseña.

Paso 1

Creamos el directorio stats.

mkdir /var/www/html/stats

Paso 2

Lanzamos el proceso de goaccess en background para generar los informes en segundo plano.

sudo goaccess /var/log/apache2/access.log -o /var/www/html/stats/index.html --log-format=COMBINED --real-time-html &

Paso 3

Creamos el archivo de contraseñas para el usuario que accederá al directorio stats. El archivo de contraseñas lo guardamos en un directorio seguro. En nuestro caso lo podemos guardar en /home/usuario.

sudo htpasswd -c /home/usuario/.htpasswd usuario

Paso 4

Creamos el archivo .htaccess en el directorio que queremos proteger con usuario y contraseña. En nuestro caso lo vamos a crear en el directorio /var/www/html/stats/.htaccess.

sudo nano /var/www/html/stats/.htaccess

El contenido del archivo .htaccess será el siguiente:

AuthType Basic
AuthName "Restricted Content"
AuthUserFile /home/usuario/.htpasswd
Require valid-user

Paso 5

Editamos el archivo configuración de Apache.

sudo nano /etc/apache2/sites-enabled/000-default.conf

Añadimos la siguiente sección dentro de las etiquetas de <VirtualHost *:80> y </VirtualHost>.

<Directory "/var/www/html/stats">
  Options Indexes FollowSymLinks
  AllowOverride All
  Require all granted
</Directory>

Paso 6

Reiniciamos el servicio de Apache.

sudo /etc/init.d/apache2 restart

8 Referencias

9 Licencia

Licencia de Creative Commons
El contenido de esta web está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 4.0 Internacional.