5 truques e truques SSH e mais

imagem



Neste artigo, falaremos sobre truques e comandos úteis ao trabalhar com SSH. Nomeadamente:



  • Como usar a autenticação de dois fatores para conexões SSH.
  • Uso seguro de "encaminhamento de agente".
  • Terminando uma sessão suspensa.
  • Deixamos o terminal aberto ao sair ou desconectar.
  • ( Zoom!).




Existem cinco maneiras de ativá-lo.



1. Atualizamos o OpenSSH e usamos tokens de hardware. Em fevereiro deste ano, o suporte para tokens FIDO U2F (Universal Second Factor) foi adicionado ao OpenSSH. O que posso dizer - isso é ótimo, mas há uma ressalva.



O ponto é que a atualização adiciona novos tipos de chave para dar suporte a tokens. No entanto, esse recurso só pode ser usado ao atualizar o cliente e o servidor para a versão 8.2 ou posterior. Você pode verificar a versão atual do cliente usando o comando ssh -V. No que diz respeito ao servidor remoto, vale a pena usar nc [nome do servidor] 22.



Além disso, dois novos tipos de chave foram adicionados - ecdsa-sk e ed25519-sk. Também existem certificados para eles. Para criar arquivos de chave, você precisa inserir um token e executar o comando



$ ssh-keygen -t ecdsa-sk -f ~ / .ssh / id_ecdsa_sk.



O que ela faz? Cria chaves públicas e privadas que estão vinculadas ao token U2F. A chave privada no token é usada para descriptografar a chave privada que está armazenada no disco.



Outra possibilidade é definir uma senha para arquivos-chave como um segundo fator. O fato é que o OpenSSH funciona com outra opção de geração - sk. Assim, os arquivos de chave são armazenados em um token de hardware e estão sempre com você. Para criar uma chave residente, você precisa usar o comando:



$ ssh-keygen -t ecdsa-sk -O resident -f ~/.ssh/id_ecdsa_sk.


Bem, para transferir o arquivo de chave para uma nova máquina, você precisa inserir a mídia e executar o comando $ ssh-add -K. Lembre-se - o token deve ser ativado na conexão.



2. Usamos PIV + PKCS11 e Yubikey. No caso de você precisar se conectar a máquinas onde versões anteriores do servidor SSH estão instaladas, há outra opção. Aqui está uma instrução detalhada para U2F + SSH com PIV / PKCS11 . Um pouco complicado, mas vale a pena.



3. A terceira maneira é usar o agente yubikey. Aqui está o agente SSH da própria Yubikeys , criado por Filipo Valsorda.



4. Toque em ID e selecione. Outra maneira é usar o Sekey- um agente de código aberto. Ele armazena chaves privadas no sistema de enclave seguro para MacOS e permite que você acione o recurso de assinatura do Touch ID.



5. Finalmente, usando SSH de logon único. Aqui estão as instruções de configuração. A vantagem do SSH de logon único é que o usuário pode aplicar a política de segurança do provedor de conta, incluindo suporte para autenticação multifator.



Encaminhamento seguro da chave (encaminhamento do agente)



Para que serve o encaminhamento de chave? Para acesso de host remoto ao agente de usuário SSH local. O fato é que quando o cliente SSH usa o encaminhamento de chave (ssh -A é mais frequentemente ativado), então durante a conexão existem 2 canais. A primeira é uma sessão de usuário interativa, a segunda é um canal de encaminhamento de chaves.



O agente SSH local cria um soquete IPC que se conecta por meio deste canal ao host remoto. Isso é muito perigoso, pois o usuário root no host remoto tem acesso ao agente SSH local do usuário conectado. Assim, ele pode ser usado para acessar recursos de rede em nome deste usuário. E se você trabalhar com um agente SSH padrão, não descobrirá o problema. Mas com uma chave U2F ou Sekey, esse problema pode ser removido.



Em geral, você pode encaminhar a chave, mas é aconselhável não usar esse método com freqüência e para todas as suas conexões. É aconselhável usá-lo somente quando o usuário estiver confiante na situação.



Saindo de uma sessão SSH travada



As sessões SSH geralmente congelam devido a problemas de rede, perda de controle de um programa em execução ou uma das sequências de escape do terminal bloqueando a entrada do teclado. Existem várias maneiras de sair de uma sessão



interrompida : 1. Automaticamente quando a rede é desconectada. Para fazer isso, adicione ao arquivo de configuração SSH, .ssh / config:

