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

De wikijoan
Salta a la navegació Salta a la cerca
m
m
Línia 1: Línia 1:
 +
=Professor: connexió a OVHCloud=
 +
==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 81:
  
 
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 144:
 
Ayala/Aiara;Álava
 
Ayala/Aiara;Álava
 
...
 
...
−
 
−
des de dins del docker:
 
−
 
−
$ docker exec -it mysql_m02bd /bin/bash
 
−
bash-4.4#
 
−
 
−
# 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>
 
</pre>
 +
==Des del mysql-workbench:==
 +
[[Fitxer:Connexio mysql remota ovhcloud.png | thumbnail]]
 +
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=
 
Per veure les connexions al servidor:
 
Per veure les connexions al servidor:
 
<pre>
 
<pre>
Línia 170: Línia 164:
 
| 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'@'%';'').
  
  
 
{{Autor}}, febrer 2022
 
{{Autor}}, febrer 2022

Revisió del 11:52, 25 feb 2022

Professor: connexió a OVHCloud

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
...

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

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'@'%';).



creat per Joan Quintana Compte, febrer 2022