Bashで> 1つのプログラムのパスワードを渡す安全な方法

Bashで> 1つのプログラムのパスワードを渡す安全な方法

bashユーザーにパスワードを要求し、それに渡す必要があるスクリプトを作成していますopensslopensslパスワード自体を読むことはできますが、プログラムを2回実行する必要があり、ユーザーに2回尋ねたくありません。スクリプトは次のとおりです。

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それでは、両方のインスタンスにパスワードを安全に渡すにはどうすればよいですか?

答え1

入力時に別のファイル記述子にパスワードを渡します(暗号化用に一度、復号化用に一度)。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 a-z A-Z | tee /dev/tty | {
  openssl enc -e -aes-256-cbc -pass fd:3 -out file; }
} 3<&0

答え2

printf '%s\n' "$PASS"Bashを使用すると、いわゆるhere文字列をファイル記述子に関連付けるためにBash組み込みコマンドを使用せずにこれを実行できますexec

詳細については、次を参照してください。コマンドラインパラメータのシェルスクリプトパスワードセキュリティ

(

# 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

)

答え3

申し訳ありません。以前の回答はopenssl encドキュメントではなくopenssl manから来ました。

このソリューションはパイプではありませんが、このソリューションが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

答え4

私は完全なリセットを実行し、設定ファイルを保存するためにこの小さなbashスクリプトを作成しました。強制プッシュはGitHubリポジトリを効果的に再生成します。

#!/bin/bash
tfile=$(mktemp /tmp/config.XXXXXXXXX)
GITCONF=".git/config"
commitmsg=${1:-git repository initialised}
if [ -f $GITCONF ]; then
   mv .git/config tfile
   rm -rf .git
   git init .
   mv tfile .git/config
   git add .
   git commit -a -m "${commitmsg}"
   git push -f
else
   echo "Warning: No git config file found. Aborting.";exit;
fi

関連情報