MySQL cria privilégios de usuário e banco de dados

1

Eu estou tentando escrever um script de shell simples para criar um novo usuário mysql e banco de dados para este usuário. Desde que eu não quero fazer uso de conta root mysql, eu criei um novo usuário (vamos chamá-lo de 'criador'). Eu dei a ele INSERT, SELECT, UPDATE, CREATE, CREATE USER, GRANT privileges, mas não posso conceder acesso para criar um banco de dados para o novo usuário.

O script é parecido com isto:

myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb

mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON * . * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";

Eu recebo ERROR 1044 (42000) at line 1: Access denied for user 'creator'@'localhost' to database 'newdb' . Quando eu faço login como 'criador', recebo os mesmos erros, que são estranhos, já que 'criador' tem privilégio GRANT. Então, qual privilégio falta "criador"? Eu quero que ele tenha o menor privilégio possível.

    
por psztucz 16.11.2010 / 11:18

2 respostas

1

O problema aqui é muito simples. Veja a ordem das coisas:

mysql -u$myuser -p$mypass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$myuser -p$mypass -rs -e "GRANT USAGE ON *. * TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$myuser -p$mypass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$myuser -p$mypass -rs -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";
mysql -u$myuser -p$mypass -rs -e "FLUSH PRIVILEGES ;";

As primeiras três (3) linhas não podem ser realizadas por $myuser porque. Um superusuário (como root@localhost ) deve executar as primeiras três linhas.

Aqui está algo adicional: somente root@localhost pode executar FLUSH PRIVILEGES; . No entanto, isso nem é necessário porque o comando GRANT executa internamente FLUSH PRIVILEGES; .

Com isso em mente, é assim que você pode criar novos usuários com seu próprio banco de dados:

rootuser=root
rootpass=rootpassword
myuser=creator
mypass=xxxx
dbuser=newuser
dbname=newdb

mysql -u$rootuser -p$rootpass -rs -e "CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass';";
mysql -u$rootuser -p$rootpass -rs -e "GRANT USAGE ON *.* TO '$dbuser'@'localhost' IDENTIFIED BY '$dbpass' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;";
mysql -u$rootuser -p$rootpass -rs -e "CREATE DATABASE IF NOT EXISTS $dbname ;";
mysql -u$rootuser -p$rootpass -e "GRANT ALL PRIVILEGES ON $dbname . * TO '$dbuser'@'localhost';";

Se você não quiser realmente usar o usuário root@localhost , crie o usuário da seguinte maneira:

Passo 01) Como root@localhost , faça o login no mysql e execute

SELECT PASSWORD('creatorpassword');

Isso retornará uma string parecida com um MD5 de 41 caracteres.

Passo 02) Como root@localhost , faça o login no mysql e execute

SET SQL_LOG_BIN=0;
GRANT ALL PRIVILEGES ON *.* to creator@localhost IDENTIFIED BY PASSWORD '41-character MD5-like string';

Isso cria o usuário e define sua senha. A primeira linha SET SQL_LOG_BIN=0 simplesmente impede que o comando seja gravado nos logs binários se você tiver o log binário ativado.

Passo 03) Remova os comandos do histórico de auditoria do mysql.

Toda vez que você logar no mysql, os comandos são registrados em um arquivo chamado .mysql_history . Execute ths

cd
vi .mysql_history

Quando você entrar em vi , execute /SELECT PASSWORD , pressione enter. Isto irá colocá-lo na linha onde o comando para imprimir a função PASSWORD do texto foi feito. Simplesmente pressione dd e ZZ e está pronto.

Indo adiante, você pode criar o criador @ localhost com os mesmos direitos que root @ localhost e ocultou bem a senha. Você só precisa manter sua integridade.

    
por 21.01.2013 / 05:55
0

No momento, com base nos comentários abaixo, acho que o problema é que o usuário creator não tem as permissões que está tentando conceder à conta newuser .

De acordo com a documentação ,

You cannot grant another user a privilege which you yourself do not have

Então, eu entendo seu desejo de ter a conta creator com o menor número de privilégios possível, mas não é assim que funciona o modelo de privilégio do MySQL; para GRANT ALL em newdb. * para newuser, o criador também precisará de ALL em newdb. *, assim como o privilégio GRANT.

    
por 16.11.2010 / 11:36