Salta el contingut

MP08 - UF2: Servidors d'aplicacions web

Sistema Gestor de Bases de Dades - MariaDB (i)

Nosaltres treballem amb una la plataforma LAMP per tant, la configuració que donarem és unica i exclusivament pel servidor web Apache. En altres implemetacions web (Linux vs Windows, Apache vs Nginx, MySQL/MariaDB vs PostgreSQL, PHP vs Perl vs Python, etc) caldrà buscar la forma d'implementació.

El servidor de bases de dades que instal·larem serà MariaDB.

Implementació

Repositori

Recorda que si cal (no troba els paquets, ...) hem d'actualitzar la llista del repositori amb la comanda

apt-get update

Se suposa que tenim iniciat el nostre servidor ubuntu i iniciarem una shell per a poder fer la instal·lació del que calgui. A partir d'aquí:

Instal·lem client i Servidor de Base de Dades

apt install -y mariadb-server mariadb-client

Iniciem el servidor de base de dades

service mariadb start

i ara si mirem els processos en marxa al nostre sistema, hi podrem veure els de l'apache i el del mariaDB.

root@xxxxx:~$ ps -ef | grep -e apache -e maria | grep -v grep
root      3432     1  0 09:50 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  3435  3432  0 09:50 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  3436  3432  0 09:50 ?        00:00:00 /usr/sbin/apache2 -k start
root      5095     1  0 10:08 pts/0    00:00:00 /bin/sh /usr/bin/mariadbd-safe
mysql     5220  5095  1 10:08 pts/0    00:00:00 /usr/sbin/mariadbd --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-log-error --pid-file=/run/mysqld/mysqld.pid --socket=/run/mysqld/mysqld.sock

A partir d'aquí ja podriem treballar amb la instrucció mysql per accedir al servidor i treballar amb ell però ens calen les credencials per a poder entrar i per això ens cal executar la comanda mysql_secure_installation:

sudo mysql_secure_installation

Aquesta comanda ens farà diverses preguntes. Sempre es recomana tenir el mínim de permisos.

Si volem accedir des de la màquina local amb alguna eina client, recomano, ja que tenim habilitat el protocol ssh, deshabilitar l'accés remot de root i accedir obrint el port de mariadb, 3306, amb la connexió ssh. Caldrà no tenir autenticació unix_socket.

sudo mysql_secure_installation
* * *
Switch to unix_socket authentication [Y/n] n
* * *
Disallow root login remotely? [Y/n] y
* * *
Possible sortida i respostes
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
    SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none):
OK, successfully used password, moving on...

Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.

You already have your root account protected, so you can safely answer 'n'.

Switch to unix_socket authentication [Y/n] n
... skipping.

You already have your root account protected, so you can safely answer 'n'.

Change the root password? [Y/n]
New password:
Re-enter new password:
Password updated successfully!
Reloading privilege tables..
... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]
... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n]
... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n]
- Dropping test database...
... Success!
- Removing privileges on test database...
... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n]
... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

A partir d'aquest moment, podem entrar via comanda mysql amb l'usuari root i el password que li hagim posat.

Si volem accedir al servidor per ssh cal instal·lar-ne el servei. Això ens permetrà utilitzar eines locals per connectar-nos com si fossim localhost.

Instal·lem el servior ssh
apt install ssh
Client SSH
ssh root@localhost -L 3306:127.0.0.1:3306

No podem connectar-nos per ssh amb l'usuari root?

Correcte, per defecte, la connexió amb l'usuari root des del servei ssh està deshabilitat. Per això proposo:

  1. Crear un nou usuari local amb password.

    Creem un usuari
    useradd -m -s /bin/bash usuari
    echo "usuari:password" | chpasswd
    
  2. Utilitzar aquest usuari per la connexió.

Client SSH
ssh usuari@localhost -L 3306:127.0.0.1:3306

Ara podem accedir al servidor obrint un tunel ssh cap al servidor pel port 3306. podem fer-ho amb la comanda ssh o bé amb l'eina putty:

