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

71

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

Joe Holloway
fonte
8
A senha é texto simples em /etc/mysql/debian.cnf
Brent

Respostas:

57

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/mysqlscript 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/750363 ).

Zoredache
fonte
11
"O melhor plano é simplesmente não perdê-lo." A sério? Isso é de zero ajuda para as pessoas que já perderam-lo como eu, aparentemente, fez durante uma atualização. Para aqueles que precisam recriar o usuário, use uma das opções "GRANT ALL" nas outras respostas, porque esse usuário NÃO é usado apenas para operações de rotação de log - é uma parte crítica do processo de atualização.
FKEinternet
Se você perder as credenciais, sempre terá a opção de iniciar o daemon mysql / mariadb com a opção que ignora o sistema de permissões ou efetuar login como outro usuário com privilégios de root do mysql e redefinir a senha. A redefinição de senhas e o desvio do sistema de privilégios estão bem documentados em outros locais no Google e em outras perguntas neste site.
Zoredache
22

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 à do /etc/mysql/debian.cnf

Brent
fonte
9
Re (bom ou ruim) - Se alguém conseguir se tornar root, poderá ignorar completamente o sistema de privilégios simplesmente reiniciando o servidor com as opções corretas. Se um invasor for root, provavelmente terá problemas maiores que o arquivo de configuração.
Zoredache
2
also re: good or bad - eu tive que confiar no acesso debian-sys-maint para redefinir a senha da conta root do MySQL quando ela foi esquecida. Foi bom ter essa opção de fallback.
Brent
11
@Brent: Veja dev.mysql.com/doc/refman/5.0/en/resetting-permissions.html para saber como redefinir a senha root do mysql. Eu desabilitei esse usuário em muitas instalações mysql no Debian, pois isso pode causar estragos na inicialização ao verificar as tabelas se elas são grandes.
1957 Nathan
11
Nathan, obrigado por esse link. Essa é uma informação nova para mim. Se você possui um procedimento para desativar completamente a conta debian-sys-maint, por que não a inclui aqui como uma resposta separada. Isso seria bom!
Brent
3
uma concessão melhor seria apenas conceder os privilégios de desligamento / inicialização.
jmtd
19

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.


fonte
Isso funcionou no mysql-server-5.5 também.
usar o seguinte comando
Isso só funcionará se a instalação do servidor mysql não estiver interrompida - como poderia acontecer se o usuário debian-sys-maint estiver ausente.
FKEinternet
19

Eu queria apenas comentar, mas acho que a 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 à vontade para encontrar uma solução segura mais paranóica .

d -_- b
fonte
11
É tão paranóico quanto precisa ser. Somente um que deve poder ler o /etc/mysql/debian.cnfarquivo é o rootusuário do Linux . E quando alguém pode ler esse arquivo, ele já tem rootacesso à máquina e pode parar o servidor MySQL e adicionar um administrador de sistema próprio. E o script que inicia o MySQL e outros pacotes não pode fazer manutenção de segurança e outras. Então, sim, é o mais seguro possível. E útil se você perder a senha de administrador do MySQL para recuperá-la, sem a necessidade de reiniciá-la no modo inseguro. ;-)
Anders
É para isso que serve a edição.
RobinJ
6

Se você precisar adicionar o debian-sys-maintusuário apenas para logrotate.dpropósitos, você não deve conceder ALL PRIVILEGESou GRANT OPTION- este é um buraco gigante desnecessário na segurança. Em vez disso, você pode simplesmente adicionar o usuário com o RELOADprivilégio como este (supondo que você esteja acessando seu db como roote 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.

Mark Chackerian
fonte
Essa é a única resposta segura, pois concede apenas as permissões necessárias debian-sys-maint. Além disso, posso confirmar que funciona como um encanto. Felicidades!
Jealie
2
É realmente uma brecha na segurança? Se alguém já puder ler o /etc/mysql/debian.cnf, provavelmente terá acesso root e poderá reiniciar o mysql com --skip-grant-tables de qualquer maneira.
Mc0e
Obrigado. Mas não há necessidade de liberar as coisas duas vezes, o MySQL já sabe o que o comando GRANT faz. Consulte dev.mysql.com/doc/refman/5.6/en/privilege-changes.html
ygoe
11
E isso não funcionará, pois o debian-sys-maintusuário também é usado para desligar o servidor. E também para procurar usuários root ao iniciar o servidor mysql. Então você pelo menos precisa conceder privilégios de seleção no mysql. * E privilégios de desligamento.
Anders
11
NÃO NÃO NÃO, NÃO siga as orientações desta resposta - você precisa conceder todos os privilégios ao debian-sys-maint pelos motivos descritos na outra resposta intitulada "permissões necessárias do debian-sys-maint". Em resumo, você pode ficar bem no dia-a-dia, mas se depara com problemas graves ao aplicar uma atualização de segurança, corrigir ou atualizar seu sistema.
Kurt Fitzner
3

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 ...?

Fortega
fonte
3

permissões necessárias para 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 and 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 as verificações de integridade realizadas quando o banco de dados for 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ária para verificar tabelas com falha. 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
  • global todos os privilégios , necessários para atualizar as tabelas se / quando uma nova versão do MySQL for instalada através 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 um reparo na tabela.

AVISO 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 upgrades 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.

Kurt Fitzner
fonte
Obrigado pela resposta elaborada. Difícil de acreditar que essa pergunta tenha quase 10 anos!
Joe Holloway
Essa deve ser uma das primeiras coisas que as pessoas leem.
FKEinternet
2

Como uma observação lateral, dê uma olhada nesta postagem do mysqlperformanceblog para saber por que você pode querer desativar o material específico da debian.

Jon Topper
fonte
11
"Note que isso não deve ser um problema com o MySQL do Debian lenny, pois ele é fornecido com scripts de inicialização que não executam CHECK TABLE em tabelas que não são MYISAM." - a partir da página vinculada
d -_- b
2

Ao usar o MySQL 5.6+, eu recomendaria o uso do mysql_config_editorcomando 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.cnfpode ser alterado para que os detalhes de nome de usuário e senha não sejam armazenados no arquivo.

Finalmente, altere o arquivo logrotate para o MySQL para que ele use os detalhes de login armazenados no ~/.mylogin.cnfarquivo 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

Dave Rix
fonte
Mas, o objetivo do debian-sys-maint usuário será alcançado com isso? Que os pacotes devem ser capazes de usar esse usuário / senha para fazer alguma manutenção do sistema como rootusuário no domínio Linux (não rootusuário no MySQL sem que o administrador necessário para entrar no rootsenha para MySQL?
Anders
Ele funciona para mim nos meus testes, se você executar todas as alterações, como alterar /etc/mysql/debian.cnfpara remover as senhas e alterar o arquivo logrotate para fazer referência aos detalhes seguros. Não tenho certeza se o usuário debian-sys-maint é usado para qualquer outra coisa, mas se for, isso ajudará a dar uma indicação de onde o Debian está usando esta conta de usuário em seu nome.
Dave Rix