canalizando uma senha e segurança

11

Às vezes eu faço echo "secret" | mysql -u root -p .... Agora, concerteza sobre segurança aqui: alguém que pode listar todos os processos pode ver a senha?

Para verificar eu tentei com echo "test" | sleep 1000e o comando echo com o segredo não era visível na saída de "ps aux". Portanto, presumo que seja seguro - mas um especialista em segurança pode confirmá-lo, por favor? :)

gucki
fonte
Não é possível vê-lo em uma lista de processos ao executar um loop sem fim. Boa pergunta.
Tim
1
Além disso, não esqueça que o que você digitar na maioria dos shells será armazenado em um arquivo de histórico em algum lugar (como .history).
Alexander Ave

Respostas:

13

A resposta para isso depende de qual shell você está usando. Muitos shells possuem echoum comando interno, o que significa que ele não gera um processo separado e, portanto, não será exibido em uma lista de processos. No entanto, se você digitar /bin/echoou ./echodesabilitar os recursos internos com o enable -n echocomando, o shell não usará seu comando interno e, em vez disso, usará a versão binária. Isso será exibido em uma lista de processos.

Se você estiver usando o binário e não o shell interno, o comando echo será exibido pelo tempo necessário para mover os dados para o buffer STDIN do outro processo. Esse buffer possui um tamanho finito; portanto, se houver mais dados que caberão no buffer, o comando echo terá que permanecer por um tempo até que o outro processo possa ler alguns dados do buffer. Para a maioria dos casos (como os dois exemplos que você deu acima), esse período será de microssegundos. Se você estiver colando um dump de SQL de 20 MB no MySQL usando echo, isso poderá ser mais longo. Não importa quão curto seja o tempo, se você estiver usando o binário em vez do shell embutido e alguém acertar o tempo, eles poderão ver o processo na lista de processos.

Você pode evitar isso colocando os dados secretos em um arquivo (com permissões apropriadas) e usando o arquivo como STDIN assim:

mysql -u root -p < file_with_secret.sql
Ladadadada
fonte
5
Lembre-se de que, digitando a senha na linha de comando dessa maneira, é mais provável que seja salva no arquivo de histórico do seu shell, portanto, vale a pena verificar a permissão e o conteúdo do arquivo de histórico.
Aculich
3

Para o caso mysql, ~ / .my.cnf pode ser usado para armazenar segredos, ie

[client]
user = DBUSERNAME
password = DBPASSWORD
host = DBSERVER

[mysql]
database = DBNAME
ficando mais sábio
fonte
1

Apenas use

mysql -uroot -p

e aperte enter. A senha será solicitada e ela não será visível na lista de processos nem nos arquivos de histórico.

jdw
fonte
Os dados aceitos no STDIN pelo MySQL são os comandos a serem executados após o login. O "segredo" na pergunta não é a senha.
Ladadadada