Solução alternativa à autenticação SSH de dois fatores com conexão mestre e encaminhamento de porta?

8

O problema 1.0

Estou trabalhando em um servidor que suporta apenas autenticação de dois fatores (a autenticação do par de chaves está desativada). Portanto, toda vez que meu cliente SFTP deseja fazer upload de um arquivo, ele solicita um token ... depois de 3 minutos, isso se torna um UX not_very_nice.

A solução 1.0

Então, eu aprendi sobre a multiplexação SSH e agora posso abrir uma conexão mestre manualmente (a partir do terminal), e todas as outras conexões ssh podem ser multiplexadas na parte superior, da seguinte forma:

$ ssh example_com_master
Verification code: (/me enters the token code)
Password: (/me enters my pass)
Welcome to Ubuntu 14.04 blah blah....
Last login: Wed Oct  1 11:24:15 2014 from 12.34.56.78
$

Em seguida, de outro terminal ou de outro software:

$ ssh my.example.com
Last login: Wed Oct  1 16:34:45 2014 from 12.34.56.78
$ 

Portanto, missão cumprida, não é mais necessário inserir o token 2FA. E nenhuma senha, por sinal, SSH FTW!

~ / .ssh / config:

Host example_com_master
  HostName my.example.com
  User username
  PubkeyAuthentication no
  ControlMaster yes
  ControlPath ~/.ssh/sockets/example_com
  ControlPersist 10

Host my.example.com
  HostName my.example.com
  User username
  PubkeyAuthentication no
  ControlMaster no
  ControlPath ~/.ssh/sockets/example_com

Problema 2.0 (TLDR)

Alguns softwares (por exemplo, PyCharm IDE) usam sua própria biblioteca SSH / binária / qualquer que seja! Significando que nada que eu digitar ~/.ssh/configirá afetá-lo, AFAIK.

Esse é o meu problema atual: existe uma maneira de "enganar" esse software para usar uma conexão mestre já existente?


Uma idéia: como você geralmente pode configurar o software para usar uma porta diferente à qual se conectar, fiquei pensando se seria possível configurar algum tipo de encapsulamento que multiplexaria as conexões de entrada no mestre existente. Mas meu foo falhou comigo ...

editar:

O principal objetivo é conectar-se ao interpretador / depurador remoto do Python.

editar 2:

Todas as portas estão fechadas, exceto as 22 e 80. No entanto, é possível fazer:

remote$ ssh localhost:2222
(password or securekey login, both work)
remote$ 

mas o 2222 é aberto apenas para conexões do host local e os administradores não abrem portas adicionais, dizendo "qualquer um pode usá-lo".

frnhr
fonte
Talvez eu esteja entendendo mal o seu problema, mas você não pode contorná-lo com uma montagem ssh local? Isso transformaria sua ação sftp em uma cópia local, com o ssh sendo tratado pelo processo de montagem que você pode controlar.
Belrog
Eu deveria ter mencionado isso na pergunta ... Eu preciso do SSH para executar o interpretador / depurador remoto do Python. Na verdade, eu tenho um sshfs montar no local para sincronização de arquivo :)
frnhr
Suponho que você esteja trabalhando remotamente em alguns bits muito específicos de hardware? O desenvolvimento remoto é realmente doloroso. Uma VM local seria uma idéia melhor se você pudesse fazê-la funcionar.
Belrog
Verdadeiro dat! Mas neste projeto particular, existem várias complicações com a criação de um ambiente local que não pode ser facilmente resolvido :(
frnhr
@Belrog eu converti sua resposta em um comentário. Poste apenas uma resposta se ela realmente responder à pergunta. Para pedir esclarecimentos, poste um comentário. É para isso que servem.
terdon

Respostas:

2

Um problema bastante interessante que você tem.

A solução real seria pedir ajuda ao administrador do sistema primeiro.

Se isso não for uma opção, a próxima melhor coisa é ter o libssh do pyCharm ou o que quer que ele use (eu pesquisei no Google e não consegui descobrir) analise seu `~ / .ssh / config '.

Se isso não for possível, você pode ser capaz de executar o seu próprio daemon ssh na escuta host remoto no endereço de retorno e conectá-lo com uma frente local.

Para configurar um daemon ssh sem privilégios (copiado de um link na resposta SF ):

  $ pwd
  /home/<USER>
  $ mkdir -p etc var/run
  $ cp /etc/sshd_config etc
  $ vi etc/sshd_config
  [Set `Port 2230']
  [Set `HostKey /home/<USER>/etc/ssh_host_rsa_key']
  [Set `UsePrivilegeSeparation no']
  [Set `PidFile /home/<USER>/var/run/sshd.pid']
  [:wq!]
  $ ssh-keygen -t rsa -f /home/<USER>/etc/ssh_host_rsa_key -N ''
  Generating public/private rsa key pair.
  Your identification has been saved in /home/<USER>/etc/ssh_host_rsa_key.
  Your public key has been saved in /home/<USER>/etc/ssh_host_rsa_key.pub.
  The key fingerprint is:
  02:5d:02:5d:e8:2e:c6:b9:4c:d9:93:6c:13:ef:5d:61 hein@vmbert2k8
  $ /usr/sbin/sshd -f /home/<USER>/etc/sshd_config -D

Agora encaminhe uma porta local para ela (você fará login com 2fa aqui):

 ssh -L 2230:localhost:2230 example_com_master

E pyCharm direto para localhost:2230. Você também pode configurar a autenticação do par de chaves no seu sshd personalizado.

Observe que este é um tiro no escuro, e seu administrador de sistemas pode não gostar disso.

Há uma grande chance de o pyCharm já usar o OpenSSH para sua implementação ssh. Nesse caso, adicionar suporte à multiplexação ao pyCharm seria muito mais fácil do que a solução alternativa que propus.

GnP
fonte
Obrigado pela resposta. Os administradores provavelmente não vão permitir que eu execute meu próprio sshd (duvido que exista mesmo uma porta disponível). Mas se eu conseguir um sshd separado em execução no servidor, acho que talvez não precise multiplexar nada, basta configurar o servidor para autenticação de par de chaves. Ou existem alguns benefícios que eu perdi?
frnhr
Você está certo sobre não precisar de multiplexação :). Além disso, eu sei que ficaria chateado se um usuário fizesse algo assim sem me perguntar primeiro. Além disso, se você perguntar ao sysadmin de qualquer maneira, uma solução muito mais saudável seria não exigir o 2fa do localhost. É o que eu costumo fazer de qualquer maneira.
GnP
:) E se não houvesse 2fa do localhost, o tunelamento pode resolver o problema?
Frnhr
Exatamente, se você não precisar de 2fa do host local, conectar-se através de um túnel é como conectar-se localmente. A mágica sshd_config para isso é Match Address 127.0.0.1 PasswordAuthentication yes provavelmente seguida por um único Matchem uma linha própria para fechar a seção, se você não estiver adicionando isso no final do arquivo.
GnP