Data

14 abr, 2015

MySQL 5.7 – novidades no gerenciamento de usuários

Publicidade

Uma série de mudanças no subsistema de gestão de usuários da nova versão do sistema de gerenciamento de bancos de dados open source mais popular do mundo é observada. Muito vem para melhorar tudo aquilo que é considerado um problema de segurança para muitos dos administradores de bancos e dados que já trabalham com o MySQL desde outras versões.

Realmente, a versão 5.7 trará muitas novidades que já podem ser testadas através do download do DMR (Developement Milestonbe Release), disponível no labs.mysql.com. Muito do que vem sendo solicitado há algum tempo está previsto para a nova versão ainda sem previsão para lançamento. Entretanto, quero começar a listar aqui as várias novidades para que o leitor não fique perdido quando a hora da migração chegar – até porque as melhorias não são somente em algumas áreas, mas vários subsistemas estão sendo profundamente alterados e até reescritos, como é o caso da adoção de um sistema próprio de gestão para partições em tabelas, no caso do InnoDB, e a reescrita completa do parser de consultas que está localizado na primeira camada do gerenciador de bancos de dados do MySQL.

Deseja instalar o último release ou DMR do MySQL 5.7?

Mudanças na instalação

Para aqueles que fazem a instalação via pacote RPM ou mesmo via YUM, uma mudança interessante aconteceu. Considerando que usuários sem privilégios administrativos no nível do sistema operacional não têm acesso a determinados arquivo de log – especificamente acesso de leitura ao arquivo de log de erros do MySQL, que inicialmente se encontra em /var/log – após fazer a instalação do servidor de bancos de dados (o pacote com o nome *server*), o arquivo .mysql_secret não será mais gerado no diretório /home do usuário efetivo da instalação do MySQL, como acontece na versão 5.6.

Sabendo que após a instalação dos pacotes RPM do novo MySQL 5.7 DMR 6 nenhum arquivo será gerado no diretório padrão configurado na variáveis DATADIR (/var/lib/mysql), será interessante iniciar o mysqld somente após decidir onde residirão os arquivos necessários à inicialização do servidor de bancos de dados. Se essa localização for a padrão, já citada, um simples start irá criar justa às entradas de log padrão, um evento no log de erro como o abaixo:

#: comando para inicialização da instância
$ sudo service mysqld start

#: entrada no error log
2015-03-24T19:45:17.005384Z 1 [Warning] A temporary password is generated for root@localhost: e:pto=>:z50Z

Como já é de praxe acompanhar a inicialização do MySQL através do log de erros para verificar se esse processo foi limpo de erros ou não, é interessante já verificar a geração automática da senha do root como mostrado.

Após gerar a senha conforme fizemos acima, é interessante rodar o mysql_secure_installation para fazer a troca da senha para uma mais forte (não deixe a mesma senha que foi escrita aleatoriamente pela inicialização do mysql, pois algum usuário com privilégios poderia pegar essa senha no arquivo de log como fizemos e se apropriar dos bancos de dados contidos no MySQL). Adicionalmente, saliento que, segundo as boas práticas, a conta do root é indicada somente para operações administrativas que não possam ser realizadas por outros usuários, já que é também uma boa prática trabalhar com a política do menor privilégio.

[vagrant@central ~]$ mysql_secure_installation

Securing the MySQL server deployment.

Enter password for root user:

The existing password for the user account has expired. Please set a new password.

New password:

Re-enter new password:

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 2
Using existing root password.

Estimated strength of the password: 100
Change the root password? (Press y|Y for Yes, any other key for No) : Y

New password:

Re-enter new password:

Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : Y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : No

 ... skipping.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : Y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : Y
Success.

All done!

Após alterar a senha, testamos o acesso ao MySQL 5.7.6:

[vagrant@central ~]$ mysql -u root -pP@ssw0rd
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.6-m16 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, 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 'Hello World!!' as MSG;
+---------------+
| MSG           |
+---------------+
| Hello World!! |
+---------------+
1 row in set (0.00 sec)

mysql> \q
Bye

Ao rodar o mysql_secure_installation pela primeira vez considerando a nova versão do binário 5.7.6-m16, este lhe perguntará o nível de validação de senhas que o administrador de bancos de dados deseja aplicar ao ambiente, sendo os níveis de tal validação:

  1. LOW: considera somente o tamanho da senha fornecida;
  2. MEDIUM: nível padrão, considera o tamanho, uso de caracteres minúsculos e maiúsculos e especiais, exemplo: P@ssw0rd;
  3. STRONG: considera o tamanho, uso de caracteres minúsculos e maiúsculos e especiais, exceto palavras adicionadas a um dicionário que, se forem fornecidas como senha, serão rejeitadas.

Duas são as variáveis que controlam o nível da política de segurança para senhas e o dicionário de proibições – validate_password_policy e validate_password_dictionary_file, respectivamente.

