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 foo
con contraseña bar
para 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.sock
o algo así), ejecútelo en la línea de comando (use la --protocol
opció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 mysql
comando 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 mysql
proceso)
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 localhost
se 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. localhost
ahora 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.2
se conecta desde 127.0.0.1
y 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.user
tabla, 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;