terça-feira, 23 de setembro de 2014

MySQL conexões de usuários

Original post: http://anothermysqldba.blogspot.com/2014/09/mysql-user-connections.html

Então eu me encontrei explicando as diferenças com os usuários do MySQL e como eles autenticar. Em primeiro lugar esta informação não é nova, mas pode ser encontrada aqui:
Vou apenas mostrar alguns exemplos do mundo real para explicar isso.

O MySQL utiliza o nome de usuário, bem como o acesso quando se avalia as permissões de um usuário. É por isso que a melhor prática é remover os usuários anônimos.

Para este exemplo vou começar com os seguintes usuários



MariaDB [(none)]> select user , host from mysql.user;
+---------+-----------+
| user | host |
+---------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| | centos64 |
| root | centos64 |
| | localhost |
| root | localhost |
+---------+-----------+

Eu posso entrar no servidor até pensei que não tem um nome de usuário porque o padrão para baixo para anonymous @ localhost.


# mysql -u nobody
MariaDB [(nenhum)]> selecione current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
MariaDB [(nenhum)]> show subvenções;
+ -------------------------------------- +
| Bolsas paralocalhost |
+ -------------------------------------- +
| GRANT Uso na * TO '' @ 'localhost'. |
+ -------------------------------------- +

Enquanto eu não posso fazer muita coisa que eu ainda tenho no banco de dados.

Agora, quando eu passar por um usuário conhecido:


# mysql -u root -p
MariaDB [(nenhum)]> selecione current_user;
+ ---------------- +
| Current_user |
+ ---------------- +
| Root @ localhost |
+ ---------------- +
MariaDB [(nenhum)]> show subvenções;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para root @ localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL ON * PRIVILÉGIOS * TO 'root' @ 'localhost' IDENTIFICADAS POR SENHA '* 8CD56861FDADF7A264741F27D502D1A8DAE0A8F7' WITH GRANT OPTION. |
| GRANT PROXY ON '' @ '' para 'root' @ 'localhost' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+


Atualmente, o usuário root tem quatro contas diferentes.

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1 |
| root | centos64 |
| root | localhost |
+------+-----------+

Estas são todas as contas diferentes. Eu só preciso de um deles embora. Eu só uso a conta root através de ligações locais de acolhimento.

MariaDB [(none)]> DROP USER 'root'@'127.0.0.1';
Query OK, 0 rows affected (0.33 sec)

MariaDB [(none)]> DROP USER 'root'@'centos64';
Query OK, 0 rows affected (0.02 sec)

MariaDB [(none)]> DROP USER 'root'@'::1';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> select user , host from mysql.user where user = 'root';
+------+-----------+
| user | host |
+------+-----------+
| root | localhost |
+------+-----------+

Então, o que eu quero dizer com quatro contas diferentes? Eles toda a conta de usuário root. Sem .. Eles são raiz e tudo o host. Assim, cada conta (usuário + host) pode ter permissões diferentes.

Então, vamos fazer um exemplo próximo para mostrar a diferença.
Assim, o servidor, neste exemplo, possui duas interfaces de rede. Então, eu vou criar um usuário por todos os pontos de acesso, cada um com diferentes permissões para mostrar as diferenças. Vou ajustar a mesma senha, mas aqueles poderia ser diferente também.

MariaDB [(none)]> GRANT SELECT ON *.* TO 'anothermysqldba'@'10.0.2.15' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE , DROP, RELOAD, SHUTDOWN, PROCESS, FILE, INDEX, ALTER ON *.* TO 'anothermysqldba'@'192.168.0.%' IDENTIFIED BY '<cleartext password>';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'anothermysqldba'@'localhost' IDENTIFIED BY '<cleartext password>' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(nenhum)]> selecione usuário, host de mysql.user onde user = 'anothermysqldba';
+ ----------------- + ------------- +
| Usuário | anfitrião |
+ ----------------- + ------------- +
| Anothermysqldba | 10.0.2.15 |
| Anothermysqldba |. 192.168.0% |
| Anothermysqldba | localhost |
+ ----------------- + ------------- +

Então o que isso significa? Mesmo que os nomes de usuário são os mesmos, porque o MySQL usa o acolhimento, bem como para validar um usuário a cada ponto de acesso do usuário, como permissões diferentes.

