Intereting Posts
Повторное использование сеанса ssh для повторяющихся команд rsync Поиск большого количества расширений с помощью find Недавно установленный CentOS 6 показывает квадраты вместо букв Кто командует: что такое S на slackware? добавить имя файла в текст в углу файла изображения Может кто-нибудь объяснить некоторые из этих кодов эвакуации? Почему переменная замещения bash с расширенным расширением, действующая на уровне байта? Как настроить SELinux для разрешения исходящих подключений из сценария CGI? Извлечение IP из IP.port Смутно с awk! Получение: «невозможно открыть» «для вывода» Скопируйте только последнюю строку последовательного вывода из весовой шкалы rs232 в буфер обмена Сравнить столбцы из двух CSV и слить на совпадения Grep, который показывает линию рисунка и соответствующую строку Как копировать в две папки одновременно с помощью GNU параллельно, создавая несколько потоков? добавьте «#» в начале выбранных строк в файле

Безопасный способ передачи пароля для> 1 программы в bash

Я пишу сценарий 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 ?

Передайте пароль из отдельного дескриптора файла из ввода (дважды, один раз для шифрования и один раз для дешифрования). Не экспортируйте PASS в среду.

 read -sp 'Enter password. ' PASS printf '%s\n' "$PASS" | openssl enc -d -aes-256-cbc -kfile /dev/stdin -in file.old | sed ... | { printf '%s\n' "$PASS" | openssl enc -e -aes-256-cbc -kfile /dev/stdin -in /dev/fd/3 -out file; } 3<&0 

Если ваша система не имеет /dev/fd , вы можете использовать аргумент -pass чтобы сообщить openssl прочитать парольную фразу из дескриптора открытого файла.

 printf '%s\n' "$PASS" | { printf '%s\n' "$PASS" | openssl enc -d -aes-256-cbc -pass fd:0 -in file.old | tr az AZ | tee /dev/tty | { openssl enc -e -aes-256-cbc -pass fd:3 -out file; } } 3<&0 

Используя Bash, это можно сделать без использования printf '%s\n' "$PASS" путем связывания так называемой строки здесь с файловыми дескрипторами с использованием встроенной команды exec Bash.

Дополнительные сведения см. В разделе: Безопасность паролей для сценариев командной строки параметров командной строки .

 ( # sample code to edit password-protected file with openssl # user should have to enter password only once # password should not become visible using the ps command echo hello > tmp.file #env -i bash --norc # clean up environment set +o history unset PASS || exit 1 read -sp 'Enter password. ' PASS; echo # encrypt file and protect it by given password exec 3<<<"$PASS" openssl enc -e -aes-256-cbc -pass fd:3 -in tmp.file -out file cp file{,.old} # decode | edit | encode exec 3<<<"$PASS" 4<<<"$PASS" openssl enc -d -aes-256-cbc -pass fd:3 -in file.old | sed 's/l/L/g' | openssl enc -e -aes-256-cbc -pass fd:4 -out file exec 3<<<"$PASS" openssl enc -d -aes-256-cbc -pass fd:3 -in file rm -P tmp.file file.old unset PASS ) 

Извините, мой предыдущий ответ был от openssl man, а не от opensl enc docs.

Это решение не является конвейером, но я считаю, что это решение предотвращает видимость пароля для ps.

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

 # cp file{,.old} don't need this anymore since intermediate becomes same read -sp 'Enter password. ' PASS; echo #no need to export, env's are readable, as mentioned # decode into intermediate file openssl <<HERE 2>&1 >/dev/null enc -d -aes-256-cbc -k "$PASS" -in file -out intermediate HERE # edit intermediate # encode intermediate back into file openssl <<HERE 2>&1 >/dev/null enc -e -aes-256-cbc -k "$PASS" -in intermediate -out file HERE unset PASS rm -f intermediate