Linux之特殊权限(SUID/SGID/SBIT)
Linux之特殊權(quán)限(SUID/SGID/SBIT)
- 博客分類:?
- Linux
特殊權(quán)限的介紹
Set UID
當(dāng)s這個(gè)標(biāo)志出現(xiàn)在文件所有者的x權(quán)限上時(shí),如/usr/bin/passwd這個(gè)文件的權(quán)限狀態(tài):“-rwsr-xr-x.”,此時(shí)就被稱為Set UID,簡(jiǎn)稱為SUID。那么這個(gè)特殊權(quán)限的特殊性的作用是什么呢?
1、SUID權(quán)限僅對(duì)二進(jìn)制程序(binary program)有效;
2、執(zhí)行者對(duì)于該程序需要具有x的可執(zhí)行權(quán)限;
3、本權(quán)限僅在執(zhí)行該程序的過程中有效(run-time);
4、執(zhí)行者將具有該程序擁有者(owner)的權(quán)限。
SUID的目的就是:讓本來沒有相應(yīng)權(quán)限的用戶運(yùn)行這個(gè)程序時(shí),可以訪問他沒有權(quán)限訪問的資源。passwd就是一個(gè)很鮮明的例子,下面我們就來了解一下這相passwd執(zhí)行的過程。
我們知道,系統(tǒng)中的用戶密碼是保存在/etc/shadow中的,而這個(gè)文件的權(quán)限是----------. (這個(gè)權(quán)限和以前版本的RHEL也有差別,以前的是-r--------)。其實(shí)有沒有r權(quán)限不重要,因?yàn)槲覀兊膔oot用戶是擁有最高的權(quán)限,什么都能 干了。關(guān)鍵是要把密碼寫入到/etc/shadow中。我們知道,除了root用戶能修改密碼外,用戶自己同樣也能修改密碼,為什么沒有寫入權(quán)限,還能修 改密碼,就是因?yàn)檫@個(gè)SUID功能。
下面就是passwd這個(gè)命令的執(zhí)行過程
1、因?yàn)?usr/bin/passwd的權(quán)限對(duì)任何的用戶都是可以執(zhí)行的,所以系統(tǒng)中每個(gè)用戶都可以執(zhí)行此命令。
2、而/usr/bin/passwd這個(gè)文件的權(quán)限是屬于root的。
3、當(dāng)某個(gè)用戶執(zhí)行/usr/bin/passwd命令的時(shí)候,就擁有了root的權(quán)限了。
4、于是某個(gè)用戶就可以借助root用戶的權(quán)力,來修改了/etc/shadow文件了。
5、最后,把密碼修改成功。
注:這個(gè)SUID只能運(yùn)行在二進(jìn)制的程序上(系統(tǒng)中的一些命令),不能用在腳本上(script),因?yàn)槟_本還是把很多的程序集合到一起來執(zhí)行,而不是腳本自身在執(zhí)行。同樣,這個(gè)SUID也不能放到目錄上,放上也是無效的。
Set GID
我們前面講過,當(dāng)s這個(gè)標(biāo)志出現(xiàn)在文件所有者的x權(quán)限上時(shí),則就被稱為Set UID。那么把這個(gè)s放到文件的所屬用戶組x位置上的話,就是SGID。如開頭的/usr/bin/wall命令。
那么SGID的功能是什么呢?和SUID一樣,只是SGID是獲得該程序所屬用戶組的權(quán)限。
這相SGID有幾點(diǎn)需要我們注意:
1、SGID對(duì)二進(jìn)制程序有用;
2、程序執(zhí)行者對(duì)于該程序來說,需具備x的權(quán)限;
3、SGID主要用在目錄上;
理解了SUID,我想SGID也很容易理解。如果用戶在此目錄下具有w權(quán)限的話,若使用者在此目錄下建立新文件,則新文件的群組與此目錄的群組相同。
Sticky Bit
這個(gè)就是針對(duì)others來設(shè)置的了,和上面兩個(gè)一樣,只是功能不同而已。
SBIT(Sticky Bit)目前只針對(duì)目錄有效,對(duì)于目錄的作用是:當(dāng)用戶在該目錄下建立文件或目錄時(shí),僅有自己與 root才有權(quán)力刪除。
最具有代表的就是/tmp目錄,任何人都可以在/tmp內(nèi)增加、修改文件(因?yàn)闄?quán)限全是rwx),但僅有該文件/目錄建立者與 root能夠刪除自己的目錄或文件。
注:這個(gè)SBIT對(duì)文件不起作用。
SUID/SGID/SBIT權(quán)限設(shè)置
和我們前面說的rwx差不多,也有兩種方式,一種是以字符,一種是以數(shù)字。
4 為 SUID = u+s
2 為 SGID = g+s
1 為 SBIT = o+t
下面我們就來看看如何設(shè)置,并看看達(dá)到的效果。
先看SUID的作用及設(shè)置
[root@japie ~]# cd /tmp/
[root@?japie?tmp]# cp /usr/bin/passwd ./
[root@?japie?tmp]# mkdir testdir?
上面兩步是在/tmp目錄下創(chuàng)建passwd文件和testdir目錄
下面看看這兩個(gè)的權(quán)限
[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/?
我們切換到y(tǒng)ufei 用戶,然后修改自己的密碼
[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?
發(fā)現(xiàn)上面的yufei改不了自己的密碼,為什么呢?就是因?yàn)闆]有權(quán)限把密碼寫入到/etc/shadow中。想讓普通用戶能修改/etc/shadow的話,那就需要用到SUID了。
[yufei@?japie?tmp]$ su root
Password:
[root@?japie?tmp]# chmod u+s passwd
[root@?japie?tmp]# ls -l passwd
-rwsr-xr-x. 1 root root 26968 Jan 20 23:27 passwd?
看到有SUID權(quán)限了,下面再來修改yufei自己的密碼
[yufei@?japie?tmp]$ ./passwd
Changing password for user yufei.
Changing password for yufei.
(current) UNIX password:
New password:
Retype new password:
passwd: all authentication tokens updated successfully.?
我們發(fā)現(xiàn)已經(jīng)成功了。
我想這一下,你對(duì)SUID的作用已經(jīng)了解了吧。
如果想把這個(gè)改回來(就是把SUID的權(quán)限去掉),我們用數(shù)字方式來設(shè)置
[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這樣就改過來了,這個(gè)數(shù)字的原理和我們前面講的rwx是一樣的,只是在最前面設(shè)置相應(yīng)的數(shù)字而已。
注:在普通用戶修改自己的密碼是,密碼要設(shè)置的復(fù)雜點(diǎn),否則的話,通過不了認(rèn)證,普通用戶和root用戶的權(quán)限是不同的。
再看SGID的作用及設(shè)置
我們以前面建立的/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/?
這時(shí)候,任何用戶對(duì)此目錄都有寫入權(quán)限,那么我們就在這個(gè)目錄里面創(chuàng)建文件與目錄,并看看他們的權(quán)限如何
[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?
這時(shí)候的文件與目錄權(quán)限都是創(chuàng)建者的本身
下面我們就來看看,把這個(gè)目錄加上SGID權(quán)限后,再創(chuàng)建文件與目錄,會(huì)是什么樣的效果
[?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/?
這時(shí)候我們就發(fā)現(xiàn),file2和dir2的用戶組變成了root了,也就是他們上層目錄testdir這個(gè)目錄的所屬用戶組。
這個(gè)應(yīng)用,應(yīng)用在一個(gè)項(xiàng)目的共同開發(fā)上,是很方便的。
[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/?
這樣就還原了
最后我們來看SBIT的作用及設(shè)置
[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/目錄里面的全部?jī)?nèi)容。
我們切換成普通用戶,然后再里面創(chuàng)建文件,至少需要兩個(gè)普通用戶來測(cè)試這個(gè),如果沒有的話,就自己建立。
[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?
這時(shí)候我們建立了一個(gè)文件,我們換成另外一個(gè)用戶
[yufei@?japie?tmp]$ su opsers
Password:
[opsers@?japie?tmp]$ ls -ld testdir/
drwxr-xrwx. 2 root root 4096 Jan 21 11:45 testdir/?
我們看到,雖然其他用戶對(duì)yufei_file只有只讀權(quán)限,但由于japie?_file所在的目錄,對(duì)其他人是全部的權(quán)限,所以,我們換其他用戶還是可以刪除這個(gè)文件的,看操作
[opsers@?japie?tmp]$ rm -f testdir/?japie?_file
[opsers@?japie?tmp]$ ls testdir/?
發(fā)現(xiàn)我們已經(jīng)刪除了這個(gè)不屬于我們的權(quán)限。
下面我們就給這個(gè)目錄加上SBIT權(quán)限,再來看看效果
[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/?
再一次切換普通用戶,創(chuàng)建文件
[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?
這個(gè)文件的權(quán)限還是和第一次創(chuàng)建的時(shí)候是一樣的,我們?cè)贀Q成其他的用戶,看看能不能再次刪除這個(gè)文件
[yufei@?japie?tmp]$ su opsers
Password:
[opsers@?japie?tmp]$ rm -f testdir/?japie?_file
rm: cannot remove `testdir/?japie?_file': Operation not permitted?
看到提示,說權(quán)限不夠了,只能由這個(gè)文件的創(chuàng)建者或root用戶才能刪除。這個(gè)我們就不演示了。
如果要還原權(quán)限的話,
[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/
兩個(gè)需要注意的問題
OK,關(guān)于SUID/SGID/SBIT這些特殊權(quán)限的應(yīng)用和作用我們已經(jīng)講完了。但如果你仔細(xì)一點(diǎn)的話,會(huì)發(fā)現(xiàn),我并沒有用數(shù)字方式來更改這個(gè)特殊的權(quán)限,為什么呢?且看下面的分析。
問題1:用數(shù)字改變目錄的特殊權(quán)限,不起作用。
我們把/tmp/下面,我們自己建立的實(shí)驗(yàn)文件刪除
[root@?japie?tmp]# rm -fr testdir/
[root@?japie?tmp]# rm -fr passwd?
然后再重新創(chuàng)建一個(gè)文件和目錄,
[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/?
下面我們就來用數(shù)字方式來更改這三個(gè)特殊的權(quán)限,看看會(huì)有什么樣的結(jié)果
[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/?
發(fā)現(xiàn)用這種方式增加這三個(gè)特殊權(quán)限沒有問題,那么我們?cè)侔褭?quán)限改回去看看
[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/?
我們發(fā)現(xiàn),對(duì)文件,權(quán)限是改回去了,而對(duì)于目錄,只改回去了SBIT的權(quán)限,對(duì)SUID和SGID改不回去。這是RHEL6上的實(shí)驗(yàn)結(jié)果,可能是出于安全性的考慮嗎?這個(gè)我就不清楚了,也找不到相關(guān)的資料。如果各位網(wǎng)友,有知道什么原因的,歡迎與我聯(lián)系。在此先謝過了。
所以說,建議大家還是用最明了的方式,直接用+-來更改,無論方法如何,最終能得到結(jié)果就OK了。哈哈……
問題2:為什么會(huì)有大寫的S和T。
還是用上面的文件和目錄
[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權(quán)限去掉
[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權(quán)限
[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/?
我們看到,這時(shí)候的小s和小t已經(jīng)變成了大S和大T了,為什么呢?因?yàn)樗麄冞@個(gè)位置沒有了x權(quán)限,如果沒有了x權(quán)限,根據(jù)我們上面講的內(nèi)容,其實(shí),這個(gè)特 殊的權(quán)限就相當(dāng)于一個(gè)空的權(quán)限,沒有意義。也就是說,如果你看到特殊權(quán)限位置上變成了大寫的了,那么,就說明,這里有問題,需要排除。
總結(jié)
以上是生活随笔為你收集整理的Linux之特殊权限(SUID/SGID/SBIT)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。