- 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的意思和它是一樣的,即讓執行文件的用戶以該文件所屬組的權限去執行。
- 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,別的用戶均不能動別人的,這就是粘滯位的作用。
- 和文件標志位關聯的概念還有
在使用 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)的權限。