Я пишу bash
скрипт, и мне нужно спросить у пользователя его пароль и передать его openssl
. Хотя openssl
сам пароль могу прочитать, мне нужно два прогона программы, и я не хочу спрашивать пользователя дважды. Вот сценарий:
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
Это небезопасно, так как пароль легко получить, посмотрев на командную строку; кто-то может прочитать это ps
, например.
openssl
может прочитать пароль из переменной окружения, так что я могу заменить -k "$PASS"
с -pass env:PASS
, но это по - прежнему не безопасно; переменные окружения любого процесса могут быть прочитаны свободно (опять же, это ps
можно сделать).
Итак, как я могу безопасно передать пароль для двух openssl
экземпляров?
bash
command-line
password
openssl
Крис Даун
источник
источник
ps
читает среду процесса/proc/<pid>/environ
, но у этого файла есть0600
разрешения, поэтому только пользователь root и пользователь, выполняющий процесс, могут читать среду процесса. Я бы сказал, что это довольно безопасно.Ответы:
Передайте пароль в отдельном файловом дескрипторе от входа (дважды, один раз для шифрования и один раз для дешифрования). Не экспортировать
PASS
в окружающую среду.Если ваша система не имеет
/dev/fd
, вы можете использовать-pass
аргумент, чтобы сказать,openssl
чтобы прочитать фразу-пароль из дескриптора открытого файла.источник
bash
версии сenv:PASS
тоже безопасно.printf '%s\n' "$PASS"
не безопасно Кто-нибудь может прочитать командную строку,ps
например.env:PASS
не является безопасным, потому что пароль появится в средеopenssl
процесса (он не появится в средеbash
процесса, но этого недостаточно). Использованиеprintf
безопасно, поскольку оно встроено в bash.echo $PASS | openssl ...
, Это не будет отображаться в списке PS. Единственное место, которое вы можете получить - это память процесса bash. Я думаю ?echo
было бы безопасно по той же причинеprintf
безопасно (иprintf
не было бы безопасно в оболочке, где она не встроена). Причина, по которой я пользуюсь,printf
а не нет,echo
заключается в том, чтоecho
может искажать обратную косую черту (в зависимости от параметров bash).Используя Bash, это можно сделать без использования
printf '%s\n' "$PASS"
, связав так называемую здесь строку с файловыми дескрипторами, используя встроеннуюexec
команду Bash .Для получения дополнительной информации см .: Защита паролем сценария командной строки параметров командной строки .
источник
Извините, мой предыдущий ответ был от openssl man, а не от openssl enc docs.
Это решение не является конвейером, но я считаю, что это решение предотвращает видимость пароля для PS.
Используя здесь документ, только openssl видит текст пароля.
Пока вы уверены, что удалите промежуточный файл, никаких следов не останется. Может быть, кто-то может помочь сделать это в конвейере и устранить промежуточный файл?
источник
enc
команда не имеет-kn
переключателя, по крайней мере, в текущих версиях-pass
), но не очень информативно. (Понижение не мое.)