วิธีป้องกันการปิดระบบเมื่อผู้ใช้ SSH ลงชื่อเข้าใช้


20

ฉันจัดการสภาพแวดล้อมเครือข่ายและฉันมีสถานการณ์ที่น่าสนใจเกิดขึ้นเมื่อวานนี้ เมื่อโฮสต์จำเป็นต้องปิดระบบโดยผู้ใช้ปกติจะไม่ทำเช่นนั้นหากผู้ใช้รายอื่นเข้าสู่ระบบในเครื่อง อย่างไรก็ตามนี่ไม่ใช่กรณีที่ผู้ใช้รายอื่นเข้าสู่ระบบผ่านทาง SSH หากผู้ใช้รายหนึ่งเข้าสู่ระบบในเครื่องและผู้ใช้รายหนึ่งเข้าสู่ระบบผ่านทาง SSH และผู้ใช้ที่เข้าสู่ระบบในเครื่องพยายามปิดระบบสำเร็จโดยไม่แจ้งเตือนและการเชื่อมต่อ SSH ของผู้ใช้รายอื่นจะถูกยกเลิกทันที คำถามของฉันคือมีวิธีป้องกันเช่นนี้นโยบายสำหรับผู้ใช้ท้องถิ่นหรือไม่ ฉันดูหน้าคนนั้นsshd_configแล้วและไม่พบสิ่งที่เกี่ยวข้องเลย


แก้ไข (ข้อมูลเพิ่มเติม):

มี 4 ระบบปฏิบัติการบนเครือข่าย: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 และ Ubuntu 11.04 กรณีเฉพาะที่ฉันอ้างถึงมีผู้ใช้ SSH ในโฮสต์ Mandriva 2009 และผู้ใช้ท้องถิ่นในโฮสต์ Mandriva 2011

โฮสต์ Mandriva 2009 ใช้สภาพแวดล้อม GNOME 2.28, โฮสต์ 2010.2 ใช้ GNOME 2.32, 2011 โฮสต์ใช้ KDE Plasma และโฮสต์ Ubuntu 11.04 ใช้ Unity


ปรับปรุง

ดังที่ฉันบันทึกไว้ในคำถามนี้ฉันได้ดูpolkitการกระทำภายใต้/usr/share/polkit-1/actions/และพบ (ในไฟล์org.freedesktop.consolekit.policy) การกระทำที่เรียกorg.freedesktop.consolekit.system.stop-multiple-usersว่าพ่นข้อความ

System policy prevents stopping the system when other users are logged in

ฉันคิดว่า (เนื่องจากรูปorg.freedesktop.*แบบการตั้งชื่อ) ว่านี่เป็นสัญญาณบางชนิดที่ส่งไปยัง DM ผ่าน D-BUS ฉันคิดว่าถ้าฉันสามารถทราบได้ว่าสัญญาณใดบ้างที่กระตุ้นpolkitการกระทำนี้ฉันควรจะสามารถปรับเปลี่ยนพฤติกรรม ความคิดใด ๆ


อัปเดต 2

ฉันลองทำการทดลองเล็กน้อยในวันนี้และมันก็ให้ผลลัพธ์ที่แปลกมาก ฉันลองเข้าสู่ระบบผ่าน SSH ไปยังหนึ่งกล่องและตรวจสอบให้แน่ใจว่าไม่มีผู้ใช้รายอื่นเข้าสู่ระบบใน VT ใด ๆ หากฉันเลือกShutdownจากเมนู "การกระทำ" ของ GDM ฉันจะได้รับข้อความนโยบายที่รอคอยมานานแจ้งให้ฉันทราบว่าเป็นไปไม่ได้ที่จะทำเช่นนั้นโดยไม่มีการตรวจสอบสิทธิ์เนื่องจากผู้ใช้รายอื่นเข้าสู่ระบบอย่างไรก็ตามถ้าฉันใช้ GDM เพื่อเข้าสู่ระบบ เพื่อปิดกล่องจากเมนูของ GNOME เซสชัน SSH จะถูกปิดบังเหมือนเมื่อก่อน เป็นไปได้อย่างไร? ที่แตกต่างกันคือพฤติกรรมเมื่อฉันเริ่มต้นการshutdownร้องขอจาก GDM กว่าเมื่อฉันเริ่มต้นได้จากภายในgnome-session? นั่นบอกอะไรกับใครก็ได้ที่ช่วยฉันแก้ปัญหาได้หรือไม่?


