Qual é uma alternativa segura ao uso de uma senha do MySQL na linha de comando?

35

Temos um script de linha de comando PHP para a versão de um banco de dados. Executamos esse script sempre que um desenvolvedor adiciona um novo patch de banco de dados.

O script executa o patch com a linha de comando do MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

No entanto, o MySQL 5.6 agora emite o seguinte aviso:

Aviso: o uso de uma senha na interface da linha de comandos pode ser inseguro

O que é obviamente verdade, mas pode ou não ser um problema para o usuário.

  • Qual é a alternativa segura, então?
  • Como alternativa, é possível desativar esse aviso?

Observe que eu não quero depender de um arquivo de senha externa.

Benjamin
fonte
2
Ter suas credenciais em um arquivo não é um grande problema. Se uma pessoa tem privilégios de root no seu servidor, ela pode ignorar completamente o sistema de autenticação, apenas reiniciando o servidor mysql com uma opção específica.
Zoredache
Esse não é o mesmo problema da duplicata sugerida . O MySQL não está solicitando uma senha, estou fornecendo e está funcionando bem. Estou procurando alternativas para fornecer a senha, excluindo um arquivo de senha.
Benjamin

Respostas:

17

Na versão GA recente do MySQL, ou seja, versão 5.6 , você pode fazer isso através do comando mysql_config_editor, conforme descrito em http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html

Basicamente, o que ele faz é: criptografar suas credenciais de usuário / senha com um alias de host e, em seguida, você usa o alias de host, coloca essas informações em um arquivo de configuração no diretório inicial e, quando necessário, em vez de fazer algo como :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

você escreve:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

evitando assim colocar sua senha em algum script em texto não criptografado.

Para que isso funcione, você deve primeiro (apenas uma vez) definir myhostaliascomo:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

Você pode usar diferentes caminhos de login para diferentes contas e / ou hosts, conforme desejar. Boa ideia se você me perguntar.

Como uma nota, acredito, essa funcionalidade NÃO existe em nenhuma versão abaixo da versão 5.6.

Tuncay Göncüoğlu
fonte
note: Eu percebo que o mysql_config_editor realmente cria um arquivo de senha externa, no entanto, isso não é feito por você, é como o sistema funciona, portanto não há en / de / crypting manual a ser feito por você.
Tuncay Göncüoğlu
Obrigado, estou usando o MySQL 5.6, então isso não é um problema. Dito isso, sua abordagem ainda é problemática (pelo menos com a forma como trabalhamos atualmente), porque quero pegar a senha de um arquivo de configuração do PHP em tempo real e passá-la dinamicamente para a linha de comando. Com o que você sugere, eu ainda precisaria usar a senha na linha de comando ao ligar mysql_config_editor, para que infelizmente não traga muito mais valor. Também estou tentando evitar que o desenvolvedor o faça manualmente, mantendo assim o arquivo de configuração do PHP e a configuração do mysql.
Benjamin
Minha melhor solução é provavelmente ignorar os avisos por enquanto. Na verdade, estou me perguntando se há algum problema de segurança: como é chamado do PHP, acho que a linha de comando não está armazenada no histórico do bash ou em qualquer outro lugar na máquina?
Benjamin
não que eu saiba, não, o bash history não o armazena. no entanto, a senha que está em texto sem formatação no arquivo de configuração php acarreta exatamente o mesmo risco, apenas em outra forma. talvez você prefira armazenar a senha usando mysql_config_editor e armazenar o caminho de login no seu arquivo de configuração php? Dessa forma, você não expõe sua senha em nenhum lugar. (mas ainda precisará manter a senha externa).
Tuncay Göncüoğlu
9

Use a opção --defaults-fileou --defaults-extra-file. Você pode especificar o ID do usuário e a senha. Tem o mesmo formato que /etc/my.cnf.

Lendo mais, você diz que não deseja confiar em um arquivo de senha externo, mas essa é a única maneira realmente segura. Qualquer outra coisa deixará rastros na tabela de processos ou algo assim. Você pode até colocar o arquivo de senha no controle de versão, se realmente quiser. Torne 600 (ou 400) e legível apenas pelo mysql ou pelo usuário sob o qual ele está sendo executado.

