it-swarm-pt.tech

O que é o usuário do MySQL debian-sys-maint (e mais)?

Fui mordido várias vezes pelo usuário 'debian-sys-maint' que é instalado por padrão nos pacotes mysql-server instalados nos repositórios do Ubuntu.

Geralmente o que acontece é que eu puxo uma cópia nova do nosso banco de dados de produção (que não está sendo executado no Debian/Ubuntu) para solucionar problemas ou novo desenvolvimento e esqueço de excluir a tabela mysql.user, perdendo o usuário debian-sys-maint.

Se adicionarmos novos usuários mysql por qualquer motivo, eu tenho que 'mesclá-los' no meu ambiente de desenvolvimento, em vez de apenas sobrepor a tabela.

Sem o usuário, meu sistema ainda parece funcional, mas atormentado por erros como:

Sudo /etc/init.d/mysql restart
Stopping MySQL database server: mysqld...failed.
error: 'Access denied for user 'debian-sys-maint'@'localhost' (using password: YES)'
  • Para que é utilizado o debian-sys-maint?
    • Existe uma maneira melhor para os mantenedores de pacotes fazerem o que estão tentando fazer?
  • Qual é a maneira mais fácil de restaurá-lo depois que eu o perdi?
  • Qual é o conjunto correto/mínimo de privilégios para esse usuário?
    • Parece uma má idéia "conceder todos os privilégios em *. * ..."

Editar

Pergunta adicional - A senha em /etc/mysql/debian.cnf já está com hash ou é a senha em texto sem formatação? É importante quando você recriar o usuário e eu nunca pareço acertar na primeira tentativa.

Obrigado

69
Joe Holloway

Para que é utilizado o debian-sys-maint?

Uma coisa importante para a qual é usado é dizer ao servidor para rolar os logs. Ele precisa de pelo menos o privilégio de recarregar e desligar.

Veja o arquivo /etc/logrotate.d/mysql-server

É usado pelo /etc/init.d/mysql script para obter o status do servidor. É usado para desligar/recarregar normalmente o servidor.

Aqui está a citação do README.Debian

* MYSQL WON'T START OR STOP?:
=============================
You may never ever delete the special mysql user "debian-sys-maint". This user
together with the credentials in /etc/mysql/debian.cnf are used by the init
scripts to stop the server as they would require knowledge of the mysql root
users password else.

Qual é a maneira mais fácil de restaurá-lo depois que eu o perdi?

O melhor plano é simplesmente não perdê-lo. Se você realmente perder a senha, redefina-a usando outra conta. Se você perdeu todos os privilégios de administrador no servidor mysql, siga os guias para redefinir a senha root e repare o debian-sys-maint.

Você pode usar um comando como este para criar um arquivo SQL que você pode usar posteriormente para recriar a conta.

mysqldump --complete-insert --extended-insert=0 -u root -p mysql | grep 'debian-sys-maint' > debian_user.sql

A senha no /etc/mysql/debian.cnf já está com hash

