Alimentando com segurança um programa com uma senha

7

Depois de entender o problema de usar uma senha na linha de comando , eu preciso encontrar uma maneira de alimentar um programa com uma senha sem que seja um problema (sem a senha sendo gravada em algum lugar).

Eu tenho um script bash que instala automaticamente um servidor LAMP inteiro a partir da fonte: Apache, FastCGI, PHP & MySQL Estas instalações requerem uma senha, especialmente o MySQL.

Como posso tornar o script totalmente automatizado sem revelar a senha?

Editar (9 de junho, 3h55 UTC):
Estou invocando o mysql com uma senha na linha de comando, via root:

root@dor-desktop:/home/dor# PASS='cat /home/dor/tmpf/pass'
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(PASS="p4ssw0rd" no nosso caso)
E eu executo ps aux | grep mysql via meu usuário regular (dor), que não mostra a senha !
(Some of) ps output é:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

Como isso é possível?

    
por Dor 09.06.2013 / 04:22

3 respostas

10

Em relação à sua atualização:

Quando um processo é iniciado, ele possui uma área dedicada de memória onde os argumentos são armazenados e um int que informa quantos argumentos foram passados.

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

O MySQL verifica se a senha foi passada na linha de comando por -p , e se foi copiada para uma nova variável que não é visível, então sobrescreva aquela região da memória com x 'es.

Em termos simples, por exemplo:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

Você pode encontrá-lo, por exemplo em client/mysqladmin.cc do código-fonte:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

Quando ps é executado, ele lê a região de memória dos argumentos, ( argv[N] ) e, portanto, é xxxx .

Por muito pouco tempo, a senha é visível, mas apenas por alguns ciclos de CPU.

Você pode atualizar a senha do MySQL usando a opção --init-file e o procedimento especiais. C.5.4.1.2. Redefinindo a senha do root: Sistemas Unix

mysqld_safe --init-file=/home/me/mysql-init &

Editar:

Como @Gilles , você pode echo , printf ou use o documento here de um script.

Você também pode adicionar isto a .my.cnf do seu diretório pessoal ou em um arquivo ( temporário ) e usar o --defaults-extra-file . (Acredite que você tem que adicionar essa opção no início da linha de comando.) opcionalmente, também inclui o usuário. Observe também o extra no nome da opção, a menos que você queira usar somente esse arquivo como configuração:

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

Opcionalmente, o agrupamento [client] faz com que mysqld ignore a configuração.

Também é possível usar a variável de ambiente MYSQL_PWD , mas isso deve nunca seja usado como você pode listar o ambiente, em muitas ps implementações por ps -e , no arquivo /proc/<PID>/environ no Linux etc.

tr '
MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar
' '\n' < /proc/<PID>/environ

Mais sobre o tema aqui .

Você também pode querer dar uma olhada no Utilitário de configuração do MySQL que permite armazenar a senha em um arquivo criptografado em seu diretório inicial - .mylogin.cnf .

    
por 09.06.2013 / 05:44
4

A solução típica é ler a senha de um arquivo ou da entrada padrão (ou de outro descritor de arquivo que deveria ser passado como um parâmetro).

    
por 09.06.2013 / 04:32
3

Alguns programas (linha de comando ftp , por exemplo) leem senhas de /dev/tty , o arquivo especial por processo que representa o processo que controla o TTY. Isso permite que o programa não retorne a senha para a tela e tenha um pouco mais de segurança sobre a origem da senha.

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

echo $PASSWORD
    
por 09.06.2013 / 16:03