22 exemplos de uso do SSH no Linux

ssh

O comando SSH poderá auxiliar a resolver muitos problemas no dia a dia de um usuário comum ou administrador de sistemas, sendo possível utilizar nos mais diversos sistemas operacionais, tais como, Linux, UNIX, macOS e Windows. Neste post, mostraremos 22 dicas utilizando o SSH.

O primeiro passo é definir o que é Secure SHell. O SSH (Secure SHell) é um protocolo que permite a você acessar virtualmente o servidor como se você estivesse em um terminal. A diferença entre o telnet e o SSH está na segurança. Toda a transmissão de dados no SSH é criptografada, impedindo que hacker consiga capturar as informações trafegadas, incluindo login e senha.

Quando você conecta via terminal remoto com seu servidor, você está controlando aquele servidor a partir de seu sistema operacional. Qualquer comando que você digitar é executado no servidor (e não no seu PC) e você o opera conforme os parâmetros de comandos do servidor.

Guia completo com 22 dicas utilizando o SSH para auxiliar o seu trabalho:

  1. SSH Socks Proxy
  2. Tunelamento (encaminhamento de porta)
  3. Encaminhamento de túnel SSH para host remoto secundário
  4. Túnel Reverso
  5. Proxy Reverso
  6. Estabeleça uma VPN sobre SSH
  7. Copie sua chave SSH (ssh-copy-id)
  8. Execute o comando remotamente (não interativo)
  9. Captura remota de pacotes e exibição no Wireshark
  10. Copiar pasta local para o servidor remoto
  11. Aplicativos GUI remotos com encaminhamento SSH x11
  12. Copie arquivos remotamente com rsync e SSH
  13. SSH na rede Tor
  14. Instância SSH para EC2
  15. Edite arquivos de texto com o VIM sobre ssh / scp
  16. Monte o local SSH remoto como pasta local com o SSHFS
  17. SSH Multiplex usando o ControlPath
  18. Stream de vídeo sobre SSH usando VLC + SFTP
  19. Autenticação de dois fatores
  20. Saltando através de hosts de salto com -J
  21. Bloquear tentativas de força bruta com iptables
  22. Modifique o encaminhamento de porta em uma sessão com ~ C

1. Tráfego de proxy sobre SSH usando SOCKS

O recurso Proxy SSH foi colocado no número 1 por um bom motivo. É mais poderoso do que muitos imaginam, fornecendo acesso a qualquer sistema que o servidor remoto possa acessar, usando qualquer aplicativo. O cliente ssh pode encapsular o tráfego pela conexão usando um servidor proxy SOCKS. Uma coisa importante a entender é que o tráfego para os sistemas remotos terá uma fonte do servidor remoto. Por exemplo, em um arquivo de log do servidor da web.

Terminal
ssh -D 8888 usuario@servidor
netstat -pan | grep 8888
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/ssh

Aqui, iniciamos o servidor proxy em execução na porta TCP 8888, o segundo comando verifica se a porta está escutando. O 127.0.0.1 indica que o serviço está sendo executado apenas no localhost. Podemos usar um comando diferente para escutar em todas as interfaces, incluindo Ethernet ou Wi-Fi, isso permitirá que outros aplicativos em nossa rede se conectem ao serviço de proxy socks ssh.

Terminal
ssh -D 0.0.0.0:8888 usuario@servidor servidorremoto

Agora podemos configurar nosso navegador para conectar-se ao proxy. No Firefox, selecione preferências | geral | configurações de rede. Adicione o endereço IP e a porta para a conexão.

Observe a opção na parte inferior do formulário para forçar as solicitações de DNS do navegador para também passarem pelo proxy. Se você estiver usando o proxy para criptografar o tráfego da Web na rede local, terá que selecionar esta opção para que as solicitações de DNS também sejam tunelizadas pela conexão SSH.

Ativar proxy no Chrome

