每个通常使用ssh-agent和私钥。 一切正常。
我的问题是,关于从ssh-add冲洗密钥的最佳实践,比如睡眠,暂停,hibernate等等。我曾经想过为这些命令写一个简单的包装,但是后来想知道他们是否被称为? 还是内核直接启动这个活动? PM公用设施是严格的用户区吗?
我想这个额外的安全层以外locking我的屏幕等,并想知道如果有人已经解决了这个优雅或有最佳做法推荐。 谢谢。
您可能可以让用户守护进程侦听通过D-Bus进行的状态更改。 看起来gnome-power-manager并没有公开任何信号,但是你可以从hal或者DeviceKit-power / upower中获得一些东西。
我有一个小小的脚本,为暂停/hibernate,恢复/解冻每个login用户运行用户定义的脚本。 我用它来杀死或重新启动进程,而这些进程的performance不如暂停。 用户可以在~/.user-pm创build脚本,这些脚本在恢复时按照暂停和相反的顺序按照字典顺序运行。 $1有pm操作名称。
你可以简单地添加一个在suspend / hibernate中调用“ ssh-add -D ”的用户脚本。 (你必须在某处查找SSH_AUTH_SOCK ,但是我认为你需要任何解决scheme)。
这里是全球性的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”,则需要确认每次使用。 这不如在暂停时从代理中删除密钥,如果您还locking了屏幕,它可能会有类似的效果,因为直到您login才能确认密钥的使用。
在过去,我通过运行一个简单的脚本来完成这个关键的移除,每隔几秒就会唤醒一次,并寻找locking屏幕的程序,如果发现它会执行“ssh-add -D”。 然后一旦消失,它会再次调用“ssh-add -c”来询问密码。 当我暂停或离开键盘时,我最终转而依靠确认和屏幕locking。
这是另一个间接的解决scheme,不涉及从代理刷新注册的身份/密钥,但会lockingssh-agent一样有用( ssh-add -x )? 我不确定这个方法是多么的安全(当然没有把代理移除的安全性),但是我认为这个特性的实现是为了在这种情况下提供这种附加的安全性。
感谢@Greg的回答,我冒昧地扩展它,使其更加“freedesktop”兼容,因为pm-utils是一个freedesktop.org项目。
这个脚本现在可以在config.d , power.d和sleep.d使用一个副本或一个符号链接。 然后,它会查找脚本在~/.config/pm/使用与/etc/pm相同的文件夹名称( config.d , power.d和sleep.d )。
#!/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
然后,这是我的脚本,在挂起/hibernate时从ssh-agent删除所有密钥,并重新添加用于SparkleShare的密钥。 可以肯定的是,它也检查其他的ssh-agent并从中删除所有的密钥。
#!/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