Linux UGO和ACL權限管理


自主訪問控制(Discretionary Access Control, DAC)是指對象(比如程序、文件、進程)的擁有者可以任意修改或者授予此對象相應的權限。Linux的UGO(User, Group, Other)和ACL(Access Control List)權限管理方式就是典型的自主訪問控制。UGO將權限信息存儲在節點的權限中,ACL將權限位信息存儲在節點的擴展屬性中。

1、Linux UGO權限管理

1.1 普通權限

當一個文件創建后,它具有讀(r)、寫(w)、執行(x)三種操作方式。UGO權限管理方式將訪問文件的操作者簡單分為三類:文件屬主(u)、同組用戶(g)與其他組用戶(o)。

文件的三種操作方式用三個二進制位表示,第一位表示讀權限,第二位表示寫權限,第三位表示執行權限。一個文件的權限屬性就是有三類用戶對該文件的權限使能的集合。當我們用ls查看一個文件的時候,會顯示如下結果

xlzh@cmos:~$ ls -l test
-rw-rw-r-- 1 xlzh xlzh 0  3月 15 15:12 test
xlzh@cmos:~$

最前面的’-’,表示文件為普通類型

第一組的‘rw-’,表示文件屬主對文件具有讀和寫權限,但沒有執行權限

第二組的’rw-’,表示同組其他用戶對文件具有讀和寫權限,但沒有執行權限

第三組的’r--’,表示其他組用戶對文件具有讀權限,但沒有寫和執行權限

上述每一組權限用可以用二進制表示,例如’rw-’,二進制表示是110,十進制數值是6,‘r--’,二進制表示100, 十進制數值是4;所以對每一組權限都可以用十進制來表示。當使用chmod修改文件權限的時候就可以使用十進制代替‘rwx’,例如

xlzh@cmos:~$ ls -l test
-rw-rw-r-- 1 xlzh xlzh 0  3月 15 15:12 test
xlzh@cmos:~$ chmod 766 test
xlzh@cmos:~$ ls -l test
-rwxrw-rw- 1 xlzh xlzh 0  3月 15 15:12 test
xlzh@cmos:~$

當然也可以通過chmod u+x,o+w test實現與上述同樣的功能。具體使用哪種方式,單憑個人喜好。

在linux下一切皆文件,目錄也不例外,但目錄的讀寫執行權限與普通文件的讀寫執行權限含義有所不同,如下所示

權限位 文件 目錄
r 可以讀文件 可以查看目錄中內容
w 可以寫文件 可以增刪目錄中內容
x 可以執行文件 可以進入目錄

1.2 特殊權限

1.1節描述了常用的權限位,但還有幾個特殊的權限位需要知道,分別是s(suid),s(sgid), t(Sticky Bit)。首先看一下linux下的/usr/passwd文件和/tmp目錄

xlzh@cmos:~$ ls -l /usr/bin/passwd 
-rwsr-xr-x 1 root root 42824  9月 13  2012 /usr/bin/passwd
xlzh@cmos:~$ ls -ld /tmp
drwxrwxrwt 16 root root 12288  3月 15 15:31 /tmp
xlzh@cmos:~$

可以看到/usr/bin/passwd的第一組權限位和上一節有所不同,第三個標志位變成了s。當屬主用戶對文件設置了suid位后,其他用戶在執行該文件的時候則具有等同於屬主的權限。

還是以passwd命令為例,普通用戶可以用passwd修改自己的密碼,而用戶密碼的hash存儲在/etc/shadow文件中,修改密碼必然要修改此文件,我們看下此文件

xlzh@cmos:~$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1647  2月 18 09:46 /etc/shadow
xlzh@cmos:~$

發現只有root用戶可以修改此文件,也就是說當普通用戶執行passwd命令的時候,其權限變為root的權限,故可以修改/etc/shadow文件。

guid類似

SUID對目錄沒有影響,SGID對目錄有影響,對於設置了SGID的目錄,所有用戶在該目錄下新建的文件屬主輸入該用戶,但GID是該目錄所屬的組,如下

xlzh@cmos:~$ sudo mkdir -m 2777 test
xlzh@cmos:~$ ls -ld test
drwxrwsrwx 2 root root 4096  3月 28 16:23 test
xlzh@cmos:~$ cd test
xlzh@cmos:~/test$ touch 1.txt
-rw-rw-r-- 1 xlzh root 0  3月 28 16:23 1.txt

而對於t,又叫粘着位,僅對目錄生效。在具有t位的目錄下,如果用戶在該目錄下具有w及x權限,則當用戶在該目錄下建立文件或目錄時,只有文件擁有者與root才有權力刪除。/tmp目錄則是最好的例子,每個應用都可以在tmp目錄下新建刪除自己的文件,但卻不能刪除其應用建立的文件。

