Executando o mysql dump em um trabalho cron sem expor senhas

11

Eu quero correr

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

em um trabalho cron. Como posso fazer isso com segurança?

Eu sei que poderia colocar o comando ali, mas qualquer pessoa com acesso à máquina o veria imediatamente via crontab. Há uma melhor forma de fazê-lo?

slycat
fonte
1
Seu exemplo está incorreto, deve ser -pP4SSw0rd sem espaço.
Simon Woodside

Respostas:

14

Conforme indicado em man mysqldump: ver 6.1.2.1. Diretrizes do usuário final para segurança de senha no manual de referência do MySQL.

Um arquivo de opções é a aposta mais segura, de acordo com a referência acima. Entregá-lo em texto sem formatação no crontab não é bom, já que a linha de comando do processo, por padrão, é visível pspara outros usuários. O mesmo se aplica às variáveis ​​de ambiente, conforme explicado na referência.

Parte relevante do manual de referência do MySQL:

Armazene sua senha em um arquivo de opções. Por exemplo, no Unix, você pode listar sua senha na [client]seção do .my.cnfarquivo em seu diretório pessoal:

[client]
password=your_pass

Para manter a senha segura, o arquivo não deve estar acessível para ninguém além de você. Para garantir isso, defina o modo de acesso ao arquivo como 400ou 600. Por exemplo:

shell> chmod 600 .my.cnf

Para nomear na linha de comando um arquivo de opções específico contendo a senha, use a --defaults-file=file_nameopção onde file_nameestá o nome completo do caminho para o arquivo. Por exemplo:

shell> mysql --defaults-file=/home/francis/mysql-opts

A Seção 4.2.3.3, “Usando arquivos de opções” , discute os arquivos de opções em mais detalhes.

Consulte também /programming//q/10725209 .

Daniel Andersson
fonte
Parece que o comando ps ofusca a senha com um x: ps: mysqldump -uroot -px xx mydb. Não estou dizendo que é uma boa proteção (se você digitar trabalhos, a senha será revelada em texto sem formatação).
ling
4

Execute o cronjob como um usuário específico e use alguma lógica simples do Bash para extrair a senha de um arquivo de texto sem formatação armazenado em algum lugar do sistema com permissões que permitem apenas que o usuário (ou talvez o grupo) acesse.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Portanto, se o cronjob for executado como usuário 'exemplo', a propriedade do arquivo deverá ser "exemplo: exemplo" e com permissão 0400.

Você também pode obter uma função semelhante usando um .my.cnf no nível do usuário .

Garrett
fonte
1
read PASS < /path/to/pwdfileé um idioma mais limpo para fazer a mesma coisa (sem dúvida, eu acho; aplica-se superuser.com/q/323060/49184 ).
22812 Daniel Andersson
* "é uma maneira idioma mais limpa" ... Perdida na edição.
22812 Daniel Andersson
Alguém com o conhecimento mais básico do Bash deve ser capaz de ver o que está acontecendo com esse gato. :)
Garrett
1
É verdade que eu diria que é a maneira mais comum de fazer isso, mas ainda é um pouco desagradável :-). Se alguém criar um hábito para o UUOC que ele morderá quando o arquivo for maior do que ARGMAXisso, será necessário um processo extra, em vez de usar um shell interno , pode tentar construções como for i in `cat file`; do ...com sua própria variedade de problemas etc. Mas, claro, como com a maioria das coisas: se alguém sabe o que está acontecendo, é livre para fazer o que quiser. Eu não estou em uma cruzada aqui, independentemente de como possa parecer :-D.
Daniel Andersson
0

Qualquer pessoa com acesso à máquina tem o mesmo nível de acesso /var/spool/cron/crontabs/que /var/lib/mysqlvocê permite. Portanto, defina as permissões apropriadas nos diretórios e pronto. Qualquer pessoa com acesso root tem acesso direto aos arquivos do banco de dados diretamente. Qualquer pessoa em quem você não confie para ter acesso à máquina não deve ter acesso à máquina.

Normalmente, as pessoas só veem seus próprios cronjobs via crontab -l.

akira
fonte
0

Para fins de backup, considere ter um usuário somente leitura no mysql, assim

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

O mysqldump requer apenas SELECTe LOCK TABLESprivilégios para fazer seu trabalho.

Saptarshi Biswas
fonte