基本上SUID有這樣的限制與功能:shell
SUID權限僅對二進位程序(binaryprogram)有效,不能用在shellscript上面;api
運行者對於該程序須要具備x的可運行權限;安全
本權限僅在運行該程序的過程當中有效(run-time);測試
運行者將具備該程序擁有者(owner)的權限。ui
這裏舉個栗子。Linux系統中默認的被賦予suid權限的文件是passwd。spa
root@VMS001:~#ll/usr/bin/passwdcode
-rwsr-xr-x1rootroot42824Sep132012/usr/bin/passwd*token
passwd的擁有者是root用戶。假定有某個用戶叫hackstoic,他要修改本身的密碼,即執行passwd命令,這時候hackstoic就會被臨時賦予root的權限來執行passwd命令文件,passwd就會去修改/etc/shadow文件中對應的記錄,從而修改用戶本身的密碼。這就解釋了爲何能夠執行passwd命令的原因。ip
可是你能夠會問,既然我能夠臨時得到root的權限,我爲何不能使用passwd命令來修改別人的密碼呢?開發
這是由於passwd在修改密碼以前會查看當前用戶是否匹配要修改的用戶,不然就不會往下執行。
會顯示「您不能查看或更改xxx的密碼信息。」之類的提示。這個提示是passwd修改密碼以前的判斷,而不是在修改shadow的時候系統提示的權限不足。這就解釋了爲何普通用戶不能修改他人的密碼的緣由。
和咱們前面說的rwx差很少,也有兩種方式,一種是以字符,一種是以數字。
4 爲 SUID = u+s
2 爲 SGID = g+s
1 爲 SBIT = o+t
下面咱們就來看看如何設置,並看看達到的效果。
[root@japie ~]# cd /tmp/
[root@ japie tmp]# cp /usr/bin/passwd ./
[root@ japie tmp]# mkdir testdir
上面兩步是在/tmp目錄下建立passwd文件和testdir目錄
下面看看這兩個的權限
[root@ japie tmp]# ls -l passwd ; ls -ld testdir/
-rwxr-xr-x. 1 root root 26968 Jan 20 23:27 passwd
drwxr-xr-x. 2 root root 4096 Jan 20 19:25 testdir/
咱們切換到yufei 用戶,而後修改本身的密碼
[root@ japie tmp]# su yufei
[yufei@ japie i tmp]$ ./passwd
Changing password for user japie .
Changing password for yufei.
(current) UNIX password:
New password:
Retype new password:
passwd: Authentication token manipulation error
發現上面的yufei改不了本身的密碼,爲何呢?就是由於沒有權限把密碼寫入到/etc/shadow中。想讓普通用戶能修改/etc/shadow的話,那就須要用到SUID了。
[yufei@ japie tmp]$ su root
Password:
若是想把這個改回來(就是把SUID的權限去掉),咱們用數字方式來設置
[root@ japie tmp]# chmod 0755 passwd
[root@ japie tmp]# ls -l passwd
-rwxr-xr-x. 1 root root 26968 Jan 20 23:27 passwd
OK這樣就改過來了,這個數字的原理和咱們前面講的rwx是同樣的,只是在最前面設置相應的數字而已。
注:在普通用戶修改本身的密碼是,密碼要設置的複雜點,不然的話,經過不了認證,普通用戶和root用戶的權限是不一樣的。
咱們之前面創建的/tmp/testdir爲例子
[root@ japie tmp]# ls -ld testdir/
[root@ japie tmp]# chmod 757 testdir/
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 20 19:25 testdir/
這時候,任何用戶對此目錄都有寫入權限,那麼咱們就在這個目錄裏面建立文件與目錄,並看看他們的權限如何
[root@ japie tmp]# su japie
[yufei@ japie tmp]$ touch testdir/file1
[yufei@ japie tmp]$ mkdir testdir/dir1
[yufei@ japie tmp]$ ls -l testdir
total 0
drw-rw-r--. 1 japie japie 0 Jan 21 10:33 dir1
-rw-rw-r--. 1 japie japie 0 Jan 21 10:33 file1
這時候的文件與目錄權限都是建立者的自己
下面咱們就來看看,把這個目錄加上SGID權限後,再建立文件與目錄,會是什麼樣的效果
[ japie @ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod g+s testdir/
[root@ japie tmp]# ls -ld testdir/
drwxr-srwx. 2 root root 4096 Jan 21 10:33 testdir/
[root@ japie tmp]# su yufei
[yufei@ japie tmp]$ touch testdir/file2
[yufei@ japie tmp]$ mkdir testdir/dir2
[yufei@ japie tmp]$ ls -l testdir/
total 0
drw-rw-r--. 1 japie japie 0 Jan 21 10:33 dir1
drw-rw-r--. 1 japie root 0 Jan 21 10:36 dir2
-rw-rw-r--. 1 japie i japie 0 Jan 21 10:33 file1
-rw-rw-r--. 1 japie root 0 Jan 21 10:35 file2
[yufei@ japie tmp]$ ls -ld testdir/
drwxr-srwx. 2 root root 4096 Jan 21 10:36 testdir/
這時候咱們就發現,file2和dir2的用戶組變成了root了,也就是他們上層目錄testdir這個目錄的所屬用戶組。
這個應用,應用在一個項目的共同開發上,是很方便的。
[yufei@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod g-s testdir/
[yufei@ japie tmp]$ ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 10:36 testdir/
這樣就還原了
[root@ japie tmp]# rm -fr testdir/*
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:42 testdir/
清空/tmp/testdir/目錄裏面的所有內容。
咱們切換成普通用戶,而後再裏面建立文件,至少須要兩個普通用戶來測試這個,若是沒有的話,就本身創建。
[root@ japie tmp]# su japie
[yufei@ japie tmp]$ touch testdir/ japie _file
[yufei@ japie i tmp]$ ls -l testdir/
total 0
-rw-rw-r-- 1 japie japie 0 Jan 21 11:45 japie _file
這時候咱們創建了一個文件,咱們換成另一個用戶
[yufei@ japie tmp]$ su opsers
Password:
[opsers@ japie tmp]$ ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:45 testdir/
咱們看到,雖然其餘用戶對yufei_file只有只讀權限,但因爲japie _file所在的目錄,對其餘人是所有的權限,因此,咱們換其餘用戶仍是能夠刪除這個文件的,看操做
[opsers@ japie tmp]$ rm -f testdir/ japie _file
[opsers@ japie tmp]$ ls testdir/
發現咱們已經刪除了這個不屬於咱們的權限。
下面咱們就給這個目錄加上SBIT權限,再來看看效果
[opsers@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod o+t testdir
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwt. 2 root root 4096 Jan 21 11:49 testdir/
再一次切換普通用戶,建立文件
[root@ japie tmp]# su japie
[yufei@ japie tmp]$ touch testdir/ japie _file
[yufei@ japie tmp]$ ls -l testdir/ japie _file
-rw-rw-r-- 1 japie japie 0 Jan 21 11:51 testdir/ japie _file
這個文件的權限仍是和第一次建立的時候是同樣的,咱們再換成其餘的用戶,看看能不能再次刪除這個文件
[yufei@ japie tmp]$ su opsers
Password:
[opsers@ japie tmp]$ rm -f testdir/ japie _file
rm: cannot remove `testdir/ japie _file': Operation not permitted
看到提示,說權限不夠了,只能由這個文件的建立者或root用戶才能刪除。這個咱們就不演示了。
若是要還原權限的話,
[opsers@ japie tmp]$ su root
Password:
[root@ japie tmp]# chmod o-t testdir
[root@ japie tmp]# ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:51 testdir/
OK,關於SUID/SGID/SBIT這些特殊權限的應用和做用咱們已經講完了。但若是你仔細一點的話,會發現,我並無用數字方式來更改這個特殊的權限,爲何呢?且看下面的分析。
咱們把/tmp/下面,咱們本身創建的實驗文件刪除
[root@ japie tmp]# rm -fr testdir/
[root@ japie tmp]# rm -fr passwd
而後再從新建立一個文件和目錄,
[root@ japie tmp]# cp /usr/bin/passwd ./
[root@ japie tmp]# mkdir testdir
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-xr-x 2 root root 4096 Jan 21 12:00 testdir/
下面咱們就來用數字方式來更改這三個特殊的權限,看看會有什麼樣的結果
[root@yufei tmp]# chmod 4755 passwd
[root@yufei tmp]# chmod 3755 testdir/
[root@yufei tmp]# ls -l passwd ;ls -ld testdir/
-rwsr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
發現用這種方式增長這三個特殊權限沒有問題,那麼咱們再把權限改回去看看
[root@ japie tmp]# chmod 0755 passwd
[root@ japie tmp]# chmod 0755 testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
咱們發現,對文件,權限是改回去了,而對於目錄,只改回去了SBIT的權限,對SUID和SGID改不回去。這是RHEL6上的實驗結果,多是出於安全性的考慮嗎?這個我就不清楚了,也找不到相關的資料。若是各位網友,有知道什麼緣由的,歡迎與我聯繫。在此先謝過了。
因此說,建議你們仍是用最明瞭的方式,直接用+-來更改,不管方法如何,最終能獲得結果就OK了。哈哈……
仍是用上面的文件和目錄
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwxr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-x 2 root root 4096 Jan 21 12:00 testdir/
咱們把passwd和testdir的x權限去掉
[root@ japie tmp]# chmod u-x passwd
[root@ japie tmp]# chmod o-x testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rw-r-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-- 2 root root 4096 Jan 21 12:00 testdir/
再給他們加上SUID和SBIT權限
[root@ japie tmp]# chmod u+s passwd
[root@ japie tmp]# chmod o+t testdir/
[root@ japie tmp]# ls -l passwd ;ls -ld testdir/
-rwSr-xr-x 1 root root 26968 Jan 21 12:00 passwd
drwxr-sr-T 2 root root 4096 Jan 21 12:00 testdir/
咱們看到,這時候的小s和小t已經變成了大S和大T了,爲何呢?由於他們這個位置沒有了x權限,若是沒有了x權限,根據咱們上面講的內容,其實,這個特 殊的權限就至關於一個空的權限,沒有意義。也就是說,若是你看到特殊權限位置上變成了大寫的了,那麼,就說明,這裏有問題,須要排除。