那么如何修改文件的sst權限呢?還是使用chmod命令,由第一節我們知道可以用十進制數值設置UGO對文件的訪問權限,同樣對於特殊權限位,也可以使用。只需在原來的數值前面加上sst的十進制數值。有時候我們還會看到大寫的SST,那是因為可執行位為0,所以顯示為大寫,例如

xlzh@cmos:~$ ls -l test
-rw-rw-r-- 1 xlzh xlzh 0  3月 15 15:52 test
/*為文件增加sst,僅做演示,實際上t為對文件不生效*/
xlzh@cmos:~$ chmod 7777 test
/*為文件加上了suid, sgid, Sticky Bit位*/
xlzh@cmos:~$ ls -l test
-rwsrwsrwt 1 xlzh xlzh 0  3月 15 15:52 test
/*去除文件的可執行位*/
xlzh@cmos:~$ chmod 7666 test
/*顯示為大寫*/
xlzh@cmos:~$ ls -l test
-rwSrwSrwT 1 xlzh xlzh 0  3月 15 15:52 test
xlzh@cmos:~$

1.3 掩碼

先做一個實驗,在linux下分別建立一個目錄和一個文件,查看其權限位

xlzh@cmos:~$ mkdir dir
xlzh@cmos:~$ touch test
xlzh@cmos:~$ ls -ld dir
drwxrwxr-x 2 xlzh xlzh 4096  3月 15 15:57 dir
xlzh@cmos:~$ ls -l test
-rw-rw-r-- 1 xlzh xlzh 0  3月 15 15:57 test
xlzh@cmos:~$

可以看到,新建的目錄全顯示775,新建的文件是664,為什么新建的文件和目錄權限不是777呢?就是由於掩碼的存在,當用戶新建一個目錄的時候,是777與掩碼做與操作,當用戶新建一個文件的時候,是666與掩碼做與操作。可以用umask命令查看當前系統掩碼

xlzh@cmos:~$ umask
0002
xlzh@cmos:~$

新建目錄是777與007做掩碼,結果正是775,新建文件是666與002做掩碼,結果正是664。

當然,還可以通過umask命令修改系統掩碼,新建文件的權限位也跟着改變。

2、Linux ACL權限管理

UGO權限管理方式只能對屬主、同組用戶和其他組用戶進行權限管理,很難對每個用戶或用戶組進行權限管理。ACL就是為了這種局限性而生的。

ACL(Access Control List, 訪問控制列表),它是對UGO權限管理的方式進行了擴展、可以對任意的用戶/組分配讀、寫和執行權限。

其常用的命令有getfacl和setfacl。

2.1 設置ACL

首先看一下幾種類型

類型 定義
ACL_USER_OBJ 文件屬主的權限
ACL_USER 額外用戶的權限
ACL_GROUP_OBJ 文件屬組的權限
ACL_GROUP 額外組的權限
ACL_MASK ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大權限
ACL_OTHER 其他組的權限

設置ACL的命令是setfacl,-m選項表示修改acl規則,使用方式是setfacl  -m {u|g}:{user|group}:rwx;

u表示設置ACL_USER的權限,g表示修改ACL_GROUP的權限

例子如下

/*新建文件,查看文件權限位和ACL規則*/
root@cmos:/home/xlzh# touch test
root@cmos:/home/xlzh# ls -l test
-rw-r--r-- 1 root root 0  3月 15 16:39 test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
group::r--
other::r--
/*讓xlzh用戶對test文件有rwx的權限,並查看文件權限位和ACL規則*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx test
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ 1 root root 0  3月 15 16:39 test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx
group::r--
mask::rwx
other::r--
/*讓dhcpd組對test文件有rwx的權限,並查看文件權限位和ACL規則*/
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx test
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ 1 root root 0  3月 15 16:39 test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-                      //ACL_USER_OBJ
user:xlzh:rwx               //ACL_USER
group::r--                     //ACL_GROUP_OBJ
group:dhcpd:rwx        //ACL_GROUP
mask::rwx                   //ACL_MASK
other::r--                     //ACL_OTHER

root@cmos:/home/xlzh#

可以看到,當設置ACL規則后,ls 查看權限位,在權限位后增加了一個’+’號。

上述例子演示了如何給指定用戶和指定組增加rwx權限,當然rwx權限和UGO權限一樣,可以隨意修改。

設置完成后,xlzh用戶和dhcpd組的用戶對該文件具有讀、寫、執行的權限。

2.2 ACL掩碼

再看定義,ACL掩碼定義了ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大權限。舉例如下