mysql> show global variables like 'validate_password%';
+--------------------------------------+--------+
| Variable_name                        |  Value |
+--------------------------------------+--------+
| validate_password_dictionary_file    |        |
| validate_password_length             |      8 |
| validate_password_mixed_case_count   |      1 |
| validate_password_number_count       |      1 |
| validate_password_policy             | STRONG |
| validate_password_special_char_count |      1 |
+--------------------------------------+--------+
6 rows in set (0.05 sec)

Após a realização da configuração da nova senha e já com a possibilidade de utilização dela para fazer acessos ao MySQL, vale saber que novas declarações que fazem uso de comandos SQL existentes para outras atividades agora estão disponíveis também para a manipulação de usuários e se tornam a principal forma para realizar tarefas como a criação e a alteração de propriedades de usuários dos bancos de dados contidos no MySQL 5.7.6.

mysql> select @@validate_password_policy;
+----------------------------+
| @@validate_password_policy |
+----------------------------+
|                     STRONG |
+----------------------------+
1 row in set (0.01 sec)

mysql> CREATE USER wb@localhost IDENTIFIED BY 'P@ssw0rd';
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER USER wb@localhost IDENTIFIED BY 'Welc0me$1';
Query OK, 0 rows affected (0.01 sec)

O comando SET PASSWORD, a partir de então, também passa a ser utilizado de forma diferente. Por conta dos plugins de autenticação que são chamados de Pluggable Authentication, cada usuário poderá utilizar um tipo de plugin disponível no mySQL 5.7++, ou ainda qualquer um que seja escrito por algum outro usuário para se autenticar no MySQL. A coluna Password da tabela user do banco de dados mysql perdeu seu sentido, uma vez que quem está no controle do password ou senha dos usuários é o plugin de autenticação, sendo que tal tabela ganhou dois novos campos diferentes – um para armazenamento da senha (authentication_string) e outro que é o plugin que controla tal senha. Visto isso, não é mais necessário utilizar o comando SET PASSWORD chamado depois da função PASSWORD() para gerar o hash da senha, uma vez que, ao configurar uma nova senha, esta será enviada ao plugin que fará a conversão e a armazenará na tabela mysql.user.

mysql> select user, host, authentication_string, plugin from mysql.user where user='root'\G
*************************** 1. row ***************************
user: root
host: localhost
authentication_string: *8232A1298A49F710DBEE0B330C42EEC825D4190A
plugin: mysql_native_password
1 row in set (0.01 sec)

mysql> set password='Welc0me$1';
Query OK, 0 rows affected (0.01 sec)

mysql> select user, host, authentication_string, plugin from mysql.user where user='root'\G
*************************** 1. row ***************************
user: root
host: localhost
authentication_string: *DD3013C1ABE1B64468D813BE51EC66E8E40AE267
plugin: mysql_native_password
1 row in set (0.01 sec)

O comando ALTER USER nos permite, além de tudo, alterar o plugin de autenticação utilizado para um usuário e enviar um novo password para ser convertido por tal plugin para que a segurança seja reforçada. Abaixo utilizo o plugin que impõe senhas mais fortes para usuários no MySQL 5.7.6.

mysql> select user, host, authentication_string, plugin from mysql.user where user='root'\G
*************************** 1. row ***************************
user: root
host: localhost
authentication_string: *DD3013C1ABE1B64468D813BE51EC66E8E40AE267
plugin: mysql_native_password
1 row in set (0.00 sec)

mysql> select sha1('Welc0me$1') as `password`;
+------------------------------------------+
| password                                 |
+------------------------------------------+
| 5862fbdaa8eb0d68b48d5f1f1de5bfbc37f2b393 |
+------------------------------------------+
1 row in set (0.01 sec)

mysql> alter user root@localhost identified with sha256_password as '5862fbdaa8eb0d68b48d5f1f1de5bfbc37f2b393';
Query OK, 0 rows affected (0.01 sec)

mysql> select user, host, authentication_string, plugin from mysql.user where user='root'\G
*************************** 1. row ***************************
user: root
host: localhost
authentication_string: 5862fbdaa8eb0d68b48d5f1f1de5bfbc37f2b393
plugin: sha256_password
1 row in set (0.01 sec)

Para o usuário acima, será necessário configurar o acesso via SSL, o qeu geraria um novo artigo!! Ao tentar acessar o MySQL com um usuário que tenha sua senha administrada pelo plugin nativo sha256_password sem as configurações de SSL, você receberá a seguinte mensagem de erro:

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2061 (HY000): Authentication plugin 'sha256_password' reported error: Authentication requires SSL encryption

Para saber mais sobre esse tipo de autenticação, clique aqui.
Para saber mais sobre o novo modelo de autenticação de usuários no MySQL 5.7, clique aqui.