Скрыть / зашифровать пароль в файле 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
это никоим образом не защищает пароль, но мешает кому-то случайно увидеть его через мое плечо.
8 ответов
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
я использовал base64 для преодоления той же проблемы, т. е. люди могут видеть мой пароль через плечо.
вот что я сделал - Я создал новый " db_auth.cfg " файл и созданные параметры, один из которых является моим паролем БД. Я установил разрешение как 750 для файла.
DB_PASSWORD=Z29vZ2xl
в моем скрипте оболочки я использовал команду "source", чтобы получить файл, а затем декодировать его для использования в моем скрипте.
source path_to_the_file/db_auth.cfg
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)
надеюсь, это поможет.
хотя это не встроенное решение Unix, я реализовал решение для этого, используя сценарий оболочки, который может быть включен в любой сценарий оболочки, который вы используете. Это "должно" использоваться в настройках, совместимых с POSIX. Полное описание доступно в репозитории github -> https://github.com/ahnick/encpass.sh. Это решение автоматически создаст ключ для вашего скрипта и сохранит ключ и пароль (или другие секреты) в скрытом каталоге под вашим пользователем (т. е. ~/.encpass).
в вашем скрипте вам просто нужно source 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 ] && [ ! -z ]; then
LABEL=
SECRET_NAME=
elif [ ! -z ]; then
LABEL=$(basename )
SECRET_NAME=
else
LABEL=$(basename )
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
fi
}
get_secret() {
checks
get_private_key_abs_name
get_secret_abs_name
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
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() {
# : relative filename
filename=
parentdir=$(dirname "${filename}")
if [ -d "${filename}" ]; then
echo "$(cd "${filename}" && pwd)"
elif [ -d "${parentdir}" ]; then
echo "$(cd "${parentdir}" && pwd)/$(basename "${filename}")"
fi
}
вы должны иметь возможность использовать crypt
, mcrypt
или gpg
отвечать ваши потребностямы. Все они поддерживают ряд алгоритмов. crypt
немного устарел, хотя.
больше info:
другое решение, без учета безопасности (я также думаю, что лучше сохранить учетные данные в другом файле или в базе данных), - это зашифровать пароль с помощью gpg и вставить его в скрипт.
Я использую пару ключей gpg без пароля, которую я храню в usb. (Примечание: при экспорте этой пары ключей не используйте --armor, экспортируйте их в двоичном формате).
сначала зашифруйте свой пароль:
редактировать: поставил пробел перед этой командой, поэтому она не записывается историей bash.
echo -n "pAssw0rd" | gpg --armor --no-default-keyring --keyring /media/usb/key.pub --recipient someone@mail.com --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 установлен в системе пароль может быть расшифрован. Конечно, вы также можете импортировать ключи в систему (менее безопасный или вообще без безопасности) или защитить закрытый ключ паролем (так что это не может быть автоматизированный.)
- отступ от края экрана (при условии, что вы не используете обертывание строк, и у вас есть ширина редактора consistant)
или
- сохраните его в отдельном файле и прочитайте его.
существует более удобный способ хранения паролей в скрипте, но вам придется зашифровать и запутать скрипт, чтобы его нельзя было прочитать. Для того, чтобы успешно зашифровать и запутать сценарий оболочки и на самом деле этот сценарий быть исполняемым, попробуйте скопировать и вставить его здесь:
http://www.kinglazy.com/shell-script-encryption-kinglazy-shieldx.htm
на вышеуказанной странице все, что вам нужно сделать, это отправить свой скрипт и дать скрипту собственное имя, затем нажмите кнопку загрузки. Для вас будет создан zip-файл. Щелкните правой кнопкой мыши ссылку для загрузки и скопируйте предоставленный URL-адрес. Затем перейдите в поле UNIX и выполните следующие действия.
установка:
1. wget link-to-the-zip-file
2. unzip the-newly-downloaded-zip-file
3. cd /tmp/KingLazySHIELD
4. ./install.sh /var/tmp/KINGLAZY/SHIELDX-(your-script-name) /home/(your-username) -force
что вышеуказанная команда установки сделает для вас:
- установите зашифрованную версию скрипта в каталог /var/tmp/KINGLAZY / SHIELDX-(имя вашего скрипта).
- он разместит ссылку на этот зашифрованный скрипт в любом каталоге, который вы укажете в замене /home / (ваше имя пользователя)-таким образом, он позволит вам легко получить доступ к скрипту без необходимости вводить абсолютный путь.
- гарантирует, что никто не сможет изменить скрипт - любые попытки изменить зашифрованный скрипт сделают его неработоспособным...пока эти попытки не будут остановлены или удалены. Это может быть даже настроить уведомления вы всякий раз, когда кто-то пытается сделать что-либо со скриптом, кроме его запуска...т. е. попытки взлома или модификации.
- гарантирует, что абсолютно никто не может сделать копии. Никто не может скопировать ваш скрипт в укромное место и попробовать покрутиться с ним, чтобы посмотреть, как он работает. Все копии скрипта должны быть ссылками на Исходное расположение, указанное во время установки (Шаг 4).
Примечание:
Это не работает для интерактивные сценарии, которые запрашивают и ждут ответа пользователя. Значения, ожидаемые от пользователя, должны быть жестко закодированы в сценарий. Шифрование гарантирует, что никто не может видеть эти значения, поэтому вам не нужно беспокоиться об этом.
отношения:
решение, предоставленное в этом сообщении, отвечает на вашу проблему в том смысле, что оно шифрует фактический скрипт, содержащий пароль, который вы хотели зашифровать. Ты должен уйти. пароль как есть (незашифрованный), но сценарий, в котором пароль находится, настолько глубоко запутан и зашифрован, что вы можете быть уверены, что никто не сможет его увидеть. А если будут предприняты попытки совать нос в скрипт, вы получите по электронной почте уведомления о них.
следующая строка в приведенном выше коде не работает
DB_PASSWORD=$(eval echo ${DB_PASSWORD} | base64 --decode)
правильная строка:
DB_PASSWORD=`echo $PASSWORD|base64 -d`
и сохраните пароль в другом файле в качестве пароля.