O uso de um parâmetro de linha de comando ao iniciar o Chrome usará o proxy socks e também encapsulará solicitações DNS do navegador sobre o proxy socks5. Mas, sempre verifique, use o dump tcp (dump tcp, não a porta 22) para confirmar que as solicitações de DNS não estão mais visíveis.

Terminal
google-chrome --proxy-server = "socks5: //192.168.1.10: 8888"

Usando outros aplicativos com o Proxy

Lembre-se de que existem muitos outros aplicativos que podem utilizar um proxy. Um navegador da web é o mais popular. Alguns aplicativos terão opções de configuração para uso do proxy. Outros podem precisar de um programa auxiliar. Um exemplo disso é proxychains. Usando esta ferramenta, podemos, por exemplo, usar o Microsoft RDP sobre o proxy.

Terminal
proxychains rdesktop$ ServidorWindowsRemoto

As opções de configuração para o proxy são definidas no arquivo de configuração proxychains.

2. Tunelamento (encaminhamento de porta)

Na sua forma mais simples, um túnel SSH abre uma porta no sistema local que se conecta a outra porta na outra extremidade do túnel.

Terminal
ssh -L 9999: 127.0.0.1:80 usuario@servidorremoto

Vamos entender o parâmetro -L. Pense em -L como o lado de escuta local. Assim, em nosso exemplo acima, a porta 9999 está escutando em localhost e a outra porta até a porta 80 em nosso servidor remoto, note que a 127.0.0.1 refere-se ao localhost no servidor remoto! Neste exemplo a seguir, a porta que está pronta e ativa, e pode ser conectada a partir de outros hosts na rede local.

Terminal
ssh -L 0.0.0.0:9999:127.0.0.1:80 usuario@servidorremoto

Nestes exemplos, a porta que estamos conectando é um servidor da Web. Também pode ser um servidor proxy ou qualquer outro serviço TCP.

3. Encaminhamento de túnel SSH para host remoto secundário

Podemos usar as mesmas opções acima para que o túnel se conecte a outro serviço em execução em um sistema secundário a partir do servidor remoto.

Terminal
ssh -L 0.0.0.0:9999:192.168.1.10:80 usuario@servidorremoto

Neste exemplo, estamos encaminhando o túnel do servidor remoto para o servidor Web em execução em 192.168.1.10. O tráfego do servidor remoto -> 192.168.1.10 não está mais no túnel ssh. O servidor da Web em 192.168.1.10 verá o servidor remoto como a fonte das solicitações da Web.

4. Túnel Reverso com SSH

Nesse cenário, queremos configurar uma porta de escuta no servidor remoto que se conectará novamente a uma porta local em nosso host local (ou outro sistema).

Terminal
ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 usuario@servidorremoto

Com esta sessão ssh estabelecida, uma conexão com a porta remota do servidor 1999 será encaminhada para a porta 902 em nosso cliente local.

5. Proxy Reverso com SSH

Nesse caso, estamos estabelecendo um proxy SOCKS com nossa conexão ssh, no entanto, o proxy está escutando no servidor remoto. Com as conexões com esse proxy de meias remotas, agora emergindo do túnel como tráfego originário de nosso host local.

Terminal
ssh -v -R 0.0.0.0:1999 192.168.1.10 usuario@servidorremoto

Solução de problemas de túneis SSH remotos

Se estiver com problemas para que as opções SSH remotas funcionem, verifique com netstat se a porta também está conectada. Mesmo que tenhamos especificado 0.0.0.0 nos exemplos acima, se GatewayPorts estiver definido como no sshd_config, ele ligará apenas ao localhost (127.0.0.1).

Aviso de segurança

Observe que, ao abrir túneis e socks proxies, você pode estar expondo os recursos internos da rede a redes não confiáveis.

6. Estabeleça uma VPN sobre SSH

Após estabelecer uma conexão em um sistema, esse sistema se torna um ponto de gateway para acesso adicional à rede. Isso é conhecido como rotação e permite o movimento lateral através da rede.

