Serwer Gateway Jump Bastion Host Konfiguracja lokalna

0

Chcę ssh do zdalnego prywatnego hosta za pomocą serwera pośredniego (bastion, skok, brama). To polecenie działa dobrze:

ssh gateway ssh private

Dzięki tej konfiguracji ~ / .ssh / config:

Host gateway
  User gateway-user
  HostName XX.XX.XX.XX
  RequestTTY force

Jak mogę to zaimplementować w mojej ~ / .ssh / config? Próbowałem wielu iteracji ProxyCommand bez powodzenia. Chcę użyć pliku tożsamości znajdującego się na hoście bramy, aby uzyskać dostęp do hostów prywatnych. Chcę być w stanie:

ssh private

Znam opisaną tutaj technikę, ale wymaga ona, aby mój klucz publiczny znajdował się na wszystkich prywatnych hostach, ale nie chcę tego:

http://www.lorrin.org/blog/2014/01/10/one-liner-ssh-via-jump-box-using-proxycommand/

Shaun
źródło

Odpowiedzi:

0

Najpierw skonfiguruj klucze ssh w bramie, aby móc ssh na prywatny. Następnie na kliencie utwórz osobną parę kluczy prywatny / publiczny, której użyjesz do uwierzytelnienia w bramie. Np ssh-keygen -t rsa -f id_gateway.

Następnie w bramie użyj command=składni w pliku autoryzowanych_kluczy. Na przykład Twój wpis może wyglądać następująco:

command="sh -c 'ssh private ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3....

Przeszukaj stronę podręcznika sshd, aby command="command"uzyskać więcej informacji. Dodaj do tego wiersza klucz id_gateway.pub. Następnie w swoim .ssh/configkliencie dodaj następujący wpis:

Host private
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway

Teraz od klienta powinieneś mieć możliwość ssh privatebezpośredniego wejścia. To działa nawet dla scpi sftp.

Dodatkowy kredyt

Jeśli chcesz użyć tego do wielu serwerów, ale chcesz zarządzać tylko jednym kluczem publicznym w bramie, możesz użyć następującej sztuczki. sshddomyślnie zezwala tylko na otrzymywanie określonych zmiennych ze środowiska lokalnego. Jednym z nich LC_PAPERjest rzadko używany do niczego. Możemy więc użyć go do przekazania nazwy hosta serwera w następujący sposób:

Najpierw zmień wpis klucza publicznego na

command="sh -c 'ssh $LC_PAPER ${SSH_ORIGINAL_COMMAND:-}'" ssh-rsa AAAAB3...

Następnie na kliencie dodaj do swojego .bashrcpliku (lub jakiejkolwiek powłoki) funkcję, która wygląda następująco:

ssh_proxy() {
  LC_PAPER=$1 /usr/bin/ssh $*
}

Następnie utwórz alias, jeśli chcesz:

alias ssh=ssh_proxy

Na koniec dodaj Hostsekcje do swojego .ssh/configpodobnego do pokazanego powyżej. na przykład:

Host private2
User gateway-user
Hostname xxx.xxx.xxx.xxx
IdentitiesOnly Yes
IdentityFile ~/.ssh/id_gateway

Teraz powinieneś być w stanie to zrobić ssh privatei ssh private2tylko z jednego klucza publicznego na bramie.

gogatorzy
źródło
Jest to zgodne z właściwą linią. Jak mogę SSH do wielu prywatnych hostów i mieć tylko 1 klucz publiczny zapisany w bramie? Czy istnieje sposób przekazania wymaganej nazwy hosta?
Shaun
Zaktualizowałem swoją odpowiedź, aby rozwiązać ten problem.
gogatorzy
Czy istnieje sposób, aby zachować to w pliku .ssh / config. Byłoby również idealnie, gdyby gospodarze mogli udostępnić jeden wpis.
Shaun
Nie. Nie możesz umieścić zmiennych env w .ssh/config. Możesz po prostu uruchomić ręcznie LC_PAPER=private ssh private. Jeśli użyjesz Host *bloku na końcu .ssh/config, potrzebujesz tylko 1 wpisu. BTW, dlaczego nie możesz mieć wielu kluczy prywatnych / publicznych? Byłoby o wiele łatwiej.
gogatorzy
Mam scp do pracy w ten sposób: scp_proxy () {LC_PAPER = echo "$1" | cut -f1 -d":"/ usr / bin / scp $ *} alias scp = scp_proxy
Shaun