Tunnelling amb la comanda ssh
ssh usuari@localhost -L 3306:127.0.0.1:3306
Tunnelling amb Putty DBeaver
Configuració del Tunnelling amb putty Accés amb DBeaver utilitzant connexió ipdelservidor

Podem mapejar tants ports com ens interesssi

Ara sí que podem començar a treballar amb la shell de mariadb o amb el client que vulguem.

$ mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 69
Server version: 10.6.12-MariaDB-0ubuntu0.22.04.1 Ubuntu 22.04

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.001 sec)

MariaDB [(none)]> exit;

usuari root sense password?

Assegura't que l'usuari root tingui password ja que en cas contrari pot causar problemes de seguretat o d'accés a través de phpmyadmin, o altres eines, més endavant.

Connectem php i mariadb

Ens falta fer la connexió del php amb el mariadb, és a dir, instal·lar els mòduls que connecten php amb mariadb. Cal fer-ho a la versió de php on necessitem l'accés al servidor de base de dades.

Això podem fer-ho manualment o bé instal·lar el phpmyadmin i aquest ja ens en farà la instal·lació.

Connexió a la BD amb PDO

En aquest exemple i tots els del lloc web es farà la connexió amb el SGBD utilitzant PDO

Per veure-ho afegirem un fitxer, anomenat bdd.php, a l'arrel del servidor web (on apunta el DocumentRoot) amb el següent contingut:

És possible abans de poder editar-lo amb el Visual Studio Code, l'haguem de crear

Des del SO del propi ordinador
docker exec PI touch /var/www/html/bdd.php
Fitxer /var/www/html/bdd.php
<?php
    $servername = "ipdelservidor";
    $username = "root";
    $password = "passwordQueTinguiElRoot";

    try {
      $conn = new PDO("mysql:host=$servername;dbname=mysql", $username, $password);
      // set the PDO error mode to exception
      $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      echo "Connected successfully";
    } catch(PDOException $e) {
      echo "Connection failed: " . $e->getMessage();
    }
?>

Accedim a la pàgina web http://ipdelservidor/bdd.php i al tenir el codi d'accés a la base de dades dins un try, el missatge que ens dóna és Connection failed: could not find driver.

Si no tinguéssim el codi protegit per un try caldria procedir de la següent forma:

  • Abans d'accedir a la pàgina web http://ipdelservidor/bdd.php podem executar la comanda tail al nostre servidor per a veure si es produeix algun error.

    tail -n 0 -f /var/log/apache2/error.log

    L'error que ens donaria si no tinguéssim el codi dins el try seria: PHP Fatal error: Uncaught PDOException: could not find driver in /var/www/html/bdd.php

La qual cosa significa que ens falta instal·lar el mòdul de connexió del llengiatge php amb la base de dades mariadb.

Instal·lem els mòduls d'accés del php al servidor de base de dades

Cal instal·lar el mòdul php-mysql. Segons la versió de php que tinguem, ens instal·larà els mòduls libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline. Cal fixar-nos bé amb la versió de php. Si en volem una altra, el millor serà instal·lar el mòdul php7.4-mysql per exemple.

apt install php-mysql

COMPTE a l'hora de la instal·lació. Cal que sigui la mateixa versió de php que tenim instal·lada i habilitada a l'apache.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline
Suggested packages:
  php-pear
The following NEW packages will be installed:
  phpX.y-mysql
The following packages will be upgraded:
  libapache2-mod-phpX.y phpX.y-cli phpX.y-common phpX.y-opcache phpX.y-readline
5 upgraded, 1 newly installed, 0 to remove and 23 not upgraded.
Need to get 4,853 kB of archives.
After this operation, 138 kB of additional disk space will be used.
Do you want to continue? [Y/n]

Ara només ens cal reiniciar el servidor web, si no ens ho ha demanat la instal·lació,

service apache2 restart

per tal que l'apache s'executi havent carregat el php amb el mòdul d'accés al servidor de bases de dades mariaDB.

Si tornem a accedir a http://ipdelservidor/bdd.php veurem que intenta connectar-se; una altra cosa és que tinguem permisos per a fer-ho - Connection failed: SQLSTATE[HY000] [1698] Access denied for user 'root'@'localhost'.