lsd
fonte
1
Eu não sou contra o arquivo de senhas por motivos de segurança, apenas as credenciais do MySQL fazem parte de uma configuração global no aplicativo PHP (usado também para a conexão PDO), e isso significaria criar um arquivo de senha (temporário) apenas para executar a linha de comando mysql durante a vida útil do script (alguns segundos).
Benjamin
Como fazer isso no Windows Server 2012? Onde está o arquivo de configuração que contém a opção --defaults-file?
21413 Jake
Você acabou de especificar o arquivo como uma opção para --defaults-file como em:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@Benjamin, Então, se é não sobre a segurança, em seguida, basta digitar a senha na linha de comando. O que há de errado em fazer isso (além da segurança)?
Pacerier 15/01/15
@ Benjamin, se você já usa o MySQL a partir do PHP, por que está entrando no mysqlcliente do console?
Josip Rodin
5

Você tem 4 opções por http://dev.mysql.com/doc/refman/5.1/en/password-security-user.html

  • Use uma opção -pyour_passou --password=your_passna linha de comando
  • Use a opção -pou --passwordna linha de comandos sem nenhum valor de senha especificado. Nesse caso, o programa cliente solicita a senha interativamente:
  • Armazene sua senha em um arquivo de opções.
  • Armazene sua senha na MYSQL_PWDvariável de ambiente

Para suas necessidades, MYSQL_PWDpode ser uma opção, mas não é mais segura. Realmente, você deve gerar um processo interativo --passworde enviar a senha interativamente, mas essa é uma solução bastante complexa para esse problema.

RS
fonte
1
Como o MYSQL_PWD seria menos seguro que a linha de comando? O PW nunca aparece na lista de processos, o que parece ser a principal preocupação
TheLQ
1
Claro que sim. man pstem -E Display the environment as well. a partir do URL que eu ligado: Este método de especificar sua senha MySQL deve ser considerado extremamente inseguro e não deve ser utilizado. Algumas versões do ps incluem uma opção para exibir o ambiente dos processos em execução. Em alguns sistemas, se você definir MYSQL_PWD, sua senha será exposta a qualquer outro usuário que execute ps. Mesmo em sistemas sem essa versão do ps, não é aconselhável supor que não haja outros métodos pelos quais os usuários possam examinar os ambientes de processo.
RS
Pegando nesta opção MYSQL_PWD: Eu acho que se você definir a variável de ambiente no início de algum script, invocar a linha de comando do MySQL e limpar que, posteriormente, no final do script, você poderá reduzir no mínimo o tempo de exposição . Isso soa razoável?
superjos 20/05
@kormoc, Por favor, elabore o último parágrafo. Qual é a solução bastante complexa de que você estava falando?
Pacerier 15/01
1
Parece que o uso da variável de ambiente é mais seguro que a linha de comando. Em um sistema debian padrão, você pode fazer pse ver o argumento da linha de comando para cada processo de cada usuário. Mas ps eapenas exibe o ambiente para seus próprios processos (a menos que você seja root, é claro). É apenas um pouco mais seguro, mas ainda é mais seguro.
jlh
4

Se o seu script PHP já possui uma conexão de banco de dados aberta, por que você não usa apenas mysqli_multi_query()para importar o arquivo .sql? Se a sintaxe do arquivo .sql for válida, é claro ...

Michael Hampton
fonte
Não tenho certeza de como isso funcionaria com arquivos .sql muito grandes.
7373 Benjamin
1
@ Benjamin Imagino que não seja pior do que o cliente MySQL faria - se você está realmente preocupado com segurança, embora essa seja a maneira menos hackeana de fazer isso, e tamanho é um problema que você pode resolver de várias maneiras.
precisa saber é o seguinte
Você sabe se é possível com a DOP?
7303 Benjamin
O PDO não parece ter uma função equivalente para lançar várias consultas no banco de dados de uma só vez. Desculpe. Era uma idéia ...
Michael Hampton