Existe uma maneira de executar um comando privilegiado após o login bem-sucedido do SSH (não necessariamente com shell ou PTY)?

3

Gostaria de executar um comando privilegiado em logins de SSH bem-sucedidos no final do servidor. No entanto, isso deve estar na configuração do servidor ( sshd_config ou qualquer outra coisa que não possa ser manipulada ou contornada pelo usuário), pois eu preciso que isso seja obrigatório. Isto é, por mais restrita que a conta do sistema seja usada, ela precisa ser capaz de manipular uma parte dos dados que requerem privilégios de superusuário (ou seja, usar ipset add condicionalmente - o qual eu posso criar scripts). Ah, e eu gostaria de poder acessar o conteúdo de SSH_CLIENT , por favor - apesar da execução privilegiada. O comando também não deve ser afetado por ChrootDirectory .

Estou ciente de /etc/ssh/sshrc , mas parece ser "do lado do cliente", ou seja, está sendo executado pelo usuário que está fazendo login na máquina.

Existe tal facilidade no OpenSSH? Estou usando a versão 6.6.

Além disso, a página man ( ssh(1) ) não é muito clara sobre sshrc :

/etc/ssh/sshrc Commands in this file are executed by ssh when the user logs in, just before the user's shell (or command) is started. See the sshd(8) manual page for more information.

Isso significa que ele também é executado sempre que comandos externos (via ForceCommand ) ou subsistemas como internal-sftp são chamados, apesar de restringir configurações como alocação de PTY ou forçar um chroot ? Se assim for, eu poderia recorrer a uma entrada /etc/sudoers restritiva se não houver outra maneira.

NB: não estou usando inetd por razões óbvias (consulte sshd(8) ) conforme descrito aqui .

    
por 0xC0000022L 21.05.2014 / 04:39

1 resposta

5

Você pode fazer isso usando o PAM e o módulo pam_exec.so .

Você simplesmente adiciona uma linha a /etc/pam.d/sshd à seção "sessão", como a seguir:

session    optional    pam_exec.so /usr/local/bin/ipset-ssh

Em que ipset-ssh é algum script criado por você.

O script será executado como root. Você pode obter o endereço IP do cliente com a variável PAM_RHOST . Você também desejará verificar a variável PAM_TYPE , pois seu script será executado no login e no logout. No login PAM_TYPE será definido como open_session . No logout, ele é definido como close_session .

Aqui está a lista completa de variáveis que recebo de um teste simples (coloquei env > /tmp/pamenv no script):

PAM_SERVICE=sshd
PAM_RHOST=127.0.0.1
GNOME_KEYRING_CONTROL=/home/phemmer/.cache/keyring-vJUUda
PAM_USER=phemmer
PWD=/
GNOME_KEYRING_PID=19742
SHLVL=1
PAM_TYPE=open_session
PAM_TTY=ssh
_=/usr/bin/env

Seu script pode ser tão simples quanto:

#!/bin/bash
[[ "$PAM_TYPE" == "open_session" ]] && ipset add whitelist $PAM_RHOST
    
por 21.05.2014 / 05:52