Estou escrevendo um bash
script e preciso solicitar a senha do usuário e passá-la para openssl
. Embora openssl
possa ler a senha em si, preciso de duas execuções do programa e não quero perguntar ao usuário duas vezes. Aqui está o script:
cp file{,.old}
read -sp 'Enter password. ' PASS; echo
export PASS
# decode | edit | encode
openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \
sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file
unset PASS
Isso não é seguro, pois a senha está facilmente disponível olhando a linha de comando; alguém pode lê-lo usando ps
, por exemplo.
openssl
pode ler uma senha de uma variável de ambiente, para que eu possa substituir -k "$PASS"
por -pass env:PASS
, mas ainda não é seguro; as variáveis de ambiente de qualquer processo podem ser lidas livremente (novamente, é ps
possível).
Então, como posso passar com segurança a senha para as duas openssl
instâncias?
bash
command-line
password
openssl
Chris Down
fonte
fonte
ps
lê o ambiente de um processo/proc/<pid>/environ
, mas esse arquivo tem0600
permissões; portanto, apenas o usuário root e o usuário que está executando o processo podem ler o ambiente do processo. Eu diria que é bem seguro.Respostas:
Passe a senha em um descritor de arquivo separado da entrada (duas vezes, uma para criptografia e outra para descriptografia). Não exporte
PASS
para o meio ambiente.Se o seu sistema não possui
/dev/fd
, você pode usar o-pass
argumento para dizeropenssl
para ler a senha de um descritor de arquivo aberto.fonte
bash
versão com tambémenv:PASS
é seguro.printf '%s\n' "$PASS"
não é seguro. Alguém pode ler a linha de comando,ps
por exemplo.env:PASS
não é seguro porque a senha apareceria no ambiente doopenssl
processo (não apareceria no ambiente dobash
processo, mas isso não é suficiente). O usoprintf
é seguro porque é um bash embutido.echo $PASS | openssl ...
. Não apareceria na lista ps. O único lugar que você pode obter aprovação seria na memória do processo do bash. Eu acho que ?echo
seria seguro pelo mesmo motivo queprintf
é seguro (eprintf
não seria seguro em uma concha onde não está embutido). A razão pela qual eu usoprintf
e nãoecho
é que issoecho
pode causar barras invertidas (dependendo das opções do bash).Usando o Bash, isso pode ser feito sem o uso
printf '%s\n' "$PASS"
da associação da chamada string aqui aos descritores de arquivo, usando oexec
comando Bash builtin .Para obter mais informações, consulte: Segurança da senha do script do shell dos parâmetros da linha de comandos .
fonte
Desculpe, minha resposta anterior foi do openssl man, e não do openssl enc docs.
Essa solução não é um pipeline, mas acredito que ela evite que a senha seja visível para o ps.
Usando um documento aqui, o openssl vê apenas o texto da senha.
Contanto que você elimine o arquivo intermediário, nenhum vestígio permanece. Talvez alguém possa ajudar a fazer isso em um pipeline e eliminar o arquivo intermediário?
fonte
enc
comando não tem-kn
opção, pelo menos nas versões atuais-pass
), mas não é muito informativo. (O voto negativo não é meu.)