มันอาจช่วยได้ถ้าคุณให้คำแนะนำเกี่ยวกับระบบปฏิบัติการที่คุณใช้อยู่
เจนนี่ D

มี 4 ระบบปฏิบัติการบนเครือข่าย: Mandriva 2009, Mandriva 2010.2, Mandriva 2011 และ Ubuntu 11.04 ฉันไม่ทราบว่านี่เป็นระบบปฏิบัติการเฉพาะ แก้ไขคำถามของฉัน ...
โจเซฟอาร์

2
ฉันคิดว่ามันเกี่ยวกับ OS มากกว่า SSH มันไม่ใช่สิ่งที่ฉันเจอใน Unixes ที่ฉันวิ่ง แต่จากนั้นอีกครั้งฉันมักจะปิดระบบเป็น root
Jenny D

@JennyD: วิธีแก้ไขอาจเป็นการป้องกันไม่ให้ผู้ใช้ปิดระบบผ่าน UI แต่ฉันคิดว่ามันค่อนข้างน่ารำคาญสำหรับพวกเขา
Joseph R.

2
แทนที่จะเป็นปัญหากับ SSH อาจเป็นปัญหากับการกำหนดค่าของ PAM (บนโฮสต์ถูกปิดระบบ) คุณได้ดูว่า PAM สามารถช่วยให้การปิดระบบของผู้ใช้ที่เข้าสู่ระบบและให้คำเตือนเดียวกันกับผู้ใช้ที่ต้องการปิดระบบได้อย่างไร?
Rob Gibson

คำตอบ:


3

ผมจะเขียนโปรแกรมขนาดเล็กที่มีการตรวจสอบสำหรับการเชื่อมต่อ SSH ใด ๆ ที่ใช้งานผ่านทางและnetstat / หรือ psวางไว้ในตำแหน่งของshutdownคำสั่ง

หากไม่มีใครใช้เครื่องให้โทรshutdownเมื่อผู้ใช้พยายาม หากมีผู้ใช้เครื่องเพียงเตือนผู้ใช้ที่ออกshutdownคำสั่ง

Netstat จะให้ผลลัพธ์เช่นนี้และมันค่อนข้างง่ายที่จะค้นหา.sshในเอาต์พุต

netstat -a
Active Internet connections (including servers)
Proto Recv-Q Send-Q  Local Address          Foreign Address        State
tcp        0     52  10.5.6.xx.ssh          10.6.6.yy.51400        ESTABLISHED
tcp        0      0  *.ssh                  *.*                    LISTEN
udp        0      0  *.syslog               *.*

psจะให้ผลลัพธ์เช่นนี้ แต่หนักขึ้นเล็กน้อยเพราะคุณต้องแน่ใจว่าไม่ต้องกังวลเกี่ยวกับการเชื่อมต่อขาออก Netstatน่าจะเป็นวิธีที่ถูกต้อง

  ps -e | grep ssh
      10084366 ?        00:00:07 /opt/sbin/sshd
        282647 ?        00:00:00 /opt/sbin/sshd

