
eu quero prevenirinterativoenão interativologin ssh baseado em uma lógica condicional. Preciso testar o nome de usuário e dar uma mensagem de erro.
Pessoas que utilizam sftp (ssh não interativo) também devem ser submetidas ao teste de sorte.
Como eu implementaria isso? Tenho controle total do sistema.
Tentei usar o sshd ForceCommand, mas de acordo comhttps://stackoverflow.com/a/33714333/746461não funciona para notty.
Não estou familiarizado com o PAM e duvido que o PAM possa gerar uma mensagem de erro personalizada caso o login seja interativo.
https://linuxhint.com/understanding_bash_shell_configuration_startup/diz que o shell de login não interativo com --noprofile
opção pode ignorar todos os arquivos de configuração do bash. É por isso que não posso escrever minha lógica lá.
Responder1
Eu descobri. Posso implementar um módulo PAM para fazer isso.
Salve o seguinte em, digamos, arquivo /root/checkConnections
.
#! /bin/bash
limit=$1
c=$(pgrep -xcu $PAM_USER sshd)
if [[ $c -ge "$limit" ]]; then
echo "Max $limit ssh connections allowed, but you have $c."
exit 1
fi
Então em /etc/pam.d/sshd, adicione
session required pam_exec.so stdout /root/checkConnections 5
pam_exec.so
executa o script de shell e stdout
envia mensagens para o usuário terimal.
Quando a condição falha, o efeito é assim.
$ ssh localhost
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-74-generic x86_64)
94 updates can be installed immediately.
0 of these updates are security updates.
To see these additional updates run: apt list --upgradable
Max 5 ssh connections allowed, but you have 5.
/root/checkConnections failed: exit code 1
Last login: Thu Jun 24 12:19:27 2021 from 172.18.33.67
Connection to localhost closed.