Сохранять учетные данные GnuPG в кэше на протяжении всей сессии пользователя

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

Сохранять учетные данные GnuPG в кэше на протяжении всей сессии пользователя

GnuPG может, с помощью gpg-agent, кэшировать доступ к закрытому ключу. Как мне сохранить этот кэш активным на всю пользовательскую сессию?

Когда я разблокирую ключ для gpg-agent, он остается в кэше только на ограниченное время. В случае с агентом SSH я ввожу пароль один раз, и он остается в кэше на всю сессию. Я хочу такого же поведения от gpg-agent.

Таким образом, ssh-agent не страдает от ограниченного времени кэширования. Но gpg-agent ограничивает время кэширования, по крайней мере, по умолчанию. Как мне устранить ограничение по времени кэширования в gpg-agent?

Пользовательская конфигурация (в ~/.gnupg/gpg-agent.conf) может только определить значение по умолчанию и максимальную продолжительность кэширования; отключить это невозможно.

Опция default-cache-ttl устанавливает тайм-аут (в секундах) после последней активности GnuPG (то есть он сбрасывается, если вы его используете), опция max-cache-ttl устанавливает период времени (в секундах), в течение которого он сохраняет кэш после ввода вашего пароля. Значение по умолчанию составляет 600 секунд (10 минут) для default-cache-ttl и 7200 секунд (2 часа) для max-cache-ttl.

Установите его на год или около того – скажем, 34560000 секунд (400 дней) – и это должно сработать:

GnuPG 2.1 и выше

В GnuPG 2.1 и выше опция maximum-cache-ttl была переименована в max-cache-ttl без дополнительных изменений.

default-cache-ttl 34560000
max-cache-ttl 34560000

GnuPG 2 и ниже

default-cache-ttl 34560000
maximum-cache-ttl 34560000

Перезапустите агент

Но для того, чтобы это изменение вступило в силу, вам нужно завершить сессию, перезапустив gpg-agent.

gpgconf --kill gpg-agent
gpg-agent --daemon --use-standard-socket

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

Вы также можете перезапустить gpg-agent во время входа в систему, но это не ограничивает время кэширования до длительности сессии, а только до входов пользователя. Решите сами, является ли это проблемой в вашем случае.

Для Windows

Файл, который вам нужно отредактировать, должен находиться по адресу: ~\.gnupg\

Если вы выполните это в окне PowerShell, оно откроет: C:\Users\<UserName>\.gnupg

Просто поместите файл gpg-agent.conf туда с любыми значениями, которые вам нравятся.

Вы можете проверить, сработало ли это, выполнив:

gpgconf.exe --reload gpg-agent
gpgconf.exe --list-options gpg-agent

Вы также можете использовать эту однострочную команду, чтобы установить тайм-аут на один день:

Set-Content -Path ~\.gnupg\gpg-agent.conf -Value "default-cache-ttl 86400$([System.Environment]::NewLine)max-cache-ttl 86400"

Старые версии GPG

В старых версиях файл находился по адресу:
$env:AppData\gnupg (C:\Users\<UserName>\AppData\Roaming\gnupg)

Поэтому, если вы не можете найти его по адресу ~\.gnupg\gpg-agent.conf, посмотрите там.

Не забудьте перезагрузить ваш gpg-агент с помощью gpg-connect-agent reloadagent /bye после изменения конфигурации.

Поскольку ваша проблема заключается в том, что вам нужно больше или неограниченное время кэширования для пароля, вы можете использовать gpg-preset-passphrase для кэширования вашего пароля gpg, и у вас будет неограниченное время кэширования до тех пор, пока агент не будет перезапущен / перезагружен. Ознакомьтесь с документацией здесь:

gpg-preset-passphrase:

Пароли, установленные с помощью этого утилиты, не истекают, если не используется опция --forget для явного их удаления из кэша — или gpg-agent не будет перезапущен или перезагружен (отправив ему SIGHUP). Обратите внимание, что максимальное время кэширования, установленное с помощью --max-cache-ttl, все равно будет соблюдено.

