Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como gerenciar usuários e autenticação no MySQL


Introdução


O gerenciamento de usuários é uma das responsabilidades mais importantes de quem deseja gerenciar um sistema de banco de dados MySQL. Criar, alterar e excluir contas de usuário para melhor representar os usuários e serviços em seu ambiente ajuda a estabelecer as bases para bloquear o acesso, limitar o escopo de alterações e implementar auditoria e responsabilidade por modificações.

Neste guia, falaremos sobre como gerenciar contas de usuário no MySQL. Primeiro, discutiremos o que é um usuário válido no MySQL e mostraremos como adicionar usuários adicionais ao sistema. Isso leva a uma discussão sobre como configurar a autenticação para cada usuário e como o sistema escolhe uma opção de autenticação de uma lista de possibilidades. Continuaremos a falar sobre como fazer alterações em usuários existentes, como fazer login com as contas que você criou e como excluir usuários que não são mais necessários.


Pré-requisitos


Para seguir este guia, você precisará de uma conta em um servidor MySQL com os privilégios apropriados.

Comandos que usaremos


Para criar, modificar e excluir usuários no MySQL, os principais comandos necessários são:
  • CREATE USER :crie uma nova conta de usuário
  • ALTER USER :fazer alterações em uma conta de usuário existente
  • DROP USER :remover uma conta de usuário existente


Privilégios necessários


Para executar os comandos acima, você precisa fazer login no MySQL com uma conta com CREATE USER privilégios. O CREATE USER privilégio permite criar, modificar, excluir e renomear usuários, entre outras ações. Também precisaremos do SELECT privilégio no mysql banco de dados para ver informações sobre usuários existentes.

Em ordem de preferência, você deve fazer o login usando:
  • Uma conta limitada que tem o CREATE USER privilégio e o SELECT privilégio no mysql banco de dados
  • A root ou usuário administrativo que tem privilégios totais no MySQL



Compreendendo como o MySQL define e interpreta contas de usuário


Antes de começarmos a criar novas contas, é útil dedicar algum tempo para se familiarizar com os vários que o MySQL usa para criar e fazer referência aos usuários. Você também precisa estar familiarizado com o algoritmo de autenticação do MySQL para entender qual conta de usuário ele usará para autenticar as conexões.

Qual ​​é a sintaxe do MySQL para contas de usuário?


No MySQL, as contas de usuário são compostas por duas informações separadas, unidas por uma arroba (@):
  • O nome de usuário
  • O host do qual o usuário está se conectando

Em geral, as contas de usuário no sistema terão a seguinte aparência:
'<user>'@'<host>'

As aspas simples podem ser usadas, como acima, para agrupar individualmente os componentes de usuário e host da conta de usuário. Às vezes, eles são necessários se um dos componentes contiver caracteres que, de outra forma, seriam mal interpretados. Em geral, adicioná-los é sempre uma boa ideia para ser explícito.

Então, em vez de apenas ter uma conta chamada 'john' , no MySQL, o nome completo da conta exigiria algum tipo de host, como 'john'@'localhost' . Isso significa que pode haver vários 'john' contas no sistema e o MySQL verá cada uma delas como uma conta única, desde que sejam provenientes de um domínio diferente.

Com tudo isso dito, é possível definir contas de usuário que não possuem um componente de usuário ou host, mas há implicações importantes que você deve estar ciente.

Você pode definir uma conta de usuário sem um valor de usuário usando uma string vazia:
''@'<host>'

Por exemplo, você pode criar um usuário como ''@'localhost' . Este usuário corresponderia a qualquer nome de usuário se conectando a partir do computador local.

Da mesma forma, você pode ter uma conta de usuário que corresponda a qualquer host. Em vez de usar uma string vazia, para valores de host, você usaria o % curinga, assim:
'<user>'@'%'

Por exemplo, se você criar 'john'@'%' , essa conta corresponderia a um 'john' usuário se conectando de qualquer hospedeiro.


Como o MySQL autentica usuários?


