Como um processo de host SSH pode detectar quais portas foram encaminhadas pelo cliente (-R não -L)

4

(Eu não posso decidir entre postar isso aqui ou no SuperUser, mas como isso é para um propósito de sysadmin, isso parece um ajuste melhor)

Eu tenho uma situação em que os clientes SSH solicitarão uma porta usando a opção -R do SSH. No momento da conexão, quero poder registrar em quais portas eles foram encaminhados.

Eu planejo fazer isso forçando um comando em particular para executar ( command=my-command no arquivo authorized_keys , isto é) que fará esse registro e então executará o comando original (login ou usuário especificado).

A única maneira que eu encontrei para fazer isso até agora requer correr sudo e parece bastante hacky:

sudo lsof [email protected] -Fn -p12345 | grep "^n" | grep -v '\->' | awk -F: '{print $NF}' | sort | uniq * em que 12345 é o ID do processo do sshd que está manipulando essa conexão (ou seja, o processo pai de qualquer script que eu execute para verificar isso.

Existe algo mais elegante (a la as variáveis de ambiente SSH_* que são configuradas para outras informações de conexão) disponível para mim?

* Para os curiosos, a primeira parte do comando obtém todas as portas de rede ligadas à interface local ( [email protected] ) e ( -a ) pertencentes ao processo 12345 ( -p12345 ) e as formata para máquina legibilidade ( -Fn ). Os sinalizadores -P e -n fazem com que ele forneça os números de porta brutos e os endereços de rede. A segunda parte ( grep "^n" ) me devolve apenas as informações da rede. A próxima parte ( grep -v '\->' ) elimina as conexões estabelecidas (deixando as portas "ouvintes"). A próxima parte ( awk -F: '{print $NF}' ) usa awk para obter o último campo separado por ':', dando-me a porta (não uso cortar aqui porque para uma conexão IPv6, o número do campo pode mudar). As duas últimas partes me dão uma lista única de portas. Eu coloquei esta explicação aqui porque lsof é um comando fantástico para saber, e todos deveriam.

    
por Bo Jeanes 26.12.2011 / 01:51

2 respostas

1

Você pode definir o nível de log do sshd como DEBUG1 e, em seguida, fazer o grep dos logs. Você estará procurando por uma linha como:

Dec 25 21:40:25 d34dh0r53 sshd[21963]: debug1: Local forwarding listening on ::1 port 8085.

Dependendo de qual arquivo de registro você usa e das permissões que você não precisa ser root, leia-o.

    
por 26.12.2011 / 04:46
1

ssh ~ keys?

~ # Lista de conexões encaminhadas.

    
por 26.12.2011 / 20:26