
Eles dizem que a melhor senha é aquela que não precisa ser lembrada. No caso do MySQL, isso é real graças ao plugin auth_socket e sua versão para MariaDB - unix_socket .
Ambos os plugins não são novos, eles foram discutidos bastante no mesmo blog, por exemplo, em um artigo sobre como alterar senhas no MySQL 5.7 usando o plugin auth_socket . No entanto, analisando as novidades do MariaDB 10.4, descobri que o unix_socket agora está instalado por padrão e é um dos métodos de autenticação ("um dos", porque no MariaDB 10.4 mais de um plug-in está disponível para autenticação para um usuário, o que é explicado no documento "Autenticação" do MariaDB 10.04 ).
Como eu disse, isso não é novidade, e quando você instala o MySQL usando os pacotes .deb suportados pela equipe Debian, um usuário com direitos de root é criado para autenticação através do soquete. Isso é verdade para o MySQL e o MariaDB.
root@app:~# apt-cache show mysql-server-5.7 | grep -i maintainers Original-Maintainer: Debian MySQL Maintainers <pkg-mysql-maint@lists.alioth.debian.org> Original-Maintainer: Debian MySQL Maintainers <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org">pkg-mysql-maint@lists.alioth.debian.org</a>>
Nos pacotes Debian para MySQL, o usuário root se autentica da seguinte maneira:
root@app:~# whoami root= root@app:~# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 4 Server version: 5.7.27-0ubuntu0.16.04.1 (Ubuntu) Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root'; +------+-----------+-------------+-----------------------+ | user | host | plugin | authentication_string | +------+-----------+-------------+-----------------------+ | root | localhost | auth_socket | | +------+-----------+-------------+-----------------------+ 1 row in set (0.01 sec)
O mesmo acontece com o pacote .deb para o MariaDB:
10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04 MariaDB [(none)]> show grants; +------------------------------------------------------------------------------------------------+ | Grants for root@localhost | +------------------------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED VIA unix_socket WITH GRANT OPTION | | GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION | +------------------------------------------------------------------------------------------------+ 2 rows in set (0.00 sec)
Os pacotes .deb do repositório oficial da Percona também configuram a autenticação root para o socket de autenticação e o servidor Percona. Aqui está um exemplo com o Percona Server para MySQL 8.0.16-7 e Ubuntu 16.04:
root@app:~# whoami root root@app:~# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 9 Server version: 8.0.16-7 Percona Server (GPL), Release '7', Revision '613e312' Copyright (c) 2009-2019 Percona LLC and/or its affiliates Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user, host, plugin, authentication_string from mysql.user where user ='root'; +------+-----------+-------------+-----------------------+ | user | host | plugin | authentication_string | +------+-----------+-------------+-----------------------+ | root | localhost | auth_socket | | +------+-----------+-------------+-----------------------+ 1 row in set (0.00 sec)
Então, qual é a mágica? O plug-in verifica se o usuário do Linux corresponde ao usuário do MySQL usando a opção de soquete SO_PEERCRED - para coletar informações sobre o usuário que está executando o programa cliente. Portanto, o plug-in pode ser usado apenas em sistemas que suportam a opção SO_PEERCRED, como o Linux. A opção de soquete SO_PEERCRED permite que você reconheça o uid do processo associado ao soquete. E depois disso, ele já recebe o nome de usuário associado a este uid.
Aqui está um exemplo com o usuário "vagrant":
vagrant@mysql1:~$ whoami vagrant vagrant@mysql1:~$ mysql ERROR 1698 (28000): Access denied for user 'vagrant'@'localhost'
Como não há usuário vagante no MySQL, temos acesso negado. Crie esse usuário e tente novamente:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket; Query OK, 0 rows affected (0.00 sec) vagrant@mysql1:~$ mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 45 Server version: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.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 grants; +---------------------------------------------------------------------------------+ | Grants for vagrant@localhost | +---------------------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'vagrant'@'localhost' IDENTIFIED VIA unix_socket | +---------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
Acabou!
Bem, o que dizer de uma distribuição não-Debian onde isso não é fornecido por padrão? Vamos tentar o Percona Server para MySQL 8 instalado no CentOS 7:
mysql> show variables like '%version%comment'; +-----------------+---------------------------------------------------+ | Variable_name | Value | +-----------------+---------------------------------------------------+ | version_comment | Percona Server (GPL), Release 7, Revision 613e312 | +-----------------+---------------------------------------------------+ 1 row in set (0.01 sec) mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket; ERROR 1524 (HY000): Plugin 'auth_socket' is not loaded
Que chatice. O que estava faltando? Plugin não carregado:
mysql> pager grep socket PAGER set to 'grep socket' mysql> show plugins; 47 rows in set (0.00 sec)
Adicione um plugin ao processo:
mysql> nopager PAGER set to stdout mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so'; Query OK, 0 rows affected (0.00 sec) mysql> pager grep socket; show plugins; PAGER set to 'grep socket' | auth_socket | ACTIVE | AUTHENTICATION | auth_socket.so | GPL | 48 rows in set (0.00 sec)
Agora temos tudo o que precisamos. Vamos tentar mais uma vez:
mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket; Query OK, 0 rows affected (0.01 sec) mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost'; Query OK, 0 rows affected (0.01 sec)
Agora você pode fazer login usando o login "percona".
[percona@ip-192-168-1-111 ~]$ whoami percona [percona@ip-192-168-1-111 ~]$ mysql -upercona Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 19 Server version: 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312 Copyright (c) 2009-2019 Percona LLC and/or its affiliates Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona'; +---------+-----------+-------------+-----------------------+ | user | host | plugin | authentication_string | +---------+-----------+-------------+-----------------------+ | percona | localhost | auth_socket | | +---------+-----------+-------------+-----------------------+ 1 row in set (0.00 sec)
E funcionou de novo!
Pergunta: será possível fazer login usando o mesmo login da percona, mas de um usuário diferente?
[percona@ip-192-168-1-111 ~]$ logout [root@ip-192-168-1-111 ~]# mysql -upercona ERROR 1698 (28000): Access denied for user 'percona'@'localhost'
Não, não vai dar certo.
Conclusão
O MySQL é bastante flexível em vários aspectos, um dos quais é o método de autenticação. Como pode ser visto nesta postagem, o acesso pode ser obtido sem senhas, com base nos usuários do sistema operacional. Isso pode ser útil em certos cenários, e um deles é quando você migra do RDS / Aurora para o MySQL normal, usando a autenticação do banco de dados IAM para ainda acessar, mas sem senhas.