1. 程式人生 > >linux下的權限、特殊權限、acl

linux下的權限、特殊權限、acl

權限 suid sgid acl

首先,我們都知道Linux是一個多用戶操作系統,那麽問題就來了,假設我有一個文件叫file1,這個文件是用戶user1的,user1有一個項目組g1,他希望他項目組裏的同事可以查看修改這個文件,但是不希望其他人看到文件中的內容當然也不能編輯。那怎麽解決這個問題靠的就是我們下面要說的權限。通過對文件權限的配置我們就可以實現不同的用戶或用戶組在訪問相同資源時不同的訪問權限。

UGO模型

所謂UGO就是把對於文件所有的用戶的三種身份,所屬主user即文件主人,所屬組group即文件所屬群組,其他other即不是user也不在所屬組。
用戶已經分好了類別,那麽一個文件需要什麽屬性的權限呢,在linux下一個文件的權限包括rwx,即read(讀取)、write(寫入)、excute(執行)對於一個普通文件(不包括目錄)來說擁有read權限代表用戶只可以查看文件中的內容,擁有write權限用戶就可以修改文件中的內容(不需要read權限就可以修改),excute權限對於文件比較敏感,對於普通文件沒有意義,但是一旦文件內容可以執行,也就意味著用戶可以執行此文件(僅擁有執行權限即可執行不需要read權限),除非必要執行權限不應該配給任何人。

有了以上的內容上面的例子就很容易解決了,給file的所屬主rw權限,把file的所屬組改為g1並賦予rw權限,其他人權限為空。然後我們看一下文件信息中的權限位代表的含義。使用ll命令可以查看文件的詳細信息。

-rw-r--r--. 1 root root      0 Apr  3 21:17 file1
-rw-r--r--. 這其中,第一位是文件類型-代表是普通文件
            後面9位,3位一組代表ugo的權限-表示沒有對應權限
            最後一位是acl權限,此位為+表示該文件設置了acl權限

chown修改所有者

chown命令可以用來修改文件的所有者,包括所屬主和所屬組(處文件所屬主和root其他用戶不可使用此命令)

chown user1.g1 file1    \\把file所屬主所屬組改為user1,g1

chown可以使用-R選項對目錄進行遞歸處理

chown -R username dir   \\把dir目錄及其目錄下文件遞歸處理

chgrp修改所屬組

chgrp使用方法和chown類似,通常很少使用同樣支持-R進行遞歸

chgrp -R grpname dir    \\把敵人目錄及其目錄下文件一並處理

chmod修改文件權限

chmod使用比較靈活也很常用,可以通過不同的方法指定文件權限

chmod u=rw,g=rw,o= file1    \\指定file1針對ugo的權限分別為rw,rw和空

上面的示例中,等號前面的u,g,o代表權限修改範圍,可以分開指定也可以一次指定,也可以使用a表示全部修改,如下

chmod ug=rw,o= file1    \\和上條命令效果相同
chmod a=rw file1        \\所有用戶權限設置為rw

同時還可以使用‘-’‘+’運算符如下

chmod u-w,g+r,o+r file1      \\去掉u的w權限,g和o加上r權限
chmod a-x file1              \\去掉file1文件所有用戶的x權限

除了這種的方法,使用數字方法直接指定是我們更常用的方法。使用數字方法的時候我們用4,2,1分別表示rwx,在是使用的時候把ugo對應權限的對應數字相加就可以直接給文件設定對應的權限例如:

chmod 660 file1         \\指定file1針對ugo的權限分別為rw,rw,和空

chmod同樣支持-R遞歸,不在示例。

擴展:目錄權限

目錄本質是一種特殊的文件,所以rwx對應的權限在目錄上表現出來的和文件上不太一樣,簡單總結了一下,供參考

r 只能列出文件夾下文件名,不包括詳細信息 rw 和只給r一樣
w 沒用 rx 對於一般
x 可進,可以執行目錄下程序 wx 無法列出目錄下文件,可以進入,可刪除目錄下文件

可以看出和文件不同的是,對於目錄x權限屬於基礎權限,如果只給rw沒有意義,但是需要註意的是,目錄的w權限不能隨便給,因為一般目錄都會給rx權限,而wx權限的組合意味著用戶可以刪除目錄下文件,所以對於目錄來說,wx的權限組合是相當危險的。

默認權限和umask

我們在新建文件或者目錄的時候都是有權限設定的,這個權限就叫做默認權限,對於文件來說這個權限是644,對於目錄來說是755,那這個權限就是由umask決定的。可以使umask查看當前設定的umask值,umask值是四位數,第一位是特殊權限位(suid,sgid,sticky)。可以通過修改~/.bashrc文件修改當前用戶umask也可以通過修改/etc/bashrc文件改變全局umask設定。和網上很多對umask的解釋不同,下面介紹的umask和默認權限的計算應該更為精確。
首先,文件的最大默認權限為666,目錄為777,通常我們用最大權限減去umask認為是默認權限,這種計算方法對目錄來說並無問題,不過有些值這樣算可能結果和實際並不相同。如umask為125,上面的方法默認文件權限應該為541,但實際創建會發現是642。
先給結論:umask代表取消對應的權限。具體是這樣運算的
666
125
轉換為二進制,這9位分別對應ugo權限組合中的9個權限位,1代表有對應權限,0表示沒有對應權限
110110110
001010101
然後取消最大權限裏umask中對應的權限解釋如下
取消第一位和第二位的0權限,也就是不做更改,取消第三位的1權限也就是還是0,第四位取消0不變,第五位取消1為0……以此計算最後得出的二進制權限為
110100010也就是642
可以看一下下面的示例:

