sudo 如何決定一個命令是否只能由具有 ALL 權限的 sudoers 執行?
我只是想知道為什麼在安裝了 sudo 的 Debian 系統上可以執行預設使用者,
ls
但ifconfig
因為二進製文件確實具有相同的權限,所以不能執行:-rwxr-xr-x 1 root root 114032 Jan 26 2013 /bin/ls -rwxr-xr-x 1 root root 72296 Sep 7 2012 /sbin/ifconfig
所以我想一定有某種數據庫或策略告訴系統誰可以執行命令,誰不可以,但是我在哪裡可以找到它?不可能,
/etc/sudoers
因為在該文件中,只定義了誰是 root sudoer,而誰不是這樣的:%admin ALL=(ALL) ALL john ALL=/usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd
所以
john
不能執行/sbin/ifconfig
,但是系統怎麼知道他不允許呢?
sudo
與這個小差異無關,限制更接近核心。你看,即使每個人都有權執行該/sbin/ifconfig
程序,但這並不意味著該程序將有足夠的權限以普通使用者權限完成其工作。基本上,使用 UNIX 權限集,您有權創建可執行程式碼
/sbin/ifconfig
為. 實際上,無論事後如何ls
和ifconfig
表現,它們的過程確實是產生**的。**但是,ifconfig
將提前退出,因為它通過執行它的使用者提供的權限是不夠的。引用弗蘭克托馬斯的評論:$$ it cannot $$抓取網卡對象
**注意:**實際上您可能可以在
ifconfig --help
沒有特權的情況下執行。由於此操作不需要使用網卡,因此不會失敗,也不需要root權限。現在,如果您想更具體地了解以低權限拒絕了哪些操作
ifconfig
,您可能想strace
試一試。這是一個例子ls
。strace - 跟踪系統呼叫和信號
權限被拒絕的錯誤程式碼是 13 (
EACCES
)。通過使用strace
,我可以找出觸發了哪些系統呼叫EACCES
:$ strace ls ~ 2>&1 | grep EACCES # No output, I can read my home directory just fine. $ strace ls /root 2>&1 | grep EACCES openat(AT_FDCWD, "/root", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = -1 EACCES (Permission denied)
在那裡,您可以看到
openat
系統呼叫失敗。事實上,作為我目前的使用者,我無權閱讀該/root
目錄,因此核心在ls
嘗試獲取有關/root
. 當ls
意識到openat
failed 並返回EACCES
時,它只是告訴我:ls: 無法打開目錄 /root: 權限被拒絕
現在,由程序在系統呼叫失敗時通知使用者。例如,在 C 中:
if((rootdir = opendir("/root")) == NULL){ perror("myprogram"); exit(1); }
在低權限的情況下,這將導致:
$ ./myprogram myprogram: Permission denied
現在,如果您執行
strace /sbin/ifconfig
,您將能夠找出ifconfig
以您的使用者身份執行時拒絕了哪個系統呼叫。這是我嘗試關閉無線介面的範例:$ strace ifconfig wlan0 down 2>&1 | grep EPERM ioctl(4, SIOCSIFFLAGS, {ifr_name="wlan0", ???}) = -1 EPERM (Operation not permitted)
如您所見,
ioctl
系統呼叫失敗。在這種情況下,錯誤呼叫是EPERM
(1:不允許操作)。程序會在其功能中ifconfig
警告您:setifflags
// ... if (ioctl(s, SIOCSIFFLAGS, &ifreq) == -1) err(EXIT_FAILURE, "SIOCSIFFLAGS"); // ...