Você pode usar o PAM para isso. A configuração do PAM para o serviço SSH está em /etc/pam.d/sshd
. Para executar um comando antes de qualquer coisa no processo de login, adicione algo como:
auth [default=ignore] pam_exec.so /path/to/some/script
Por exemplo, se eu usar /usr/local/bin/foo.sh
contendo:
#! /bin/sh
cat <<EOF >>/tmp/log
PAM_RHOST $PAM_RHOST
PAM_RUSER $PAM_RUSER
PAM_SERVICE $PAM_SERVICE
PAM_TTY $PAM_TTY
PAM_USER $PAM_USER
PAM_TYPE $PAM_TYPE
EOF
E então eu faço ssh muru@localhost
, eu recebo:
$ cat /tmp/log
PAM_RHOST localhost
PAM_RUSER
PAM_SERVICE sshd
PAM_TTY ssh
PAM_USER muru
PAM_TYPE auth
Isso não acontece antes que o prompt de senha seja exibido, mas auth
modules são os primeiros executados depois que a senha é digitada - eles verificam se o usuário está autenticado, afinal de contas:
authentication - authenticate a user and set up user credentials.
Typically this is via some challenge-response request that the user
must satisfy: if you are who you claim to be please enter your
password. Not all authentications are of this type, there exist
hardware based authentication schemes (such as the use of smart-cards
and biometric devices), with suitable modules, these may be substituted
seamlessly for more standard approaches to authentication - such is the
flexibility of Linux-PAM.
Portanto, com efeito, auth
modules são executados antes do login e se o primeiro auth
module for pam_exec
, essa é praticamente a primeira coisa a ser executada.
Observe a [default=ignore]
parte - como os módulos auth
autenticam o usuário, não queremos que o status de saída do script signifique algo. default=ignore
diz ao PAM para ignorar o valor de retorno de pam_exec
, qualquer que seja, o que, por sua vez, depende do status de saída do script. Veja man pam.d
para mais detalhes.
Advertências:
- Isso não é executado se o usuário simplesmente sair antes de digitar qualquer senha.
- Isso não é executado se o usuário tiver uma senha vazia (a configuração SSH padrão tem
PermitEmptyPasswords no
, portanto, o SSH rejeita essas informações). - O SSH precisa ter
UsePAM yes
para usar o PAM.