ServerAliveInterval 5

ServerAliveCountMax 1




Nesse caso, ssh verificará a conexão enviando solicitações de eco para o host remoto em intervalos regulares. Eles são definidos pelo parâmetro ServerAliveInterval. Se houver mais solicitações não respondidas do que ServerAliveCountMax, o SSH fecha a conexão.



2. Interromper a sessão. ssh usa o caractere ~ como a sequência de escape padrão. O comando ~ fecha a conexão atual e retorna ao terminal.



Além disso, o ~? Exibe toda a lista de comandos que podem ser usados ​​na sessão atual. Se você tiver vários layouts instalados, terá que pressionar o botão ~ duas vezes para enviar um personagem.



Deixando o terminal no host remoto aberto



Existem duas opções para salvar a sessão ao alternar entre as redes.



1. Usando Mosh ou Terminal Eternal



Se você precisa de uma conexão confiável e que não fecha, mesmo ao alternar entre redes, então há uma saída - você precisa usar o Mosh - shell móvel. Mosh se refere a um shell seguro que usa SSH para inicializar uma sessão (handshake). Depois disso, ela muda para seu próprio canal criptografado, que é muito estável. Por exemplo, ele pode lidar com várias situações, incluindo desconexões, alterações no endereço IP do dispositivo, grandes atrasos na transferência de dados e assim por diante. Tudo isso graças ao UDP e ao protocolo de sincronização que o Mosh usa.



Para trabalhar com ele, você primeiro precisa instalá-lo no servidor e no cliente, abrindo as portas 60.000 a 61.000 para o tráfego UDP de entrada em seu host remoto. Depois disso, você só precisa digitar mosh user @ server para se conectar.



Mosh funciona no nível de telas de terminal e pressionamentos de tecla, o que oferece muitas vantagens sobre o SSH, que transfere um fluxo de dados binários de E / S normal entre os clientes e o servidor. Se você precisar sincronizar apenas a tela do terminal e os pressionamentos de tecla, a conexão interrompida será restaurada muito mais rápido. O mesmo SSH precisa ser armazenado em um buffer e enviado tudo, mas Mosh só precisa salvar as teclas digitadas, sincronizando o último estado da janela do terminal com o cliente.



2. Usando o tmux. Para conectar e desconectar conforme necessário, mantendo a mesma sessão no host remoto, vale a pena usar um multiplexador de terminal chamado tmux . No caso de a conexão SSH cair, você precisa reconectar e digitar tmux attach. O usuário é então retornado à sessão tmux.



Ele também oferece vários recursos adicionais, incluindo guias, painéis, os mesmos que no terminal macOS, além da capacidade de trabalhar com o terminal com outro usuário. Você pode obter ainda mais com o Byobu, um pacote que adiciona muitas funções convenientes e atalhos de teclado. Ele vem com o Ubuntu e pode ser executado no macOS usando o Homebrew.



Compartilhando um terminal remoto



Existem situações em que você precisa compartilhar uma sessão SSH - por exemplo, enquanto resolve problemas complexos com servidores. A melhor maneira de fazer isso é com o tmux. Para resolver o problema, você precisa fazer o seguinte:



  • Certifique-se de que o tmux esteja instalado no servidor no DMZ (ou no local ao qual você deseja se conectar).
  • Ambos os usuários precisam se conectar ao servidor via SSH com a mesma conta.
  • Um dos usuários deve executar o tmux para criar uma sessão do tmux.
  • O segundo usuário executa o comando tmux attach.
  • Tudo está pronto!


Se você precisar ajustar as sessões multiusuário, deve usar o tmate . Este é um fork melhorado do tmux.



Conselho de profissional



Decidimos complementar a tradução com nossas próprias dicas - esperamos que sejam úteis também. Maxim Klochkov , consultor sênior do Network Solutions Center da Jet Infosystems e professor do curso Cybersecurity Profession na Skillbox, compartilhou sua experiência útil .



Encaminhamento de porta TCP



O Ssh tem duas opções úteis: -L e -R.



O parâmetro -L organiza uma porta TCP aberta em nosso computador local, ao tentar estabelecer uma conexão TCP para a qual essa conexão é encaminhada de forma transparente para o túnel ssh, e então uma conexão é estabelecida a partir do computador remoto.



O parâmetro -L é seguido por um argumento no seguinte formato:



ssh -L XXX:server1:YYY login@server2


