Como usar o MySQL sem senha (e sem riscos de segurança)

Como usar o MySQL sem senha (e sem riscos de segurança)

Dizem que a melhor senha é aquela que você não precisa lembrar. No caso do MySQL, isso é possível graças ao plugin auth_socket e sua versão para MariaDB — unix_socket.

Ambos os plugins não são novidades; eles foram bastante discutidos neste mesmo blog, por exemplo, no artigo sobre como alterar senhas no MySQL 5.7, usando o plugin auth_socket . No entanto, ao analisar o que há de novo no MariaDB 10.4, descobri que o unix_socket agora vem pré-configurado como padrão e é um dos métodos de autenticação (um dos, porque no MariaDB 10.4 um usuário pode ter mais de um plugin disponível para autenticação, como explicado no documento“Autenticação” do MariaDB 10.04 Como já mencionei, isso não é uma novidade; ao instalar o MySQL usando os pacotes .deb suportados pela equipe Debian, um usuário com privilégios de root é criado para autenticação via socket. Isso é válido tanto para MySQL quanto para MariaDB.).

Com os pacotes Debian para MySQL, o usuário root é autenticado da seguinte maneira:

root@app:~# apt-cache show mysql-server-5.7 | grep -i mantenedores
Original-Maintainer: Mantenedores do MySQL do Debian <pkg-mysql-maint@lists.alioth.debian.org>
Original-Maintainer: Mantenedores do MySQL do Debian <<a href="mailto:pkg-mysql-maint@lists.alioth.debian.org"&gt;pkg-mysql-maint@lists.alioth.debian.org</a>>

root@app:~# whoami root= root@app:~# mysql Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou g. Seu ID de conexão MySQL é 4 Versão do servidor: 5.7.27-0ubuntu0.16.04.1 (Ubuntu)Copyright (c) 2000, 2019, Oracle e/ou suas afiliadas. Todos os direitos reservados. Oracle é uma marca registrada da Oracle Corporation e/ou suas afiliadas. Outros nomes podem ser marcas registradas de seus respectivos proprietários.Digite 'help;' ou 'h' para ajuda. Digite 'c' para limpar a declaração de entrada atual.mysql> select user, host, plugin, authentication_string from mysql.user where user = 'root'; +------+-----------+-------------+-----------------------+ | user | host | plugin | authentication_string | +------+-----------+-------------+-----------------------+ | root | localhost | auth_socket | | +------+-----------+-------------+-----------------------+ 1 linha em conjunto (0.01 seg)

O mesmo se aplica ao pacote .deb para MariaDB:

10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04MariaDB [(nenhum)]> 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 linhas em conjunto (0.00 seg)

Os pacotes .deb do repositório oficial da Percona também configuram a autenticação do usuário com privilégios de root para auth-socket e para o Percona Server. Vamos dar um exemplo com

Percona Server for MySQL 8.0.16-7 e Ubuntu 16.04: e Ubuntu 16.04:

root@app:~# whoami
root
root@app:~# mysql
Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou g.
Seu ID de conexão MySQL é 9
Versão do servidor: 8.0.16-7 Percona Server (GPL), Release '7', Revision '613e312'

Copyright (c) 2009-2019 Percona LLC e/ou suas afiliadas
Copyright (c) 2000, 2019, Oracle e/ou suas afiliadas. Todos os direitos reservados.
Oracle é uma marca registrada da Oracle Corporation e/ou suas
afiliadas. Outros nomes podem ser marcas registradas de seus respectivos
proprietários.

Digite 'help;' ou 'h' para ajuda. Digite 'c' para limpar a declaração de entrada atual.

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 plugin verifica se o usuário Linux corresponde ao usuário MySQL, usando a opção de socket SO_PEERCRED — para coletar informações sobre o usuário que está executando o programa cliente. Assim, o plugin só pode ser usado em sistemas que suportam a opção SO_PEERCRED, como o Linux. A opção de socket SO_PEERCRED permite descobrir o uid associado ao processo do socket. Depois, ele obtém o nome de usuário associado a esse uid.

