文件標志位的作用

  1. setuid與setgid (讓其他用戶運行文件時擁有創建者或者所屬組的權限)
 # setuid權限
chmod u+s xxx
#或者可以寫為
chmod 4755 xxx # 也是setuid權限,755可以看自己的需要
# 設置setgid權限 ,針對目錄
chmod g+s xxx 
# 或者可以寫成
chmod 2755 xxx

看一下系統中用到它的地方,以/etc/passwd和/usr/bin/passwd為例:
代碼如下:

[root@pc]# ll /etc/passwd /usr/bin/passwd
-rw-r--r-- 1 root root 2005 Apr 23 01:25 /etc/passwd
-rwsr-xr-x 1 root root 23420 Aug 11 2010 /usr/bin/passwd

分析一下,/etc/passwd的權限為 -rw-r--r-- 也就是說:該文件的所有者擁有讀寫的權限,而用戶組成員和其它成員只有查看的權限。我們知道,在系統中我們要修改一個用戶的密碼,root用戶和普通用戶均可以用/usr/bin/passwd someuser這個命令來修改這個/etc/passwd這個文件,root用戶本身擁有對/etc/passwd的寫權限,無可厚非;那普通用戶呢,這里就用到了setuid,setuid的作用是讓執行該命令的用戶以該命令擁有者的權限去執行,就是普通用戶執行passwd時會擁有root的權限,這樣就可以修改/etc/passwd這個文件了。它的標志為:s,會出現在x的地方,例:-rwsr-xr-x 。而setgid的意思和它是一樣的,即讓執行文件的用戶以該文件所屬組的權限去執行。

  1. stick bit(粘滯位,針對目錄,除了root用戶和文件創建者其他用戶不能刪改目錄下文件)
chmod o+t xxx # 設置stick bit權限,針對目錄(其實也可以對文件使用),也可以寫成
chmod 1755 xxx

看一下系統中用到它的地方,以/tmp為例: 復制代碼
代碼如下:

[root@pc]# ll -d /tmp
drwxrwxrwt 13 root root 4096 Apr 23 02:06 /tmp

我們知道/tmp是系統的臨時文件目錄,所有的用戶在該目錄下擁有所有的權限,也就是說在該目錄下可以任意創建、修改、刪除文件,那如果用戶A在該目錄下創建了一個文件,用戶B將該文件刪除了,這種情況我們是不能允許的。為了達到該目的,就出現了stick bit(粘滯位)的概念。它是針對目錄來說的,如果該目錄設置了stick bit(粘滯位),則該目錄下的文件除了該文件的創建者和root用戶可以刪除和修改/tmp目錄下的stuff,別的用戶均不能動別人的,這就是粘滯位的作用。

  1. 和文件標志位關聯的概念還有
    在使用 setuid() 函數時會遇到 3 個關于 ID 的概念:
    real user ID -- 真實用戶 ID
    effective user ID -- 有效用戶 ID
    saved set-user-ID -- 保存了的設置用戶 ID。
    真實用戶 ID (real user ID) 就是通常所說的 UID,也就是終端中@之前的那個user的id
    在命令行中輸入指令id可以看到結果如下
benson@benson:~$ id
uid=1000(benson) gid=1000(benson) 組=1000(benson),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),107(lpadmin),124(sambashare)

它用來標識系統中各個不同的用戶。普通用戶無法改變這個 ID 值。有效用戶 ID (effective) 表明,在運行一個程序時,你是以哪種有效身份運行它的。
一般而言,有效用戶ID 等于 真實用戶 ID。這兩個 ID 值可以用 geteuid()和getuid()函數獲取。

#include <sys/types.h>  
#include <unistd.h>  
#include <stdio.h>  
#include <stdlib.h>  
int main(void)  
{  
    printf ("The real user ID is: %d\n", getuid());  
    printf ("The effective user ID is :%d\n", geteuid());  
    return (0);  
}  

編譯程序后,查看生成的可執行文件權限:

$ls -l getuid.exe 
-rwxr-xr-x 1 beyes beyes 4775 Jun  9 15:38 getuid.exe

普通用戶運行

$ ./getuid.exe 
The real user ID is: 1000
The effective user ID is :1000

root 用戶運行

# ./getuid.exe
The real user ID is: 0
The effective user ID is :0

這就是所說的一般情況:實際用戶ID == 有效用戶 ID下面看不一致的情況:使用 chmod 改變該程序的有效權限位(suid):

$ chmod u+s getuid.exe
$ ls -l getuid.exe
-rwsr-xr-x 1 beyes beyes 4775 Jun  9 15:38 getuid.exe

再使用普通用戶運行:

$ ./getuid.exe 
The real user ID is: 1000
The effective user ID is :1000

切換到 root 用戶運行:

# ./getuid.exe 
The real user ID is: 0
The effective user ID is :1000

從 root 運行輸出來看,有效用戶 ID 的值為 1000 。也就是說,root 運行這個程序時,是沒有 root 的權限的,它只有 beyes 這個普通用戶(實際用戶 ID 為 1000)的權限。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容