Dlaczego po prostu nie użyć% h w opcji ControlPath OpenSSH ssh?

13

Dlaczego „ssh_config (5)” manpages zalecić ControlPathopcja powinna zawierać co najmniej %h, %pa %rzastępcze w celu jednoznacznej identyfikacji każdego udostępnionego połączenia?

Pomyślałem, że wiele sesji powinno współdzielić to samo gniazdo z połączeniem z tym samym hostem. Czy nie ma więc sensu mieć prostą definicję, taką jak:

ControlPath ~/.cache/ssh/mux/%h

Zamiast czegoś takiego:

ControlPath ~/.cache/ssh/mux/%r@%h:%p

W moim rozumieniu pierwszej definicji jedno połączenie jest współużytkowane przez wiele sesji z różnymi zdalnymi użytkownikami, do tego samego zdalnego hosta, na różnych zdalnych portach.

Chcę mieć pierwszą definicję w domyślnej sekcji hosta, aby wystarczyło powiedzieć ssh -o ControlMaster=no.

Chcę udostępnić połączenie z tym samym hostem zdalnym między wszystkimi sesjami zainicjowanymi przez tego samego użytkownika lokalnego, niezależnie od użytkownika zdalnego i portu zdalnego. Gniazdo klienta głównego powinno znajdować się poniżej katalogu domowego użytkownika lokalnego.

Tim Friske
źródło
„Chcę udostępnić połączenie z tym samym hostem zdalnym między wszystkimi sesjami zainicjowanymi przez tego samego użytkownika lokalnego, niezależnie od użytkownika zdalnego i portu zdalnego”. Krótka odpowiedź: nie możesz . W odpowiedzi dodałem coś w rodzaju wyjaśnienia.
goldilocks

Odpowiedzi:

13

„Pomyślałem, że wiele sesji powinno dzielić to samo gniazdo z połączeniem z tym samym hostem.”

Mogą. Pamiętaj jednak, że jeśli łączysz się z hostem za pomocą istniejącego połączenia ControlPath, niezależnie od tego, który użytkownik zamierza się zalogować, zostaniesz zalogowany jako oryginalny użytkownik połączenia. Np. Bez ustalonego połączenia z „gdzieś”:

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=yes bob@somewhere

Ta sesja to gdzieś bob @.

ssh -o ControlPath=~/.ssh/%h -o ControlMaster=no sue@somewhere

Ta sesja też będzie gdzieś bob @, ponieważ użyłeś tej samej ControlPath i ustawiłeś ControlMaster=no; gdybyś ControlMaster=yesbył zalogowany jako sue, ale ssh zignoruje twój argument ControlPath, co sugeruje man ssh_config:

Dodatkowe sesje mogą łączyć się z tym gniazdem przy użyciu tego samego ControlPath z ControlMaster ustawionym na „nie” .

Jako dowód tego, jeśli ControlMaster=yesw obu przypadkach, gdy bob wyjdzie, gniazdo ControlPath ~/.ssh/somewherezniknie, nawet jeśli sesja „sue” nadal działa, co oznacza, że sesja sue nigdy nie korzystała z tego gniazda .

Tak więc, jeśli chcesz korzystać z tego samego połączenia, %hjest w porządku, ale uważaj, że nie możesz udostępnić połączenia wielu użytkownikom zdalnym - ssh ci na to nie pozwoli.

Złotowłosa
źródło
Wielkie dzięki. Przed twoją szczegółową odpowiedzią przeoczyłem fakt, że nie jest możliwe współdzielenie głównego gniazda klienta pomiędzy różnymi zdalnymi użytkownikami bez jednoczesnego przyjęcia przez drugiego zdalnego użytkownika tożsamości pierwszego.
Tim Friske,
5

Możesz mieć wielu użytkowników i wiele portów używanych nawet dla tego samego serwera. Sam łączę się z setkami systemów w intranecie firmy, większość ma wielu użytkowników z różnymi funkcjami lub serwerami aplikacji. Dostęp do użytkownika A różni się bardzo od dostępu do użytkownika B, a połączenie główne musiałoby być inne. Bardziej zwięźle, jeśli miałbyś biec:

$ ssh -n -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userA localhost sleep 10 & # create the master connection and background it
$ ssh -o ControlMaster=auto -o ControlPath=~/.cache/ssh/mux/%h -l userB localhost whoami
userA

Jak widać, nie otrzymujemy sesji OpenSSH z użytkownikiem B, ale oryginał z użytkownikiem A. Oznacza to, że katalog domowy, uprawnienia, a nawet samo uwierzytelnianie nie są tym, czego się oczekuje. Korzystając z tego, jeśli spróbujesz usunąć plik z katalogu użytkownika B, to a) może to być zły plik i b) może to być złe uprawnienia.

Jeśli nigdy nie będziesz łączyć się z więcej niż jednym użytkownikiem na jednym serwerze za pomocą jednego portu, wtedy tak, użycie %hmoże wystarczyć. W swoim ~/.ssh/configpliku chciałbyś użyć:

ControlMaster=auto  # use existing or create a master connection
ControlPath=~/.cache/ssh/mux/%h
ControlPersist=yes

Dzięki tej ControlPersistopcji połączenie główne pozostaje otwarte w tle, dopóki nie zostanie zabite lub zakończone ssh -O exit. To fajna funkcja „ustaw i zapomnij”.

Ale jeśli istnieje jakikolwiek możliwość podłączenia do więcej niż jednego użytkownika na jednym hoście, wtedy chcesz coś bardziej bezpieczne:

ControlMaster=auto
ControlPath=~/.cache/ssh/mux/%r@%h:%p
ControlPersist=yes
Arcege
źródło
Wciąż jestem zdezorientowany. Próbowałem wyjaśnić scenariusz konfiguracji i moją intencję w akapitach „Chcę”. Czy ktoś z was mógłby bardziej precyzyjnie odpowiedzieć na moje pytanie za pomocą tych dodatkowych informacji?
Tim Friske,