SUDO_ASKPASS: Как правильно использовать его?

Вопрос или проблема

Мне нужно исправить скрипт для монтирования USB-композиции из µSD карт, все устройства зашифрованы с помощью LUKS, с общим LVM на нем и внутри зашифрованной с помощью fscrypt домашней резервной партицией. Идея заключается в том, чтобы автоматически проверять (например, при запуске оболочки или при планировании задания cron), доступна ли она и монтировать ее корректно, расшифровывать устройства LUKS и резервные домашние папки, зашифрованные с помощью fscrypt. После выполнения rsync она должна автоматически размонтироваться.

enter image description here

Я поместил свои пароли в 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 именно с целью автоматизации ввода пароля из безопасной программы или сценария.

  1. Скрипт SUDO_ASKPASS: Скрипт или программа, на которую указывает SUDO_ASKPASS, должна просто возвращать пароль через стандартный вывод. Она может обращаться к безопасному источнику данных, например, к местной базе данных, менеджеру паролей или безопасно сохраненному файлу.

  2. Использование -A флага: sudo -A используется для указания, что необходимо применить SUDO_ASKPASS для получения пароля. Без такого указания, sudo будет взаимодействовать напрямую с пользователем через стандартный ввод.

  3. Грамотное обращение с данными: Поскольку работа идет с паролями и другими конфиденциальными данными, крайне важно предпринимать все меры для обеспечения их безопасности, избегая их запись в открытых текстах или плохо защищенных файловых системах.

Пример

Рассмотрим ваш пример более детально. Ваша задача состоит в монтировании USB-состава с зашифрованными µSD-картами и декриптировании LUKS-устройств с fsCrypt папками. Вы применяете SUDO_ASKPASS для аутентификации, но встречаетесь с ошибками. Ключевое в том, чтобы полностью различать работу sudo и cryptsetup, как объясняется в последнем примечании вашего описания.

Необходимые шаги:

  1. Скрипт askpass.sh должен вызывать и возвращать пароль именно для sudo.
#!/bin/bash
cat "$1"
  1. askpass_wrapper.sh должен выполниться корректно.
#!/bin/bash
PASSWORD=$("/home/userXXX/scripts/askpass.sh" "/home/userXXX/scripts/key.txt")
echo "$PASSWORD"
  1. Правильное использование sudo и cryptsetup: Ваша задача состоит в том, чтобы обходить каждый механизм аутентификации корректно. sudo нуждается в пароле для выполнения команды cryptsetup, а последняя потребует ключа для расшифровки.

Применение

Чтобы успешно применить SUDO_ASKPASS, выполните следующие действия:

  1. Убедитесь, что пути к скриптам правильные. Ваша ошибка указывает, что файлы не находятся по указанному пути:
/home/userXXX/scripts/askpass_wrapper.sh: строка 2: /home/userXXX/scripts/askpass.sh /home/userXXX/scripts/key.txt: Нет такого файла или каталога
  1. Проверка прав доступа: Убедитесь, что все скрипты имеют необходимые права на выполнение (chmod +x).

  2. Обработка ошибок: Добавьте больше диагностики в свои скрипты. Используйте set -x и set -e в начале скриптов для диагностики и автоматической остановки при сбоях:

set -xe
  1. Удержание безопасности: Помните, что хранение паролей в виде открытого текста следует использовать крайне осторожно и избегать это решение в промышленных применениях. Помните про использование защищенных хранилищ ключей (например, gnome-keyring).

  2. Тестирование без влияния: Завершив скрипты, протестируйте их на фальшивых данных, чтобы удостовериться в правильности работы без появления утечек.

Четкое понятие задач SUDO_ASKPASS и взаимодействий терминала с sudo и cryptsetup поможет вам эффективно реализовать ваш проект, минимизировав риски и ошибки.

Оцените материал
Добавить комментарий

Капча загружается...