Аргументы процесса видны всем пользователям, но среда видна только одному и тому же пользователю ( по крайней мере, в Linux , и я думаю о каждом современном варианте Unix). Поэтому передача пароля через переменную среды безопасна. Если кто-то может читать переменные вашей среды, он может выполнять процессы как вы, так что игра уже окончена.
Содержимое среды подвержено некоторому риску косвенной утечки, например, если вы запускаете ps
что-то для исследования и случайно копируете результат, включая конфиденциальные переменные среды, в публичном месте. Другой риск заключается в том, что вы передаете переменную среды программе, которая в ней не нуждается (включая дочерние элементы процесса, которому требуется пароль), и эта программа предоставляет свои переменные среды, потому что она не ожидала, что они будут конфиденциальными. Насколько серьезны эти риски вторичной утечки, зависит от того, что делает процесс с паролем (как долго он работает? Он запускает подпроцессы?).
Проще убедиться, что пароль не будет случайно утек, передав его по каналу, который не предназначен для прослушивания, например по каналу. Это довольно легко сделать на отправляющей стороне. Например, если у вас есть пароль в переменной оболочки, вы можете просто сделать
echo "$password" | theprogram
если theprogram
ожидает пароль на его стандартный ввод. Обратите внимание, что это безопасно, потому что echo
является встроенным; это не будет безопасно с внешней командой, так как аргумент будет представлен в ps
выводе. Еще один способ добиться того же эффекта - вот документ:
theprogram <<EOF
$password
EOF
Некоторым программам, которым требуется пароль, может быть предложено прочитать его из определенного дескриптора файла. Вы можете использовать дескриптор файла, отличный от стандартного ввода, если вам нужен стандартный ввод для чего-то другого. Например, с gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Если программе нельзя сказать, чтобы она читала из файлового дескриптора, но можно было бы сказать, чтобы она читала из файла, вы можете сказать ей, чтобы она читала из файлового дескриптора, используя имя файла, например `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
В ksh, bash или zsh вы можете сделать это более кратко с помощью подстановки процессов.
theprogram --password-from-file=<(echo "$password")