Como posso liberar minhas chaves ssh na atividade de gerenciamento de energia?

5

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.

    
por Sam Halicke 09.11.2010 / 15:24

5 respostas

4

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.

    
por 09.11.2010 / 15:34
2

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

    
por 01.01.2011 / 05:42
1

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.

    
por 14.11.2010 / 22:59
0

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.

    
por 13.12.2010 / 07:48
0

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
    
por 09.07.2014 / 01:26