Compreender como o MySQL realmente processa cada solicitação de autenticação é muito importante para evitar uma classe comum de problemas de autenticação que resultam de suposições razoáveis, mas incorretas. Isso foi discutido com alguma profundidade em nossa introdução à autenticação e autorização no artigo MySQL.

Ao autenticar uma solicitação de conexão, o MySQL usa vários campos dentro do user tabela de seu mysql interno banco de dados para decidir se permite a conexão. O MySQL usará no máximo um registro de conta de usuário para tentar autenticar uma conexão. Isso significa que o MySQL precisa de uma maneira de decidir qual conta de usuário usar se houver mais de uma conta que possa corresponder a uma conexão.

O algoritmo do MySQL para autenticar usuários começa quando o servidor é inicializado. Na inicialização, o MySQL carrega todo o mysql.user tabela na memória. Ele também faz isso sempre que as contas de usuário são criadas usando os comandos regulares do MySQL. À medida que carrega a tabela, ele classifica as entradas da prioridade mais alta para a mais baixa.

MySQL usa o Host coluna como o campo de classificação principal e prioriza os resultados com valores mais específicos. Portanto, os valores literais são classificados no topo como a prioridade mais alta e aqueles que usam curingas, como % , são classificados para baixo. As entradas finais são aquelas que contêm apenas % sem outros caracteres, seguido por entradas que têm um host completamente em branco.

O User coluna é usada como um campo de classificação secundário para quaisquer entradas que tenham o mesmo Host valor. Mais uma vez, as correspondências mais exatas são priorizadas. Como o User a coluna não pode usar curingas, todas as entradas estão em pé de igualdade, exceto aquelas com um User em branco valor. Esses são classificados para o fundo. Se qualquer entrada com um User em branco for selecionado, o usuário será autenticado como um "usuário anônimo", o que geralmente equivale a não ter privilégios.

Agora, sempre que uma solicitação de conexão é feita, o MySQL percorre sua tabela classificada na memória de cima para baixo. Ele usa o primeiro entrada que ele encontra para autenticar o usuário, independentemente de haver outras entradas que também correspondam. Se o cliente não autenticar usando o método definido por essa entrada, a conexão falhará e nenhuma outra entrada será verificada.


Quais são os implicações de não incluir um usuário ou host em uma definição de conta de usuário MySQL?


Por causa do algoritmo de autenticação do MySQL, podem surgir problemas se você não for cuidadoso ao criar contas de usuário sem um componente de usuário ou host. Isso ocorre porque o modo como o MySQL decide qual registro usar para autenticar você pode ser pouco intuitivo e surpreendente.

Por exemplo, se um usuário se autenticar no MySQL com a parte do usuário como uma string em branco, o MySQL o considerará um "usuário anônimo" pelo restante da sessão. Como regra, usuários anônimos quase não têm energia e podem fazer muito pouco depois de conectados. É possível até mesmo autenticar acidentalmente como um usuário anônimo ao tentar autenticar usando uma conta de usuário diferente.

O desafio de usar hosts curinga para contas de usuário é as outras contas de usuário que incluem um valor de host pode mascarar facilmente ou tornar indisponível a conta de usuário que usa o curinga.

Por exemplo, se você tiver uma conta de usuário definida como 'emily'@'%' , você pode esperar poder autenticar para 'emily' de qualquer hospedeiro. No entanto, se você tiver uma conta de usuário com um usuário em branco, mas um valor de host que corresponda ao host 'emily' está se conectando, o MySQL se autenticará usando essa conta (levando a um login de usuário anônimo conforme descrito acima).

