Inicjacja połączenia ssh trwa wieczność, utknęła w „pledge: network”

44

Nawiązanie połączenia z jednym z moich serwerów za pomocą ssh trwa dłużej niż 20 sekund.

Nie jest to związane z warunkami LAN lub WAN, ponieważ połączenie z samym sobą zajmuje to samo (ssh localhost). Po ostatecznym ustanowieniu połączenia interakcja z serwerem jest bardzo szybka.

Użycie -vvv pokazuje, że połączenie jest zawieszone po powiedzeniu „pledge: network”. W tym momencie uwierzytelnianie (tutaj za pomocą klucza) jest już wykonane, jak widać tutaj:

...
debug1: Authentication succeeded (publickey).
Authenticated to myserver.mydomain.com ([xx.xx.xx.xx]:22).
debug1: channel 0: new [client-session]
debug2: channel 0: send open
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network

(... utknąłem tutaj na 15 do 25 sekund ...)

debug1: client_input_global_request: rtype [email protected] want_reply 0
debug2: callback start
debug2: fd 3 setting TCP_NODELAY
debug2: client_session2_setup: id 0
...

Serwer to Ubuntu 16.04. W przeszłości zdarzyło mi się to z innym serwerem (był Ubuntu 12.04), nerver znalazł rozwiązanie i problem zniknął po pewnym czasie ...

sshd_config jest domyślnym programem dostarczanym przez Ubuntu.

Do tej pory próbowałem:

  • using -o GSSAPIAuthentication = no w komendzie ssh
  • używając hasła zamiast klucza
  • using UsePrivilegeSeparation no zamiast yes, w sshd_config
M-Jack
źródło
1
Zwykle dla mnie powolne połączenia SSH stanowią problemy z DNS, czy może tak być w tym przypadku? Na przykład serwer może utknąć, próbując wykonać odwrotny DNS dla adresu IP klienta i czekać, aż
upłynie limit
Właściwie nie: domyślnie UseDNS nie jest zdefiniowany w sshd_config, a strona man mówi, że ta opcja jest domyślnie „nie”.
M-Jack
3
Niektórzy Googling sugerują, że może to być spowodowane aktualizacją systemd bez ponownego uruchamiania. 12 lipca wprowadzono systemową aktualizację Xenial . systemctl restart systemd-logindnaprawia dla mnie problem tylko przez krótki czas.
Ivan Kozik,
Lub jeśli widzisz, pam_systemd(sshd:session): Failed to create session: Connection timed outjak wspomniano w odpowiedzi, może to być github.com/systemd/systemd/issues/2925
Ivan Kozik
Przyszedłem tutaj po tym problemie po aktualizacji, a sugestia @ IvanKozik naprawiła problem - tj. Restart systemctl systemd-logind - dzięki za to.
Paul M

Odpowiedzi:

43

Jest to prawdopodobnie problem z D-Busi systemd. Jeśli z dbusjakiegoś powodu usługa zostanie ponownie uruchomiona, konieczne będzie również ponowne uruchomienie systemd-logind.

Możesz sprawdzić, czy to jest problem, otwierając dziennik demona ssh (na Ubuntu powinien być /var/log/auth.log) i sprawdź, czy ma on następujące linie:

sshd[2721]: pam_systemd(sshd:session): Failed to create session: Connection timed out

Jeśli tak, po prostu uruchom ponownie systemd-logindusługę:

systemctl restart systemd-logind

Miałem ten sam problem na CentOS 7, ponieważ messagebuszostał zrestartowany (tak się D-Busnazywa usługa na CentOS).

Strahinja Kustudic
źródło
Próbowałem zrestartować systemd-logind, ale po chwili mówi, że demon PolicyKit został odłączony od magistrali. Nie jesteśmy już zarejestrowanym agentem uwierzytelniającym. Zadanie dla systemd-logind.service nie powiodło się, ponieważ przekroczono limit czasu. Aby uzyskać szczegółowe informacje, zobacz „status systemtl systemd-logind.service” i „journalctl -xe”.
Kun Ren
@ KunRen prawdopodobnie musisz ponownie uruchomić polkitusługę za pomocą systemctl restart polkit.
Strahinja Kustudic
16

znalazłem odpowiedź:

zmieniono UsePAM z yes na no w pliku sshd_config

Po zrestartowaniu usługi ssh połączenie jest teraz natychmiastowe do serwera. Na tym serwerze PAM jest połączony z ldap, więc prawdopodobnie jest to powód, nawet jeśli tutaj łączę się z użytkownikiem zadeklarowanym na samym serwerze, a nie LDAP.

Jest to raczej sposób na obejście problemu, a nie rozwiązanie ... Mam inne serwery skonfigurowane w ten sam sposób, w których nie występuje ten problem.

Mam nadzieję, że to może komuś pomóc ...

