Redirecionando o SSH no login, no entanto o SFTP não funciona

3

Estou tentando configurar um proxy SSH para nossos usuários usando uma caixa de depósito automática. O usuário efetua login e obtém automaticamente o SSHed em seu contêiner / vm, o que funciona muito bem. Lamentavelmente, SFTP que encosta sobre ele não. Tenho certeza de que isso tem a ver com a forma como o configurei, já que é basicamente apenas o retorno do canal e não o tunelamento corretamente.

/ etc / passwd

redtest:x:1002:1002::/home/redtest:/usr/bin/redtest

/ usr / bin / redtest

#!/bin/bash
/usr/bin/ssh redtest -t -F ~/.ssh/config

/home/redtest/.ssh/config

Host redtest
        HostName redtest1
        User root
        IdentityFile ~/.ssh/id_rsa

Qual é a maneira correta de definir algo assim, ou isso é possível? Os logins são um para um com os contêineres. Aprecie um empurrão na direção certa!

    
por sashman13 16.06.2015 / 22:43

1 resposta

4

Quando um cliente ssh remoto solicita a execução de um comando no servidor, o servidor OpenSSH inicia o shell do usuário local com a opção "-c" para executar o comando. Corre o equivalente disso:

$SHELL -c 'the requested command'

Por exemplo, se o usuário remoto executou:

ssh user@somehost 'rm -rf /'

e "user @ somehost" tinham /bin/bash como seu shell, então o servidor executaria o equivalente a:

/bin/bash -c 'rm -rf /'

O SFTP é um pouco mais complicado, mas você acaba no mesmo lugar. O cliente remoto solicita que o servidor execute o subsistema "sftp". No arquivo sshd_config do servidor, você provavelmente tem uma linha como esta:

Subsystem sftp /path/to/sftp-server

Essa linha diz "Quando um cliente solicita o subsistema 'sftp', execute / path / to / sftp-server" sftp-server é um programa incluído no OpenSSH que implementa a parte do servidor do protocolo SFTP. Então, quando um cliente ssh se conecta e solicita o subsistema sftp, o servidor acaba rodando:

$SHELL -c /path/to/sftp-server

(Há um caso especial chamado "internal-sftp" que não vou entrar aqui.)

Agora, você escreveu um script chamado /usr/bin/redtest e definiu como o shell do usuário. Assim, quando um usuário remoto tentar executar o sftp, o servidor será executado:

/usr/bin/redtest -c /path/to/sftp-server

Seu script redtest ignora sua linha de comando e apenas inicia uma sessão ssh simples no servidor de destino. Ele nunca executa o programa sftp-server no servidor de destino.

Para fazer isso funcionar, você precisa fazer o teste de inicialização sftp-server no host de destino quando o redtest for executado dessa maneira. Se você não é muito exigente sobre o que o usuário executa no host de destino, algo assim deve funcionar:

#!/bin/bash
if [ "$1" = "-c" ]
then
    /usr/bin/ssh redtest -F ~/.ssh/config "$2"
else
    /usr/bin/ssh redtest -t -F ~/.ssh/config
fi

Isso passará por qualquer comando solicitado pelo cliente, não apenas pelo sftp. Isso não deve ser um problema, já que os usuários aparentemente têm acesso de linha de comando de raiz aos servidores de destino de qualquer maneira.

Você pode encontrar um problema aqui se o host de salto e o host de destino não tiverem o programa sftp-server no mesmo lugar. O servidor ssh no host de salto tentará executar o sftp-server usando o caminho da configuração do host de salto, que pode não estar correto para o host de destino. Você terá que certificar-se de que sftp-server possa ser invocado no host de destino, usando o caminho no sshd_config do host de salto.

Se você quiser tornar o script redtest mais sofisticado, pode fazer com que ele execute algo assim quando o usuário remoto tentar executar o sftp:

/usr/bin/ssh redtest -F ~/.ssh/config -s sftp

Os argumentos -s e sftp solicitam especificamente a execução do subsistema sftp no host de destino.

    
por 17.06.2015 / 00:17