Es recomana crear sempre un usuari i una base de dades per cadascuna de les aplicacions que vulguem desenvolupar o instal·lar. No utilitzeu mai l'usuari root.

Eina d'administració del MariaDB: phpmyadmin

Instal·larem el paquet phpmyadmin per administrar remotament el servidor web, en cas necessari.

apt install -y phpmyadmin php-mbstring php-zip php-gd php-json php-curl

Altres extensions

Hem instal·lat algunes extensions de php però segons els CMS que instal·lem és possible que calgui instal·lar-ne d'altres.

Si no podem executar la instal·lació per no existir algun dels mòduls, podem treure'l de la llista.

I si no s'ha activat automàticament el phpmyadmin?

Ara ens cal activar el paquet phpmyadmin ja que en les proves fetes no el teniem activat. Per això caldrà afegir el fitxer /etc/phpmyadmin/apache.conf dins el directori de configuracions disponibles de l'apache /etc/apache2/conf-available per a posteriorment habilitar-la a2enconf. Ho farem amb les següents instruccions:

ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf-available/phpmyadmin.conf
a2enconf phpmyadmin
systemctl reload apache2

Fixeu-vos que al fitxer de configuració l'hem anomenat phpmyadmin.conf

Provem-ho

Per a poder treballar amb el phpmyadmin, caldrà iniciar sessió a http://ipdelservidor/phpmyadmin però, per a no treballar amb l'usuari root, crearem un usuari administrador admin amb password daw. Això ho fem amb les següents comandes:

mysql -u root -p -e "CREATE USER 'admin'@'localhost' IDENTIFIED BY 'daw'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;"

Després crearem un usuari i una base de dades per a provar que som capaços, des de php, d'accedir al servidor web. Creem un usuari m8 amb password m8 i una base on tingui tots els permisos anomenada, també, m8

mysql -u admin -pdaw -e "CREATE USER 'm8'@'localhost' IDENTIFIED BY 'm8'; CREATE DATABASE m8; GRANT ALL PRIVILEGES ON m8.* TO 'm8'@'localhost';"
mysql -u m8 -pm8 m8 -e "CREATE TABLE t1(ct1 INT AUTO_INCREMENT PRIMARY KEY, dt1 VARCHAR(50)); INSERT INTO t1(dt1) VALUES ('Un'),('Dos'),('Tres'),('Quatre'),('Cinc'),('Sis'),('Set');"

Puc connectar-me des d'eines externes com ara el dBeaver amb un usuari usuari@%?

Aquesta NO ÉS una configuració recomanda sota cap concepte

La configuració que tenim, per defecte, al servidor mariadb només permet la connexió al servidor de bases de dades des de l'adreça 127.0.0.1.

Per a poder accedir des d'altres hosts cal canviar la configuració del servidor mariadb, tenint en compte que això provoca una menor seguretat, per tal que escolti les peticions des de qualsevol IP, o la que ens interessi.

Si volem fer-ho, però, cal canviar el fitxer /etc/mysql/mariadb.conf.d/50-server.cnf, modificant la línia on especifiquem que el servidor només escolta per la ip ipdelservidor i posant-li que cal escoltar per la ip 0.0.0.0. Aquesta IP indica que escolta les peticions per totes les IPs que té el contenidor.

Així doncs, cal buscar la línia

bind-address            = 127.0.0.1

i modificar-hi l'adreça així

bind-address            = 0.0.0.0

A l'haver modificat el fitxer de configuració del mariadb cal reiniciar-ne el servei.

systemctl restart mariadb

Amb quin usuari accedeixo?

Per accedir des d'una màquina externa, cal crear un usuari que no sigui amb host localhost. La següent comanda crea un usuari anomenat admin@'%' amb password daw que pot accedir, per tant, des de qualsevol host amb permisos de DBA.

mysql -u admin -pdaw -e "CREATE USER 'admin'@'%' IDENTIFIED BY 'daw'; GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"

Aquesta NO ÉS una configuració recomanda sota cap concepte