Vamos dar um exemplo com o usuário "vagrant":

vagrant@mysql1:~$ whoami
vagrant
vagrant@mysql1:~$ mysql
ERRO 1698 (28000): Acesso negado para o usuário 'vagrant'@'localhost'

Como não existe o usuário "vagrant" no MySQL, o acesso nos foi negado. Vamos criar esse usuário e tentar 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
Bem-vindo ao monitor MariaDB. Os comandos terminam com ; ou g.
Seu ID de conexão MariaDB é 45
Versão do servidor: 10.0.38-MariaDB-0ubuntu0.16.04.1 Ubuntu 16.04
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab e outros.
Digite 'help;' ou 'h' para ajuda. Digite 'c' para limpar a declaração de entrada atual.

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)

Conseguimos!

E quanto a uma distribuição que não seja Debian, onde isso não é previsto por padrão? Vamos tentar o Percona Server for 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;
ERRO 1524 (HY000): Plugin 'auth_socket' não está carregado

Falha. O que estava faltando? Plugin não carregado:

mysql> pager grep socket
PAGER definido como 'grep socket'
mysql> show plugins;
47 linhas no conjunto (0.00 seg)

Vamos adicionar o plugin ao processo:

mysql> nopager
PAGER definido como stdout
mysql> INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
Consulta OK, 0 linhas afetadas (0.00 seg)

mysql> pager grep socket; show plugins;
PAGER definido como 'grep socket'
| auth_socket                    | ATIVO | AUTENTICAÇÃO | auth_socket.so | GPL  |
48 linhas no conjunto (0.00 seg)

Agora temos tudo o que precisamos. Vamos tentar mais uma vez:

mysql> CREATE USER 'percona'@'localhost' IDENTIFIED WITH auth_socket;
Consulta OK, 0 linhas afetadas (0.01 seg)
mysql> GRANT ALL PRIVILEGES ON *.* TO 'percona'@'localhost';
Consulta OK, 0 linhas afetadas (0.01 seg)

Agora você pode fazer login como 'percona'.

[percona@ip-192-168-1-111 ~]$ whoami
percona
[percona@ip-192-168-1-111 ~]$ mysql -upercona
Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou g.
Seu ID de conexão MySQL é 19
Versão do servidor: 8.0.16-7 Percona Server (GPL), Release 7, Revision 613e312

Copyright (c) 2009-2019 Percona LLC e/ou suas afiliadas
Copyright (c) 2000, 2019, Oracle e/ou suas afiliadas. Todos os direitos reservados.

Oracle é uma marca registrada da Oracle Corporation e/ou suas
afiliadas. Outros nomes podem ser marcas registradas de seus respectivos
proprietários.

Digite 'help;' ou 'h' para ajuda. Digite 'c' para limpar a declaração de entrada atual.

mysql> select user, host, plugin, authentication_string from mysql.user where user ='percona';
+---------+-----------+-------------+-----------------------+
| user    | host      | plugin      | authentication_string |
+---------+-----------+-------------+-----------------------+
| percona | localhost | auth_socket |                       |
+---------+-----------+-------------+-----------------------+
1 linha no conjunto (0.00 seg)

E funcionou novamente!

Pergunta: será que consigo fazer login com o mesmo usuário percona, mas de outro usuário?

[percona@ip-192-168-1-111 ~]$ logout
[root@ip-192-168-1-111 ~]# mysql -upercona
ERRO 1698 (28000): Acesso negado para o usuário 'percona'@'localhost'

Não, não funcionará.

Saída

MySQL é bastante flexível em vários aspectos, um dos quais é o método de autenticação. Como visto neste post, o acesso pode ser obtido sem senhas, baseado em usuários do sistema operacional. Isso pode ser útil em determinados cenários, e um deles é durante a migração do RDS/Aurora para o MySQL comum, usando a autenticação de banco de dados IAM, para continuar acessando, mas sem senhas.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster