เซิร์ฟเวอร์ SSH หยุดทำงานหลังจากรีบูตเกิดจากการขาดหายไป / var / run / sshd


23

VPS ของฉันไม่ได้ถูกรีบูทเป็นเวลาประมาณ 3 เดือน มันถูกโฮสต์บนเซิร์ฟเวอร์ที่มีประเภทการจำลองเสมือน OpenVZ และระบบปฏิบัติการคือ Ubuntu 16.04 ด้วยเหตุผลบางอย่างฉันรีบูต VPS และหลังจากนั้นฉันไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ผ่าน ssh ข้อความที่ฉันได้รับคือ:

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

ดังนั้นฉันจึงเปิด Serial Console บน VPS และเริ่มตรวจสอบ ... ฉันได้ลบและติดตั้งใหม่openssh-serverโดยไม่ประสบความสำเร็จ ฉันใช้เวลาสองชั่วโมงในการอ่านบทความคำถามและคำตอบเกี่ยวกับปัญหาที่คล้ายกันบนอินเทอร์เน็ต

ในที่สุดฉันก็จัดการที่จะเข้าใจว่าไดเรกทอรี/var/run/sshdไม่ได้ถูกสร้างขึ้นในระหว่างการเริ่มต้นระบบ และเมื่อฉันสร้างมันด้วยตนเองฉันสามารถเริ่มบริการ SSH ได้โดยไม่มีปัญหาใด ๆ แต่ในการรีบูตครั้งต่อไปปัญหายังคงอยู่ ดังนั้นคำถามของฉันคือ:

  • อะไรคือสาเหตุของปัญหานี้ ทำไม/var/run/sshdไม่สร้างในช่วงเริ่มต้นระบบ?

  • ฉันจะแก้ไขปัญหาในวิธีที่เหมาะสมได้อย่างไร ฉันพบวิธีแก้ปัญหาชั่วคราวที่กล่าวถึงในตอนท้ายของบทความนี้

  • ปัญหานี้อาจเกี่ยวข้องกับโฮสต์ OpenVZ ของ VPS หรือไม่ ฉันควรขอให้ผู้ให้บริการโฮสติ้งแก้ปัญหาหรือไม่


การส่งออกของsystemctl status ssh.service, sshd -Ddp 22และjournalctl -xeเป็น:

# 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'.

เนื้อหาของ/usr/lib/tmpfiles.d/sshd.confและ/etc/init/ssh.confคือ:

# 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

ข้อมูลเพิ่มเติมเกี่ยวกับระบบ:

# 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

วิธีแก้ปัญหาชั่วคราว: ฉันพบว่า/var/runเป็นลิงก์สัญลักษณ์/runฉันไม่ทราบว่าทำไมถึงเป็นสิ่งจำเป็น แต่เมื่อฉันแก้ไขเนื้อหาของไฟล์/usr/lib/tmpfiles.d/sshd.confจาก:

d /var/run/sshd 0755 root root

ไปที่:

d /run/sshd 0755 root root

ทุกอย่างเป็นไปด้วยดีเมื่อระบบเริ่มทำงานบริการ SSH เริ่มต้นตามปกติและฉันสามารถลงชื่อเข้าใช้ผ่าน SSH ได้


ปัญหานี้อาจปรากฏขึ้นทันทีหลังจากการรีบูตเนื่องจากการอัพเกรดเวอร์ชั่นที่ทำก่อนการรีบู๊ตดังที่อธิบายไว้ในคำถามที่เชื่อมโยงนี้ บทเรียน: อย่าอัปเกรดเว้นแต่ว่าคุณแน่ใจว่าเคอร์เนลของคุณสามารถรองรับได้
หิมะตก

คำตอบ:


24