Aqui, server2 é o servidor remoto que acessamos via ssh, login é o nome de usuário com o qual nos conectamos ao servidor remoto, XXX é o número da porta que precisa ser organizado no computador local, server1 é o host para o qual precisamos encaminhar a conexão desta porta e, finalmente, YYY é a porta para a qual essa conexão deve ser encaminhada.



Vejamos dois exemplos.



Exemplo 1.



  1. Estamos no servidor spb.company1.ru e queremos testar um aplicativo da web que acesse o banco de dados em central-db.company1.ru
  2. Este banco de dados está disponível apenas no servidor moscow.company1.ru, na porta 9999
  3. Organizaremos o encaminhamento da porta local 55555 para o banco de dados por meio do túnel ssh da seguinte maneira: ssh -L 55555: central-db.company1.ru: 9999 login@moscow.company1.ru
  4. Depois disso, implantamos um aplicativo da web em nosso servidor local e especificamos não central-db.company1.ru:9999 como base, mas localhost: 55555 - essa conexão será encaminhada para o servidor moscow.company1.ru, e este servidor fará a conexão com um banco de dados no host central-db.company1.ru, porta 9999


Exemplo 2.



  1. Estamos no servidor spb.company1.ru e queremos mostrar ao cliente um site de teste em moscow.company1.ru, porta 5000.
  2. Não há acesso a este site pela Internet, há apenas acesso interno do mesmo host onde ele está implantado, ou seja, de moscow.company1.ru
  3. Organizamos o encaminhamento da porta local 80 através do túnel ssh da seguinte maneira ssh -L 80: localhost: 5000 login@moscow.company1.ru
  4. Se o usuário agora entrar no navegador usando o link spb.company1.ru , a conexão será encaminhada por meio do túnel ssh para o servidor moscow.company1.ru, e este servidor já estabelecerá uma conexão com o endereço localhost: 5000, ou seja, para nossa web de teste -local.


O parâmetro -R organiza uma porta TCP aberta no servidor remoto, quando você tenta estabelecer uma conexão TCP, esta conexão é encaminhada de forma transparente para o túnel ssh, e então uma conexão é estabelecida a partir do servidor local.



O parâmetro -R é seguido por um argumento no seguinte formato:



ssh -R XXX:server1:YYY login@server2


Aqui, server2 é o servidor remoto ao qual efetuamos login via ssh, login é o nome de usuário com o qual nos conectamos ao servidor remoto, XXX é o número da porta que precisa ser organizada no servidor remoto, server1 é o host para o qual precisamos encaminhar a conexão do servidor remoto e, finalmente, YYY é a porta para a qual essa conexão deve ser encaminhada.



Vejamos dois exemplos.



Exemplo 1.



  • Estamos no servidor moscow.company1.ru e, a partir desse servidor, um banco de dados está disponível no servidor central-db.company1.ru, na porta 9999.
  • Estamos implantando um aplicativo da web no servidor spb.company1.ru e o banco de dados não está acessível a partir deste servidor.
  • Organizamos o encaminhamento de portas do servidor spb.company1.ru para o banco de dados da seguinte maneira: ssh -R 55555: central-db.company1.ru: 9999 login@spb.company1.ru
  • Depois disso, implantamos nosso aplicativo da web no servidor spb.company1.ru, mas especificamos not central-db.company1.ru:9999 como base, já que este servidor não está disponível para nós, mas localhost: 55555 - esta conexão será encaminhada para nosso local máquina através de um túnel ssh e, em seguida, a máquina local estabelecerá uma conexão com o servidor central-db.company1.ru, porta 9999.


Exemplo 2.



  • Estamos no servidor moscow.company1.ru e temos um site de teste implantado em nosso servidor, na porta 5000.
  • Este site de teste está disponível apenas localmente, conexões da Internet não são permitidas, mas queremos demonstrar este site a um cliente que pode usar um navegador da web para acessar o servidor spb.company1.ru
  • Organizaremos o encaminhamento de portas do servidor spb.company1.ru da seguinte maneira: ssh -R 80: localhost: 5000 login@spb.company1.ru
  • Se agora o usuário entrar no navegador usando o link spb.company1.ru , a conexão será encaminhada por meio do túnel ssh para nosso servidor local moscow.company1.ru e uma conexão será estabelecida a partir dele para localhost: 5000 - ou seja, para nossa web de teste local.


Que truques você pode compartilhar?



Neste tópico:



  • O artigo " Como usar o Bash executará a tarefa ";
  • Curso prático online " Linux‌ OS Administration ".



All Articles