Em nossos servidores Debian, quero garantir que todas as conexões SSH expirem e sejam desconectadas após 8 horas. Isso foi recomendado pelo nosso consultor de segurança.
Eu executei estas etapas:
# Log in as root then:
sudo vi /etc/ssh/sshd_config
# Use / to search for and change:
ClientAliveInterval=3600
ClientAliveCountMax=8
# Second parameter is number of hours before connection times out and drops.
# Then test config:
sudo sshd -t
# Restart
sudo systemctl restart sshd
No entanto, os testes falharam. Quando eu configurei e reiniciei temporariamente ClientAliveInterval=120
o ClientAliveCountMax=2
daemon sshd, esperaria que a conexão caísse após 4 minutos de inatividade. No entanto, isso não aconteceu.
Alguma ideia?
OpenSSH
sshd_config
Palavras-chave de configuração corretas desde OpenSSH 9.2 (Debian 12)
O OpenSSH 9.2 (2 de fevereiro de 2023) introduziu novos recursos para sessões inativas.
Durante as oito horas nesta questão, por exemplo,
Onde:
*=8h
monitora todos os canais separadamente. Se você quiser que a atividade em qualquer canal redefina o tempo limite, use a palavra-chave especialglobal=8h
.UnusedConnectionTimeout
é definido para um minuto para encerrar a conexão logo após o último canal ter sido fechado.Para OpenSSH <9.2, isso deve ser feito por outros meios.
As palavras-chave de configuração usadas são para sessões que não respondem
O
ClientAliveInterval
não monitora a inatividade , mas sim se o cliente ainda está respondendo .A documentação para
ClientAliveCountMax
pode ajudar a entender isso:📜 Uma nota histórica: antes do OpenSSH 8.2 (14 de fevereiro de 2020), ele
ClientAliveCountMax
funcionava de maneira diferente com o0
, tendo o efeito colateral de que poderia ter sido usado para encerrar conexões ociosas. Do registro de alterações:⚠️ No entanto, esta instrução enganosa foi repetida em toda a Internet :
Destes, apenas o Gite tinha o
ClientAliveCountMax=0
que poderia ter funcionado antes de 2020, mas isso conta? Afinal, o artigo provavelmente foi escrito em 2021... Me pergunto se alguém leu a documentação ou está ocupado copiando e colando postagens de outros blogs. 🤦♂️Discussão aprofundada sobre alternativas
Scripting – tome cuidado para detectar a inatividade corretamente
Hayden James dá um exemplo de automatização do processo com um script . No entanto, usar esse script é perigoso, pois pode encerrar sessões SSH que estão em uso ativo. O script obtém o "tempo ocioso" de
ps -eo pid,etimes,comm
ondeetimes
não mostra o tempo ocioso do processo, mas sim o tempo total que ele esteve em execução. De ps(1) :Satish Kumar sugere usar
who
para lista de usuários ativos e a quinta colunaw -h
para detectar inatividade. No entanto, este script também tem algumas falhas:2.00s
como7:51m
ou5days
. O[[ "$idle" -gt "1800" ]];
não analisa isso corretamente.screen
,tmux
) e outros processos que se destinam a viver fora de uma sessão SSH ativa.A detecção da inatividade deverá ser bem mais precisa, assim como a seleção do processo a ser eliminado.
Esta abordagem poderia funcionar:
who
.stat
para obter o horário do último acesso do dispositivo TTY (veja a resposta do Celada ). Isso pode ser convertido diretamente em idade em segundos:pgrep
para localizarsshd
processos para os TTYs oupkill
para eliminá-los.Tudo junto (mais completo
find-inactive-ssh-sessions.sh
em oh2fih/ Misc-Scripts ):Recursos integrados em shells
Como menciona Vivek Gite , os shells possuem recursos para desconectar automaticamente o usuário após um período de inatividade. Isso pode funcionar se não houver necessidade de forçar o logout, pois o usuário poderá alterar essas configurações.
TMOUT
variável de ambiente parabash
,zsh
&ksh
.autologout
configurando emtcsh
&csh
.Se você configurá-los através, por exemplo, de
/etc/profile.d/
, eles afetarão todas as sessões. No entanto, você também pode usar recursossshd_config
para configurá-los:SetEnv
&ForceCommand
. Por exemplo,De onde vem a recomendação?
O conselho provavelmente é baseado, por exemplo, no NIST 800-171 Revisão 2 :
Você deve decidir o que é mais importante para você: impedir que alguém use a conexão sem permissão ou a confiabilidade das conexões de gerenciamento. O uso não autorizado poderia ser evitado por outros meios? Por exemplo, as conexões SSH poderiam ser limitadas apenas aos computadores da empresa e os computadores da empresa poderiam ser forçados a serem bloqueados por inatividade?