Linux中的檔案許可權

THANK_DBA發表於2013-12-04
Linux系統中的每一個檔案都與多種許可權型別相關聯。在這些許可權中,我們主要和三類許可權打交道:使用者(user)、使用者組(group)和其他使用者(others)。使用者是檔案的所有者;使用者組是指和檔案所有者在同一組的其他多個使用者的集合;其他使用者是除使用者或使用者組之外的任何使用者。
ls -l命令可以列出檔案的許可權,如:
-rw-rw-r-- 1 lfqy lfqy  529  6月 11 20:21 file-authority.txt
-rw-rw-r-- 1 lfqy lfqy    0  6月 11 19:02 helloworld
drwxrwxr-x 2 lfqy lfqy 4096  6月 11 20:21 try
可以看出,每一行輸出代表一個檔案。每行輸出的前10個字元代表檔案的許可權資訊:第一個字元代表檔案的型別(-表示普通檔案,d表示目錄,c表示字元裝置,b表示塊裝置,l表示符號連結,s表示套接字,p表示管道),剩下的部分可以劃分成三組(第一組的三個字元對應使用者許可權,第二組的三個字元對應使用者組許可權,第三組的三個字元對應其他使用者許可權。這9個字元中的每一個字元指明是否設定了某種許可權,如果設定了許可權,對應位置上就會出現一個字元,否則就一個'-'表明沒有設定對應的許可權)。其中r代表讀許可權,w代表寫許可權,x代表執行許可權,比如第一行中的file-authority.txt檔案屬於使用者lfqy,該使用者對其擁有讀寫許可權,而沒有執行許可權,和lfqy在同一組的其他使用者也擁有對該檔案的讀寫許可權,而其他使用者對其只有讀許可權。
1、檔案的許可權
1.1 檔案的基本許可權

rwx分別對應檔案的讀許可權、寫許可權和可執行許可權,然而,對於目錄來說,這三種許可權有不同的含義。目錄的讀許可權允許讀取目錄中檔案和子目錄的列表,目錄的寫許可權允許在目錄中建立或刪除檔案或目錄,目錄的可執行許可權指明是否可以訪問目錄中的檔案和子目錄。
1.2 setuid、setgid和sticky bit
實際上,除了最基本的讀、寫和執行許可權之外,Linux中還有setuid、setgid和sticky bit等三種許可權。下面分別解釋這三種許可權。
關於setuid和setgid維基百科上的解釋如下:
setuid and setgid (short for "set user ID upon execution" and "set group ID upon execution", respectively) are Unix access rights flags that allow users to run an executable with the permissions of the executable's owner or group respectively and to change behaviour in directories. They are often used to allow users on a computer system to run programs with temporarily elevated privileges in order to perform a specific task.
The setuid and setgid flags, when set on a directory, have an entirely different meaning.
Setting the setgid permission on a directory (chmod g+s) causes new files and subdirectories created within it to inherit its group ID, rather than the primary group ID of the user who created the file (the owner ID is never affected, only the group ID). Newly created subdirectories inherit the setgid bit. Thus, this enables a shared workspace for a group without the inconvenience of requiring group members to explicitly change their current group before creating new files or directories. Note that setting the setgid permission on a directory only affects the group ID of new files and subdirectories created after the setgid bit is set, and is not applied to existing entities. Setting the setgid bit on existing subdirectories must be done manually, with a command such as the following:
[root@foo]# find /path/to/directory -type d -exec chmod g+s {} \;
The setuid permission set on a directory is ignored on UNIX and Linux systems. FreeBSD can be configured to interpret it analogously to setgid, namely, to force all files and sub-directories to be owned by the top directory owner.
1.2.1 setuid許可權
setuid可以設定使檔案在執行階段具有檔案所有者的許可權。setuid屬性出往往用使用者許可權的第三個字元表示:如果使用者許可權的第三個字元是s,則表示該檔案的屬主對該檔案有可執行許可權的同時,該檔案還有setuid許可權;如果使用者許可權的第三個字元是S,則表示該檔案的屬主對該檔案沒有可執行許可權,但是該檔案有setuid許可權(實際上,從下文也可一看出,這種情況,沒有可執行許可權只有setuid許可權無任何意義)。setuid許可權允許使用者以其檔案擁有者的許可權來執行可執行檔案,即使這個可執行檔案是由其他使用者執行的。從下面的例子中可以看出setuid許可權的意思。
Linux中的密碼通常是儲存在"/etc/paswd"和"/etc/shadow"檔案中,這兩個檔案對系統安全至關重要,因此只有Root使用者才能對其執行讀寫操作。以管理員的身份登陸系統,在Linux提示符下執行"ls /etc/passwd /etc/shadow"命令,在返回資訊中可以看到普通使用者對上述這兩個檔案並沒有寫許可權,因此從檔案屬性的角度看,普通使用者在更改自身密碼時,是無法將密碼資訊寫入到上述檔案中的,哪麼使用者是怎樣成功的更改密碼的呢?實際上,問題的關鍵不在於密碼檔案本身,而在於密碼更改命令"passwd"。在提示符下執行命令"ls /usr/bin/passwd",在返回資訊中的檔案所有者執行許可權位上顯示"s"字樣,表示"passwd"命令具setuid許可權,其所有者為root,這樣普通使用者在執行"passwd"命令時,實際上以有效使用者root的身份來執行的,並具有了相應的許可權(包括讀寫passwd和shadow檔案的許可權),從而將新的密碼寫入到"/etc/passwd"和"/etc/shadow"檔案中,當命令執行完畢,該使用者的身份立即消失。這樣,通過setuid許可權,普通使用者在執行passwd程式時,也能獲得passwd程式屬主(root)一樣的許可權(也可以對檔案passwd和shadow進行讀寫)。這樣,普通使用者也可以通過passwd工具來修改自身密碼。
1.2.2 setgid許可權
setgid許可權的含義和setuid類似,它允許使用者以其擁有者所在的組的許可權來執行可執行檔案。setgid屬性往往用使用者組許可權的第三個字元表示:如果使用者許可權的第三個字元是s,則表示該檔案的屬主對該檔案有可執行許可權的同時,該檔案還有setgid許可權;如果使用者組許可權的第三個字元是S,則表示該檔案的屬主對該檔案沒有可執行許可權,但是該檔案有setgid許可權(實際上,從下文也可一看出,這種情況,沒有可執行許可權只有setuid許可權無任何意義)。setgid許可權允許使用者以其檔案擁有者所在組的許可權來執行可執行檔案,即使這個可執行檔案是由其他使用者執行的。
1.2.3 sticky bit
關於sticky,維基百科上的解釋如下:
In computing, the sticky bit is a user ownership access-right flag that can be assigned to files and directories on Unix systems.
The most common use of the sticky bit today is on directories. When the sticky bit is set, only the item's owner, the directory's owner, or the superuser can rename or delete files. Without the sticky bit set, any user with write and execute permissions for the directory can rename or delete contained files, regardless of owner. Typically this is set on the /tmp directory to prevent ordinary users from deleting or moving other users' files. This feature was introduced in 4.3BSD in 1986 and today it is found in most modern Unix systems.
sticky-bit之後,儘管其他使用者有寫許可權,也必須由屬主執行刪除、移動等操作。對一個目錄設定了sticky-bit之後,存放在該目錄的檔案僅准許其屬主執行刪除、移動等操作。
sticky bit出現在其他使用者許可權中的執行許可權(x)位置,使用t或T表示。t表示既有可執行許可權,又設定了sticky bit,T表示只設定了sticky bit而沒有設定可執行許可權。
2、管理檔案許可權
2.1 設定基本許可權
2.1.1 用助記符的方式設定檔案基本許可權

