SSH Server berhenti bekerja setelah reboot, disebabkan oleh hilang / var / run / sshd

23

VPS saya tidak di-boot ulang selama sekitar 3 bulan. Di-host di server dengan tipe virtualisasi OpenVZ dan sistem operasinya adalah Ubuntu 16.04. Untuk beberapa alasan, saya reboot VPS dan setelah itu, saya tidak dapat terhubung ke server melalui ssh, pesan yang saya terima adalah:

ssh: connect to host srvname.com port 22: Connection refused

Jadi saya membuka Serial Console di VPS dan mulai menyelidiki ... Saya sudah membersihkan dan menginstal ulang openssh-servertanpa hasil. Saya menghabiskan dua jam membaca artikel, pertanyaan, dan jawaban tentang masalah serupa di Internet.

Akhirnya saya berhasil memahami bahwa direktori /var/run/sshdtidak dibuat saat startup sistem. Dan begitu saya membuatnya secara manual saya dapat memulai layanan SSH tanpa masalah, tetapi pada reboot berikutnya masalahnya tetap ada. Jadi pertanyaan saya adalah:

  • Apa yang bisa menjadi penyebab masalah ini? Mengapa /var/run/sshdtidak dibuat saat startup sistem?

  • Bagaimana saya bisa menyelesaikan masalah dengan cara yang tepat? Saya menemukan solusi sementara yang disebutkan di akhir posting ini.

  • Apakah masalah ini dapat dikaitkan dengan host OpenVZ dari VPS? Haruskah saya meminta penyedia hosting untuk menyelesaikannya?


Output dari systemctl status ssh.service, sshd -Ddp 22dan journalctl -xeadalah:

# systemctl status ssh.service
 ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: failed (Result: start-limit-hit) since вт 2019-01-15 12:58:08 EET; 22s ago
  Process: 407 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=255)

яну 15 12:58:07 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:07 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 12:58:08 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 12:58:08 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 12:58:08 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.


# $(which sshd) -Ddp 22
debug1: sshd version OpenSSH_7.2, OpenSSL 1.0.2g  1 Mar 2016
debug1: private host key #0: ssh-rsa SHA256:...
debug1: private host key #1: ssh-dss SHA256:...
debug1: private host key #2: ecdsa-sha2-nistp256 SHA256:...
debug1: private host key #3: ssh-ed25519 SHA256:...
Missing privilege separation directory: /var/run/sshd


# journalctl -xe
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:21 srvname sshd[1688]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:21 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:21 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:21 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: Starting OpenBSD Secure Shell server...
-- Subject: Unit ssh.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has begun starting up.
яну 15 13:21:22 srvname sshd[1691]: Missing privilege separation directory: /var/run/sshd
яну 15 13:21:22 srvname systemd[1]: ssh.service: Control process exited, code=exited status=255
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'exit-code'.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Service hold-off time over, scheduling restart.
яну 15 13:21:22 srvname systemd[1]: Stopped OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has finished shutting down.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Start request repeated too quickly.
яну 15 13:21:22 srvname systemd[1]: Failed to start OpenBSD Secure Shell server.
-- Subject: Unit ssh.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit ssh.service has failed.
-- 
-- The result is failed.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Unit entered failed state.
яну 15 13:21:22 srvname systemd[1]: ssh.service: Failed with result 'start-limit-hit'.

Isi dari /usr/lib/tmpfiles.d/sshd.confdan /etc/init/ssh.confadalah:

# cat /usr/lib/tmpfiles.d/sshd.conf 
d /var/run/sshd 0755 root root

# cat /etc/init/ssh.conf | sed '/^#/ d'

description "OpenSSH server"

start on runlevel [2345]
stop on runlevel [!2345]

respawn
respawn limit 10 5
umask 022

env SSH_SIGSTOP=1
expect stop

console none

pre-start script
    test -x /usr/sbin/sshd || { stop; exit 0; }
    test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; }

    mkdir -p -m0755 /var/run/sshd
end script

exec /usr/sbin/sshd -D

Informasi tambahan tentang sistem:

# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.5 LTS
Release:    16.04
Codename:   xenial

# uname -a
Linux srvname 2.6.32-042stab127.2 #1 SMP Thu Jan 4 16:41:44 MSK 2018 x86_64 x86_64 x86_64 GNU/Linux

# apt show openssh-server | grep 'Version'
Version: 1:7.2p2-4ubuntu2.6

Solusi sementara: Saya menemukan itu /var/runadalah tautan simbolis ke /run, saya tidak tahu mengapa ini diperlukan, tetapi ketika saya mengubah konten file /usr/lib/tmpfiles.d/sshd.confdari:

d /var/run/sshd 0755 root root

untuk:

d /run/sshd 0755 root root

semuanya berjalan dengan baik pada startup sistem, layanan SSH dimulai secara normal dan saya dapat masuk melalui SSH.

pa4080
sumber
Masalah ini dapat tiba-tiba muncul setelah reboot karena peningkatan versi yang dilakukan tepat sebelum reboot, seperti yang dijelaskan dalam pertanyaan terkait ini . Pelajaran: jangan upgrade kecuali Anda yakin kernel Anda dapat mendukungnya.
Salju

Jawaban:

24

Saya menemukan ini adalah bug dengan versi sekarang dari kernel systemd dan kernel lama yang digunakan oleh beberapa VPS privdes seperti dalam kasus saya. Bug ini muncul dari waktu ke waktu, seperti yang dapat kita lihat di Launchpad: Bug # 45234 , Bug # 1811580 ; atau di ServerFault: Mengapa saya hilang / var / run / sshd setelah setiap boot?

