Diferència entre revisions de la pàgina «Connexió remota a mysql (OVHCloud)»

De wikijoan
Salta a la navegació Salta a la cerca
m
 
(Hi ha 6 revisions intermèdies del mateix usuari que no es mostren)
Línia 1: Línia 1:
 +
=Professor: connexió a OVHCloud=
 +
OVHCloud és una empresa amb la que podem contractar un VPS (Virtual Private Server). Aquesta wiki i l'aplicació ''bdquest'', entre d'altres aplicacions, estan allotjades en aquest VPS.
 +
==creació de l'usuari de MySQL==
 +
El professor es connecta a la màquina al núvol, on hi ha un servidor mysql:
 
<pre>
 
<pre>
create user 'pepito'@'%' identified by 'password';
+
$ ssh ubuntu@vps-f5d83567.vps.ovh.net
drop user 'pepito';
+
</pre>
 
+
El professor entra dins el mysql, i crea l'usuari ''provisional'':
192.168.48.123
+
<pre>
create user 'pepito'@'192.168.48.123' identified by 'password';
+
$ mysql -u root -p
 +
mysql> create user 'provisional'@'%' identified by 'password';
  
 
mysql> select User,Host from mysql.user;
 
mysql> select User,Host from mysql.user;
+------------------+----------------+
+
+------------------+-----------+
| User            | Host           |
+
| User            | Host     |
+------------------+----------------+
+
+------------------+-----------+
| alumne          | %             |
+
| bdquest          | %         |
| pepito          | 192.168.48.123 |
+
| provisional      | %        |
 
+
...
/etc/mysql/mysql.conf.d
+
</pre>
 +
Es dóna permisos de ''select'' sobre les tres taules de la base de dades de ''municipis'':
 +
<pre>
 +
GRANT SELECT ON municipis.* TO 'provisional'@'%';
  
 +
SHOW GRANTS FOR 'provisional'@'%';
 +
+----------------------------------------------------+
 +
| Grants for provisional@%                          |
 +
+----------------------------------------------------+
 +
| GRANT USAGE ON *.* TO `provisional`@`%`            |
 +
| GRANT SELECT ON `municipis`.* TO `provisional`@`%` |
 +
+----------------------------------------------------+
 +
</pre>
 +
==MySQL: habilitar connexions remotes==
 +
El servidor MySQL té fitxers de configuració a ''/etc/mysql''. Concretament:
 +
<pre>
 +
$ cd /etc/mysql/mysql.conf.d
 
$ sudo joe mysqld.cnf
 
$ sudo joe mysqld.cnf
  
 
# Instead of skip-networking the default is now to listen only on
 
# Instead of skip-networking the default is now to listen only on
 
# localhost which is more compatible and is not less secure.
 
# localhost which is more compatible and is not less secure.
# bind-address         = 127.0.0.1
+
# bind-address = 127.0.0.1
 
+
bind-address = 0.0.0.0
 
+
</pre>
GRANT SELECT ON municipis.municipis TO pepito@192.168.48.123;
+
Per defecte, un servidor MySQL només accepta connexions locals (127.0.0.1), i per acceptar connexions remotes des de qualsevol IP ho canviem per ''0.0.0.0''.
GRANT all ON municipis.* TO 'pepito'@'192.168.48.123';
 
flush privileges;
 
 
 
mysql -h 192.168.48.123 -u pepito -ppassword municipis
 
 
 
sudo ufw enable
 
sudo ufw status
 
sudo ufw allow 3306/tcp
 
 
 
$ sudo ufw allow 3306/tcp
 
Regla afegida
 
Regla afegida (v6)
 
 
 
$ sudo ufw status numbered
 
Status: active
 
 
 
    A                          Acció      Des de
 
    -                          -----      ------
 
[ 1] 3306/tcp                  ALLOW IN    Anywhere                 
 
[ 2] 3306/tcp (v6)              ALLOW IN    Anywhere (v6)
 
 
 
sudo ufw disable
 
  
 +
Reiniciem el servidor MySQL:
 +
<pre>
 +
