เหตุใดฉันจึงไม่สามารถปิดการทำงานเมื่อสิทธิ์เป็น rwxr-xr-x


34

ผมอยู่ใน/sbinและผมเห็นว่ามีสิทธิ์shutdown rwxr-xr-xนี่ไม่ได้หมายความว่าทุกคนสามารถทำงานได้หรือไม่


1
คำสั่งที่คุณใช้คืออะไรและอะไรคือข้อผิดพลาดที่คุณได้รับ?
slayedbylucifer

ฉันคิดว่าเขากำลังพูดถึงshutdownคำสั่ง
Vinz

ฉันวิ่ง. / shutdown +30 ฉันได้รับ "การปิดระบบ: จำเป็นต้องเป็นรูท" อย่างไรก็ตามหากสิทธิ์บอกว่าทุกคนสามารถดำเนินการได้ทำไมฉันต้องรูท
Korgan Rivera

ฉันเดาว่าทุกคนสามารถปิดเครื่องได้ เช่นเดียวกับบน GUI ทุกคนสามารถปิดได้เช่นกัน แต่ถ้าคุณบอกว่าคุณต้องรูทฉันก็ไม่รู้ แม้ว่าคำถามที่ดี
Kevdog777

4
@ Kevdog777: บนนโยบาย GUIKit จัดการสิ่งนี้ มันเป็นภูตที่มีสิทธิ์ใช้งานรูทซึ่งจะตรวจสอบว่าคุณได้รับอนุญาตให้ใช้shutdownหรือไม่
Vinz

คำตอบ:


76

ทุกคนสามารถดำเนินการshutdownได้ แต่การทริกเกอร์การปิดระบบต้องใช้สิทธิ์พิเศษ แต่shutdownไม่ใช่ setuidและมีเพียง root เท่านั้นที่สามารถเรียกใช้งานได้สำเร็จ shutdownโปรแกรมก็พอมีความสุขในการตรวจสอบสิทธิ์ของคุณและให้คุณทราบว่ามีปัญหา แต่แม้ว่าจะพยายามอย่างไร้เดียงสาปิดระบบไม่มีอะไรที่จะเกิดขึ้น

GLENDOWER: ฉันสามารถเรียกวิญญาณจากสิ่งที่ลึกล้ำ
แรงบันดาลใจ: ทำไมฉันสามารถหรือเพื่อให้คนใดคนหนึ่งสามารถ; แต่พวกเขาจะมาเมื่อคุณเรียกร้องพวกเขา?
(จาก Henry IV)

shutdown/bin/rmไม่แตกต่างจาก ทุกคนสามารถดำเนินการได้ แต่ผู้ใช้ปกติไม่สามารถลบ/etcหรือไดเรกทอรีบ้านของผู้ใช้อื่น

โดยเฉพาะ: กระบวนการที่รันด้วยสิทธิพิเศษรูท (UID ที่มีประสิทธิภาพ 0) เท่านั้นที่สามารถสั่งให้ระบบ initหยุดบริการระบบยุติกระบวนการผู้ใช้ทั้งหมดและออกการเรียกระบบที่หยุดเครื่องจริง (ถ้าshutdownsetuid มันจะทำงานเหมือนรูทไม่ว่าใครจะเรียกมัน แต่มันไม่ใช่)

แล้วการโทรshutdownจาก GUI เช่นด้วย control-alt-del ล่ะ สิ่งสำคัญคือต้องตระหนักว่าในกรณีshutdownนั้นเริ่มต้นโดยตรงinitและจะทำงานด้วยสิทธิ์พิเศษของรูท ดังนั้นทุกคนที่เดินขึ้นไปที่คอนโซลอาจปิดระบบได้ หากไม่เป็นที่พึงประสงค์ควบคุม Alt-Delete shutdown -aจะทำงานจริง (ดูเอกสารที่ @ some1 อ้างถึงในคำตอบ) ที่บอกshutdownให้ตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้รับอนุญาตให้เรียกใช้มัน แต่สิ่งนี้มีความเกี่ยวข้องเท่านั้นเนื่องจากshutdownใช้งานเป็นรูทในสถานการณ์นี้


2
Clarification: ทุกคนสามารถดำเนินการโปรแกรมshutdownได้ แต่โปรแกรมนั้นไม่สามารถกระตุ้นการปิดระบบได้เว้นแต่ผู้ใช้ปัจจุบันจะมีสิทธิ์ใช้งานรูท ขวา?
LarsH

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