Então, como exemplo, o MySQL classificará as seguintes contas na seguinte ordem:
Prioridade Conta MySQL Comentários
1 'emily'@'localhost' e 'emily'@'example.com' Eles têm a mesma prioridade, o que é bom porque só é possível que um deles corresponda a uma conexão.
2 ''@'localhost' e ''@'example.com' Essas duas entradas são, novamente, da mesma prioridade. Como eles não têm um componente de usuário, mas têm têm um componente de host literal, eles são colocados na parte inferior das entradas que possuem valores de host exatos.
3 'emily'@'%.example.com' Esta entrada tem um curinga no componente de host, portanto, tem prioridade menor do que entradas com valores de host exatos.
4 ''@'%.example.com' Esta entrada é agrupada com as entradas que possuem um curinga em seu valor de host. Como não tem componente de usuário, está na parte inferior deste grupo.
5 'emily'@'%' Esta entrada tem um valor de host que consiste apenas em um curinga. Como corresponde a qualquer host, tem uma prioridade muito baixa.
7 ''@'%' Esta entrada pode ser usada para autenticar qualquer usuário de qualquer host como um usuário anônimo. É de prioridade extremamente baixa, pois corresponde a qualquer conexão.
6 'emily'@'' Esta entrada tem um valor de host totalmente em branco, que é de prioridade ainda mais baixa do que um host que contém apenas um host curinga.
8 ''@'' Este é o usuário de menor prioridade possível. Ele não contém informações do host, portanto, é colocado no final durante a classificação do host. Como também contém um usuário em branco, ele é colocado abaixo de outras entradas neste grupo. Como todas as entradas sem usuário, as conexões autenticadas com esta entrada serão conectadas como um usuário anônimo.



Como você cria usuários?


Agora que você tem uma ideia de como o MySQL lida com contas de usuários, podemos começar a criar alguns novos usuários. Lembre-se de fazer login com um usuário com os privilégios descritos nos pré-requisitos.

Sintaxe básica


A sintaxe básica para criar um novo usuário é relativamente simples. Você usa o CREATE USER comando e, em seguida, especifique o usuário e o host para a nova conta:
CREATE USER '<user>'@'<host>';

Isso criará uma conta básica sem configurar nenhum detalhe além de seu usuário e host na criação.


Como você cria um usuário com uma senha?


Muitas vezes, você deseja configurar a autenticação enquanto cria o usuário. Você pode fazer isso adicionando o opcional IDENTIFIED BY cláusula em CREATE USER demonstração:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';

Isso cria uma nova conta de usuário, como antes, e atribui uma senha para a conta ao mesmo tempo. Abordaremos como atribuir uma senha após o fato ou como alterar a senha de um usuário posteriormente.


Como você cria um usuário com autenticação de soquete Unix?


Embora a autenticação por senha seja o método de autenticação mais comum para a maioria dos usuários, não é a única opção. O MySQL fornece muitos mecanismos de autenticação internos e externos diferentes que você pode configurar para usar em suas contas de usuário. Como exemplo, vamos configurar uma nova conta usando a autenticação de soquete Unix.

A autenticação de soquete Unix pode ser usada em ambientes Linux ou semelhantes a Unix para que uma conta no sistema operacional tenha acesso ao mesmo nome de conta no MySQL sem autenticação adicional. Nesta configuração, o administrador do MySQL sabe que as contas de usuário no sistema operacional são rigidamente controladas.

Então, se houver uma mary usuário no sistema operacional, eles poderão fazer login no 'mary'@'localhost' conta dentro do MySQL se a autenticação de soquete Unix for o mecanismo de autenticação definido. Vamos configurar isso agora.

A autenticação de soquete requer o auth_socket plugin, então primeiro carregue o plugin digitando:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';

Em seguida, crie uma conta de usuário que corresponda a uma conta de usuário que você possui em seu sistema operacional. Para este exemplo, usaremos o mary conta que discutimos acima. Se você não usar um nome que corresponda a um dos nomes de seu sistema operacional, não poderá autenticar usando esse usuário.

Para criar o usuário com autenticação de socket, precisamos usar o IDENTIFIED WITH cláusula (diferente do IDENTIFIED BY cláusula usada anteriormente) para especificar o plug-in de autenticação a ser usado:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;

Agora, você deve conseguir se autenticar no 'mary'@'localhost' Usuário MySQL do mary usuário em seu sistema operacional. Quando conectado como mary , conecte-se ao banco de dados sem fornecer nenhum nome de usuário ou senha:
mysql

