Você pode ter um daemon de usuário para ouvir a mudança de status no D-Bus. Parece que o gnome-power-manager não expõe nenhum sinal para isso, mas você pode conseguir algo do hal ou DeviceKit-power / upower.
Usando ssh-agent
e chaves privadas de acordo com o habitual. Tudo está funcionando normalmente.
Minha pergunta diz respeito às melhores práticas em liberar as chaves de ssh-add
em atividades como sleep, suspend, hibernate, etc. Pensei em escrever um simples wrapper em torno desses comandos, mas depois me perguntei se eles são chamados? Ou o kernel inicia esta atividade diretamente? Os utilitários de PM são estritamente usuários?
Eu gostaria dessa camada adicional de segurança além de bloquear minha tela, etc. e queria saber se alguém resolveu isso com elegância ou se tem práticas recomendadas para recomendar. Obrigado.
Eu tenho um pequeno script pm
que executa os scripts definidos pelo usuário para cada usuário logado em suspender / hibernar, continuar / descongelar. Eu usei isso para matar ou reiniciar processos que não se comportam bem durante a suspensão. O usuário pode criar scripts em ~/.user-pm
, que são executados em ordem lexicográfica na suspensão e na ordem inversa no currículo. $1
tem o nome da operação do pm.
Você pode simplesmente adicionar um script de usuário que chame " ssh-add -D
" no suspender / hibernar. (você terá que procurar o SSH_AUTH_SOCK
em algum lugar, mas eu suponho que você precisaria disso para qualquer solução).
Este é o gancho global 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
Eu estou no Ubuntu - isso deve funcionar para o Debian também - caso contrário, YMMV
Se você adicionar sua chave usando a opção "-c" para "ssh-add", será necessário confirmar cada uso. Isso não é tão bom quanto remover a chave do seu agente na suspensão, se você também bloquear sua tela, isso pode ter um efeito semelhante, já que o uso da chave não pode ser confirmado até você fazer o login.
No passado, eu realizava essa remoção de chave executando um script simples que acordava a cada poucos segundos e procurava pelo programa que bloqueia a tela e, se fosse encontrado, faria o "ssh-add -D". Então, uma vez que ele fosse embora, invocaria o "ssh-add -c" novamente para me pedir a senha. Acabei mudando para confiar apenas na confirmação e no bloqueio de tela quando suspendo ou saio do teclado.
Esta é outra solução indireta que não envolve liberar identidades / chaves registradas do agente, mas bloquear o ssh-agent seria tão útil ( ssh-add -x
)? Não tenho certeza de como esse método seria seguro (certamente não é tão seguro quanto remover as chaves do agente), mas presumo que esse recurso tenha sido implementado para oferecer o tipo de segurança adicional que você está procurando nessa situação.
Obrigado @Greg pela sua resposta, tomei a liberdade de expandi-lo para torná-lo mais compatível com o "freedesktop", já que o pm-utils é um projeto do freedesktop.org.
Este script agora funcionará em config.d
, power.d
e sleep.d
com uma cópia ou um symlink. Em seguida, ele procurará que os scripts sejam executados em ~/.config/pm/
usando os mesmos nomes de pastas ( config.d
, power.d
e sleep.d
) como /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
Este é o meu script para remover todas as chaves do ssh-agent
no suspend / hibernate e adicionar novamente uma chave usada no SparkleShare. Só para ter certeza, ele também verifica outros ssh-agent
s e remove todas as chaves deles.
#!/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