對可執行文件設置 setuid 權限時,將對運行該文件的進程授予基於文件屬主的訪問權限。該訪問權限不是基於正在運行可執行文件的用戶。使用此特殊權限,用戶可以訪問通常只有屬主才可訪問的文件和目錄。
可以使用chmod u+s 或chmod g+s來設置二進制的可執行文件的euid。setuid只能對二進制的可執行設置。
一 進程的uid和euid
轉自:http://bbs.linuxpk.com/thread-39597-1-1.html
linux系統中每個進程都有2個ID,分別為用戶ID(uid)和有效用戶ID(euid),UID一般表示進程的創建者(屬於哪個用戶創建),而EUID表示進程對於文件和資源的訪問權限(具備等同於哪個用戶的權限)。C語言中,可以通過函數getuid()和geteuid()來獲得進程的兩個ID值。
當一個用戶登陸系統時,系統會將UID和EUID都賦值為/etc/passwd文件中的UID,一般情況下2個ID是相同的,但是某些情況下會出現2個ID不同的情況。
gid和egid同理。
下面一段C代碼將解釋區別:"printid.c"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
printf(" UID\t= %d\n", getuid());
printf(" EUID\t= %d\n", geteuid());
printf(" GID\t= %d\n", getgid());
printf(" EGID\t= %d\n", getegid());
return EXIT_SUCCESS;
}
編譯之:
aguo@linux-x9rc:~> gcc -o printid printid.c
執行:
aguo@linux-x9rc:~> ./printid
Real UID = 1000
Effective UID = 1000
Real GID = 100
Effective GID = 100
看看/etc/passwd里uid和gid:
aguo@linux-x9rc:~> cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'
uid:1000 gid:100
以上是相同的例子。
下面演示uid和euid不同的例子。
首先,修改一下文件屬性,setuid或setgid
aguo@linux-x9rc:~> chmod u+s printid #這樣一來,文件在執行階段具有文件所有者的權限。
還可以再補充一個:
aguo@linux-x9rc:~> chmod g+s printid #這樣一來,文件在執行階段具有文件所屬組的權限。
其次,變成其他用戶,再來試驗一下,比如變成root;
linux-x9rc:/home/aguo # ./printid
Real UID = 0
Effective UID = 1000
Real GID = 0
Effective GID = 100
看到了吧?uid和euid是有區別的!
以上演示環境:
OS:SuSE Desktop Linux 11
gcc:4.3.2
順便補充一下:
perl里面的特殊變量$<、$>表示uid euid; $(、$)表示gid egid。
只是,$(和$)會存儲一個列表,第一位表示的才是gid和egid,這個是perl的設置,不在本文討論范圍中。
二 passwd 實例
轉自:http://keren.blog.51cto.com/720558/144908
【關於linux的passwd命令】
passwd命令是用來修改用戶登陸密碼的,用來記錄用戶登陸密碼的文件為/etc/shadow,該文件只有root用戶具有訪問權限,如下所示:
gaolu@gaolu-desktop:~$
gaolu@gaolu-desktop:~$ cd /etc
gaolu@gaolu-desktop:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
gaolu@gaolu-desktop:/etc$
這是出現了矛盾:出於安全考慮,不允許普通用戶查看並修改shadow文件;但是如果這樣普通用戶就無法為自己修改密碼。
Linux系統就是使用setuid來解決這個矛盾的問題:如果一個程序被設置了setuid位,那么它無論被哪個用戶啟用,都會具備程序所有者的權限。而passwd程序的所有者是root用戶,passwd的權限如下所示,那么任何用戶執行該程序,程序的EUID就會變成root用戶的EUID,而不是執行該程序的UID。
gaolu@gaolu-desktop:/etc$ cd /usr/bin
gaolu@gaolu-desktop:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
gaolu@gaolu-desktop:/usr/bin$
gaolu@gaolu-desktop:/usr/bin$
因此,普通用戶可以通過passwd程序修改shadow文件內容,完成密碼修改。
完!