$ sudo /etc/init.d/mysql restart
 +
</pre>
  
 +
El professor comproca que el servidor està escoltant pel port 3306, que és el port del MySQL:
 +
<pre>
 
$ sudo lsof -i -P -n | grep LISTEN
 
$ sudo lsof -i -P -n | grep LISTEN
[sudo] contrasenya per a joan:       
 
systemd-r  671 systemd-resolve  13u  IPv4  27340      0t0  TCP 127.0.0.53:53 (LISTEN)
 
apache2    1067            root    4u  IPv6  34737      0t0  TCP *:80 (LISTEN)
 
 
...
 
...
mysqld    47753           mysql  24u IPv6 315423     0t0  TCP *:3306 (LISTEN)
+
mysqld    3274835           mysql  32u IPv6 170198035      0t0  TCP *:33060 (LISTEN)
 
+
mysqld    3274835          mysql  56u  IPv4 170198037     0t0  TCP *:3306 (LISTEN)
 +
...
 +
</pre>
 
o bé:
 
o bé:
 +
<pre>
 
$ sudo netstat -tulpn | grep LISTEN
 
$ sudo netstat -tulpn | grep LISTEN
tcp        0      0 127.0.0.53:53          0.0.0.0:*              LISTEN      671/systemd-resolve
+
tcp        0      0 0.0.0.0:3306            0.0.0.0:*              LISTEN      3274835/mysqld     
tcp        0      0 127.0.0.1:631          0.0.0.0:*              LISTEN      6730/cupsd         
+
...
tcp        0      0 127.0.0.1:33060        0.0.0.0:*              LISTEN      47753/mysqld       
+
tcp6      0      0 :::33060                :::*                    LISTEN      3274835/mysqld      
tcp6      0      0 :::80                  :::*                    LISTEN      1067/apache2       
+
...
tcp6      0     0 ::1:631                :::*                    LISTEN      6730/cupsd         
+
</pre>
tcp6      0      0 :::443                  :::*                    LISTEN      1067/apache2       
 
tcp6      0      0 :::3306                :::*                    LISTEN      47753/mysqld
 
  
If you’re using iptables, you need to add an entry to your firewall rule for Transmission Control Protocol (TCP) port 3306. You can use the name mysql for the port number.
+
=Alumne: connexió remota=
 
+
==Des de dins del docker==
$ sudo ufw allow from 192.168.0.66 to any port 3306
+
Entrem a dins del docker:
Regles actualitzades
+
<pre>
joan@joan-Len1:~$ sudo ufw status
+
$ docker exec -it mysql_m02bd /bin/bash
Estat: inactiu
+
bash-4.4#
joan@joan-Len1:~$ sudo ufw enable
+
</pre>
Firewall is active and enabled on system startup
+
Primer comprovem que podem accedir al servidor pel port 3306. Una manera de fer-ho és amb un telnet:
joan@joan-Len1:~$ sudo ufw status
+
<pre>
Status: active
+
# echo X | telnet -e X vps-f5d83567.vps.ovh.net 3306
 
 
A                          Acció      Des de
 
-                          -----      ------
 
3306/tcp                  ALLOW      Anywhere                 
 
3306                      ALLOW      192.168.0.66             
 
3306/tcp (v6)              ALLOW      Anywhere (v6)
 
 
 
https://phoenixnap.com/kb/mysql-remote-connection
 
 
 
You can also use the telnet or nc command to connect to port 3306 for testing purpose:
 
$ echo X | telnet -e X 192.168.48.123 3306
 
o bé:
 
$ nc -z -w1 192.168.48.123 3306
 
 
 
 
 
/sbin/iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
 
====
 
mysql -h vps-f5d83567.vps.ovh.net -u bdquest -pkeiL2lai municipis
 
 
 
Per fer el bind de totes les ips es fa:
 
bind-address    = 0.0.0.0
 
 
 
$ echo X | telnet -e X vps-f5d83567.vps.ovh.net 3306
 
 
Telnet escape character is 'X'.
 
Telnet escape character is 'X'.
 
Trying 51.210.179.7...
 
