web-dev-qa-db-ja.com

bashファイルのパスワードを非表示/暗号化して、誤ってパスワードを表示しないようにする

これが以前に尋ねられた場合は申し訳ありませんが、チェックしましたが何も見つかりませんでした...

Unixにバッチファイル内のパスワードを暗号化およびして、bashファイル内の他のコマンドにパイプできるようにする機能はありますか?

私はこれを行うと本当のセキュリティが提供されないことを認識しています。誰かが私の肩越しにスクリプトを見ている場合、誰かが誤ってパスワードを見るのを止めることです

Red Hat 5.3で実行しています。

私はこれに似た何かをするスクリプトを持っています:

serverControl.sh -u admin -p myPassword -c shutdown

私はこのようなことをしたいと思います:

password = decrypt("fgsfkageaivgea", "aDecryptionKey")
serverControl.sh -u admin -p $password -c shutdown

これは決してパスワードを保護しませんが、誰かが私の肩越しに誤ってそれを見ることを防ぎます。

33
Rich

OpenSSLは passwd コマンドを提供します。このコマンドは暗号化できますが、ハッシュのみを行うため復号化は行いません。 aesutil のようなものをダウンロードすることもできますので、よく知られた対称暗号化ルーチンを使用できます。

例えば:

#!/bin/sh    
# using aesutil
SALT=$(mkrand 15) # mkrand generates a 15-character random passwd
MYENCPASS="i/b9pkcpQAPy7BzH2JlqHVoJc2mNTBM=" # echo "passwd" | aes -e -b -B -p $SALT 
MYPASS=$(echo "$MYENCPASS" | aes -d -b -p $SALT)

# and usage
serverControl.sh -u admin -p $MYPASS -c shutdown
26
Kaleb Pederson

同じ問題を克服するためにbase64を使用しました。つまり、私の肩越しに私のパスワードを見ることができます。

これが私がやったことです。新しい「db_auth.cfg」ファイルを作成し、dbパスワードをパラメータとして作成しました。ファイルの許可を750に設定します。

DB_PASSWORD=Z29vZ2xl

シェルスクリプトでは、「ソース」コマンドを使用してファイルを取得し、それをデコードしてスクリプトで使用しました。

source path_to_the_file/db_auth.cfg
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)

これがお役に立てば幸いです。

10
White_Nazgul

これはUnixの組み込みソリューションではありませんが、使用しているシェルスクリプトに含めることができるシェルスクリプトを使用して、このソリューションを実装しました。これはPOSIX準拠のセットアップで使用できるはずです。詳細な説明は、githubリポジトリ-> https://github.com/ahnick/encpass.sh にあります。このソリューションは、スクリプトのキーを自動生成し、キーとパスワード(またはその他の秘密)をユーザーの下の隠しディレクトリ(つまり〜/ .encpass)に保存します。

スクリプトでencpass.shをソースし、get_secretメソッドを呼び出すだけです。例えば:

#!/bin/sh
. encpass.sh
password=$(get_secret)

わかりやすくするためにencpass.shのコードを貼り付けます:

#!/bin/sh
################################################################################
# Filename: encpass.sh
# Description: This script allows a user to encrypt a password (or any other
#              secret) at runtime and then use it, decrypted, within another
#              script. This prevents shoulder surfing passwords and avoids
#              storing the password in plain text, which could inadvertently
#              be sent to or discovered by an individual at a later date.
#
#              This script generates an AES 256 bit symmetric key for each
#              script (or user-defined label) that stores secrets.  This key
#              will then be used to encrypt all secrets for that script or
#              label.  encpass.sh sets up a directory (.encpass) under the
#              user's home directory where keys and secrets will be stored.
#
#              Subsequent calls to retrieve a secret will not Prompt for a
#              secret to be entered as the file with the encrypted value
#              already exists.
#
# Author: Xan Nick
#
# Usage: . ./encpass.sh
#        ...
#        $password=$(get_secret)
################################################################################

checks() {
if [ -n "$ENCPASS_CHECKS" ]; then
return
fi

if [ ! -x "$(command -v openssl)" ]; then
echo "Error: OpenSSL is not installed or not accessible in the current path." \
"Please install it and try again." >&2
exit 1
fi

ENCPASS_HOME_DIR=$(get_abs_filename ~)/.encpass

if [ ! -d $ENCPASS_HOME_DIR ]; then
mkdir -m 700 $ENCPASS_HOME_DIR
mkdir -m 700 $ENCPASS_HOME_DIR/keys
mkdir -m 700 $ENCPASS_HOME_DIR/secrets
fi

if [ ! -z $1 ] && [ ! -z $2 ]; then
LABEL=$1
SECRET_NAME=$2
Elif [ ! -z $1 ]; then
LABEL=$(basename $0)
SECRET_NAME=$1
else
LABEL=$(basename $0)
SECRET_NAME="password"
fi

ENCPASS_CHECKS=1
}

generate_private_key() {
KEY_DIR="$ENCPASS_HOME_DIR/keys/$LABEL"

if [ ! -d $KEY_DIR ]; then
mkdir -m 700 $KEY_DIR
fi

if [ ! -f $KEY_DIR/private.key ]; then
(umask 0377 && printf "%s" "$(openssl Rand -hex 32)" > $KEY_DIR/private.key)
fi
}

