Вопрос или проблема
Мне нужно исправить скрипт для монтирования USB-композиции из µSD карт, все устройства зашифрованы с помощью LUKS, с общим LVM на нем и внутри зашифрованной с помощью fscrypt домашней резервной партицией. Идея заключается в том, чтобы автоматически проверять (например, при запуске оболочки или при планировании задания cron), доступна ли она и монтировать ее корректно, расшифровывать устройства LUKS и резервные домашние папки, зашифрованные с помощью fscrypt. После выполнения rsync она должна автоматически размонтироваться.
Я поместил свои пароли в gnome-keyring пользователя и извлек оба пароля во временные файлы. Оттуда я хотел отправить их в SUDO_ASKPASS:
secret-tool search service "FSCryptBckHome" | sed -n '/^secret = /s/^secret = //p' > "$KEYFILE"
# Получить ключ шифрования для LVM, зашифрованного с помощью LUKS, микросд-карты для решения резерва
secret-tool search service "LUKSCryptBckHome" | sed -n '/^secret = /s/^secret = //p' > "$KEYFILE2"
# Избавиться от последовательности конца файла (EOF)
perl -pi -e 'chomp if eof' "$KEYFILE"
# Разблокировать том, зашифрованный с помощью LUKS, если он не открыт, с обработкой ошибок
if ! is_luks_open "ubuntu-luks-bckhome"; then
echo "Разблокировать первый том, зашифрованный с помощью LUKS, если он не открыт, с обработкой ошибок"
if SUDO_ASKPASS="$ASKPASS_WRAPPER" sudo -A cryptsetup luksOpen UUID="xxxyyyZZZ" ubuntu-luks-bckhome --key-file="$KEYFILE2"; then
echo "Том LUKS ubuntu-luks-bckhome открыт."
else
echo "Не удалось открыть том LUKS ubuntu-luks-bckhome. Прекращение!"
exit 1
fi
else
echo "Том LUKS ubuntu-luks-backuphome2 уже открыт."
fi
Поскольку я обнаружил где-то на этом форуме, что SUDO_ASKPASS должен быть скриптом, а не текстовым файлом, содержащим пароль, я создал два скрипта:
- askpass.sh
- askpass_wrapper.sh
Последний, потому что мой ИИ имел неверное мнение (?), что эта команда должна содержать только одно слово, то есть не как cat $KEYFILE
:
# Разблокировать первый том, зашифрованный с помощью LUKS, если он не открыт, с обработкой ошибок
if ! is_luks_open "ubuntu-luks-backuphome2"; then
echo "Разблокировать первый том, зашифрованный с помощью LUKS, если он не открыт, с обработкой ошибок"
if SUDO_ASKPASS="$ASKPASS_WRAPPER" sudo -A cryptsetup luksOpen UUID="9c5b65e8-5785-44be-85c7-3009cbc1e02a" ubuntu-luks-backuphome2 --key-file="$KEYFILE2"; then
echo "Том LUKS ubuntu-luks-backuphome2 открыт."
else
echo "Не удалось открыть том LUKS ubuntu-luks-backuphome2. Прекращение!"
exit 1
fi
else
echo "Том LUKS ubuntu-luks-backuphome2 уже открыт."
fi
Но каждый раз появляется ошибка типа:
mount_fscrypt_luks_usbdisc_bckHome.sh
attribute.service = FSCryptBckHome
attribute.service = LUKSCryptBckHome
Warning: /home/userXXX/scripts/askpass.sh уже существует.
Вы хотите перезаписать его? (y/n): y
askpass.sh скрипт сгенерирован в /home/userXXX/scripts/askpass.sh
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
Извините, попробуйте еще раз.
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
Извините, попробуйте еще раз.
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
sudo: 3 неправильные попытки ввода пароля
Разблокировать том, зашифрованный с помощью LUKS, если он не открыт, с обработкой ошибок
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
Извините, попробуйте еще раз.
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
Извините, попробуйте еще раз.
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
sudo: 3 неправильные попытки ввода пароля
Итак, моя вторая строка в askpass_wrapper.sh:
1 #!/bin/bash
2 PASSWORD=$("/home/peddanet/scripts/askpass.sh /home/peddanet/scripts/key.txt")
3 echo $PASSWORD
Я пробовал также SUDO_ASKPASS="cat $KEYFILE" sudo -A ...
, но ошибка просто мигрирует…
Есть ли какие-то подсказки, как я неправильно использовал SUDO_ASKPASS или bash? Я не вижу леса за деревьями…
Здесь есть две вещи, которые требуют аутентификации/авторизации. У вас есть команда cryptsetup luksOpen
, которой нужен ключ из файлов ключей для расшифровки тома. Также у вас есть команда sudo
, которой нужен пароль или другая учетная информация, чтобы sudo знала, что она может выполнить для вас команду cryptsetup
.
Вы пытались использовать опцию sudo -A
и переменную окружения SUDO_ASKPASS
, чтобы удовлетворить потребности в аутентификации cryptsetup, но -A
и SUDO_ASKPASS
этого не делают. Они являются опциями для sudo, а не для cryptsetup, поэтому они работают для удовлетворения потребностей в аутентификации sudo.
Страница руководства sudo содержит довольно хорошее описание опции -A
, включая функцию переменной SUDO_ASKPASS
. Я предлагаю, что страница руководства является более надежным источником информации, чем какой-либо ИИ.
Ответ или решение
SUDO_ASKPASS — это важная переменная окружения, которая используется в Unix-подобных системах для автоматизации и облегчения процесса аутентификации при использовании команды sudo
для выполнения привилегированных действий через скрипты или приложения без необходимости ручного ввода пароля. На практике это может быть особенно полезно в скриптах, которые должны работать без участия человека, например, при выполнении задач в фоновом режиме или при автоматизации процессов, требующих повышенных привилегий. Однако часто возникают ошибки и недопонимание в процессе использования SUDO_ASKPASS, что и происходит в вашей ситуации.
Теория
Основная задача переменной SUDO_ASKPASS
заключается в указании пути к скрипту, который будет вызываться sudo
для чтения пароля. Это переменная окружения поддерживается sudo
именно с целью автоматизации ввода пароля из безопасной программы или сценария.
-
Скрипт SUDO_ASKPASS: Скрипт или программа, на которую указывает
SUDO_ASKPASS
, должна просто возвращать пароль через стандартный вывод. Она может обращаться к безопасному источнику данных, например, к местной базе данных, менеджеру паролей или безопасно сохраненному файлу. -
Использование -A флага:
sudo -A
используется для указания, что необходимо применитьSUDO_ASKPASS
для получения пароля. Без такого указания,sudo
будет взаимодействовать напрямую с пользователем через стандартный ввод. -
Грамотное обращение с данными: Поскольку работа идет с паролями и другими конфиденциальными данными, крайне важно предпринимать все меры для обеспечения их безопасности, избегая их запись в открытых текстах или плохо защищенных файловых системах.
Пример
Рассмотрим ваш пример более детально. Ваша задача состоит в монтировании USB-состава с зашифрованными µSD-картами и декриптировании LUKS-устройств с fsCrypt папками. Вы применяете SUDO_ASKPASS
для аутентификации, но встречаетесь с ошибками. Ключевое в том, чтобы полностью различать работу sudo
и cryptsetup
, как объясняется в последнем примечании вашего описания.
Необходимые шаги:
- Скрипт askpass.sh должен вызывать и возвращать пароль именно для
sudo
.
#!/bin/bash
cat "$1"
- askpass_wrapper.sh должен выполниться корректно.
#!/bin/bash
PASSWORD=$("/home/userXXX/scripts/askpass.sh" "/home/userXXX/scripts/key.txt")
echo "$PASSWORD"
- Правильное использование
sudo
иcryptsetup
: Ваша задача состоит в том, чтобы обходить каждый механизм аутентификации корректно.sudo
нуждается в пароле для выполнения командыcryptsetup
, а последняя потребует ключа для расшифровки.
Применение
Чтобы успешно применить SUDO_ASKPASS
, выполните следующие действия:
- Убедитесь, что пути к скриптам правильные. Ваша ошибка указывает, что файлы не находятся по указанному пути:
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
-
Проверка прав доступа: Убедитесь, что все скрипты имеют необходимые права на выполнение (
chmod +x
). -
Обработка ошибок: Добавьте больше диагностики в свои скрипты. Используйте
set -x
иset -e
в начале скриптов для диагностики и автоматической остановки при сбоях:
set -xe
-
Удержание безопасности: Помните, что хранение паролей в виде открытого текста следует использовать крайне осторожно и избегать это решение в промышленных применениях. Помните про использование защищенных хранилищ ключей (например,
gnome-keyring
). -
Тестирование без влияния
:
Завершив скрипты, протестируйте их на фальшивых данных, чтобы удостовериться в правильности работы без появления утечек.
Четкое понятие задач SUDO_ASKPASS
и взаимодействий терминала с sudo
и cryptsetup
поможет вам эффективно реализовать ваш проект, минимизировав риски и ошибки.