自主訪問控制(Discretionary Access Control, DAC)是指對象(比如程序、文件、進程)的擁有者可以任意修改或者授予此對象相應的權限。Linux的UGO(User, Group, Other)和ACL(Access Control List)權限管理方式就是典型的自主訪問控制。UGO將權限信息存儲在節點的權限中,ACL將權限位信息存儲在節點的擴展屬性中。
當一個文件創建後,它具有讀(r)、寫(w)、執行(x)三種操作方式。UGO權限管理方式將訪問文件的操作者簡單分為三類:文件屬主(u)、同組用戶(g)與其他組用戶(o)。
文件的三種操作方式用三個二進制位表示,第一位表示讀權限,第二位表示寫權限,第三位表示執行權限。一個文件的權限屬性就是有三類用戶對該文件的權限使能的集合。當我們用ls查看一個文件的時候,會顯示如下結果
linuxidc@linuxidc:~$ ls -l test -rw-rw-r-- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$
最前面的’-’,表示文件為普通類型
第一組的‘rw-’,表示文件屬主對文件具有讀和寫權限,但沒有執行權限
第二組的’rw-’,表示同組其他用戶對文件具有讀和寫權限,但沒有執行權限
第三組的’r--’,表示其他組用戶對文件具有讀權限,但沒有寫和執行權限
上述每一組權限用可以用二進制表示,例如’rw-’,二進制表示是110,十進制數值是6,‘r--’,二進制表示100, 十進制數值是4;所以對每一組權限都可以用十進制來表示。當使用chmod修改文件權限的時候就可以使用十進制代替‘rwx’,例如
linuxidc@linuxidc:~$ ls -l test -rw-rw-r-- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$ chmod 766 test linuxidc@linuxidc:~$ ls -l test -rwxrw-rw- 1 linuxidc xlzh 0 3月 15 15:12 test linuxidc@linuxidc:~$
當然也可以通過chmod u+x,o+w test實現與上述同樣的功能。具體使用哪種方式,單憑個人喜好。
在linux下一切皆文件,目錄也不例外,但目錄的讀寫執行權限與普通文件的讀寫執行權限含義有所不同,如下所示
權限位 文件 目錄 r 可以讀文件 可以查看目錄中內容 w 可以寫文件 可以增刪目錄中內容 x 可以執行文件 可以進入目錄1.1節描述了常用的權限位,但還有幾個特殊的權限位需要知道,分別是s(suid),s(sgid), t(Sticky Bit)。首先看一下linux下的/usr/passwd文件和/tmp目錄
linuxidc@linuxidc:~$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 42824 9月 13 2012 /usr/bin/passwd linuxidc@linuxidc:~$ ls -ld /tmp drwxrwxrwt 16 root root 12288 3月 15 15:31 /tmp linuxidc@linuxidc:~$
可以看到/usr/bin/passwd的第一組權限位和上一節有所不同,第三個標志位變成了s。當屬主用戶對文件設置了suid位後,其他用戶在執行該文件的時候則具有等同於屬主的權限。
還是以passwd命令為例,普通用戶可以用passwd修改自己的密碼,而用戶密碼的hash存儲在/etc/shadow文件中,修改密碼必然要修改此文件,我們看下此文件
linuxidc@linuxidc:~$ ls -l /etc/shadow -rw-r----- 1 root shadow 1647 2月 18 09:46 /etc/shadow linuxidc@linuxidc:~$
發現只有root用戶可以修改此文件,也就是說當普通用戶執行passwd命令的時候,其權限變為root的權限,故可以修改/etc/shadow文件。
guid類似
SUID對目錄沒有影響,SGID對目錄有影響,對於設置了SGID的目錄,所有用戶在該目錄下新建的文件屬主輸入該用戶,但GID是該目錄所屬的組,如下
linuxidc@linuxidc:~$ sudo mkdir -m 2777 test linuxidc@linuxidc:~$ ls -ld test drwxrwsrwx 2 root root 4096 3月 28 16:23 test linuxidc@linuxidc:~$ cd test linuxidc@linuxidc:~/test$ touch 1.txt -rw-rw-r-- 1 linuxidc root 0 3月 28 16:23 1.txt
而對於t,又叫粘著位,僅對目錄生效。在具有t位的目錄下,如果用戶在該目錄下具有w及x權限,則當用戶在該目錄下建立文件或目錄時,只有文件擁有者與root才有權力刪除。/tmp目錄則是最好的例子,每個應用都可以在tmp目錄下新建刪除自己的文件,但卻不能刪除其應用建立的文件。
那麼如何修改文件的sst權限呢?還是使用chmod命令,由第一節我們知道可以用十進制數值設置UGO對文件的訪問權限,同樣對於特殊權限位,也可以使用。只需在原來的數值前面加上sst的十進制數值。有時候我們還會看到大寫的SST,那是因為可執行位為0,所以顯示為大寫,例如
linuxidc@linuxidc:~$ ls -l test先做一個實驗,在linux下分別建立一個目錄和一個文件,查看其權限位
linuxidc@linuxidc:~$ mkdir dir可以看到,新建的目錄全顯示775,新建的文件是664,為什麼新建的文件和目錄權限不是777呢?就是由於掩碼的存在,當用戶新建一個目錄的時候,是777與掩碼做與操作,當用戶新建一個文件的時候,是666與掩碼做與操作。可以用umask命令查看當前系統掩碼
linuxidc@linuxidc:~$ umask 0002 linuxidc@linuxidc:~$
新建目錄是777與007做掩碼,結果正是775,新建文件是666與002做掩碼,結果正是664。
當然,還可以通過umask命令修改系統掩碼,新建文件的權限位也跟著改變。