/*新建文件*/
root@cmos:/home/xlzh# touch test
root@cmos:/home/xlzh# ls -l test
-rw-rw-r-- 1 root root 0  3月 15 16:50 test
/*設置acl規則,使xlzh用戶和dhcpd組內的用戶具有rwx的權限*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx test
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx
group::rw-
group:dhcpd:rwx
mask::rwx
other::r--
/*查看文件的權限位,第二組權限發生變化*/
root@cmos:/home/xlzh# ls -l test
-rw-rwxr--+ 1 root root 0  3月 15 16:53 test
/*設置掩碼,查看權限位和acl規則*/
root@cmos:/home/xlzh# setfacl -m m:r test
root@cmos:/home/xlzh# ls -l test
-rw-r--r--+ 1 root root 0  3月 15 16:50 test
root@cmos:/home/xlzh# getfacl test
# file: test
# owner: root
# group: root
user::rw-
user:xlzh:rwx              #effective:r--
group::rw-                 #effective:r--
group:dhcpd:rwx            #effective:r--
mask::r--
other::r--

root@cmos:/home/xlzh#

有上述例子可知兩點:

1、當文件設置ACL規則后,權限位的第二組顯示的不再是屬主同組對該文件的訪問權限,而是顯示ACL的掩碼。所以當ls看到權限位后面有‘+’號時,應該使用getfacl查看文件屬主所在組的權限。

2、當修改ACL的掩碼后,例如把掩碼修改為r--,則可以看到ACL_USER,ACL_GROUP_OBJ和ACL_GROUP三行后面增加了#effective:r—,表示這三種類型實際生效的權限只有讀權限,為什么會這樣?再看ACL_MASK的定義:ACL_USER、ACL_GROUP_OBJ,ACL_GROUP的最大權限。即當把掩碼修改為r--后,也就限制了三種類型最大的權限范圍,只能小於掩碼,不能大於掩碼。

2.3 默認ACL

默認ACL僅對目錄有效,如果對一個目錄設置了默認ACL規則,則在該目錄下建立的所有文件都繼承此目錄的ACL規則。實例如下

/*新建目錄,查看ACL規則*/
root@cmos:/home/xlzh# mkdir dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
/*設置默認ACL規則,使xlzh和dhcpd對該目錄下的所有文件具有rwx權限*/
root@cmos:/home/xlzh# setfacl -d -m u:xlzh:rwx dir
root@cmos:/home/xlzh# setfacl -d -m g:dhcpd:rwx dir
root@cmos:/home/xlzh# ls -ld dir
drwxrwxr-x+ 2 root root 4096  3月 15 17:05 dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x
/*進入文件,新建目錄和文件,查看acl規則*/
root@cmos:/home/xlzh# cd dir
root@cmos:/home/xlzh/dir# touch file
root@cmos:/home/xlzh/dir# mkdir dir
/*xlzh和dhcpd對文件具有rwx權限*/
root@cmos:/home/xlzh/dir# getfacl file
# file: file
# owner: root
# group: root
user::rw-
user:xlzh:rwx            #effective:rw-
group::rwx            #effective:rw-
group:dhcpd:rwx            #effective:rw-
mask::rw-
other::r--
/*xlzh和dhcpd對目錄具有rwx權限,並且該目錄繼承了dir的默認權限*/
root@cmos:/home/xlzh/dir# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
user:xlzh:rwx
group::rwx
group:dhcpd:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x

root@cmos:/home/xlzh/dir#

上述實例有一點需要注意:

1、當為dir設置完默認ACl規則后,只是說dir目錄下的所有文件繼承該目錄的所有ACL規則,並不是是說該目錄已經具備了該ACL規則。例如上述設置完dir的ACl規則后。xlzh和dhcp組內的用戶同樣沒有權限在dir目錄下新建刪除文件。除非執行以下命令,設置目錄本身的ACL規則

root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x

/*默認ACL是指繼承給該目錄下文件的ACL規則,而不是該目錄本身的ACL規則*/
root@cmos:/home/xlzh# setfacl -m u:xlzh:rwx dir
root@cmos:/home/xlzh# setfacl -m g:dhcpd:rwx dir
root@cmos:/home/xlzh# getfacl dir
# file: dir
# owner: root
# group: root
user::rwx
user:xlzh:rwx
group::rwx
group:dhcpd:rwx
mask::rwx
other::r-x
default:user::rwx
default:user:xlzh:rwx
default:group::rwx
default:group:dhcpd:rwx
default:mask::rwx
default:other::r-x

root@cmos:/home/xlzh#

2.4 總結

1、普通ACL規則可以設置普通文件和目錄文件,是對UGO文件權限方式的補充

2、默認ACL規則只對目錄生效,且被該目錄下的文件繼承,而對該目錄本身的權限,還需要使用普通ACL規則

3、設置ACl規則后,文件屬組的權限位顯示的acl規則的掩碼,不再是原來的含義

4、ACL規則的掩碼限制了ACL_USER、ACL_GROUP、ACL_GROUP_OBJ的最大權限


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM