Как использовать зашифрованные пароли в сценариях Bash

Опубликовано: 2022-01-29
Ноутбук Linux в стиле Ubuntu.
Фатмавати Ачмад Заэнури/Shutterstock.com

Если вы вынуждены использовать сценарий Linux для подключения к ресурсу, защищенному паролем, вы, вероятно, чувствуете себя неловко, помещая этот пароль в сценарий. OpenSSL решит эту проблему за вас.

Пароли и скрипты

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

Вы можете ввести пароль вручную, когда процесс достигнет этой точки, но если сценарий будет выполняться без присмотра, это не сработает. К счастью, существует альтернатива жесткому кодированию паролей в сценарии. Как ни странно, для этого используется другой пароль, а также надежное шифрование.

В нашем примерном сценарии нам нужно установить удаленное подключение к компьютеру с Fedora Linux с нашего компьютера с Ubuntu. Мы будем использовать сценарий оболочки Bash, чтобы установить SSH-соединение с компьютером Fedora. Сценарий должен работать без присмотра, и мы не хотим помещать в сценарий пароль для удаленной учетной записи. В этом случае мы не можем использовать SSH-ключи, потому что мы притворяемся, что у нас нет никакого контроля или прав администратора на компьютере с Fedora.

Мы собираемся использовать известный инструментарий OpenSSL для обработки шифрования и утилиту sshpass для ввода пароля в команду SSH.

СВЯЗАННЫЕ С: Как создать и установить ключи SSH из оболочки Linux

Установка OpenSSL и sshpass

Поскольку многие другие инструменты шифрования и безопасности используют OpenSSL, он может быть уже установлен на вашем компьютере. Однако, если это не так, установка займет всего несколько минут.

В Ubuntu введите эту команду:

 sudo apt получить openssl 

Чтобы установить sshpass , используйте эту команду:

 sudo apt установить sshpass 

В Fedora вам нужно ввести:

 sudo dnf установить openssl 

Команда для установки sshpass :

 sudo dnf установить sshpass 

В Manjaro Linux мы можем установить OpenSSL с помощью:

 sudo pacman -Sy openssl 

Наконец, чтобы установить sshpass , используйте эту команду:

 sudo pacman -Sy sshpass 

Шифрование в командной строке

Прежде чем мы приступим к использованию команды openssl со сценариями, давайте познакомимся с ней, используя ее в командной строке. Допустим, пароль от учетной записи на удаленном компьютере rusty!herring.pitshaft . Мы собираемся зашифровать этот пароль с помощью openssl .

Когда мы это делаем, нам нужно предоставить пароль шифрования. Пароль шифрования используется в процессах шифрования и дешифрования. В команде openssl много параметров и опций. Мы рассмотрим каждый из них через мгновение.

 echo 'ржавый!сельдь.питшафт' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

Мы используем echo для отправки пароля удаленной учетной записи через канал в команду openssl .

Параметры openssl :

  • enc -aes-256-cbc : Тип кодировки. Мы используем 256-битный ключевой шифр Advanced Encryption Standard с цепочкой блоков шифрования.
  • -md sha512 : Тип дайджеста сообщения (хеш). Мы используем криптографический алгоритм SHA512.
  • -a : это говорит openssl применять кодировку base-64 после фазы шифрования и перед фазой дешифрования.
  • -pbkdf2 : Использование функции получения ключа на основе пароля 2 (PBKDF2) значительно усложняет подбор вашего пароля методом грубой силы. PBKDF2 требует много вычислений для выполнения шифрования. Злоумышленнику потребуется повторить все эти вычисления.
  • -iter 100000 : устанавливает количество вычислений, которые будет использовать PBKDF2.
  • -salt : Использование случайно примененного значения соли делает зашифрованный вывод каждый раз разным, даже если обычный текст одинаков.
  • -pass pass:'pick.your.password' : пароль, который нам нужно будет использовать для расшифровки зашифрованного удаленного пароля. Замените pick.your.password надежным паролем по вашему выбору.

Зашифрованная версия нашего пароля rusty!herring.pitshaft записывается в окно терминала.

Зашифрованный пароль, записанный в окно терминала

Чтобы расшифровать это, нам нужно передать эту зашифрованную строку в openssl с теми же параметрами, которые мы использовали для шифрования, но добавив опцию -d (расшифровать).

 эхо U2FsdGVkX19iiiRNhEsG+wm/uKjtZJwnYOpjzPhyrDKYZH5lVZrpIgo1S0goZU46 | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'pick.your.password' 

Реклама

Строка расшифровывается, и наш исходный текст — пароль для учетной записи удаленного пользователя — записывается в окно терминала.

Расшифрованный пароль, записанный в окно терминала

