Como forçar o sudo a sempre solicitar uma senha depois de acordar da suspensão?

15

Digamos que eu execute um comando com sudo, então, se eu usá-lo sudonos próximos 15/5 minutos (não sei por quanto tempo ele me lembra), ele não solicitará uma senha. Isso só vai me alertar novamente se eu não usá-lo por pelo menos esse tempo.

No entanto, se eu suspender minha máquina, ativá-la e efetuar o login antes que esse período termine, posso executar um sudocomando novamente e ele não solicitará minha senha, porque não deixei que fosse pelo valor certo de tempo.

Então, como posso fazê-lo para que, não importa quanto tempo eu não usei sudo, ele definitivamente solicitará uma senha após a suspensão, depois que eu fizer login novamente, mesmo se eu ainda estiver dentro desse período em que o 15/5 minutos de não usar sudoainda não passaram?

A coisa mais provável que funcionará é fazê-lo executar um comando para remover todos os caches de identidade sudoapós a execução de um determinado comando que é executado na ativação.

Estou executando o Ubuntu GNOME 15.10 com o GNOME 3.18.


fonte
1
boa pergunta, mas por que você é paranóico? porque se a pessoa que não seja você sabe sua senha de login não pode ser parado de usarsudo
Edward Torvalds
Se você sair da janela do terminal, precisará digitar sua senha novamente quando abrir uma nova janela do terminal, independentemente da rapidez com que fizer isso. Se você estiver executando algo em uma janela de terminal, adicione `; exit` e a janela será fechada quando o comando for concluído.
Marc
@ Marc: Eu sei, mas nem sempre é conveniente sair, nem fazer manualmente sudopedir na próxima vez. Uma solução automática seria preferida.
@edwardtorvalds: Bem, eu poderia entrar novamente e depois ir embora (não que eu faça isso com muita frequência); então, quando alguém vier, seria ruim se eles pudessem usar sudo. Sei que isso soa um pouco estranho para o meu próprio computador, mas eu poderia estar fazendo algum trabalho de manutenção em outro computador Ubuntu e, quando eu reconectar o usuário novamente, pode ser inconveniente fechar o Terminal, mas não o faço. quer que eles tenham sudodireitos.
1
Anexando `; exit` (sete pressionamentos de teclas) parece bem fácil para mim. De que tipos de manutenção você se afasta, porque não consigo pensar em muita coisa, eu me arriscaria a suspender no meio.
Marc

Respostas:

19

De man sudo:

     -K, --remove-timestamp
                 Similar to the -k option, except that it removes the user's
                 cached credentials entirely and may not be used in conjunc‐
                 tion with a command or other option.  This option does not
                 require a password.  Not all security policies support cre‐
                 dential caching.

Então, o que você deseja é que seu usuário execute sudo -Ksempre que o sistema for suspenso.

Ubuntu 15.04+ (systemd)

Isso pode ser feito no Ubuntu 15.04+, colocando um script no /lib/systemd/system-sleep/.

  1. Executar sudo nano /lib/systemd/system-sleep/disable_sudo_user(substitua userpelo nome de usuário do usuário por conveniência);
  2. Cole o seguinte script (substitua userpelo nome de usuário do usuário):
#!/bin/sh
case $1/$2 in
    pre/suspend)
        su user -c 'sudo -K'
        ;;
esac
  1. Hit CTRL+ O, ENTERe CTRL+ X;

  2. Corra sudo chmod o+x /lib/systemd/system-sleep/disable_sudo_user;


Para habilitar isso também para hibernação / sono híbrido, use este script:

#!/bin/sh
case $1 in
    pre)
        su user -c 'sudo -K'
        ;;
esac

Versões anteriores do Ubuntu (Upstart)

Isso pode ser feito nas versões anteriores do Ubuntu, colocando um script no /etc/pm/sleep.d/.

  1. Executar sudo nano /etc/pm/sleep.d/disable_sudo_user(substitua userpelo nome de usuário do usuário por conveniência);
  2. Cole o seguinte script (substitua userpelo nome de usuário do usuário):
#!/bin/sh
case $1 in
    suspend)
        su user -c 'sudo -K'
        ;;
esac
  1. Hit CTRL+ O, ENTERe CTRL+ X;

  2. Corra sudo chmod o+x /etc/pm/sleep.d/disable_sudo_user;


Para habilitar isso também para hibernação, use este script:

#!/bin/sh
case $1 in
    suspend|hybernate)
        su user -c 'sudo -K'
        ;;
esac
kos
fonte
2
Teria sido mais engraçado se você usasse sudo -u user sudo -k. : D
muru
@muru pensamento o mesmo, mas por alguma razão ele parecia um pouco bobo: D
kos
Desculpe, não escrevi nenhum código de shell por um tempo, o que exatamente isso pre/*)faz? :)
@ParanoidPanda Acabou, veja a atualização. Veja aqui (Descrição, segundo parágrafo): systemd-suspend.servicechama os scripts /lib/systemd/system-sleep/passando dois argumentos; $1ou é prepara os eventos pré-sono ou postpara eventos pós-sono, e $2ela quer suspend, hybernateou hybrid-sleep; pre/*foi criado para capturar todas as combinações de pre/e qualquer um de suspend, hybernateou hybrid-sleep, mas desde que você pediu explicitamente a suspensão, mudei para pre/suspend.
kos
1
Vale ressaltar que você também pode fazer isso no ubuntu antigo, é apenas o mecanismo que é diferente, ou seja, usar /etc/pm/sleep.dscripts.
Hbbs
3

Só se você é paranóico! Você pode usar a -Kopção de sudo.

-K, --reset-timestamp
       When used without a command, invalidates the user's cached credentials.  
       In other words, the next time sudo is run a password will be required.  
       This option does not require a password and was added to allow a user to revoke
       sudo permissions from a .logout file.

       When used in conjunction with a command or an option that may require a 
       password, this option will cause sudo to ignore the user's cached credentials.  
       As a result, sudo will prompt for a password (if one is required by the 
       security policy) and will not update the user's cached credentials.

       Not all security policies support credential caching.

por exemplo,

sudo -K <command>

Ou você pode simplesmente deixar seu computador em uma caixa de metal protegida por robôs :)

Edward Torvalds
fonte
Hmm ... Não exatamente como eu quero, não há como automatizar isso? Como isso sugere que eu definitivamente sei que estou prestes a suspender, e se um comando estiver sendo executado sudoe eu precisar ir a algum lugar, suspendo a máquina, quando voltar e desmontar a máquina, terei que esperar para que o comando ou o tempo termine antes que eu possa solicitar uma senha da próxima vez? Seria muito mais útil por vários motivos (incluindo o fato de que, quando estou executando-o com uma GUI em um nível de execução diferente, ele não solicita uma senha após a suspensão) para que seja automatizado.
Além disso, acho que você quer dizer -Ke não -k.
Bem, pode ser mais útil de qualquer maneira.
1

Ainda outro método

Digite 'sudo visudo'

Vá para a linha que diz: 'Padrões env_reset'

e mude para:

'Padrões env_reset, timestamp_timeout = 0

Salve o arquivo.

Ao definir o tempo limite como 0, o sistema solicitará a senha sempre.

Edgar Naser
fonte
Enquanto isso faz (tecnicamente falando) realizar o que o OP está pedindo, é um exagero para a maioria das situações. Dito isto, se você é realmente paranóico (ou apenas deseja uma etapa extra para pausa e contemplação toda vez que faz algo potencialmente perigoso), essa pode ser uma alternativa viável.
um CVn