"การปิดระบบไม่ได้ตั้งค่า" หมายความว่าอย่างไร
เลนซามูเอลแมคลีนผู้อาวุโส

1
@Iain ปกติแล้วโปรแกรมจะทำงานโดยได้รับอนุญาตจากผู้ใช้ที่เรียกใช้งาน shutdownและนี่ก็เป็นกรณีที่มี โปรแกรม setuid ทำงานโดยได้รับอนุญาตจากผู้ใช้ที่เป็นเจ้าของไฟล์ปฏิบัติการ เช่น/etc/passwdทำงานด้วยการอนุญาตรากเพื่อให้คุณแก้ไขไฟล์รหัสผ่าน ดู manpage chmodสำหรับ
อเล็กซิส

ที่ควรได้รับ " /usr/bin/passwdทำงานด้วยสิทธิ์ root"! /etc/passwdไม่สามารถใช้งานได้ (เป็น "ไฟล์รหัสผ่าน" ที่กำลังแก้ไข)
alexis

15

ไบนารีshutdownเองตรวจสอบว่า UID ของคุณเป็น 0

ดูผลลัพธ์ของ strace ของ:

strace /sbin/shutdown -r -h now
...
...
geteuid()                               = 10001
setuid(10001)                           = 0
getuid()                                = 10001
write(2, "shutdown: Need to be root\n", 26shutdown: Need to be root
) = 26
exit_group(1)                           = ?

4
+1 สำหรับการแสดงการใช้ strace ... มันมีประโยชน์ อย่างไรก็ตามฉันไม่เห็นว่าการติดตามนี้แสดงให้เห็นว่าshutdownUID ของคุณเป็น 0
LarsH

1
คุณจะไม่เห็นสิ่งนั้นในเอาต์พุตของ strace เนื่องจากจะรายงานการเรียกของระบบเท่านั้น คุณสามารถอนุมานได้ว่าเมื่อ getuid if(getuid() != 0) printf("Need to be root");มีผู้ติดตามอย่างใกล้ชิดโดยเขียนข้อความข้อผิดพลาดว่ารหัสคือคล้ายกับ ซึ่งในความเป็นจริงรหัสแหล่งที่มาแสดงให้เห็นว่ามันเป็น
msw

5

ใช่! ทุกคนสามารถเรียกใช้คำสั่งนั้น ในขณะที่คุณพูดว่าคุณจะสามารถเรียกใช้มัน แต่คุณต้องเผชิญกับ "จะต้องมีรากข้อความ" permission deniedไม่ได้เป็น shutdownการตรวจสอบคำสั่งของคุณUIDเพื่อดูว่าคุณกำลังรากหรือไม่


-1

ดูเหมือนว่าการปิดระบบจะตรวจสอบรายการการเข้าถึงหากคุณตั้งค่าสถานะด้วย -a:

ACCESS CONTROL
       shutdown can be called from init(8) when the magic keys CTRL-ALT-DEL are pressed, by creating an appropriate entry in /etc/inittab. This means that every‐
       one who has physical access to the console keyboard can shut the system down. To prevent this, shutdown can check to see if an authorized user  is  logged
       in  on  one of the virtual consoles. If shutdown is called with the -a argument (add this to the invocation of shutdown in /etc/inittab), it checks to see
       if the file /etc/shutdown.allow is present.  It then compares the login names in that file with the list of people that are logged in on a virtual console
       (from /var/run/utmp). Only if one of those authorized users or root is logged in, it will proceed. Otherwise it will write the message

       shutdown: no authorized users logged in

       to  the  (physical)  system  console.  The  format  of  /etc/shutdown.allow is one user name per line. Empty lines and comment lines (prefixed by a #) are
       allowed. Currently there is a limit of 32 users in this file.

เนื่องจากขณะนี้คุณกำลังเรียกใช้โดยไม่มีแฟล็ก -a จึงเป็นค่าเริ่มต้นที่อนุญาตการปิดรูทเท่านั้น

หากคุณต้องการให้ผู้ใช้เพิ่มเติมสามารถรันคำสั่งได้ให้กำหนดค่าไฟล์นั้นและใช้แฟล็ก

Why can't I execute shutdown when the permission is rwxr-xr-x?

บิตการอนุญาตไม่จำเป็นต้องยกเว้นการควบคุมการเข้าถึงตามผู้ใช้หรือกลุ่ม


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