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.


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.


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.


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.