Enquanto você pode confiar em alguns de seus desenvolvedores, este é muitas vezes uma boa idéia para limitar alguns dos seu acesso se eles estão trabalhando remotamente ou através de seus scripts. Se eles precisam fazer algo que não envolve você e eles têm de ssh para o servidor em si e login para realizar outras tarefas. Este é, naturalmente, dependente da relação de trabalho e fluxo de sua empresa e / ou aplicações.

Usando o 10.0.2.15 anfitrião o usuário só tem acesso select.

# mysql -h 10.0.2.15 -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba@10.0.2.15 |
+ --------------------------- +
MariaDB [(nenhum)]> show subvenções;
+-------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba@10.0.2.15 |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECIONE ON * TO 'anothermysqldba'@'10.0.2.15 »identificados através de senha' * 31360D7EE84BE965C0E759179FC61B6943BCA64F '. |
+-------------------------------------------------------------------------------------------------------------------------+

Usando o host 192.168.0.26 o usuário tem mais acesso. Essa conta também é definido para acessar através de qualquer coisa sob o 192.168.0 / 255 (%) de sub-rede.

# mysql -h 192.168.0.26 -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ + -----------------------------
| Current_user () |
+ + -----------------------------
| Anothermysqldba@192.168.0.% |
+ + -----------------------------
MariaDB [(nenhum)]> show subvenções;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba@192.168.0.% |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, processo e arquivo, INDEX, ALTER ON * TO 'anothermysqldba'@'192.168.0.% »identificados através de senha' * 31360D7EE84BE965C0E759179FC61B6943BCA64F '. |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Então, como você vai assumir o usuário localhost tem a conta de acesso completo.

# mysql -u anothermysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ --------------------------- +
| Current_user () |
+ --------------------------- +
| Anothermysqldba @ localhost |
+ --------------------------- +
1 row in set (0.00 sec)

MariaDB [(nenhum)]> show subvenções;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Bolsas para anothermysqldba @ localhost |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL ON * PRIVILÉGIOS * TO 'anothermysqldba' @ 'localhost' IDENTIFICADAS POR SENHA '* 31360D7EE84BE965C0E759179FC61B6943BCA64F' WITH GRANT OPTION. |
+---------------------------------------------------------------------------------------------------------------------------------------------------+

Agora, como eu disse antes, é melhor prática para remover os usuários anônimos. Usando o mysql_secure_installation para instalação vai ajudar com a sua também.

Por que isso importa?

# mysql -u anothremysqldba -p
MariaDB [(nenhum)]> selecione current_user ();
+ ---------------- +
| Current_user () |
+ ---------------- +
|localhost |
+ ---------------- +
1 row in set (0.00

O exemplo simples ... está acima e apenas evitar erros simples. Um erro de digitação permitido o acesso ao banco de dados, não deve permitir isso.

Então, retire em seguida e testar novamente.

MariaDB [(none)]> DROP USER ''@'localhost';
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> DROP USER ''@'centos64';
Query OK, 0 rows affected (0.00 sec)

# Mysql-u anothremysqldba -p
Digite a senha:
ERROR 1045 (28000): Acesso negado para o usuário 'anothremysqldba' @ 'localhost' (senha usada: SIM

Então, o que significa se o seu banco de dados é criado com a maioria com% como o nome ou ip estrita endereços e não curingas?

Esta seria uma decisão de segurança e de negócios de sua parte. Pessoalmente não é uma opção válida na minha opinião. Nada mais que um curinga (%) permite que um ponto de acesso robusto, mas se o firewall tem uma falha que também abre o acesso ao controle remoto de usuários da rede. Um endereço IP estrita por usuário também é bastante rigorosa na minha opinião, mas isso depende do usuário. Por exemplo, mesmo com uma conta que tenha sido criada para replicação Prefiro ainda usar o endereço IP com uma ie%.: 192.168.0%. Endereços IP mudam (mesmo mudanças estáticos para usuários remotos do DBA muitas vezes não é dito) e que muitas vezes resulta em pessoas que vêm para o DBA com queixas sobre falhas de acesso.

Certa vez trabalhei com uma pessoa que limitava a cada acesso do usuário bloqueado para um endereço IP estático. Essa pessoa teve que alterar constantemente declarações de concessão. As pessoas têm de ser capazes de trabalhar de forma fácil e eficaz, enquanto você pode garantir a segurança em sua extremidade.