Você deve estar conectado automaticamente por meio da autenticação de soquete Unix que você configurou.



Como você mostra os usuários existentes?


Em seguida, vamos dar uma olhada em como encontrar informações sobre os usuários existentes.

Para mostrar todos os usuários MySQL existentes, consistindo em seus componentes de usuário e host, bem como o plug-in de autenticação que estão usando no momento, você pode SELECT esses campos do mysql.user base de dados:
SELECT user,host,plugin FROM mysql.user
+------------------+-----------+-----------------------+  user             | host      | plugin                |+------------------+-----------+-----------------------+  mary             | localhost | auth_socket           |  mysql.infoschema | localhost | caching_sha2_password |  mysql.session    | localhost | caching_sha2_password |  mysql.sys        | localhost | caching_sha2_password |  root             | localhost | caching_sha2_password |  useradmin        | localhost | caching_sha2_password |+------------------+-----------+-----------------------+6 rows in set (0.00 sec)

Aqui, podemos ver que existem seis usuários definidos no sistema, todos os quais só podem fazer login localmente. Cinco das contas estão configuradas para usar autenticação de senha. O 'mary'@'localhost' conta está configurada para usar a autenticação de soquete Unix.

Podemos encontrar informações adicionais sobre as propriedades do usuário usando o SHOW CREATE USER comando. Apesar do nome, mostra todas as propriedades atuais de uma conta de usuário, não necessariamente aquelas que foram usadas durante a criação inicial da conta.

O SHOW CREATE USER O comando recebe um nome de conta como argumento:
SHOW CREATE USER '<user>'@'<host>'\G

Geralmente é melhor terminar o comando com o \G terminador de instrução em vez dos dois pontos normais (; ) para que você possa visualizar os resultados com um pouco mais de clareza.

Para exibir as propriedades do 'useradmin'@'localhost' conta, você digitaria:
SHOW CREATE USER 'useradmin'@'localhost'\G
*************************** 1. row ***************************CREATE USER for useradmin@localhost: CREATE USER 'useradmin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$O                                              Rl7lM;@Gt{roB4EWchqDdYM142Lq7pfzcCNiK4yUxnRBlrAgr0sE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT1 row in set (0.00 sec)


Como você altera os usuários existentes do MySQL?


Você pode alterar os usuários existentes no MySQL usando o ALTER USER comando. Isso pode ser usado para alterar a maioria das propriedades relacionadas ao usuário de uma conta, com exceção dos privilégios da conta, que são controlados pelo GRANT e REVOKE comandos.

A sintaxe básica para ALTER USER se parece com isso:
ALTER USER <user> <properties_to_change>;

Como você altera a senha de um usuário MySQL?


Para a maioria das pessoas, o uso mais comum de ALTER USER é modificar as senhas.

Por exemplo, você pode modificar a senha para 'kamal'@'localhost' digitando:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';

Se você deseja definir uma senha temporária para um usuário que ele terá que substituir imediatamente, você pode definir e expirar uma senha ao mesmo tempo:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;

Você sempre pode alterar sua própria senha, mesmo sem o CREATE USER privilégio. É mais fácil usar o USER() função para preencher automaticamente seu próprio nome de usuário:
ALTER USER USER() IDENTIFIED BY '<new_password>';


Como você altera os plugins de autenticação para um usuário MySQL?


Você também pode alterar o mecanismo ou plug-in usado para autenticar uma conta.

Em um exemplo anterior, configuramos uma conta chamada 'mary'@'localhost' para usar a autenticação de soquete Unix. Se mais tarde quisermos alterar essa conta para usar a autenticação de senha convencional, podemos usar o ALTER USER comando novamente.

Primeiro, identifique o plug-in de autenticação padrão para seu servidor. Se for um método de autenticação baseado em senha, provavelmente é melhor reutilizar a seleção padrão:
SHOW VARIABLES LIKE 'default_authentication_plugin';