ฉันพบว่านี่เป็นข้อผิดพลาดกับ systemd และ kernels รุ่นเก่าที่ใช้งานโดย VPS privdes บางตัวในกรณีของฉัน ข้อผิดพลาดนี้ปรากฏขึ้นเป็นครั้งคราวอย่างที่เราเห็นใน Launchpad: Bug # 45234 , Bug # 1811580 ; หรือใน ServerFault: ทำไมฉันหายไป / var / run / sshd หลังจากบู๊ตทุกครั้ง

มีวิธีแก้ไขปัญหาเพียงเล็กน้อยจากปัญหานี้พวกเขาทั้งหมดมารวมกันเพื่อสร้างทางเลือก/var/run/sshdก่อนที่จะเรียกใช้เซิร์ฟเวอร์ SSH นี่คือวิธีแก้ปัญหาที่เป็นไปได้สามข้อ


วิธีแก้ปัญหา 1:แก้ไข/usr/lib/tmpfiles.d/sshd.confด้วยวิธีต่อไปนี้:

d /run/sshd 0755 root root

ตามที่กล่าวถึงในคำถาม/var/runเป็นลิงก์สัญลักษณ์ไป/runผลลัพธ์สุดท้ายเหมือนกัน: /var/run/sshdถูกสร้างขึ้น ฉันไม่รู้ว่าทำไม แต่ใช้งานได้


วิธีแก้ปัญหาที่ 2:ใช้งาน Cron ที่จะสร้าง/var/run/sshdและรีสตาร์ทเซิร์ฟเวอร์ SSH คุณสามารถใช้รูทcrontabสำหรับวัตถุประสงค์นี้ - ดำเนินการsudo crontab -eและเพิ่มรายการต่อไปนี้:

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

ขณะนี้ฉันใช้โซลูชันนี้ดังนั้นจึงผ่านการทดสอบ


วิธีแก้ปัญหาที่ 3:ใช้/etc/rc.localเพื่อทำเช่นเดียวกับข้างต้นตามที่แสดงในความคิดเห็นนี้ในรายงานข้อผิดพลาด # 45234


1
ขอบคุณที่แก้ไข ssh แต่ไม่ใช่ปัญหาที่กว้างขึ้นของ systemd ที่ถูกทำลาย ลองใช้ systemd-tmpfiles - สร้างและดูข้อผิดพลาดทั้งหมด
paulzag

1
คุณถูกต้อง @paulzag แต่ในกรณีของฉันฉันแน่ใจว่าปัญหาทั่วไปคือเคอร์เนลเก่าฉันตัดสินใจที่จะเพิกเฉยต่อข้อผิดพลาดที่systemd-tmpfiles --createแสดงเพราะในขณะนี้ไม่มีความผิดปกติใด ๆ ที่สมเหตุสมผลบนเซิร์ฟเวอร์โดยทั่วไปแล้ว คำถามปัจจุบันเกี่ยวกับวิธีการให้บริการ SSH ทำงานหลังจากรีบูตในขณะที่ปัญหานั้นเกิดขึ้นหากคุณต้องการคุณสามารถแก้ปัญหาได้ด้วยวิธีแก้ปัญหา :)
pa4080

"วิธีแก้ปัญหา 1" ทำงานให้ฉัน ... ขอบคุณ ... โหวตให้มากขึ้น ...
Biswadeep Sarkar

2
มันจะเหมาะสมมากกว่าที่จะแทนที่ /usr/lib/tmpfiles.d/sshd.confมากกว่าการแก้ไขโดยตรงเนื่องจากไฟล์นั้นได้รับการจัดการโดยผู้จัดการแพ็คเกจ ต้องการทำเช่นนั้นก็ทำให้เกิดการเปลี่ยนแปลงใน/etc/tmpfiles.d/sshd.conf; นี้จะมีความสำคัญมากกว่าในsshd.conf /usr/libดูส่วนนี้ใน tmpfiles.d (5) คำตอบที่ยอดเยี่ยมไม่ว่าการใช้ OpenVZ VPS จะตรงกับสถานการณ์ที่ฉันเคยพบมานี้
ZeroKnight

