一般來說,使用過Linux的同學都知道,Linux文件的權限有rwx,所有者、所有組、其它用戶的rwx權限是彼此獨立的。為此,經常會聽到如果某個web文件需要被修改的話,需要加上777的權限,這就是讓所有用戶可寫。
但仔細一想,這樣的權限未免有些想得比較天真,沒有考濾特殊情況。例如/tmp目錄默認權限是777,而且有些文件也是允許所有用戶訪問修改的,那麼是不是任何一個用戶都可以將這些刪除呢?再如/etc/shadow保存的是用戶密碼文件,默認情況下它的權限是640,那麼只有shadow的owner(root)才能修改它,按照常規理解,這是不可理解的,因為每個用戶都可能修改密碼,也就是會修改這個文件。
為了把這些情況解釋清楚,需要引入Linux特殊文件權限的概念。Linux特殊文件權限有三個玩意:sticky bit、SGID、SUID,以下一一道來。
sticky bit
sticky bit只對目錄有效,使目錄下的文件,只有文件擁有者才能刪除(如果他不屬於owner,僅屬於group或者other,就算他有w權限,也不能刪除文件)。
加sticky bit的方法:
chmod o+t /tmp或者
chmod 1777 /tmp
查看是否加了sticky bit,用ls -l,可以看到有類似這樣的權限:“-rwxrwxrwt”,t就代表已經加上了sticky bit,而且生效了,如果顯示的是“-rwxrwxrwT”,說明也已經加上了sticky bit,但沒有生效(因為本來other就沒有寫的權限)。
看看/tmp目錄的權限,就是drwxrwxrwt吧
SGID(The Set GroupID )
加上SGID的文件,表示運行這個程序時,是臨時以這個文件的擁有組的身份運行的;加上SGID的文件夾,表示在這個目錄下創建的文件屬於目錄所有的組,而不是創建人所在的組,在這個目錄下創建的目錄繼承本目錄的SGID。
加SGID的方法:
chmod g+s /tmp或
chmod 2777 /tmp
查看是否加了SGID,用ls -l,可以看到類似這樣的權限“drwxrwsrwx”,s就代表已經加上了SGID,而且生效,如果顯示“drwxrwSrwx”,說明已經加上了SGID,但沒有生效(因為本來group就沒有執行的權限)。
SUID(The Set UserID)
SUID與SGID是一樣的,惟一不同的是,運行時是以這個文件的擁有者身份來運行。
加SUID的方法:
chmod o+s /tmp或
chmod 4777 /tmp
同樣的,加了SUID的文件權限有這類似這兩種:“drwsrwxrwx”、“drwSrwxrwx”。
看看passwd命令的權限:ll /usr/bin/passwd,是"-rwsr-x-rx",終於知道為什麼執行passwd時,可以修改/etc/shadow文件了吧