Безопасная передача пароля в openssl через стандартный ввод - PullRequest
15 голосов
/ 12 июня 2011

Мы знаем, что можем зашифровать файл с помощью openssl с помощью этой команды:

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass stdin

Пароль будет считан со стандартного ввода. Таким образом, чтобы предоставить пароль заранее, все, что нам нужно сделать, это prepend

echo "someGoodPassword" |

к вышеуказанной команде. Мой вопрос: как я могу сделать это более безопасно? Вышеуказанный метод не выглядит достаточно безопасным.

Буду признателен за некоторые комментарии по этому поводу, чтобы лучше понять эту проблему.

Ответы [ 5 ]

17 голосов
/ 12 июня 2011

Практически любой механизм, который вы используете, будет отслеживаться пользователем root, так что имейте это в виду.

Опция echo будет отображаться в списках 'ps', делая ее уязвимой для обычных пользователей, отслеживающих и отслеживающихпоиск пароля.

Вы можете использовать -pass file:filename для использования файла, поэтому вы можете использовать:

sumask=$(umask)
umask 077
rm -f passfile
cat >passfile <<EOM
someGoodPassword
EOM
umask $sumask

это создает файл, нечитаемый другими учетными записями (но все еще читаемый root).Предполагается, что сценарий используется один раз только для создания пароля, так как если вы повторяете процесс, он, как правило, находится в файле, и поэтому вам нужно chmod go-rwx файл, чтобы сделать его нечитаемым для других пользователей.

затем вы используете:

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass file:passfile

для выполнения шифрования с использованием предварительно созданного файла паролей.

Другие механизмы -pass env:ENVVAR для использования переменной среды (снова получаяэто там, не раскрывая это хитрость)

15 голосов
/ 18 июня 2013

Короткая версия

Использовать именованную трубу.

openssl aes-256-cbc -a -salt -in twitterpost.txt -out foo.enc -pass file:<( echo -n "someGoodPassword" )

Длинная версия

Использовать именованный канал. Вы можете создать его в bash с помощью

<( *output* )

, например

<( echo -n "content" ) # without -n echo will add a newline

Он откроет именованный канал, обычно очередь FIFO, и вы увидите в списке процессов что-то вроде

/dev/fd/63

Он будет доступен для чтения только текущему пользователю и будет автоматически закрыт после прочтения, так что вам не нужно беспокоиться о разрешениях и очистке диска (канал закроется в случае сбоя программы, пока файл, созданный вами, как указано в другом ответе, останется на диске).

Таким образом, он закроется самым быстрым способом, сразу после того, как команда прочитает его, и не дожидаясь, пока он завершит свою задачу (я только что сделал тест: зашифровал несколько гигабайт и попытался прочитать именованный канал (это видно в список процессов): именованный канал закрывается мгновенно, даже если для шифрования openssl требуется много времени).

О ваших комментариях

Если компьютер был взломан вторым приложением для получения этого пароль, то у пользователя есть серьезные проблемы с безопасностью около. На самом деле, это может быть какое-то программное обеспечение, специально предназначенное для атаковать мое собственное программное обеспечение

Если ваш компьютер был взломан и у злоумышленника есть те же права пользователя, то все готово. Например, злоумышленник может легко изменить ваш .bashrc на псевдоним openssl, чтобы он запустил гипотетический «evil-openssl», который копирует ваш пароль и данные, прежде чем обрабатывать все в реальном openssl, оставляя вам ложное чувство безопасности.

Тем не менее, я не эксперт по безопасности, поэтому, если кто-то захочет превратить меня в забвение (и скажите мне, почему), добро пожаловать.

3 голосов
/ 05 августа 2017

Если я правильно понимаю, ваш концерт о

$ echo "someGoodPassword" | openssl (...) -pass stdin

состоит в том, что пароль будет отображаться в списке процессов всем пользователям в течение некоторого короткого промежутка времени.Это можно легко обойти с помощью перенаправления bash <<< (однако не будет работать в простой старой оболочке POSIX):

$ openssl (...) -pass stdin <<<"someGoodPassword"

Эта конструкция поддерживает интерполяцию переменных (<<<"$password"), и вывод команды может бытьпередается дальше или перенаправляется в файл как обычно.

1 голос
/ 06 ноября 2018

Вы можете использовать несколько способов для прохода через пароль: https://www.openssl.org/docs/man1.0.2/apps/openssl.html#PASS-PHRASE-ARGUMENTS

Как сказал @Petesh, root может читать все!

Поэтому, если вы запишите парольв любой общий (!) файл, например

  • , во временный файл с любым безопасным разрешением
  • или в сценарий, что делает ваш echo трюк в трубу

пользователь root может найти это!

Не предпочитайте использовать все, что доступно через /proc (например, ps)

Итак,не используйте ...

openssl aes-256-cbc ... -passin 'pass:someGoodPassword'

или

PASSWORD='someGoodPassword'
openssl aes-256-cbc ... -passin 'env:PASSWORD'`

Лучшее решение

  • Избегайте хранения паролей в виде простого текста в вашей системе (например, используйте парольменеджер)
  • Передача через пароли к openssl через pipe / fifo:

    password_manager get_password | openssl aes-256-cbc ... -passin 'stdin'
    

    или

    # https://stackoverflow.com/a/7082184/1108919
    password_manager get_password >&3
    openssl aes-256-cbc ... -passin 'fd:3'
    

    или

    openssl aes-256-cbc ... -passin "file:<(password_manager get_password)"
    
1 голос
/ 12 июня 2011

Поместите пароль в bash или другой файл скрипта и сделайте для него 600 разрешений. Это позволит только вам просматривать файл, и пароль нигде не будет раскрыт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...