Linux

sudo 如何決定一個命令是否只能由具有 ALL 權限的 sudoers 執行?

  • September 5, 2014

我只是想知道為什麼在安裝了 sudo 的 Debian 系統上可以執行預設使用者,lsifconfig因為二進製文件確實具有相同的權限,所以不能執行:

-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. 實際上,無論事後如何lsifconfig表現,它們的過程確實是產生**的。**但是,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意識到openatfailed 並返回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系統呼叫失敗。在這種情況下,錯誤呼叫是EPERM1:不允許操作)。程序會在其功能ifconfig警告您:setifflags

// ...
if (ioctl(s, SIOCSIFFLAGS, &ifreq) == -1)
   err(EXIT_FAILURE, "SIOCSIFFLAGS");
// ...

引用自:https://unix.stackexchange.com/questions/153920