Необходимо разрешить эту настройку пароля, запустив
gpg-agent с --allow-preset-passphrase.

Вот пример того, как кэшировать пароль с использованием утилиты gpg-preset-passphrase в bash:

#!/bin/bash
GPG_PRESET_PASS="/usr/libexec/gpg-preset-passphrase"
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
read -s -p "[$script_name]: Введите пароль для кэширования в gpg-agent: " PASSPHRASE; echo $GPG_PRESET_PASS -c $KEY_GRIP <<< $PASSPHRASE
RETVAL=$?
if [ $RETVAL = 0 ]; then
    echo "OK"
else
    echo "NOT OK"
fi

нет шансов на debian 11

gpg-preset-passphrase: кэширование пароля не удалось: не поддерживается

bin $ cat /etc/os-release
PRETTY_NAME=”Debian GNU/Linux 11 (bullseye)”
NAME=”Debian GNU/Linux”
VERSION_ID=”11″
VERSION=”11 (bullseye)”
VERSION_CODENAME=bullseye
ID=debian
HOME_URL=”https://www.debian.org/”
SUPPORT_URL=”https://www.debian.org/support”
BUG_REPORT_URL=”https://bugs.debian.org/”

Ответ или решение

Для того чтобы сохранить кэш учетных данных GnuPG (gpg-agent) активным на протяжении всей сессии пользователя, необходимо изменить настройки кэширования в файле конфигурации gpg-agent. Вот пошаговая инструкция, как это сделать:

Шаг 1: Изменение конфигурации gpg-agent

  1. Откройте файл конфигурации gpg-agent, который находится по адресу ~/.gnupg/gpg-agent.conf. Если файл не существует, создайте его.

  2. Добавьте или измените следующие строки в файле:

    Для GnuPG версии 2.1 и выше:

    default-cache-ttl 34560000
    max-cache-ttl 34560000

    Для GnuPG версии 2 и ниже:

    default-cache-ttl 34560000
    maximum-cache-ttl 34560000

    Значение 34560000 секунд соответствует 400 дням. Это позволит избежать истечения срока действия кэша, по крайней мере, в течение указанного периода.

Шаг 2: Перезапуск gpg-agent

После внесения изменений в конфигурацию вам необходимо перезапустить gpg-agent, чтобы новые настройки вступили в силу. Для этого выполните следующие команды:

gpgconf --kill gpg-agent
gpg-agent --daemon --use-standard-socket

Шаг 3: Автоматизация завершения работы gpg-agent

Если вы хотите, чтобы gpg-agent завершал свою работу при выходе из системы, вам потребуется настроить соответствующий сценарий, который будет убивать gpg-agent при выходе из сеанса. Это может отличаться в зависимости от вашей операционной системы. Полезные советы по этому вопросу можно найти здесь.

Альтернативные методы

Если вы часто обновляете или используете разные ключи, и вам нужны другие варианты управления временем кэширования, вы можете использовать утилиту gpg-preset-passphrase. Это позволит кэшировать ваш пароль:

  1. Убедитесь, что gpg-agent запускается с опцией --allow-preset-passphrase.

  2. Запустите gpg-preset-passphrase для вашего ключа, чтобы добавить пароль в кэш без ограничения по времени.

    Пример скрипта для кэширования пароля:

    #!/bin/bash
    GPG_PRESET_PASS="/usr/libexec/gpg-preset-passphrase"
    KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
    read -s -p "Введите пароль для кэширования в gpg-agent: " PASSPHRASE
    echo $GPG_PRESET_PASS -c $KEY_GRIP <<< $PASSPHRASE
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
       echo "Пароль успешно закэширован"
    else
       echo "Ошибка при кэшировании пароля"
    fi

Обратите внимание, что на некоторых системах, таких как Debian 11, может возникнуть ошибка caching passphrase failed: not supported. Убедитесь, что ваш gpg-agent поддерживает данную функцию.

Заключение

С помощью вышеописанных шагов вы можете настроить gpg-agent так, чтобы кэширование паролей происходило на протяжении всей сессии пользователя. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обращаться за помощью.

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

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