Executar programa sempre que alguém efetuar login via SSH em uma caixa do Linux


10

Eu tenho um pequeno servidor SSH e gostaria de escrever um script para executar sempre que alguém fizer login via SSH.

Agora, como eu faria isso?

Eu gostaria que o script fosse executado toda vez que NINGUÉM efetuasse login e preciso ter acesso a pelo menos o nome de usuário da pessoa que efetuou login e o endereço IP do qual a pessoa efetuou login.

Pensei em usar /etc/bash.bashrc, mas isso é uma boa solução? Por exemplo, existe uma maneira de um usuário desabilitar seu uso e, assim, desabilitar meu script? Se sim, quais são minhas outras opções?

Obrigado.


Isso só funcionará se o usuário usar o bash, é claro. Não funcionará se os usuários puderem selecionar seu próprio shell.
Paŭlo Ebermann

Respostas:


12

O mecanismo a ser usado depende de seus objetivos.

Se você deseja fornecer algo conveniente ou amigável para seus usuários, /etc/profileé razoável o suficiente se todos eles usarem o mesmo shell. Se você deseja que os comandos sejam executados apenas ao fazer login via ssh, coloque os comandos em /etc/ssh/sshrc. (Se você não se importa que os usuários substituam os comandos por seus próprios ~/.ssh/rcarquivos.)

Se você deseja forçar um usuário a executar um programa e apenas um programa , a ForceCommandopção descrita pelo DigitalRoss é uma boa abordagem. Pessoalmente, eu limitaria ainda mais o usuário a um sistema de controle de acesso obrigatório , como AppArmor , SELinux , TOMOYO ou SMACK , para garantir que o programa não permita que um usuário escape. Eu trabalhei no AppArmor por dez anos, então esse é o ferramenta que eu escolheria primeiro, mas os outros são ótimas ferramentas escritas por excelentes programadores.)

Se você deseja apenas que um programa execute e não incomode o usuário de forma alguma , a melhor abordagem é usar o pam_exec(8)módulo, que não pode ser ignorado, funciona independentemente do shell e oferece fácil capacidade de execução como usuário ou usuário conta do programa que está executando a autorização. A página de manual fornece o seguinte exemplo:

   Add the following line to /etc/pam.d/passwd to rebuild the
   NIS database after each local password change:

               passwd optional pam_exec.so seteuid make -C /var/yp

   This will execute the command

       make -C /var/yp

   with effective user ID.

Isso pode ser estendido para rodar em auth, account, password, e sessionações; provavelmente sessionseria melhor para executar após o login. Basta adicionar uma linha como:

session optional pam_exec.so log=/var/log/ssh_login_cmd /usr/local/bin/ssh_cmd

para o seu /etc/pam.d/sshdarquivo de controle.


Parece que o pam_execmódulo é exatamente o que estou procurando. Obrigado!
houbysoft

2
ATENÇÃO, se o comando que você executa sair com um código de saída diferente de zero, seu login falhará e você poderá ser bloqueado. Uma maneira de resolver isso é garantir que haja outra 'sessão opcional' chamada com um módulo diferente que sempre tenha êxito.
Gflarity

4

As versões recentes do OpenSSH têm um recurso de servidor chamado ForceCommand que dá controle a um script em vez da operação (scp, ssh, ...) que o usuário pretendia. O script é passado ao comando original; portanto, você provavelmente poderá encadear depois de fazer o que precisar.

Do sshd_config (5):

ForceCommand

Força a execução do comando especificado pelo ForceCommand, ignorando qualquer comando fornecido pelo cliente e ~ / .ssh / rc, se presente. O comando é chamado usando o shell de login do usuário com a opção -c. Isso se aplica à execução de shell, comando ou subsistema. É mais útil dentro de um bloco de correspondência. O comando originalmente fornecido pelo cliente está disponível na variável de ambiente SSH_ORIGINAL_COMMAND. A especificação de um comando de `` internal-sftp '' forçará o uso de um servidor sftp em processo que não requer arquivos de suporte quando usado com o ChrootDirectory.

Eu usei isso uma vez para substituir o scp e fornecer o upload seguro de gemas sem dar a todos os usuários autorizados a fazer upload de acesso interativo às gemas que eles não precisavam ou queriam.


3

Uma maneira seria usar o syslog-ng como um daemon syslog e configurá-lo para executar um plano de fundo de script sempre que uma determinada entrada de log (como um login ssh bem-sucedido) corresponder.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.