1
ในฐานะที่เป็นเหตุผลว่าทำไม วิธีแก้ปัญหา 1ทำงาน; คุณกำลังหลีกเลี่ยงการใช้/var/runsymlink ซึ่งเป็นสิ่งที่systemd-tmpfilesมีปัญหาและสาเหตุที่ PrivSep dir ไม่ได้ถูกสร้างขึ้น ข้อความสุดท้ายที่ 4 ของเธรดนี้ทำให้แสงบางส่วนหายไป ได้รับมันเกี่ยวกับsystemd-tmpfiles-cleanแต่ฉันมีความรู้สึกเหมือนกันใช้ที่นี่
ZeroKnight

1

คุณสามารถตรวจสอบว่า/สิทธิ์ (ระบบไฟล์รูท) ของคุณไม่เปลี่ยนแปลงหรือไม่? ต้องเป็นroot:rootเช่นสองบรรทัดด้านล่าง:

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

หากเจ้าของเป็นผู้ใช้รายอื่น (ไม่ใช่รูท) สิ่งนี้จะป้องกันการสร้างไฟล์ชั่วคราวทั้งหมดโดย systemd ระหว่างการเริ่มต้นระบบ คุณสามารถตรวจสอบด้วยคำสั่ง:

systemd-tmpfiles --create

หากโฟลเดอร์รูท ( /) มีสิทธิ์แตกต่างกันโปรดเปลี่ยนด้วยคำสั่งต่อไปนี้:

chown root: /

0

ขอบคุณทุกคนสำหรับข้อมูลที่เป็นประโยชน์ ปัญหากับ ssh-server ใน Xenial Lubuntu ของฉันนั้นเกี่ยวข้องกับการเป็นเจ้าของ '/' ตามที่ Melebius & Stefan แนะนำ
การสร้าง/var/run/sshdและรีสตาร์ท ssh.service ด้วยตนเองชั่วคราว ssh-server ชั่วคราว การแก้ไข the sshd.confไม่ได้ช่วยในระบบนี้ จากนั้นทำตามคำแนะนำสุดท้ายฉันตรวจสอบความเป็นเจ้าของโฟลเดอร์รูทด้วย:

' ls -alF /' และแน่นอนว่ามันถูกเปลี่ยนเป็นผู้ใช้ / กลุ่มท้องถิ่นโดยไม่ตั้งใจ ออกจากท่าเรือ: ' sudo chown root:root /' sshd.confคงที่ระบบของฉันโดยไม่คำนึงถึงแก้ไขเพื่อ d /var/run/sshd 0755 root rootดังนั้นผมจึงเรียกคืนที่ไปเป็นสถานะเดิมคือ


0

ฉันมีปัญหานี้ในเครื่องของฉันเมื่อฉันเรียกใช้ sshd หลายอินสแตนซ์บนเครื่องเดียว (18.04.02 LTS, OpenSSH 7.6p1)

ปัญหาคือไม่มีสวิตช์ใน sshd (เช่นบรรทัดคำสั่งหรือsshd_configไฟล์) สำหรับการเปลี่ยนตำแหน่งของ "ไดเรกทอรีการแยกสิทธิพิเศษ" ไดเรกทอรีควรอยู่ใน/var/empty, ตามซอร์สโค้ด OpenSSH 7.6p1

แพคเกจ Ubuntu ได้ remapped /run/sshdนี้

มีปัญหา "ความปลอดภัยของเธรด" ในinit.dสคริปต์เมื่อบูตเมื่อสคริปต์บริการทั้งคู่พยายามสร้างไดเรกทอรี ฉันขอให้ทั้ง Ubuntu และ OpenSSH แก้ปัญหาชื่อพา ธ "ไดเรกทอรีการแยกสิทธิพิเศษ" แบบ hard-coded ใน sshd หากฉันสามารถอัปโหลดไฟล์ได้ฉันจะแก้ไขตาม 8.0p1 OpenSSH ซอร์สโค้ด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.