Podemos usar o proxy SSH para isso e o proxychains, no entanto, existem algumas limitações. Por exemplo, não podemos usar sockets brutos, portanto, as verificações do Nmap SYN não podem ser usadas para verificar a porta da rede interna.

Usando esta opção de VPN mais avançada, movemos a conectividade para a camada 3. Em seguida, podemos rotear o tráfego pelo túnel usando o roteamento de rede padrão. Esta técnica utiliza ssh, iptables, tun interfaces e roteamento.

Primeiro, precisamos dessas opções definidas no sshd_config. Como estamos fazendo alterações na interface no sistema remoto e no sistema cliente, precisaremos de privilégios de root em ambos os lados.

PermitRootLogin yes
PermitTunnel yes

Em seguida, estabeleceremos nossa conexão ssh usando o parâmetro que solicita a inicialização do tun dos dispositivos.

Terminal
ssh -v -w qualquer root@servidorremoto

Agora você deve ter um dispositivo tun ao mostrar interfaces (# ip a). O próximo passo é adicionar endereços IP às interfaces do túnel.

Lado do Cliente SSH:

Terminal
ip addr add 10.10.10.2/32 10.10.10.10 dev tun0
ip tun0 up

Lado do servidor SSH:

Terminal
ip addr add 10.10.10.10/32 ponto 10.10.10.2 dev tun0
ip tun0 up

Agora devemos ter uma rota direta para o outro host (route -ne ping 10.10.10.10). Agora é possível rotear qualquer sub-rede através do host do outro lado.

Terminal
route add -net 10.10.10.0 máscara de rede 255.255.255.0 dev tun0

No lado remoto, precisamos ativar ip_forwarde iptables.

Terminal
echo 1> /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE

Qualquer problema, tente dump tcp e ping, então veja onde está bloqueando. Como estamos utilizando na camada 3, nossos pacotes icmp devem estar através desse túnel.

7. Copie sua chave SSH (ssh-copy-id)

Existem várias maneiras de conseguir isso, no entanto, este comando é um atalho que economiza tempo. O que isso realmente faz? Este comando replica o que você também pode fazer manualmente. Copiar a chave ~/.ssh/id_rsa.pub(ou a padrão) do seu sistema e adicioná-la a um ~/.ssh/authorized_keysarquivo no servidor remoto.

Terminal
ssh-copy-id usuario@servidorremoto

8. Execute o comando remotamente (não interativo)

O comando SSH pode ser anexado a outros comandos para uso comum. Adicione o comando que você deseja executar no host remoto como um parâmetro final entre aspas.

Terminal
ssh servidorremoto "cat /var/log/nginx/access.log" | grep badstuff.php

Neste exemplo, o comando grep está sendo executado no sistema local após o envio do arquivo de log pela sessão ssh. Se o arquivo for grande, seria mais eficiente executar o comando grep no lado remoto, colocando o caminho entre aspas duplas. Outro exemplo executa a mesma função que o ssh-copy-id.

Terminal
cat ~/.ssh /id_rsa.pub | ssh remoteserver 'cat >> .ssh/allowed_keys'

9. Captura remota de pacotes e exibição no Wireshark

Peguei este em nossos exemplos de dump tcp. Use-o para uma captura remota de pacotes, com os resultados diretamente na GUI local do Wireshark.

Terminal
ssh root @ remoteserver 'tcpdump -c 1000 -nn -w - não porta 22' | wireshark -k -i -

10. Copiar pasta local para o servidor remoto

Um truque interessante que comprime uma pasta usando bzip2 (que é o -j no comando tar) e extrai o bzip2fluxo, criando uma duplicata da pasta no servidor remoto.

Terminal
tar -cvj /pasta de dados | ssh remoteserver "tar -xj -C /pasta de dados"

Copia pasta remota para o arquivo tar local. Para se for o inverso que você deseja, copie uma pasta remota para um arquivo local. Útil para backups rápidos de recursos remotos.

Terminal
ssh user @ remoteserver "tar -jcf - /caminho/para/backup"> dir.tar.bz2

11. Aplicativos GUI remotos com encaminhamento SSH x11

Se o cliente e o servidor remoto tiverem o X instalado. É possível executar um comando da GUI remotamente, com a janela aparecendo na área de trabalho local. Esse recurso existe desde o início dos tempos, mas ainda pode ser muito útil. Execute um navegador da Web remoto ou até o console do VMWawre Workstation, como eu faço neste exemplo.

Terminal
ssh -X remoteserver vmware

Requer: X11Forwarding yesno sshd_config.

12. Copie arquivos remotamente com rsync e SSH

O uso do programa rsync possui muitas vantagens scp: se periodicamente for necessário fazer backup de um diretório, inúmeros arquivos ou arquivos muito grandes deverá ser usado. Ele tem a capacidade de se recuperar de transferências com falha e apenas copiar diferenças entre dois locais, economizando largura de banda e tempo. O exemplo aqui usa o modo de compactação gzip (-z) e archive (-a) que inclui cópia recursiva.

Terminal
rsync -az /home/usuario/data servidorremoto: backup/

13. Acesso à rede Tor

A Tor pode encapsular o tráfego SSH usando o comando torsocks. O comando a seguir fará proxy da conexão ssh através da rede Tor.

Terminal
torsocks ssh usuario@servidorremoto

O Torsocks usará a porta 9050 do host local para o tráfego proxy. Como sempre é preciso ter em mente que o tráfego está sendo tunelizado.

14. Instância SSH para EC2

Ao usar o SSH para conectar-se à sua instância do EC2 na Amazon, você precisará usar uma chave privada. Faça o download da chave (extensão .pem) no painel de controle do Amazon EC2 e altere as permissões (chmod 400 my-ec2-ssh-key.pem. Mantenha essa chave em algum lugar seguro ou coloque-a na sua ~/.ssh/pasta.

Terminal
ssh -i ~/.ssh/EC2-key.pem ubuntu@my-ec2-public

O parâmetro -i diz ao cliente ssh para usar esta chave. Este seria um exemplo ideal de como usar o ~/.ssh/configpara configurar o uso da chave automaticamente ao conectar-se ao host ec2.

15. Edite arquivos de texto com o VIM sobre ssh / scp

Para todos os usuário do vim, você pode economizar algum tempo. Usando vim, podemos editar arquivos scp com um único comando. O uso desse método cria um arquivo no /tmp no sistema local e o copia novamente assim que escrevermos o arquivo vim.

Terminal
vim scp: //usuário@servidorremoto//etc/hosts

Observe que o formato é um pouco diferente do normal scp. Após o anfitrião, temos um duplo //. Isso faz referência ao caminho absoluto. Uma única barra terá um caminho que é relativo ao diretório inicial dos usuários.

(netrw) não pode determinar o método (formato: protocolo: // [usuário@]nome do host [:porta]/[caminho]). Se você ver esse erro, verifique o formato do seu comando. Isso geralmente significa que há um erro de sintaxe.

16. Monte o local SSH remoto como pasta local com o SSHFS

Usando sshfs- um cliente ssh do sistema de arquivos, podemos montar um diretório local em um local remoto, com toda a interação do arquivo ocorrendo durante a sessão ssh criptografada.

Terminal
apt install sshfs

No sistema baseado no Ubuntu e Debian, instalamos o pacote sshfse montamos o local remoto.

Terminal
sshfs usuario@servidorremoto:/media/data ~/data /

17. SSH Multiplex usando ControlPath

Por padrão, quando você possui uma conexão existente com um servidor remoto ssh, uma segunda conexão usa ssh ou estabelece scp uma nova sessão com a sobrecarga de autenticação. Usando as opções ControlPath, podemos usar a sessão existente para todas as conexões subsequentes. Isso irá acelerar tudo. Porém, é mais perceptível em uma rede local, e bem mais quando se conecta a recursos remotos.

Servidor remoto do host
HostName remoteserver.example.org
ControlMaster auto
ControlPath ~/.ssh/control/%r@%h:% p
ControlPersist 10m

ControlPath indica um socket verificado por novas conexões para verificar se existe uma sessão ssh existente que possa ser usada. A opção ControlPersist acima significa que, mesmo após a saída do terminal, a sessão existente permanecerá aberta por 10 minutos; portanto, se você se reconectar dentro desse período, usaria o socket existente. Veja a página man ssh_config para mais informações.

18. Stream de vídeo sobre SSH usando VLC + SFTP

Os usuários de longa data sshe vlc(Video Lan Client) talvez nem saibam dessa opção útil para quando você precisa assistir a vídeos pela rede. Usando a opção vlc para Arquivo, um fluxo de rede aberto pode ser inserido como um sftp://local. Um prompt será exibido para detalhes da autenticação, se a senha for necessária.

Terminal
sftp://remoteserver//media/uploads/myvideo.mkv

19. Autenticação de dois fatores

A maioria dos leitores entenderá o valor do uso da autenticação de dois fatores; os mesmos benefícios que se aplicam à sua conta bancária ou à Conta do Google podem ser aplicados ao seu serviço SSH. É claro que o SecureShell vem com uma forma de capacidade de dois fatores incluída, sendo uma senha e uma chave SSH. Uma vantagem de usar um token baseado em hardware ou o Google Authenticator App é o fato de geralmente serem provenientes de um segundo dispositivo físico.

20. Alternando através de hosts com -J

Quando a segmentação de rede significa que você está alternando entre vários hosts ssh para chegar a uma rede ou host de destino final, esse atalho de host para alternar pode ser o que você precisa.

Requer o OpenSSH versão 7.3 ou superior.

Terminal
ssh -J host1, host2, host3 usuário@host4.internal

Uma coisa importante a entender aqui é que isso não é o mesmo de ssh host1 então user@host1:~$ ssh host2, o parâmetro jump -J usa truques de encaminhamento para que o host local esteja estabelecendo a sessão com o próximo host da cadeia. Portanto, nosso host local está se autenticando com o host4 no exemplo acima; ou seja, nossas chaves de host local são usadas e a sessão de host local para host4 é criptografada de ponta a ponta.

Para usar essa capacidade, use no ssh_config a opção de configuração ProxyJump. Se você precisar alternar regularmente vários hosts; use o arquivo de configuração e seu alias para host4 e economizará muito tempo.

21. Bloquear tentativas de força bruta com iptables

Qualquer pessoa que tenha gerenciado um serviço SSH na Internet e visualizado os logs estará ciente da quantidade de tentativas de força bruta caso ocorrem a cada hora de cada dia. Uma maneira imediata de reduzir o ruído em seus logs é mover o SSH para uma porta diferente da tradicional 22. Faça a alteração no arquivo sshd_config usando a opção de configuração da porta ##.

O uso iptables também pode bloquear tentativas de conexão à porta a partir de fontes que atingem um determinado limite. Uma maneira de fazer isso é usar o OSSEC, pois isso não apenas bloqueia a porta 22, mas também executa várias outras funções de detecção de intrusão (HIDS) baseadas em host.

22. Modifique o encaminhamento de porta em uma sessão com ~ C

Em nosso exemplo final, é para modificar o encaminhamento de porta em tempo real em uma sessão ssh existente. Imagine este cenário de exemplo. Você conhece profundamente uma rede, talvez você tenha alternado meia dúzia de hosts e precise de uma porta local em sua estação de trabalho encaminhada para o Microsoft SMB no antigo sistema Windows 2003.

Depois de fazer as alternâncias, pressione enter e digite ~C no seu terminal. Essa é uma sequência de controle dentro da sessão que permite fazer alterações na conexão existente.

Terminal
~C
ssh> -h

Comandos:

Porta de encaminhamento.

Você pode ver aqui que encaminhamos nossa porta local 1445 para o host do Windows 2003 que encontramos na rede interna. Agora inicie console msf e estamos prontos (assumindo que você planejava explorar esse host).

Sair da versão mobile