[root@VMCent6 ~]# umask 125
[root@VMCent6 ~]# umask
0125
[root@VMCent6 ~]# touch file
[root@VMCent6 ~]# mkdir dir
[root@VMCent6 ~]# ll
total 4
drw-r-x-w-. 2 root root 4096 Apr  4 18:06 dir
-rw-r---w-. 1 root root    0 Apr  4 18:06 file

不過上面的計算方法太過繁雜,我們依然可以直接使用666減去umask值進行運算,不過需要在運算結果的奇數位加1還是以上為例,666-125=541,奇數位分別+1也就是642

特殊權限SUID,SGID,sticky

還是先說結論,SUID通常用來提權,SGID用來繼承組權限,sticky用來防止非所屬主用戶刪除文件。

SUID

舉個例子,一個普通用戶想要修改密碼,但是修改密碼必然需要更改/etc/shadow文件中的內容,那我們來看一下shadow文件的權限

----------. 1 root root 1077 Apr  3 23:33 /etc/shadow

全部為空,也就是說除了root,其他用戶並沒有權限修改此文件,但很顯然所有用戶都可以修改自己的密碼,這就是suid權限在起作用,但在shadow文件上並沒有看到任何權限信息,實際上,這個權限加在了/usr/bin/passwd文件上。原理是,當用戶執行passwd命令的時候,系統會以root身份執行這個程序,這就是suid的作用。當一個程序配置了suid權限,普通用戶在執行時程序時會以此程序所有者身份進行執行。
suid權限可以使用chmod命令進行配置,如下

chmod u+s file          \\給指定文件添加suid權限
chmod 4777 file         \\suid對應的權限位數字為4

suid權限信息表現在權限位中所有者中的x位如:

-rwsr-xr-x. 1 root root 30768 Nov 24  2015 /usr/bin/passwd

由於suid的特性,對於普通文件和目錄,suid沒有意義,只在二進制程序上生效
!!註:程序的權限繼承自程序的發起者

SGID

sgid權限和suid類似,只是suid繼承所屬主的權限,sgid繼承所屬組的權限,不同的是對於目錄設置sgid會讓目錄下所有新建文件屬於目錄所屬組如下:

[mrhan@VMCent6 tmp]$ mkdir dir
[mrhan@VMCent6 tmp]$ ll -d /tmp/dir
drwxrwxr-x. 2 mrhan mrhan 4096 Apr  4 19:01 /tmp/dir
[mrhan@VMCent6 tmp]$ touch dir/file
[root@VMCent6 tmp]# touch dir/file1
[root@VMCent6 tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr  4 19:01 file
-rw-r---w-. 1 root  root  0 Apr  4 19:01 file1

上面的示例中,我先用普通用戶在/tmp創建了目錄dir,並且在dir目錄下創建文件file,同時用root在/tmp/dir/下創建file1,但是我們可以看到雖然dir目錄屬於普通用戶mrhan但是目錄下新建的文件依然屬於root(實際上是屬於創建者的主組)那麽我如果想讓dir目錄下所有新建的文件全部屬於mrhan,就需要用到sgid權限
sgid的指定和suid類似。sgid權限信息表現在所屬組權限位的x權限位,同樣也可以使用數字方式指定,suid對應權限數字為2,和suid指定方法相同。

[mrhan@VMCent6 tmp]$ chmod g+s dir
[mrhan@VMCent6 tmp]$ ll -d /tmp/dir
drwxrwsr-x. 2 mrhan mrhan 4096 Apr  4 19:01 /tmp/dir
[root@VMCent6 tmp]# touch dir/file2
[root@VMCent6 tmp]# ll dir
total 0
-rw-rw-r--. 1 mrhan mrhan 0 Apr  4 19:01 file
-rw-r---w-. 1 root  root  0 Apr  4 19:01 file1
-rw-r---w-. 1 root  mrhan 0 Apr  4 19:11 file2

上面例子中,dir目錄在配置sgid之後新建文件file2所屬組默認繼承dir所屬組

sticky

也叫粘滯位,公共目錄下配置sticky權限,可以防止用戶對目錄下文件隨意刪除,只能刪除所屬主的文件,sticky權限只針對目錄生效,對應權限數字為1,設置方法和suid類似。如對一個目錄配置了777權限又不希望目錄下的文件被隨便刪除的時候就可以使用sicky權限,配置之後將只能刪除自己的文件。

ACL權限控制列表

還是上面的例子,出於工作需要user1想讓另一個項目g2裏的同事可以看file1裏面的內容,但是並不希望他們修改,還有一位同事user2他不在任何一個項目裏,但是要查看這個文件必要的時候還會修改一下,顯然對於這種需求,UGO這種簡單的配置已經無法解決了,這時候就需要acl權限了。
acl訪問控制列表,也就是說當用戶不滿足ugo中的任何一個時或者無法通過配置ugo解決時直接指定對應用戶或對應組的權限,使用也很簡單。

setfacl -m g:g2:r file1     \\指定g2組對file1的權限為r
setfacl -m u:user2:rw file1 \\指定user2對file1的權限為rw
setfacl -x g:grpname file 刪除file文件中組的acl權限
setfacl -x u:username file 刪除file文件中用戶的acl權限
setfacl -b file1            \\清除file1的acl規則
        -d                  \\-d參數用來對目錄設置acl,目錄下新建文件默認設置acl
        -M                  \\從文件讀取權限列表批量設置acl
                            \\文件內容格式同設置參數

使用getfacl file命令可以查看指定文件的acl權限列表
一旦啟用acl權限,ugo權限位g部分權限會變為mask權限,使用chmod修改此部分權限等同於設置mask權限,mask權限控制acl權限的最大權限
小技巧:當權限包含奇數時,必然有x權限

linux下的權限、特殊權限、acl