Zdarza się, że trzeba zalogować się do serwera stojącego za firewallem, do którego nie mamy bezpośredniego dostępu (przynajmniej przy użyciu protokołu SSH).

Jeżeli zapora ogniowa jest oparta

  • firewall jest system opartym o Linuksa, na którym możemy zalogować się przy użyciu SSH
  • mamy możliwość skorzystania z uwierzytelnienia przy użyciu kluczy na oba serwery (nie jest to obligatoryjne, ale nie będzie potrzeby dwukrotnego wprowadzania hasła

Logowanie poprzez wykonanie polecenia

Jedną z podstawowych możliwości aplikacji ssh jest możliwość wykonania komendy na zdalnej maszynie oraz zwrócenie jej wyniku działania. Najprostsza demonstracja:

lukasz@karamba:~$ ssh login@firewall ls -l mysql*
-rw-r--r-- 1 lukasz lukasz 8640154 2008-10-21 04:06 mysql-connector-java-5.1.7.tar.gz

Można to wykorzystać i zamiast polecenia ls wywołać polecenie ssh i połączyć się ze zdalną maszyną:

lukasz@karamba:~$ ssh -t login@firewall 'ssh login@produkcja'

Należy zwrócić uwagę na przełącznik użycie przełącznika -t. Nakazuje on utworzyć terminal na maszynie firewall. Bez tej opcji połączenie będzie działać, ale nie zostanie pokazany np. standardowy znak zachęty.

O czym należy pamiętać:

  • jeżeli korzystamy z uwierzytelniania opartego o klucze, to nasz klucz publiczny musi być zainstalowany na maszynie firewall, oraz klucz publiczny z maszyny firewall musi być zainstalowany na maszynie produkcja, w przeciwnym wypadku będzie trzeba podać hasła
  • niestety sposób ten nie jest kompatybilny z poleceniami scp czy też rsync, aby przekopiować plik z maszyny lokalnej na produkcja należy to wykonać dwuetapowo za pośrednictwem maszyny firewall (w przypadku polecenia rsync da się to ograniczenia ominąć, ale nie jest to już takie oczywiste)

Konfiguracja dyrektywy ProxyCommand

Drugą metodą jest poinformowanie aplikacji ssh, że do połączenia z daną maszyną musi użyć maszyny pośredniczącej w komunikacji.

Należy utworzyć plik (lub zmodyfikować instniejący) ~/.ssh/config:

1
2
Host produkcja
        ProxyCommand ssh login@firewall nc -q0 %h %p 2> /dev/null

Parametr Host (linia 1) wskazuje jakiej maszyny będą dotyczyła konfiguracja. Należy wprowadzić taką nazwę, która będzie użyta podczas łączenia z maszyną wewnątrz sieci. Dyrektywa ProxyCommand (linia 2) informuje aplikację ssh o tym, że należy połączyć się z maszyną firewall i uruchomić polecenie nc.

Po wprowadzeniu tych zmian, można zainicjować połączenie z serwerem produkcja

ssh login@produkcja

Jeżeli używamy uwierzytelniania opartego o klucze połączenie nastąpi automatycznie, w przeciwnym wypadku będzie trzeba podać hasła dostępu do obu serwerów.

O czym należy pamiętać:

  • jeżeli używamy uwierzytelnienia opartego o klucze, to zarówno na maszynie firewall jak i produkcja należy zainstalować klucz z naszego lokalnego systemu (inaczej niż w przypadku pierwszego sposobu)
  • sposób ten jest przezroczysty zarówno dla polecenia scp, rsync czy też innych korzystających ze standardowego klienta ssh, można bezpośrednio kopiować pliki pomiędzy systemami, serwer pośredniczący będzie obsłużony dla nas całkowicie przezroczyście

Źródła