O usuário não administrativo do MySQL pode acessar e modificar a tabela mysql.user

1

Eu instalo mysql no Ubuntu. Eu coloquei root user como administrador e criei um novo usuário para não administrador.

CREATE USER 'user'@'localhost' IDENTIFIED BY '';
GRANT ALTER,CREATE,CREATE VIEW,DELETE,DROP,INDEX,INSERT,REFERENCES,RELOAD,SELECT,SHOW DATABASES,SHOW VIEW,TRIGGER,UPDATE ON *.* TO 'user'@'localhost';

Mas, esse usuário comum tem acesso a (literalmente) mysql banco de dados. Qual contém a tabela do usuário. Então, eu posso modificar outros usuários mesmo usando não administradores.

mysql> DELETE FROM mysql.user WHERE User = "otheruser";
Query OK, 1 row affected (0,03 sec)

Como proibir que usuários não administradores modifiquem as tabelas mysql.* ? Minha permissão está errada?

Complemento

Sou administrador de laboratórios de informática para o assunto do banco de dados, onde cada aluno pode criar o seu próprio. Então, teoricamente, negar privilégios ao banco de dados mysql é a única maneira, certo? Como eu posso fazer isso? É possível?

    
por Abdillah 11.02.2017 / 06:52

2 respostas

0

A parte *.* na sua declaração GRANT - "acontece, esse usuário comum tem acesso ao banco de dados mysql (literalmente)". Especifique apenas aquele banco de dados que o usuário permitiu acessar como

CREATE USER 'user'@'localhost' IDENTIFIED BY '';
GRANT ALTER,CREATE,CREATE VIEW,DELETE,DROP,INDEX,INSERT,SELECT,SHOW VIEW,TRIGGER,UPDATE ON AllowedDatabaseName.* TO 'user'@'localhost';

P.S.

E eu concordo completamente com @Walmart, não dê permissões demais para o usuário se ele realmente não precisar dele (como REFERÊNCIAS, RECARREGAR, MOSTRAR BANCOS DE DADOS ...)

    
por 11.02.2017 / 08:41
0

Is my permission wrong?

Sim, você está concedendo a conta mais do que precisa para que sua declaração GRANT esteja errada.

How to forbid non-admin user to modify mysql.* tables?

Quando você concede GRANT permissões à conta SQL local que você cria, apenas conceda-o permissões que ele precisa para acessar os registros de banco de dados ou objetos de banco de dados que ele precisa acessar e nada mais.

O método mais seguro seria conceder apenas as permissões explícitas necessárias aos objetos explícitos do banco de dados, como SELECT , para uma tabela específica, ou EXECUTE , a um procedimento armazenado específico, por exemplo.

Veja os Privilégios Fornecidos pelo MySQL para entender melhor o que cada privilégio permite que uma conta acesse.

Depois de entender como cada privilégio funciona de acordo com os objetos do banco de dados, etc., você pode definir a segurança da conta SQL que você criará.

Quando você diz que não quer permitir a modificação de tabelas mysql, lembre-se que você pode modificar dados dentro de uma tabela onde DELETE e UPDATE permitiriam isso. Por outro lado, a permissão DROP permitiria a exclusão de uma tabela inteira ou a permissão ALTER permitiria a modificação do esquema da tabela, das definições da coluna ou de outros objetos existentes em uma tabela.

Exemplo

Você pode usar o seguinte para conceder uma conta SELECT de acesso a todas as tabelas e EXECUTE de acesso a todos os Procedimentos armazenados em um banco de dados específico:

GRANT CREATE, SELECT, EXECUTE ON 'DatabaseName'
TO 'user'@'localhost'

Every student can create their own database. So, theoretically, deny privileges to mysql database is the only way, right? How can I do that?

Não, eu testei e confirmei que a solução abaixo funciona. Você basicamente permite que as contas student MYSQL GRANT ALL PRIVILEGES , mas apenas para bancos de dados que correspondam a um padrão de nomenclatura específico.

Isso significa que quando você faz os alunos concluírem os exercícios, você precisa garantir que instrua os DBs que eles criaram a ter um nome que corresponda a esse padrão. Isso também significa que o padrão de convenção de nomenclatura escolhido NÃO deve corresponder a um padrão como outros bancos de dados que você não deseja que eles acessem.

Mais uma vez, testei e confirmei que esta solução funciona e é uma solução bastante simples do que ficar explícita com DENY permissões, o que pode ser perigoso, pois você pode facilmente ignorar ou não testar todos os cenários possíveis e essa é a razão pela qual vocêDENY all e only GRANT o que você deseja permitir em termos de segurança.

Exemplo

GRANT ALL PRIVILEGES ON 'student\_%' .  * TO 'student'@'%';

Fonte de crédito

Agora, um usuário chamado student pode criar qualquer banco de dados na instância do MYSQL, desde que o nome seja ou comece com student_ . A barra invertida é o caractere de escape para o caractere underbar.

    
por 11.02.2017 / 08:03