Bem, na verdade sou um idiota, o módulo pam_exec.so
está perfeitamente bem para criar condicionais do PAM.
Tim Smith estava correto ao avaliar que os dois testes no meu script /etc/security/deny-ssh-user.sh
NUNCA estavam definindo a variável SSH_SESSION
como true. Eu não levei isso em consideração porque o script funciona em um shell normal, mas o contexto do ambiente é removido quando executado por pam_exec.so
.
Acabei de reescrever o script para usar o utilitário last
exatamente como seu exemplo, no entanto, tive que alterar alguns deles porque os comutadores de last
diferem do Arch Linux para o RedHat.
Aqui está o script revisado em /etc/security/deny-ssh-user.sh:
#!/bin/bash
# Returns 1 if the user is logged in through SSH
# Returns 0 if the user is not logged in through SSH
SSH_SESSION=false
function isSshSession {
local terminal="${1}"
if $(/usr/bin/last -i |
/usr/bin/grep "${terminal}" |
/usr/bin/grep 'still logged in' |
/usr/bin/awk '{print $3}' |
/usr/bin/grep -q --invert-match '0\.0\.0\.0'); then
echo true
else
echo false
fi
}
function stripTerminal {
local terminal="${1}"
# PAM_TTY is in the form /dev/pts/X
# Last utility displays TTY in the form pts/x
# Returns the first five characters stripped from TTY
echo "${terminal:5}"
}
lastTerminal=$( stripTerminal "${PAM_TTY}")
SSH_SESSION=$(isSshSession "${lastTerminal}")
if "${SSH_SESSION}"; then
exit 1
else
exit 0
fi
Conteúdo do /etc/pam.d/sudo
....
auth [success=ok default=1] pam_exec.so /etc/security/deny-ssh-user.sh
auth sufficient pam_module_to_skip.so
....