get_private_key_abs_name() {
PRIVATE_KEY_ABS_NAME="$ENCPASS_HOME_DIR/keys/$LABEL/private.key"

if [ ! -f "$PRIVATE_KEY_ABS_NAME" ]; then
generate_private_key
fi
}

get_secret_abs_name() {
SECRET_ABS_NAME="$ENCPASS_HOME_DIR/secrets/$LABEL/$SECRET_NAME.enc"

if [ ! -f "$SECRET_ABS_NAME" ]; then
set_secret $1 $2
fi
}

get_secret() {
checks $1 $2
get_private_key_abs_name
get_secret_abs_name $1 $2

dd if=$SECRET_ABS_NAME ibs=1 skip=32 2> /dev/null | openssl enc -aes-256-cbc \
-d -a -iv $(head -c 32 $SECRET_ABS_NAME) -K $(cat $PRIVATE_KEY_ABS_NAME)
}

set_secret() {
checks $1 $2
get_private_key_abs_name
SECRET_DIR="$ENCPASS_HOME_DIR/secrets/$LABEL"

if [ ! -d $SECRET_DIR ]; then
mkdir -m 700 $SECRET_DIR
fi

echo "Enter $SECRET_NAME:" >&2
stty -echo
read -r SECRET
stty echo
echo "Confirm $SECRET_NAME:" >&2
stty -echo
read -r CSECRET
stty echo
if [ "$SECRET" = "$CSECRET" ]; then
printf "%s" "$(openssl Rand -hex 16)" > \
$SECRET_DIR/$SECRET_NAME.enc

echo "$SECRET" | openssl enc -aes-256-cbc -e -a -iv \
$(cat $SECRET_DIR/$SECRET_NAME.enc) -K \
$(cat $ENCPASS_HOME_DIR/keys/$LABEL/private.key) 1>> \
$SECRET_DIR/$SECRET_NAME.enc
else
echo "Error: secrets do not match.  Please try again." >&2
exit 1
fi
}

get_abs_filename() {
# $1 : relative filename
filename=$1
parentdir=$(dirname "${filename}")

if [ -d "${filename}" ]; then
echo "$(cd "${filename}" && pwd)"
Elif [ -d "${parentdir}" ]; then
echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
fi
}
3
Alexander Nick

必要に応じて、cryptmcrypt、またはgpgを使用できるはずです。それらはすべて、多くのアルゴリズムをサポートしています。 cryptは少し古くなっていますが。

詳細:

2
Lèse majesté

セキュリティを考慮しない別のソリューション(資格情報を別のファイルまたはデータベースに保存することをお勧めします)は、パスワードをgpgで暗号化し、スクリプトに挿入することです。

パスワードなしのgpgキーペアを使用して、USBに保管しています。 (注:このキーペアをエクスポートするときは--armorを使用しないでください。バイナリ形式でエクスポートしてください)。

最初にパスワードを暗号化します:

[〜#〜] edit [〜#〜]:このコマンドの前にスペースを入れて、bash履歴に記録されないようにします。

echo -n "pAssw0rd" | gpg --armor --no-default-keyring --keyring /media/usb/key.pub --recipient [email protected] --encrypt

これにより、標準出力にgpg暗号化パスワードが出力されます。メッセージ全体をコピーして、これをスクリプトに追加します。

password=$(gpg --batch --quiet --no-default-keyring --secret-keyring /media/usb/key.priv --decrypt <<EOF 
-----BEGIN PGP MESSAGE-----

hQEMA0CjbyauRLJ8AQgAkZT5gK8TrdH6cZEy+Ufl0PObGZJ1YEbshacZb88RlRB9
h2z+s/Bso5HQxNd5tzkwulvhmoGu6K6hpMXM3mbYl07jHF4qr+oWijDkdjHBVcn5
0mkpYO1riUf0HXIYnvCZq/4k/ajGZRm8EdDy2JIWuwiidQ18irp07UUNO+AB9mq8
5VXUjUN3tLTexg4sLZDKFYGRi4fyVrYKGsi0i5AEHKwn5SmTb3f1pa5yXbv68eYE
lCVfy51rBbG87UTycZ3gFQjf1UkNVbp0WV+RPEM9JR7dgR+9I8bKCuKLFLnGaqvc
beA3A6eMpzXQqsAg6GGo3PW6fMHqe1ZCvidi6e4a/dJDAbHq0XWp93qcwygnWeQW
Ozr1hr5mCa+QkUSymxiUrRncRhyqSP0ok5j4rjwSJu9vmHTEUapiyQMQaEIF2e2S
/NIWGg==
=uriR
-----END PGP MESSAGE-----
EOF)

この方法では、USBがシステムにマウントされている場合にのみ、パスワードを復号化できます。もちろん、システムにキーをインポートする(安全性が低い、またはセキュリティがまったくない)ことも、パスワードで秘密キーを保護することもできます(そのため、自動化できません)。

1
Juanu