Probemos.
Conéctese como superusuario y luego:
SHOW VARIABLES LIKE "%version%";
+
| Variable_name | Value |
+
| version | 10.0.23-MariaDB-0+deb8u1-log |
y entonces
USE mysql;
Preparar
Cree un usuario foocon contraseña barpara realizar pruebas:
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
Conectar
Para conectarse al Unix Domain Socket (es decir, la tubería de E / S que recibe el nombre de la entrada del sistema de archivos /var/run/mysqld/mysqld.socko algo así), ejecútelo en la línea de comando (use la --protocolopción para estar doblemente seguro)
mysql -pbar -ufoo
mysql -pbar -ufoo
Se espera que lo anterior coincida con "el usuario proviene de localhost" pero ciertamente no con "el usuario proviene de 127.0.0.1".
Para conectarse al servidor desde "127.0.0.1" en su lugar, ejecute esto en la línea de comando
mysql -pbar -ufoo
Si lo omite --protocol=TCP, el mysqlcomando seguirá intentando utilizar el socket de dominio Unix. También puede decir:
mysql -pbar -ufoo
Los dos intentos de conexión en una línea:
export MYSQL_PWD=bar; \
mysql -ufoo
mysql -ufoo
(la contraseña se establece en el entorno para que se pase al mysqlproceso)
Verificación en caso de duda
Para comprobar realmente si la conexión se realiza a través de un socket TCP / IP o un socket de dominio Unix
- obtener el PID del proceso del cliente mysql examinando la salida de
ps faux
- correr
lsof -n -p<yourpid>.
Verás algo como:
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
o
mysql [PID] quux 3u unix [code] 0t0 [code] socket
Entonces:
Caso 0: Host = '10 .10.10.10 '(prueba nula)
update user set host='10.10.10.10' where user='foo'; flush privileges;
- Conectar usando el enchufe: FALLO
- Conectarse desde 127.0.0.1: FALLO
Caso 1: Host = '%'
update user set host='%' where user='foo'; flush privileges;
- Conectar usando el enchufe: OK
- Conectar desde 127.0.0.1: OK
Caso 2: Host = 'localhost'
update user set host='localhost' where user='foo';flush privileges;
El comportamiento varía y esto aparentemente depende de skip-name-resolve. Si se establece, hace que las líneas con localhostse ignoren según el registro. Se puede ver lo siguiente en el registro de errores: "La entrada 'usuario' 'root @ localhost' ignorada en el modo --skip-name-resolve". . Esto significa que no hay conexión a través del socket de dominio Unix. Pero este no es el caso empíricamente. localhostahora significa SOLO el socket de dominio Unix, y ya no coincide con 127.0.0.1.
skip-name-resolve esta apagado:
- Conectar usando el enchufe: OK
- Conectar desde 127.0.0.1: OK
skip-name-resolve Está encendido:
- Conectar usando el enchufe: OK
- Conectarse desde 127.0.0.1: FALLO
Caso 3: Host = '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- Conectar usando el enchufe: FALLO
- Conectar desde 127.0.0.1: OK
Caso 4: Anfitrión = ''
update user set host='' where user='foo';flush privileges;
- Conectar usando el enchufe: OK
- Conectar desde 127.0.0.1: OK
(De acuerdo con MySQL 5.7: 6.2.4 Control de acceso, Etapa 1: Verificación de conexión , la cadena vacía '' también significa "cualquier host", pero se ordena después de '%' ) .
Caso 5: Host = '192.168.0.1' (prueba adicional)
('192.168.0.1' es una de las direcciones IP de mi máquina, cámbiela apropiadamente en su caso)
update user set host='192.168.0.1' where user='foo';flush privileges;
- Conectar usando el enchufe: FALLO
- Conectarse desde 127.0.0.1: FALLO
pero
- Conectarse usando
mysql -pbar -ufoo -h192.168.0.1: OK (!)
Esto último porque en realidad proviene de una conexión TCP 192.168.0.1, como lo revela lsof:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
Caso de borde A: Host = '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- Conectar usando el enchufe: FALLO
- Conectarse desde 127.0.0.1: FALLO
Caso de borde B: Host = '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- Conectar usando el enchufe: FALLO
- Conectarse desde 127.0.0.1: FALLO
Caso de borde C: Host = '127.0.0.2'
(127.0.0.2 es una dirección de loopback perfectamente válida equivalente a 127.0.0.1 como se define en RFC6890 )
update user set host='127.0.0.2' where user='foo';flush privileges;
- Conectar usando el enchufe: FALLO
- Conectarse desde 127.0.0.1: FALLO
Curiosamente:
mysql -pbar -ufoo -h127.0.0.2se conecta desde 127.0.0.1y es FALLO
mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2 esta bien
Limpiar
delete from user where user='foo';flush privileges;
Apéndice
Para ver qué hay realmente en la mysql.usertabla, que es una de las tablas de permisos, use:
SELECT SUBSTR(password,1,6) as password, user, host,
Super_priv AS su,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs,
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic,
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin
FROM user ORDER BY user, host;
esto da:
+
| password | user | host | su | gr | selock | modif | ria | views | funcs | replic | admin |
+
| *E8D46 | foo | | N | N | NN | NNNNN | NNN | NNN | NNNNN | NN | NNNNNN |
De manera similar para la mesa mysql.db:
SELECT host,db,user,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs
FROM db ORDER BY user, db, host;