可以採用"chmod u=rwx g=rw o=r filename"來設定檔案的許可權。其中u代表使用者的許可權,g代表使用者所帶組的許可權,o代表其它使用者的許可權。如果要新增許可權可以"chmod a+x filename"(給所有的使用者新增可執行許可權),"chmod o+x filename"給其他使用者增加可執行許可權。如果要刪除相應的許可權,可以"chmod a-x filename"(刪除所有使用者的可執行許可權)。
2.1.2 用八進位制數的方式設定檔案的基本許可權
也可以採用八進位制數的形式。讀、寫和執行許可權都有與之對應的唯一的8進位制數:r(4),w(2),x(1)。我們可以將許可權序列的八進位制值相加來獲得所需的許可權組合:rwx(4+2+1=7),rw-(4+2=6),r-x(4+1=5)等。因此,用8進位制設定許可權的命令為"chmod 765 filename"。
2.2 設定setuid,setgid和sticky bit
2.2.1 用助記符的方式
chmod u +s temp -- 為temp檔案加上setuid標誌
chmod g +s tempdir -- 為tempdir目錄加上setgid標誌
chmod o +t temp -- 為temp檔案加上sticky標誌
2.2.2 採用八進位制方式
對一般檔案通過三組八進位制數字來置標誌, 如 666, 777, 644等. 如果設定這些特殊標誌, 則在這組數字之外外加一組八進位制數字. 如 4666, 2777等. 這一組八進位制數字三位的意義如下:
abc
a - setuid位, 如果該位為1, 則表示設定setuid 4xxx
b - setgid位, 如果該位為1, 則表示設定setgid  2xxx
c - sticky位, 如果該位為1, 則表示設定sticky   1xxx
設定完這些標誌後, 可以用 ls -l 來檢視. 如果有這些標誌, 則會在原來的執行標誌位置上顯示. 如
rwsrw-r-- 表示有setuid標誌
rwxrwsrw- 表示有setgid標誌
rwxrw-rwt 表示有sticky標誌
對於setuid,setgid和sticky bit,如果表示這寫許可權的位上本來有x, 則這些特殊標誌顯示為小寫字母 (s, s, t);若無執行許可權則顯示為大寫字母(S, S, T)。
3、其它
檔案的許可權是為了使用的安全性和方便性而設定的,瞭解這寫許可權的含義能是我們更加方便的使用Linux,防制由於檔案許可權管理不善而帶來的安全問題。實際上,在設定檔案的許可權時,應該慎重考慮,尤其是在使用setuid、setgid和sticky bit等許可權的時候。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29366942/viewspace-1062231/,如需轉載,請註明出處,否則將追究法律責任。

相關文章