ฟังดูดีจริงๆ ฉันคิดว่าวิธีที่มีประสิทธิภาพมากขึ้นคือการเพิ่ม SSH PAM sessionchain ด้วยโปรแกรมที่สัมผัสไฟล์เมื่อผู้ใช้ล็อกอินผ่าน SSH และลบมันเมื่อผู้ใช้ล็อกเอาต์จากนั้นให้โปรแกรมที่คุณแนะนำตรวจสอบการมีอยู่ของ ไฟล์เหล่านี้ หากได้ผลฉันจะยอมรับคำตอบของคุณ
โจเซฟอาร์

1
ที่ควรจะทำงาน One thought: จะเกิดอะไรขึ้นหากพวกเขายกเลิกการเชื่อมต่อโดยไม่ต้องออกจากระบบ ไฟล์ได้รับการสัมผัสไหมหากเซสชัน SSH นั้นตายหรือไม่? คุณต้องการทำให้แน่ใจว่าเป็นเช่นนั้น
kmort

อืมม แน่นอนว่าเป็นอาหารสำหรับความคิด ...
โจเซฟอาร์

1
บางทีแนวทางของคุณอาจลดความซับซ้อนลงได้โดยการแยกวิเคราะห์ผลลัพธ์whoแทน มันแสดงให้เห็นว่าผู้ใช้คนใด / มีการเชื่อมต่อและจากที่โฮสต์
โจเซฟอาร์

1
มีโอกาสมาก. บนเชลล์ที่ฉันใช้ส่วนใหญ่whoไม่ได้ให้ผลผลิตมากนัก แต่เชลล์อื่น ๆ ส่วนใหญ่ก็ทำ (Silly ระบบฝังตัว ... ) ในกรณีใด ๆ หากคุณต้องการใช้ก็ง่ายสวยที่จะได้รับคอลัมน์ที่คุณต้องการด้วยnetstat awkบางสิ่งบางอย่างตามแนวของnetstat -a | awk '{print $4}'(อย่างน้อยบนเปลือกของฉัน.)
kmort

2

คุณพบข้อมูลที่ถูกต้องจริง อย่างน้อยก็ทำงานได้กับ Ubuntu จนถึง 13.04

รายการนโยบายต่อไปนี้เมื่อตั้งค่าด้วย "auth_admin_keep" ดังต่อไปนี้จะต้องการให้เกิดการปิดระบบ:

<action id="org.freedesktop.consolekit.system.stop-multiple-users">
  <description>Stop the system when multiple users are logged in</description>
  <message>System policy prevents stopping the system when other users are logged in</message>
  <defaults>
    <allow_inactive>no</allow_inactive>
    <allow_active>auth_admin_keep</allow_active>
  </defaults>
</action>

แต่อย่างใดตั้งแต่ 13.10 นโยบายนี้จะถูกละเว้นโดยสิ้นเชิง ไม่มีใครสามารถบอกฉันได้ว่าอะไรจะมาแทนที่ (ถ้ามี)

โปรดทราบว่าคุณยังมีเช่นรายการสำหรับการเริ่มต้นใหม่ (org.freedesktop.consolekit.system.restart-หลายผู้ใช้) auth_admin_keepซึ่งควรจะกำหนดให้

ดูคำถามนี้ / คำตอบด้วยบน AskUbuntu: /ubuntu/1190/how-can-i-make-shutdown-not-require-admin-password


0

นับการเชื่อมต่อ SSH และหากมากกว่าของคุณให้ปิดการทำงาน:

SSH_CONS=$(ps x | grep 'sshd:' | grep -v 'grep' | wc -l)

if [ "$SSH_CONS" -gt 1 ]
then
    echo "More than 1 SSH connection..."
else
    echo "Shutting down..."
    # halt
fi

อะไรแบบนี้?

ฉันอาจจะแทรกตัวแปรการอ่านบางอย่างดังนั้นมันจะพร้อมท์ให้ฉันเช่น "คุณต้องการปิดเครื่องหรือไม่?" และ "คุณต้องการปิดเครื่องหรือไม่"

จากนั้นคุณสามารถใช้มันเป็นนามแฝงหรือคล้ายกัน


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