Trying 51.210.179.7...
Línia 103: Línia 82:
  
 
telnet> Connection closed.
 
telnet> Connection closed.
 +
</pre>
 +
Ha respost amb ''connected'', vol dir que s'ha fet la connexió.
  
$ nc -z -w1 vps-f5d83567.vps.ovh.net 3306
+
Només tenim permisos per connectar-nos a la base de dades ''municipis'':
 +
<pre>
 +
# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword langtrainer
 +
mysql: [Warning] Using a password on the command line interface can be insecure.
 +
ERROR 1044 (42000): Access denied for user 'provisional'@'%' to database 'langtrainer'
  
 +
# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword municipis
  
$ mysql -h vps-f5d83567.vps.ovh.net -u bdquest -pkeiL2lai
+
mysql> show databases;
mysql>
+
+--------------------+
funciona, però encara no puc connectar-me a mysql
+
| Database          |
 +
+--------------------+
 +
| information_schema |
 +
| municipis          |
 +
+--------------------+
 +
</pre>
  
select User,Host from mysql.user;
+
Només tenim permisos per fer selects. Per exemple:
CREATE USER 'provisional'@'%' identified by 'password';
+
<pre>
GRANT SELECT ON municipis.* TO 'provisional'@'%';
+
mysql> select * from comunitats;
SHOW GRANTS FOR 'provisional'@'%';
+
+--------+----------------------+---------+
 +
| id_com | comunitat            | abr_com |
 +
+--------+----------------------+---------+
 +
|      1 | Catalunya            | CAT    |
 +
|      2 | Aragón              | ARG    |
 +
|      3 | Comunidad Valenciana | VAL    |
 +
...
 +
</pre>
 +
No podem fer un insert:
 +
<pre>
 +
mysql> insert into municipis (id_mun,municipi,id_prov) values(9000,'nou municipi',3);
 +
ERROR 1142 (42000): INSERT command denied to user 'provisional'@'79.153.33.102' for table 'municipis'
 +
</pre>
  
$ mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword municipis;
+
Municipis de Canarias:
 
+
<pre>
municipis de Canarias
+
mysql> select concat(municipi,';',provincia) from municipis m
 
 
select concat(municipi,';',provincia) from municipis m
 
 
inner join provincies p using (id_prov)
 
inner join provincies p using (id_prov)
 
inner join comunitats c using (id_com)
 
inner join comunitats c using (id_com)
 
where comunitat = 'Islas Canarias';
 
where comunitat = 'Islas Canarias';
 