A senha não é hash/criptografada quando instalada, mas as novas versões do mysql agora têm uma maneira de criptografar as credenciais (consulte: https://serverfault.com/a/75036 ).

58
Zoredache

O usuário debian-sys-maint é por padrão um equivalente raiz. É usado por certos scripts de manutenção nos sistemas Debian e, como efeito colateral, permite que os usuários com acesso root na caixa visualizem a senha de texto sem formatação em /etc/mysql/debian.cnf (bom ou ruim?)

Você pode recriar o usuário:

GRANT ALL PRIVILEGES on *.* TO `debian-sys-maint`@`localhost` IDENTIFIED BY 'your password' WITH GRANT OPTION;

Apenas verifique se a senha corresponde aquela em /etc/mysql/debian.cnf

22
Brent

Eu queria apenas comentar, mas acho que sintaxe correta merece sua própria entrada. Isso criará o usuário debian-sys-maint :

mysql> GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'plaintextpassword' WITH GRANT OPTION; FLUSH PRIVILEGES;

Se você ainda possui o arquivo /etc/mysql/debian.cnf, use a senha existente.

Sinta-se livre para criar uma paranóico solução segura.

19
d-_-b

Você também pode:

Sudo dpkg-reconfigure mysql-server-5.0

O que lhe dará a opção de recriar o usuário debian-sys-maint. Usuários e bancos de dados existentes são seguros.

19
Spoom

Se você precisar adicionar o debian-sys-maint usuário apenas para logrotate.d fins, você deve não conceder ALL PRIVILEGES ou o GRANT OPTION - este é um buraco gigante desnecessário na segurança. Em vez disso, você pode simplesmente adicionar o usuário com o privilégio RELOAD como este (supondo que você esteja acessando seu db como root e substitua xxxxxx por sua senha)

# add the user with the reload right
GRANT RELOAD on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'xxxxxx'; 

# reload the rights
FLUSH PRIVILEGES;

# double check
select * from mysql.user;

Atualização de 2019

Esta resposta pode estar desatualizada - consulte os comentários fortemente opinativos abaixo.

6
Mark Chackerian

permissões necessárias debian-sys-maint

Outras respostas abordaram suficientemente tudo, exceto o conjunto mínimo de permissões necessárias para o usuário debian-sys-maint. Muitas das respostas aqui estão simplesmente erradas a esse respeito e, de fato, perigosas. Não reduza os privilégios debian-sys-maint (incluindo a opção de concessão) sem ler e entender abaixo:

O mantenedor do Debian não deu todos os privilégios ao usuário caprichosamente. Aqui está o que é necessário, onde e por quê. Alguns desses privilégios são superconjuntos de outros, mas os listarei de forma independente, caso você queira personalizar as coisas e remover o requisito:

  • shutdown e reload, necessário sem surpresa, para encerrar ou fazer um banco de dados, feito por /etc/init.d/mysql
  • selecione mysql.user, necessário para verificações de integridade realizadas quando o banco de dados é iniciado, garantindo que haja um usuário root. Conclua cada inicialização por/etc/mysql/debian-start (chamada por /etc/init.d/mysql) com o código real na função check_root_accounts no arquivo /usr/share/mysql/debian-start.inc.sh
  • selecione em information_schema.tables, seleção global, necessário para verificar tabelas travadas. Conclua cada inicialização por/etc/mysql/debian-start (chamada por /etc/init.d/mysql) com o código real na função check_for_crashed_tables no arquivo /usr/share/mysql/debian-start.inc.sh
  • todos os privilégios globais, necessário para atualizar tabelas se/quando uma nova versão do MySQL for instalada por meio de uma atualização ou atualização do Debian. Conclua cada inicialização por/etc/mysql/debian-start (chamada por /etc/init.d/mysql) com o código real na função upgrade_system_tables_if_necessary no arquivo /usr/share/mysql/debian-start.inc.sh - realmente chama o binário MySQL mysql_upgrade - não se deixe enganar pelo nome da função (upgrade_system_tables_if_necessary), isso pode potencialmente tocar em todas as tabelas - veja abaixo

O último é, obviamente, o principal requisito para privilégios. A página de manual do mysql_upgrade declara que:

o mysql_upgrade examina todas as tabelas em todos os bancos de dados em busca de incompatibilidades com a versão atual do MySQL Server. O mysql_upgrade também atualiza as tabelas do sistema para que você possa tirar proveito dos novos privilégios ou recursos que possam ter sido adicionados.

Se o mysql_upgrade descobrir que uma tabela possui uma possível incompatibilidade, ele executa uma verificação e, se forem encontrados problemas, tenta reparar a tabela.

WARNING Se você decidir reduzir os privilégios que o debian-sys-maint possui, certifique-se de estar preparado para lidar manualmente com quaisquer futuras atualizações de segurança debian e/ou atualizações que tocam no MySQL. Se você executar uma atualização nos pacotes MySQL com um privilégio debian-sys-maint reduzido, e se o mysql_upgrade não puder ser concluído como resultado, ele poderá deixar seu banco de dados em um estado indefinido (lido com defeito). A redução de privilégios pode não ter problemas aparentes no dia-a-dia até que uma atualização apareça; portanto, não preste atenção ao fato de você já ter reduzido privilégios sem efeitos nocivos como base para pensar que é seguro.

3
Kurt Fitzner

Ao invés de

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY PASSWORD('your password') WITH GRANT OPTION; FLUSH PRIVILEGES;

Eu acho que

GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'your password' WITH GRANT OPTION; FLUSH PRIVILEGES;

porque a senha não é hash ...?

3
Sean

Ao usar o MySQL 5.6+, eu recomendaria usar o mysql_config_editor comando para criar uma entrada para o usuário 'debian-sys-maint'@'localhost' usando a senha relevante, o que significa que a senha não precisa ser armazenada em texto sem formatação no servidor.

mysql_config_editor set --login-path=debian-sys-maint --Host=localhost --user=debian-sys-maint --password

Depois disso, o arquivo de configuração específico do debian /etc/mysql/debian.cnf pode ser alterado para que os detalhes de nome de usuário e senha não sejam armazenados no arquivo.

Por fim, altere o arquivo logrotate para o MySQL para que ele use os detalhes de login armazenados em ~/.mylogin.cnf em vez do arquivo específico do debian substituindo

/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf

com

/usr/bin/mysqladmin --login-path=debian-sys-maint

Espero que isto ajude :)

Dave

2
Dave Rix

Como uma observação lateral, dê uma olhada em este post no mysqlperformanceblog por razões pelas quais você pode querer desativar o material específico do debian.

2
Jon Topper