Os argumentos do processo são visíveis para todos os usuários, mas o ambiente é visível apenas para o mesmo usuário ( pelo menos no Linux , e acho que em cada variante moderna do unix). Portanto, passar uma senha por meio de uma variável de ambiente é seguro. Se alguém pode ler suas variáveis de ambiente, elas podem executar processos como você, então já está em jogo.
O conteúdo do ambiente corre algum risco de vazamento indireto, por exemplo, se você executar ps
para investigar algo e, acidentalmente, copiar e colar o resultado, incluindo variáveis de ambiente confidenciais em um local público. Outro risco é que você passe a variável de ambiente para um programa que não precise dela (incluindo filhos do processo que precisa da senha) e que o programa expõe suas variáveis de ambiente porque não esperava que fossem confidenciais. Quão ruim esses riscos de vazamento secundário depende do que o processo com a senha faz (quanto tempo ele é executado? Ele executa subprocessos?).
É mais fácil garantir que a senha não vaze acidentalmente passando-a por um canal que não foi projetado para ser interceptado, como um cano. Isso é muito fácil de fazer no lado do envio. Por exemplo, se você tiver a senha em uma variável do shell, você pode apenas fazer
echo "$password" | theprogram
se theprogram
espera a senha em sua entrada padrão. Note que isto é seguro porque echo
é um builtin; não seria seguro com um comando externo, pois o argumento seria exposto em ps
output. Outra maneira de obter o mesmo efeito é com um documento aqui:
theprogram <<EOF
$password
EOF
Alguns programas que exigem uma senha podem ser instruídos a lê-la a partir de um descritor de arquivo específico. Você pode usar um descritor de arquivo diferente da entrada padrão se precisar de entrada padrão para outra coisa. Por exemplo, com gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Se o programa não puder ser instruído a ler de um descritor de arquivo, mas puder ser avisado para ler um arquivo, você poderá instruí-lo a ler um descritor de arquivo usando um nome de arquivo como '/ dev / fd / 3 .
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
Em ksh, bash ou zsh, você pode fazer isso de forma mais concisa através da substituição de processos.
theprogram --password-from-file=<(echo "$password")