Ada beberapa solusi dari masalah ini, mereka semua datang bersama-sama ke cara alternatif untuk membuat /var/run/sshdsebelum menjalankan server SSH. Berikut adalah tiga solusi yang mungkin.


Penanganan masalah 1: Ubah /usr/lib/tmpfiles.d/sshd.confdengan cara berikut:

d /run/sshd 0755 root root

Seperti yang disebutkan dalam pertanyaan, /var/runadalah tautan simbolis ke /run, hasil akhirnya identik: /var/run/sshddibuat. Saya tidak tahu mengapa, tetapi ini berhasil.


Solusi 2: Gunakan pekerjaan Cron yang akan membuat /var/run/sshddan memulai kembali server SSH, Anda dapat menggunakan root crontabuntuk tujuan ini - jalankan sudo crontab -edan tambahkan entri berikut:

@reboot mkdir -p -m0755 /var/run/sshd && systemctl restart ssh.service

Saat ini saya menggunakan solusi ini, jadi ini juga diuji.


Solusi 3: Gunakan /etc/rc.localuntuk melakukan hal yang sama seperti di atas, seperti yang ditunjukkan dalam komentar ini pada laporan bug # 45234.

pa4080
sumber
1
Terima kasih, itu memperbaiki ssh tetapi bukan masalah yang lebih luas dari systemd yang rusak. Coba jalankan systemd-tmpfiles --create dan lihat semua kesalahan
paulzag
1
Anda benar, @paulzag, tetapi dalam kasus saya, saya yakin masalah umum adalah kernel lama. Saya memutuskan untuk mengabaikan kesalahan ini yang systemd-tmpfiles --createmenunjukkan, karena saat ini tidak ada kesalahan fungsi yang masuk akal pada server. Secara umum, pertanyaan saat ini adalah tentang bagaimana cara mendapatkan layanan SSH operasional setelah reboot ketika masalah sedang terjadi. Jika Anda ingin, Anda dapat meningkatkan solusi :)
pa4080
"Solusi 1" bekerja untuk saya ... Terima kasih ... Dipilih ...
Biswadeep Sarkar
2
Akan lebih tepat untuk menggantikan alih- /usr/lib/tmpfiles.d/sshd.confalih mengubahnya secara langsung, karena file tersebut dikelola oleh manajer paket. Untuk melakukannya, cukup buat perubahan /etc/tmpfiles.d/sshd.conf; ini akan lebih diutamakan daripada sshd.confdi /usr/lib. Lihat bagian ini di tmpfiles.d (5) .
Bagaimanapun juga
1
Seperti mengapa Workaround 1 bekerja; Anda menghindari penggunaan /var/runsymlink, yang merupakan systemd-tmpfilesmasalah, dan mengapa dir PrivSep tidak dibuat. Pesan ke-4 terakhir dari utas ini memberi penjelasan tentang ini. Memang, ini masalah systemd-tmpfiles-clean, tapi saya merasa hal yang sama berlaku di sini.
ZeroKnight
1

Bisakah Anda memeriksa apakah /izin Anda (sistem file root) tidak diubah? Harus root:rootseperti dua baris di bawah ini:

drwxr-xr-x  25 root root      4096 дек 21 06:45 ..
drwxr-xr-x  25 root root      4096 дек 21 06:45 .

Jika pemiliknya adalah pengguna lain (dan bukan root) ini akan mencegah pembuatan semua file sementara oleh systemd selama startup sistem. Anda dapat memeriksa juga dengan perintah:

systemd-tmpfiles --create

Jika folder root ( /) memiliki izin berbeda, harap ubah dengan perintah berikut:

chown root: /
Stefan
sumber
0

Terima kasih semuanya atas informasi yang bermanfaat. Masalah dengan ssh-server di Xenial Lubuntu saya memang terkait dengan kepemilikan '/' seperti yang disarankan oleh Melebius & Stefan.
Secara manual membuat /var/run/sshddan memulai kembali ssh.service sementara ssh-server sementara. Mengedit sshd.conftidak membantu dalam sistem ini. Kemudian mengikuti saran terakhir, saya memeriksa kepemilikan folder root dengan:

' ls -alF /' dan tentu saja, itu tidak sengaja telah diubah menjadi pengguna / grup lokal. Mengeluarkan dari terminal: ' sudo chown root:root /' memperbaiki sistem saya, terlepas dari edit ke sshd.conf. Jadi saya mengembalikannya ke kondisi semula, yaitu d /var/run/sshd 0755 root root.

Michael
sumber
0

Saya mengalami masalah ini pada mesin saya ketika saya menjalankan beberapa contoh sshd pada satu mesin (18.04.02 LTS, OpenSSH 7.6p1).

Masalahnya adalah bahwa tidak ada switch di sshd (yaitu baris perintah atau sshd_configfile) yang disediakan untuk mengubah lokasi "direktori pemisahan hak istimewa". Direktori harus berada di /var/empty, sesuai dengan kode sumber OpenSSH 7.6p1.

Paket Ubuntu telah memetakannya kembali ke /run/sshd.

Ada masalah "keamanan utas" di init.dskrip saat boot ketika kedua skrip layanan mencoba membuat direktori. Saya telah meminta Ubuntu dan OpenSSH untuk mengatasi masalah nama jalur "privilege separation directory" yang telah dikodekan dalam sshd. Jika saya dapat mengunggah file, saya memperbaikinya berdasarkan kode sumber OpenSSH 8.0p1.

Luke A Perkins
sumber