+
</pre>
o bé:
+
Anem a executar aquesta select, no des de la consola del mysql, sinó des de la consola del sistema operatiu. Per fer-ho, utilitzem l'opció '''-e''' (''--execute''), l'opció '''-s''' (''--silent'') i redirigim la sortida a un fitxer:
 
+
<pre>
$ mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s \
+
# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s
 
-e "select concat(municipi,';',provincia) from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi'" > municipis_euskadi.txt
 
-e "select concat(municipi,';',provincia) from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi'" > municipis_euskadi.txt
 
+
</pre>
 
+
S'ha generat el fitxer ''municipis_euskadi.txt'':
$ cat municipis_euskadi.txt  
+
<pre>
 +
# cat municipis_euskadi.txt  
 
Alegría-Dulantzi;Álava
 
Alegría-Dulantzi;Álava
 
Amurrio;Álava
 
Amurrio;Álava
Línia 143: Línia 145:
 
Ayala/Aiara;Álava
 
Ayala/Aiara;Álava
 
...
 
...
 +
</pre>
 +
Concretament, la sentència que ha d'executar l'alumne i que haurà d'entregar és:
 +
<pre>
 +
# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s
 +
-e "select concat(municipi,';',provincia) as 'nom_alumne' from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi' order by rand() limit 10" > municipis_euskadi_nom_alumne.txt
 +
</pre>
  
des de dins del docker:
+
==Des del mysql-workbench:==
 
+
[[Fitxer:Connexio mysql remota ovhcloud.png | thumbnail]]
$ docker exec -it mysql_m02bd /bin/bash
+
Veure la imatge. Si ens ha funcionat des del docker, també ens funcioanrà des d'una eina gràfica com el mysql-workbench.
bash-4.4#
+
=Professor. Veure les connexions remotes=
 
+
[[Fitxer:Connexions remotes.png | thumbnail]]
# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s \
 
-e "select concat(municipi,';',provincia) from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi'" > municipis_euskadi.txt
 
 
 
des del mysql-workbench:
 
 
 
</pre>
 
 
Per veure les connexions al servidor:
 
Per veure les connexions al servidor:
 
<pre>
 
<pre>
Línia 170: Línia 172:
 
| 542 | provisional    | 79.153.33.102:47082 | municipis | Sleep  |    6 |                        | NULL
 
| 542 | provisional    | 79.153.33.102:47082 | municipis | Sleep  |    6 |                        | NULL
 
</pre>
 
</pre>
==mysql-workbench==
+
Podem veure tots els processor que han creat els alumnes, és a dir, les connexions que estan obertes.
[[Fitxer:Connexio mysql remota ovhcloud.png | thumbnail]]
+
 
 +
=Tasques a realitzar=
 +
Aquesta pràctica s'entrega al final de la classe, doncs l'usuari amb què hem treballat (''provisional'') quedarà deshabilitat (''mysql> drop user 'provisional'@'%';'').
 +
 
 +
Entregaràs un pdf amb dues captures de pantalla:
 +
 
 +
1. la teva llista de 10 municipis d'Euskadi o de qualsevol altra comunitat (en la capçalera ha de sortir el teu nom)
  
 +
2. Captura de pantalla de la connexió correcta del mysql-workbench, on hi hagi una evidència de què ho has fet amb la teva màquina.
  
 
{{Autor}}, febrer 2022
 
{{Autor}}, febrer 2022

Revisió de 16:30, 2 març 2022

Professor: connexió a OVHCloud

OVHCloud és una empresa amb la que podem contractar un VPS (Virtual Private Server). Aquesta wiki i l'aplicació bdquest, entre d'altres aplicacions, estan allotjades en aquest VPS.

creació de l'usuari de MySQL

El professor es connecta a la màquina al núvol, on hi ha un servidor mysql:

$ ssh ubuntu@vps-f5d83567.vps.ovh.net

El professor entra dins el mysql, i crea l'usuari provisional:

$ mysql -u root -p
mysql> create user 'provisional'@'%' identified by 'password';

mysql> select User,Host from mysql.user;
+------------------+-----------+
| User             | Host      |
+------------------+-----------+
| bdquest          | %         |
| provisional      | %         |
...

Es dóna permisos de select sobre les tres taules de la base de dades de municipis:

GRANT SELECT ON municipis.* TO 'provisional'@'%';

SHOW GRANTS FOR 'provisional'@'%';
+----------------------------------------------------+
| Grants for provisional@%                           |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `provisional`@`%`            |
| GRANT SELECT ON `municipis`.* TO `provisional`@`%` |
+----------------------------------------------------+

MySQL: habilitar connexions remotes

El servidor MySQL té fitxers de configuració a /etc/mysql. Concretament:

$ cd /etc/mysql/mysql.conf.d
$ sudo joe mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
# bind-address = 127.0.0.1
bind-address = 0.0.0.0

Per defecte, un servidor MySQL només accepta connexions locals (127.0.0.1), i per acceptar connexions remotes des de qualsevol IP ho canviem per 0.0.0.0.

Reiniciem el servidor MySQL:

$ sudo /etc/init.d/mysql restart

El professor comproca que el servidor està escoltant pel port 3306, que és el port del MySQL:

$ sudo lsof -i -P -n | grep LISTEN
...
mysqld    3274835           mysql   32u  IPv6 170198035      0t0  TCP *:33060 (LISTEN)
mysqld    3274835           mysql   56u  IPv4 170198037      0t0  TCP *:3306 (LISTEN)
...

o bé:

$ sudo netstat -tulpn | grep LISTEN
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      3274835/mysqld      
...
tcp6       0      0 :::33060                :::*                    LISTEN      3274835/mysqld      
...

Alumne: connexió remota

Des de dins del docker

Entrem a dins del docker:

$ docker exec -it mysql_m02bd /bin/bash
bash-4.4# 

Primer comprovem que podem accedir al servidor pel port 3306. Una manera de fer-ho és amb un telnet:

# echo X | telnet -e X vps-f5d83567.vps.ovh.net 3306
Telnet escape character is 'X'.
Trying 51.210.179.7...
Connected to vps-f5d83567.vps.ovh.net.
Escape character is 'X'.

telnet> Connection closed.

Ha respost amb connected, vol dir que s'ha fet la connexió.

Només tenim permisos per connectar-nos a la base de dades municipis:

# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword langtrainer
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1044 (42000): Access denied for user 'provisional'@'%' to database 'langtrainer'

# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword municipis

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| municipis          |
+--------------------+

Només tenim permisos per fer selects. Per exemple:

mysql> select * from comunitats;
+--------+----------------------+---------+
| id_com | comunitat            | abr_com |
+--------+----------------------+---------+
|      1 | Catalunya            | CAT     |
|      2 | Aragón               | ARG     |
|      3 | Comunidad Valenciana | VAL     |
...

No podem fer un insert:

mysql> insert into municipis (id_mun,municipi,id_prov) values(9000,'nou municipi',3);
ERROR 1142 (42000): INSERT command denied to user 'provisional'@'79.153.33.102' for table 'municipis'

Municipis de Canarias:

mysql> select concat(municipi,';',provincia) from municipis m
inner join provincies p using (id_prov)
inner join comunitats c using (id_com)
where comunitat = 'Islas Canarias';

Anem a executar aquesta select, no des de la consola del mysql, sinó des de la consola del sistema operatiu. Per fer-ho, utilitzem l'opció -e (--execute), l'opció -s (--silent) i redirigim la sortida a un fitxer:

# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s
-e "select concat(municipi,';',provincia) from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi'" > municipis_euskadi.txt

S'ha generat el fitxer municipis_euskadi.txt:

# cat municipis_euskadi.txt 
Alegría-Dulantzi;Álava
Amurrio;Álava
Añana;Álava
Aramaio;Álava
Armiñón;Álava
Arraia-Maeztu;Álava
Arrazua-Ubarrundia;Álava
Artziniega;Álava
Asparrena;Álava
Ayala/Aiara;Álava
...

Concretament, la sentència que ha d'executar l'alumne i que haurà d'entregar és:

# mysql -h vps-f5d83567.vps.ovh.net -u provisional -ppassword -D municipis -s
-e "select concat(municipi,';',provincia) as 'nom_alumne' from municipis m inner join provincies p using (id_prov) inner join comunitats c using (id_com) where comunitat = 'Euskadi' order by rand() limit 10" > municipis_euskadi_nom_alumne.txt

Des del mysql-workbench:

Connexio mysql remota ovhcloud.png

Veure la imatge. Si ens ha funcionat des del docker, també ens funcioanrà des d'una eina gràfica com el mysql-workbench.

Professor. Veure les connexions remotes

Connexions remotes.png

Per veure les connexions al servidor:

select id,
       user,
       host,
       db,
       command,
       time,
       state,
       info
from information_schema.processlist;

...
| 542 | provisional     | 79.153.33.102:47082 | municipis | Sleep   |    6 |                        | NULL

Podem veure tots els processor que han creat els alumnes, és a dir, les connexions que estan obertes.

Tasques a realitzar

Aquesta pràctica s'entrega al final de la classe, doncs l'usuari amb què hem treballat (provisional) quedarà deshabilitat (mysql> drop user 'provisional'@'%';).

Entregaràs un pdf amb dues captures de pantalla:

1. la teva llista de 10 municipis d'Euskadi o de qualsevol altra comunitat (en la capçalera ha de sortir el teu nom)

2. Captura de pantalla de la connexió correcta del mysql-workbench, on hi hagi una evidència de què ho has fet amb la teva màquina.


creat per Joan Quintana Compte, febrer 2022