Tại sao tôi không thể thực hiện tắt máy khi quyền là rwxr-xr-x?


34

Tôi vào /sbinvà tôi thấy shutdowncó quyền rwxr-xr-x. Điều này không có nghĩa là bất cứ ai cũng có thể thực hiện nó?


1
Lệnh bạn đã chạy là gì và lỗi mà bạn nhận được là gì?
slayedbylucifer

Tôi nghĩ rằng anh ấy đang nói về shutdownlệnh.
Vinz 4/12/13

Tôi đã chạy ./shutdown +30. Tôi nhận được "tắt máy: cần phải root". Tuy nhiên, nếu các quyền nói rằng bất cứ ai cũng có thể thực thi, tại sao tôi cần phải root?
Korgan Rivera

Tôi đoán, rằng bất cứ ai cũng có thể tắt máy. Giống như trên GUI, bất kỳ ai cũng có thể tắt nó. Nhưng nếu bạn đang nói rằng bạn cần phải root, thì tôi không biết. Câu hỏi hay mặc dù.
Kevdog777

4
@ Kevdog777: Trên Chính sách GUIKit quản lý việc này. Nó là một daemon với quyền root sẽ kiểm tra xem bạn có được phép sử dụng không shutdown.
Vinz 4/12/13

Câu trả lời:


76

Bất cứ ai cũng có thể thực thi shutdown, nhưng việc kích hoạt tắt hệ thống đòi hỏi phải có quyền root. Nhưng shutdownkhông phải là setuid, và vì vậy chỉ có root mới có thể thực hiện thành công nó. Các shutdownchương trình là đủ thoải mái để kiểm tra đặc quyền của bạn và cho bạn biết nếu có một vấn đề, nhưng ngay cả khi nó ngây thơ thử một shutdown hệ thống, không có gì sẽ xảy ra.

GLENDOWER: Tôi có thể gọi các linh hồn từ sâu thẳm khó chịu.
HOTSPUR: Tại sao, tôi cũng vậy, hoặc bất kỳ người đàn ông nào cũng có thể; Nhưng họ sẽ đến khi bạn gọi cho họ chứ?
(từ Henry IV)

shutdownlà không khác /bin/rm. Mọi người đều có thể thực thi nó, nhưng một người dùng thông thường không thể xóa /etchoặc thư mục chính của người dùng khác.

Cụ thể: Chỉ một quy trình chạy với quyền root (UID 0 hiệu quả) mới có thể điều khiển hệ thống init dừng dịch vụ hệ thống, chấm dứt tất cả các quy trình của người dùng và thực hiện lệnh gọi hệ thống thực sự dừng máy. (Nếu shutdownlà setuid, nó sẽ chạy như root bất kể ai gọi nó; nhưng không phải vậy.)

Còn việc gọi shutdowntừ GUI, ví dụ như với control-alt-del thì sao? Điều quan trọng là phải nhận ra rằng trong trường hợp đó, shutdownđược bắt đầu trực tiếp bởi initnó chạy với quyền root. Vì vậy, tất cả những người đi lên bàn điều khiển có khả năng tắt nó đi. Nếu điều này là không mong muốn, control-alt-xóa sẽ thực sự chạy shutdown -a. (Xem tài liệu mà @ some1 trích dẫn trong câu trả lời của họ). Điều đó cho biết shutdownđể kiểm tra xem người dùng hiện đang đăng nhập có được phép chạy nó hay không. Nhưng điều này chỉ có liên quan vì shutdownđang chạy bằng root trong kịch bản này.


2
Làm rõ: Bất kỳ ai cũng có thể thực thi chương trình shutdown, nhưng chương trình đó thực sự không thể kích hoạt tắt hệ thống trừ khi người dùng hiện tại có quyền root. Đúng?
LarsH

1
Nó khá là nhiều. Các chương trình chạy với các đặc quyền của người dùng gọi, trừ khi chúng được thiết lập. Việc tắt hệ thống yêu cầu quyền root, vì vậy bạn không thể viết chương trình của riêng mình để thực hiện (trừ khi khai thác lỗ hổng bảo mật, v.v.).
alexis

"Tắt máy không phải là setuid" nghĩa là gì?
Iain Samuel McLean Elder

1
@Iain, các chương trình thường được chạy với sự cho phép của người dùng gọi chúng. Đây cũng là trường hợp với shutdown. Một chương trình setuid được chạy với sự cho phép của người dùng sở hữu tệp thực thi. Ví dụ, /etc/passwdchạy với quyền root để cho phép bạn sửa đổi tệp mật khẩu. Xem trang hướng dẫn cho chmod.
alexis

Đó phải là " /usr/bin/passwdchạy với quyền root"! /etc/passwdkhông thể thực thi (đó là "tập tin mật khẩu" đang được sửa đổi).
alexis

15

Bản shutdownthân nhị phân kiểm tra nếu UID của bạn bằng 0.

Xem đầu ra bước của:

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 để hiển thị việc sử dụng strace ... điều này rất hữu ích. Tuy nhiên tôi không thấy dấu vết này cho thấy shutdownkiểm tra UID của bạn bằng 0.
LarsH

1
Bạn sẽ không thấy rằng trong đầu ra strace vì nó chỉ báo cáo các cuộc gọi hệ thống. Bạn có thể suy luận rằng khi một getuid được theo dõi chặt chẽ bằng cách viết thông báo lỗi rằng mã tương tự if(getuid() != 0) printf("Need to be root");. Trong thực tế, mã nguồn cho thấy nó là.
msw

5

Vâng ! Mọi người đều có thể chạy lệnh đó. Như bạn đã nói, bạn có thể chạy nó nhưng bạn phải đối mặt với thông báo "Cần phải root" chứ không phải a permission denied. Các shutdownkiểm tra lệnh của bạn UIDđể xem nếu bạn đang root, hay không.


-1

Dường như tắt máy sẽ kiểm tra danh sách truy cập nếu bạn gắn cờ với -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.

Vì bạn hiện đang gọi nó mà không có cờ -a, nên mặc định chỉ cho phép tắt máy gốc.

Nếu bạn muốn người dùng bổ sung có thể chạy lệnh, hãy định cấu hình tệp đó và sử dụng cờ.

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

Các bit cho phép không nhất thiết loại trừ kiểm soát truy cập dựa trên người dùng hoặc nhóm.


Gọi nó bằng -atừ dòng lệnh sẽ không có sự khác biệt: shutdown -avẫn phải được thực thi với quyền root ( initcung cấp trên control-alt-del).
alexis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.