Назад | Перейти на главную страницу

Как я могу сбросить ключи ssh при управлении питанием?

С помощью ssh-agent и закрытые ключи как обычно. Все нормально работает.

Мой вопрос касается лучших практик по очистке ключей от ssh-add о таких действиях, как сон, приостановка, переход в спящий режим и т. д. Я подумал о написании простой оболочки для этих команд, но потом задумался, вызываются ли они вообще? Или ядро ​​инициирует эту активность напрямую? Утилиты PM строго пользовательские?

Я хотел бы получить этот дополнительный уровень безопасности, помимо блокировки экрана и т. Д., И мне было интересно, решил ли кто-нибудь еще это элегантно или есть лучшие практики, которые можно порекомендовать. Спасибо.

Вы могли бы иметь возможность заставить пользовательского демона прослушивать изменение статуса через D-Bus. Похоже, что gnome-power-manager не выдает никаких сигналов для этого, но вы можете получить что-то от hal или DeviceKit-power / upower.

У меня есть немного pm сценарий, который запускает пользовательские сценарии для каждого вошедшего в систему пользователя в режиме ожидания / гибернации, возобновления / размораживания. Я использовал это, чтобы убить или перезапустить процессы, которые плохо себя ведут при приостановке. Пользователь может создавать скрипты в ~/.user-pm которые выполняются в лексикографическом порядке при приостановке и обратном порядке при возобновлении. $1 имеет имя операции pm.

Вы можете просто добавить пользовательский сценарий, который вызывает "ssh-add -D"в режиме ожидания / гибернации. (вам нужно будет найти SSH_AUTH_SOCK где-то, но я предполагаю, что вам это понадобится для любого решения).

Вот глобальный pm крючок:

> cat /etc/pm/sleep.d/10_run_user_parts
#!/bin/sh

USER_PM_DIR=".user-pm"

# foreach logged in user
for user in `users | grep -o "\S*" | sort -u`; do
    user_home=`getent passwd "${user}" | awk -F: '{print $6}'`

    # check user has a valid home-directory
    [ -d $user_home ] || continue

    user_pm_dir="$user_home/$USER_PM_DIR"
    # check for user-pm directory
    [ -d "$user_pm_dir" ] || continue

    # call run-parts as $user
    case "$1" in
        hibernate|suspend)
        su -c "run-parts --arg=\"$1\" \"${user_pm_dir}\"" "${user}"
        ;;
        thaw|resume)
        su -c "run-parts --reverse --arg=\"$1\" \"${user_pm_dir}\"" "${user}"
        ;;
        *) exit $NA ;;
    esac
done

Я использую ubuntu - это должно работать и для debian - в противном случае YMMV

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

Раньше я удалял этот ключ, выполняя простой скрипт, который просыпался каждые несколько секунд и искал программу, блокирующую экран, и, если она была обнаружена, выполняла «ssh-add -D». Затем, как только он ушел, он снова вызвал «ssh-add -c», чтобы спросить у меня пароль. В итоге я переключился на просто подтверждение и блокировку экрана, когда я откладываю или оставляю клавиатуру.

Это еще одно косвенное решение, которое не требует сброса зарегистрированных идентификаторов / ключей от агента, но блокировка ssh-agent будет столь же полезной (ssh-add -x)? Я не уверен, насколько безопасным будет этот метод (конечно, далеко не так безопасен, как удаление ключей из агента), однако я предполагаю, что эта функция была реализована для обеспечения той дополнительной безопасности, которую вы ищете в этой ситуации.

Спасибо @Greg за ваш ответ, я взял на себя смелость расширить его, чтобы сделать его более совместимым с "freedesktop", поскольку pm-utils - это проект freedesktop.org.

Этот скрипт теперь будет работать в config.d, power.d, и sleep.d с копией или символической ссылкой. Затем он будет искать сценарии для запуска ~/.config/pm/ используя те же имена папок (config.d, power.d, и sleep.d) так как /etc/pm.

#!/bin/sh

scriptdir=`cd $(dirname $0) && pwd`
USER_PM_DIR=".config/pm/$(basename $scriptdir)"

# foreach logged in user
for user in `users | grep -o "\S*" | sort -u`; do
    user_home=`getent passwd "${user}" | awk -F: '{print $6}'`

    # check user has a valid home-directory
    [ -d $user_home ] || continue

    user_pm_dir="$user_home/$USER_PM_DIR"
    # check for user-pm directory
    [ -d "$user_pm_dir" ] || continue

    # call run-parts as $user
    case "$1" in
        hibernate|suspend)
        su -c "run-parts --arg=\"$1\" \"${user_pm_dir}\"" "${user}"
        ;;
        thaw|resume)
        su -c "run-parts --reverse --arg=\"$1\" \"${user_pm_dir}\"" "${user}"
        ;;
        *) exit $NA ;;
    esac
done

Тогда это мой сценарий для удаления всех ключей из ssh-agent при приостановке / гибернации и повторно добавьте ключ, используемый для SparkleShare. Чтобы быть уверенным, он также проверяет другие ssh-agents и снимает с них все ключи.

#!/bin/sh

case "$1" in
    hibernate|suspend)
        if [ ! -z $SSH_AUTH_SOCK ] && [ -r $SSH_AUTH_SOCK ]; then
            ssh-add -D
        fi

        for SSH_AUTH_SOCK in `find /tmp/ssh-*/agent.* -user $USER`; do
            SSH_AUTH_SOCK=$SSH_AUTH_SOCK /usr/bin/ssh-add -D
        done
        ;;
    thaw|resume)
        if [ ! -z $SSH_AUTH_SOCK ] && [ -r $SSH_AUTH_SOCK ]; then
            /usr/bin/ssh-add -t 0 ~/.config/sparkleshare/2011-03-21_14h15.key
        fi

        for SSH_AUTH_SOCK in `find /tmp/ssh-*/agent.* -user $USER`; do
            SSH_AUTH_SOCK=$SSH_AUTH_SOCK ssh-add -t 0 ~/.config/sparkleshare/2011-03-21_14h15.key
        done

        ;;
esac