MySql: Concede opções somente leitura?

98

Eu tenho um usuário, a quem desejo conceder a permissão READ em um esquema db.

Uma maneira é esta:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

Existe uma maneira de agrupar todas as operações de leitura em concessão?

Ajeet Ganga
fonte
O privilégio é SHOW VIEW, não SHOW_VIEW, mas você não precisa concedê-lo a um usuário, a menos que você queira que ele SHOW CREATE VIEWnas visualizações ... ele pode selecionar a partir das visualizações apenas com o SELECTprivilégio. O que você quer dizer com "agrupar todas as operações de leitura na concessão"?
Michael - sqlbot
Se houver qualquer privilégio único que represente TODAS as operações READ no banco de dados. Eu entendo que eles estão fornecendo acesso refinado, mas uma abstração de alto nível conveniente teria nos ajudado.
Ajeet Ganga

Respostas:

161

Se houver qualquer privilégio único que represente TODAS as operações READ no banco de dados.

Depende de como você define "tudo lido".

"Ler" tabelas e visualizações é o SELECTprivilégio. Se é isso que você quer dizer com "tudo lido", então sim:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

No entanto, parece que você se refere à capacidade de "ver" tudo, de "olhar, mas não tocar". Então, aqui estão os outros tipos de leitura que vêm à mente:

"Ler" a definição das visualizações é o SHOW VIEWprivilégio.

"Ler" a lista de consultas atualmente em execução por outros usuários é o PROCESSprivilégio.

"Ler" o estado de replicação atual é o REPLICATION CLIENTprivilégio.

Observe que qualquer um ou todos eles podem expor mais informações do que você pretende expor, dependendo da natureza do usuário em questão.

Se essa é a leitura que você deseja fazer, você pode combinar qualquer um desses (ou qualquer outro dos privilégios disponíveis ) em uma única GRANTinstrução.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

No entanto, não há um único privilégio que conceda algum subconjunto de outros privilégios, que é o que parece que você está pedindo.

Se você estiver fazendo as coisas manualmente e procurando uma maneira mais fácil de fazer isso sem precisar se lembrar da concessão exata que você normalmente faz para uma determinada classe de usuário, você pode procurar a instrução para regenerar as concessões de um usuário comparável e alterá-la. para criar um novo usuário com privilégios semelhantes:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Alterar 'not_leet' e 'localhost' para corresponder ao novo usuário que você deseja adicionar, junto com a senha, resultará em uma GRANTinstrução reutilizável para criar um novo usuário.

Ou, se você deseja uma única operação para configurar e conceder o conjunto limitado de privilégios aos usuários, e talvez remover quaisquer privilégios não merecidos, isso pode ser feito criando um procedimento armazenado que encapsula tudo o que você deseja fazer. Dentro do corpo do procedimento, você construiria a GRANTinstrução com SQL dinâmico e / ou manipularia diretamente as próprias tabelas de permissões.

Em esta recente pergunta sobre administradores de banco de dados , o cartaz queria a capacidade de um usuário sem privilégios para modificar outros usuários, o que obviamente não é algo que pode ser feito normalmente - um usuário que pode modificar outros usuários é, praticamente por definição, não um usuário sem privilégios - no entanto - procedimentos armazenados forneceram uma boa solução nesse caso, porque eles são executados com o contexto de segurança de seu DEFINERusuário, permitindo que qualquer pessoa com EXECUTEprivilégios no procedimento assuma temporariamente privilégios escalados para permitir que eles façam coisas específicas que procedimento realiza.

Michael - sqlbot
fonte
1
Obrigado. Além da ótima resposta, também gostei da sua senha. :)
Ajeet Ganga
2
Vale a pena notar: PROCESS e REPLICATION CLIENT são tipos de privilégio "globais", portanto, a sintaxe falhará quando definida com uma exclusão "por banco de dados". GRANT PROCESS ON mydb. * Seria inválido, mas GRANT PROCESS ON *. * Seria OK.
Bee Kay
GRANT SELECT ON db_name. * TO 'demo' @ '%' WITH GRANT OPTION;
Musa
16
GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Isso criará um usuário com SELECTprivilégios para todos os bancos de dados, incluindo visualizações.

Mahesh Patil
fonte
9

Várias permissões que você pode conceder a um usuário são

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges

Para fornecer permissão a um usuário específico, você pode usar esta estrutura:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

Eu achei este artigo muito útil

ath j
fonte
3

Um guia passo a passo que encontrei aqui .

Para criar uma conta de usuário de banco de dados somente leitura para MySQL

Em um prompt do UNIX, execute o programa de linha de comando MySQL e faça login como administrador digitando o seguinte comando:

mysql -u root -p

Digite a senha da conta root. No prompt do mysql, execute uma das seguintes etapas:

Para fornecer ao usuário acesso ao banco de dados de qualquer host, digite o seguinte comando:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

Se o coletor for instalado no mesmo host que o banco de dados, digite o seguinte comando:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

Este comando fornece ao usuário acesso somente leitura ao banco de dados a partir do host local apenas. Se você souber o nome do host ou endereço IP do host em que o coletor será instalado, digite o seguinte comando:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

O nome do host deve ser resolvido pelo DNS ou pelo arquivo de hosts local. No prompt do mysql, digite o seguinte comando:

flush privileges;

Digite quit.

A seguir está uma lista de comandos de exemplo e mensagens de confirmação:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit
biniam
fonte
3

Até mesmo o usuário obteve a resposta e @Michael - sqlbot cobriu a maioria dos pontos muito bem em seu post, mas um ponto está faltando, então apenas tentando cobri-lo.

Se você deseja fornecer permissão de leitura a um usuário simples (tipo não de administrador) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

Nota: EXECUTE é necessário aqui, para que o usuário possa ler os dados se houver um procedimento armazenado que produza um relatório (tem poucas instruções de seleção).

Substitua localhost pelo IP específico a partir do qual o usuário se conectará ao banco de dados.

Permissões de leitura adicionais são-

  • SHOW VIEW: Se você deseja mostrar o esquema de visualização.
  • CLIENTE DE REPLICAÇÃO: Se o usuário precisar verificar o status de replicação / escravo. Mas precisa dar permissão em todos os DB.
  • PROCESSO: Se o usuário precisar verificar o processo em execução. Funcionará apenas com todos os DB.
Zafar Malik
fonte
1

Nota para MySQL 8 é diferente

Você precisa fazer isso em duas etapas:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Daniel Patrick
fonte
Esta é a única solução que funcionou para mim. Parece que as outras soluções estão desatualizadas, como você disse. Obrigado por fornecer esta solução atualizada.
Kyle Bridenstine
0

Se você deseja que a visualização seja lida apenas após conceder a permissão de leitura, você pode usar ALGORITHM = TEMPTABLE em sua definição de visualização DDL.

Daniel Fisher
fonte