Respostas:
Sim, basta usar /bin/false
como shell e instruir o usuário a iniciar o processo SSH de tunelamento sem executar nenhum comando remoto (ou seja, o -N
sinalizador para OpenSSH):
ssh -N -L 1234:target-host:5678 ssh-host
/bin/false
como shell, não terá acesso ao shell, pois todas as sessões de login serão encerradas imediatamente.
No arquivo .ssh / allowed_keys do usuário, coloque algo como o seguinte:
permitopen="192.168.1.10:3306",permitopen="10.0.0.16:80",no-pty ssh-rsa AAAAB3N...
Então, basicamente, os controles estariam na frente da chave pública ssh do usuário, separados por um espaço. No exemplo, as conexões que usam a chave pública específica poderão fazer o encaminhamento de porta SSH apenas para o servidor MySQL do 192.168.1.10 e o servidor da Web 10.0.0.16, e não receberão um shell (no-pty). Você está perguntando especificamente sobre a opção "no-pty", mas as outras também podem ser úteis se o usuário precisar apenas fazer um túnel para servidores específicos.
Consulte a página de manual do sshd para obter mais opções para o arquivo allowed_keys .
Observe que a experiência do usuário pode parecer um pouco estranha: quando ele entra, parece que a sessão está interrompida (pois não está recebendo um arquivo). Isso está ok. Se o usuário especificou o encaminhamento de porta com, por exemplo, "-L3306: 192.168.1.10: 3306", o encaminhamento de porta ainda estará em vigor.
De qualquer forma, tente.
no-pty
não impede o acesso ao shell, apenas não fornece um pty ao shell. Ele não exibe o prompt (ou seja, "parece travar"), mas você ainda pode dar comandos perfeitamente. Você precisa da command="..."
opção .ssh/authorized_keys
se deseja restringir o acesso ao shell a partir daí.
Dê ao usuário um shell que permita que ele efetue logout, como /bin/press_to_exit.sh
#! / bin / bash read -n 1 -p "Pressione qualquer tecla para sair"
Dessa forma, ele pode permanecer conectado o tempo que quiser, com os túneis ativos, mas sem executar nenhum comando. Ctrl-c
fecha a conexão.
Atribua um shell que não permita que o usuário efetue login.
por exemplo
#!/bin/sh
echo "No interactive login available."
sleep 60
exit 0
impediria que eles recebessem um prompt de shell e desse um tempo limite de 60 segundos - se não houver conexão ativa por 60 segundos, ela será encerrada e, portanto, desconectada completamente (aumente o número de acordo com os requisitos).
Eles também não podem executar um comando remoto, porque esse shell não permite.
logout
" em um normal.
/sbin/nologin
, que você pode personalizar com uma mensagem amigável /etc/nologin.txt
.
Minha solução é fornecer ao usuário que só pode estar encapsulando, sem um shell interativo , definir esse shell em / etc / passwd como / usr / bin / tunnel_shell .
Basta criar o arquivo executável / usr / bin / tunnel_shell com um loop infinito .
Além disso, use as opções AllowGroups
e Match Group
.
Totalmente explicado aqui: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
-N
, ele terá acesso ao shell. Isso realmente não resolve o problema e é perigoso.