Это доказывает, что мы можем надежно зашифровать пароль нашей учетной записи удаленного пользователя. Мы также можем расшифровать его, когда нам это нужно, используя пароль, который мы предоставили на этапе шифрования.

Но действительно ли это улучшает нашу ситуацию? Если нам нужен пароль шифрования для расшифровки пароля удаленной учетной записи, наверняка пароль для расшифровки должен быть в сценарии? Ну да, это так. Но зашифрованный пароль учетной записи удаленного пользователя будет храниться в другом скрытом файле. Разрешения на файл предотвратят доступ к нему никому, кроме вас — и, очевидно, корневого пользователя системы.

Чтобы отправить вывод команды шифрования в файл, мы можем использовать перенаправление. Файл называется «.secret_vault.txt». Мы изменили пароль шифрования на более надежный.

 echo 'ржавый!сельдь.питшафт' | openssl enc -aes-256-cbc -md sha512 -a -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' > .secret_vault.txt 

Ничего видимого не происходит, но пароль шифруется и отправляется в файл «.secret_vault.txt».

Мы можем проверить, что это сработало, расшифровав пароль в скрытом файле. Обратите внимание, что здесь мы используем cat , а не echo .

 кошка .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password' 

Реклама

Пароль успешно расшифрован из данных в файле. Мы будем использовать chmod для изменения прав доступа к этому файлу, чтобы никто другой не мог получить к нему доступ.

 chmod 600 .secret_vault.txt
 ls -l .secret_vault.txt 

Использование маски разрешений 600 удаляет любой доступ для всех, кроме владельца файла. Теперь мы можем перейти к написанию нашего сценария.

СВЯЗАННЫЕ С: Как использовать команду chmod в Linux

Использование OpenSSL в скрипте

Наш скрипт довольно прост:

 #!/бин/баш

# имя удаленной учетной записи
REMOTE_USER=выродок

# пароль для удаленной учетной записи
REMOTE_PASSWD=$(cat .secret_vault.txt | openssl enc -aes-256-cbc -md sha512 -a -d -pbkdf2 -iter 100000 -salt -pass pass:'secret#vault!password')

# удаленный компьютер
REMOTE_LINUX=fedora-34.local

# подключитесь к удаленному компьютеру и поместите метку времени в файл с именем script.log
sshpass -p $REMOTE_PASSWD ssh -T $REMOTE_USER@$REMOTE_LINUX << _remote_commands
echo $USER "-" $(дата) >> /home/$REMOTE_USER/script.log
_remote_commands
  • Мы устанавливаем для переменной REMOTE_USER значение «выродок».
  • Затем мы устанавливаем для переменной REMOTE_PASSWD значение расшифрованного пароля, извлеченного из файла «.secret_vault.txt», используя ту же команду, которую мы использовали минуту назад.
  • Местоположение удаленного компьютера хранится в переменной REMOTE_LINUX .

С этой информацией мы можем использовать команду ssh для подключения к удаленному компьютеру.

  • Команда sshpass является первой командой в строке подключения. Мы используем его с опцией -p (пароль). Это позволяет нам указать пароль, который должен быть отправлен команде ssh .
  • Мы используем параметр -T (отключить выделение псевдотерминала) с ssh , потому что нам не нужно выделять псевдо-TTY на удаленном компьютере.
Как использовать «Здесь документы» в Bash в Linux
СВЯЗАННЫЕ С : Как использовать «Здесь документы» в Bash в Linux

Мы используем короткий здесь документ для передачи команды на удаленный компьютер. Все, что находится между двумя строками _remote_commands , отправляется в качестве инструкций сеансу пользователя на удаленном компьютере — в данном случае это одна строка сценария Bash.

Команда, отправленная на удаленный компьютер, просто записывает имя учетной записи пользователя и отметку времени в файл с именем «script.log».

Скопируйте и вставьте сценарий в редактор и сохраните его в файл с именем «go-remote.sh». Не забудьте изменить детали, чтобы отразить адрес вашего собственного удаленного компьютера, удаленную учетную запись пользователя и пароль удаленной учетной записи.

Используйте chmod , чтобы сделать скрипт исполняемым.

 chmod +x go-remote.sh 

Реклама

Осталось только попробовать. Давайте запустим наш скрипт.

 ./go-remote.sh 

Поскольку наш скрипт представляет собой минималистский шаблон для автоматического скрипта, вывод на терминал невозможен. Но если мы проверим файл «script.log» на компьютере с Fedora, мы увидим, что удаленные подключения были успешно установлены и что файл «script.log» был обновлен с отметками времени.

 кот script.log 

Ваш пароль является конфиденциальным

Пароль вашей удаленной учетной записи не записан в сценарии.

И хотя пароль для расшифровки указан в скрипте, никто другой не может получить доступ к вашему файлу «.secret_vault.txt», чтобы расшифровать его и получить пароль удаленной учетной записи.