M-Jack
źródło
1
zmiana UsePAM na no ma inne efekty. Zobacz tę dyskusję , więc musiałem ustawić hasło dla użytkownika, ponieważ mam błędy takie jak Nagios użytkownik nie wolno, bo konto jest zablokowane
M-Jack
4
To naprawdę nie jest dobry pomysł.
Jakuje
1
dlaczego ?? jakaś alternatywa?
M-Jack
8
PAM służy do innych rzeczy związanych z zarządzaniem kontem w nowoczesnych systemach. Zamiast go wyłączać, lepiej zbadaj, co się dzieje w stosie PAM i dlaczego zajmuje to tak długo.
Jakuje
Pozostawienie bardzo często nieużywanego modułu PAM włączonego dla dostępu SSH stanowi lukę bezpieczeństwa. Ograniczenie dostępu do krytycznych usług, takich jak SSH z punktu widzenia bezpieczeństwa, jest zawsze dobrym pomysłem dla KAŻDEJ innej usługi. Kiedy chcesz, aby moduł PAM współpracował z SSH? Na przykład: kiedy chcesz zintegrować go z Active Directory przez winbind, gdy potrzebujesz uwierzytelniania dwuskładnikowego z tokenami Google itp. W innych przypadkach (przy użyciu passwd i shadow) wyłączenie go jest całkowicie bezpieczne. Każdy użytkownik PAM zobaczy to: cve.mitre.org/cgi-bin/cvekey.cgi?keyword=pam
Michał Sokołowski
10

Stało się to na dwóch moich serwerach Fedora 25 i było to spowodowane wieloma nieudanymi próbami logowania SSH.

(Typowe sugestie dotyczące używania GSSAPIAuthentication=noi UseDNS=noponownego uruchamiania systemd-logindnie miały znaczenia).

Na tych serwerach /etc/pam.d/postloginzawiera:

session     optional      pam_lastlog.so silent noupdate showfailed

Strona pam_lastlogpodręcznika man wyjaśnia, że showfailedopcja:

Wyświetla liczbę nieudanych prób logowania i datę ostatniej nieudanej próby z btmp.

Na tych serwerach /var/log/btmppliki były ogromne z powodu wielu nieudanych prób logowania. Te btmppliki dziennika nie zostały obrócone są obaj.

Zainstalowałem logrotatepakiet, aby mieć pewność, że pliki dziennika zostaną w przyszłości obrócone. (W Fedorze konfiguracja dostarczana z logrotateobsługuje rotację /var/log/btmp.)

Usunąłem również ogromne btmppliki dziennika; jak tylko to zrobiłem, połączenie z serwerami było natychmiastowe.

Richard Fearn
źródło
To rozwiązało mój problem! Dziękuję Ci. Dobry chwyt. SSH zajęło 5-10 sekund, a teraz jest to mniej niż mgnienie oka. To jest na maszynie wirtualnej, którą od lat podłączam do publicznego Internetu. Jego reguły zapory ogniowej można by chyba nieco lepiej dostroić, skoro o tym myślę. Dla innych to wszystko, co zrobiłem: sudo truncate -s 0 /var/log/btmp- Mój miał rozmiar 2,7 G.
Carl Bennett,
2

W moim przypadku przyczyną była awaria rsyslogd. Dowiedziałem się tego, ponieważ nie było więcej komunikatów w dzienniku np. / Var / log / syslog lub /var/log/mail.log

Więc service rsyslog restartrozwiązaliśmy problem dla nas.

randomcontrol
źródło
Ta sama przyczyna na naszym serwerze z systemem CentOS 6.10. Zajęło się tym ponowne uruchomienie rsyslog. Chodzi o to, że nie był martwy. Działał, ale najwyraźniej nie robił nic pożytecznego.
UtahJarhead
1

Dla mnie ten problem jest spowodowany dużym (setki MB) btmpplikiem. Ten plik rejestruje próby logowania. Gdy ludzie próbują brutalnie wymusić twoje hasło, ten plik może być duży i powodować opóźnienia w "pledge: network"fazie.

Spróbuj wyczyścić plik dziennika

echo "" > /var/log/btmp

i zobacz, czy to pomoże.

Marek Nagy
źródło
3
To wymaga znacznie więcej wyjaśnień. Na początek, dlaczego uważasz, że to jest pomocne?
Sven
wskazówka: samo pisanie :> /var/log/btmprobi to samo btw.
Marius
1

Dla mnie rozwiązaniem było dodawanie

UseDNS no

do /etc/ssh/sshd_configa potem oczywiście service ssh restart(na naszym serwerze Debian / Jessie). Nic więcej...

przed :

ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 13.440 total
ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 20.990 total
ssh git@git.*****.de true  0.03s user 0.02s system 0% cpu 31.114 total
ssh git@git.*****.de true  0.03s user 0.01s system 0% cpu 25.898 total

po :

ssh git@git.*****.de true  0.03s user 0.02s system 5% cpu 0.832 total
ssh git@git.*****.de true  0.03s user 0.01s system 7% cpu 0.523 total
ssh git@git.*****.de true  0.03s user 0.01s system 7% cpu 0.574 total
tamasgal
źródło
Nie, dodawanie UseDNS nojest rozwiązaniem zupełnie innego problemu.
kasperd
@kasperd To nie ma znaczenia. W moim przypadku miałem te same objawy (krótko: utknąłem po powiedzeniu „zastaw: sieć”) i to w końcu pomogło, więc jest to rozwiązanie przynajmniej bardzo podobnego problemu i jestem pewien, że to pomoże inne w pewnym momencie.
tamasgal
To samo tutaj, dwa zawieszają się podczas połączenia, jeden po sign_and_send_pubkey, dłuższy po pledge: network. Dodanie tylko UseDNS noz kolejnymi service ssh restartrozwiązało problem na starej instalacji Ubuntu 14.04.5 LTS tutaj.
Ogar
0

W mojej informacji zwrotnej dotyczącej debugowania zauważyłem następujący wiersz:

Control socket connect(/var/lib/jenkins/.ssh/USER@HOST:22): Permission denied

Który był plikiem, którego właścicielem root:rootbyłam podczas gdy ja jenkins. Usunięcie tego pliku rozwiązało moje problemy.

Ambidex
źródło