Neste caso, o plugin de autenticação padrão é caching_sha2_password , então usaremos isso quando mudarmos para autenticação de senha.

Agora, altere 'mary'@'localhost' para usar a caching_sha2_password plugin com uma nova senha:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';

O 'mary'@'localhost' o usuário não poderá mais fazer login usando a autenticação de soquete Unix, mas poderá fazer login usando a senha fornecida.



Como você faz login no MySQL?


Discutimos como criar e modificar contas de usuário MySQL, incluindo autenticação. No entanto, não falamos sobre como fazer login usando esses métodos de autenticação.

O mysql client é um poderoso cliente de linha de comando que pode ser usado para se conectar a bancos de dados locais e remotos. Vamos usá-lo para falar sobre como autenticar usando os métodos que configuramos acima.

Como você faz login em um banco de dados local com uma senha?


Para fazer login em um banco de dados MySQL hospedado localmente usando uma conta de usuário com uma senha, a sintaxe básica é assim:
mysql --user=<username> --password <dbname>

Então, se o 'kamal'@'localhost' usuário deseja fazer login no MySQL e conectar-se ao testing banco de dados do computador onde o sistema está hospedado, eles podem digitar:
mysql --user=kamal --password testing

O mysql o cliente solicitará a senha para 'kamal'@'localhost' . Se você fornecer as credenciais corretas, será conectado ao testing base de dados.

A especificação de um banco de dados na linha de comando é opcional. Se nenhum for especificado, você se conectará ao servidor, mas não a um banco de dados específico.


Como você faz login em um banco de dados local com autenticação de soquete Unix?


Para fazer login em um servidor MySQL local usando a autenticação de soquete Unix, você precisa estar conectado ao seu sistema operacional com o nome da conta correspondente. Então, se quisermos autenticar em 'mary'@'localhost' usando a autenticação de soquete Unix, primeiro temos que fazer login em nosso computador com um nome de usuário chamado mary .

Depois de usar a conta correta do sistema operacional, você pode se conectar diretamente ao banco de dados local executando o cliente, sem opções.
mysql

Como antes, você pode, opcionalmente, anexar um nome de banco de dados para se conectar a um banco de dados específico que desejar.


Como você faz login em um banco de dados remoto com uma senha?


Se o seu servidor MySQL não estiver rodando em seu servidor local, você terá que especificar o host ao qual o cliente deve tentar se conectar. Você pode fazer isso adicionando o --host opção.

Na maioria das vezes, você estará autenticando com uma senha para servidores MySQL remotos, então o comando seria algo assim:
mysql --user=<username> --password --host=<host> <dbname>

Então 'tanya'@'<tanyas_domain>' pode se conectar a um servidor MySQL localizado em example.com digitando:
mysql --user='tanya' --password --host='example.com' 



Como você exclui usuários do MySQL?


Manter contas de usuários que não servem mais a um propósito é um risco de segurança. Você pode remover contas facilmente com o DROP USER comando.

A sintaxe básica fica assim:
DROP USER '<user>'@'<host>';

Então, para excluir o 'mary'@'localhost' usuário, você digitaria:
DROP USER 'mary'@'localhost';

Se você tentar excluir um usuário que não existe, receberá um erro:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'

Para evitar isso, você pode adicionar o IF EXISTS cláusula antes do nome da conta. Se o usuário existir, ele será excluído. Caso contrário, apenas um aviso será dado:
Query OK, 0 rows affected, 1 warning (0.00 sec)


Conclusão


O gerenciamento de contas de usuário do MySQL e a configuração de autenticação são altamente flexíveis. Aprender como criar, modificar e obter informações sobre usuários no MySQL ajudará você a administrar seus sistemas de banco de dados com mais eficiência.

As práticas recomendadas de segurança determinam que você deve criar contas para cada caso de uso exclusivo, considerando apenas o nível de acesso necessário para executar seu escopo. A criação e autenticação da conta são as primeiras etapas desse processo. Em outro guia, falaremos sobre conceder e revogar privilégios para cumprir a outra parte dessa estratégia.