1. 程式人生 > >linux許可權的深入理解

linux許可權的深入理解

Linux 系統中的特殊許可權 SUID, SGID, Sticky

普通許可權在一般情況下應用是沒有問題。可是在一些特殊場景下,僅僅設定普通許可權,並不能滿足實際生產需要。

如果一個檔案具有SUID,SGID,Sticky許可權,那麼相應u,g,o 的x許可權位會被替換成s許可權。

SUID,SGID,許可權是用來提升許可權的。許可權是累加的。也就是說,使用者本身的許可權,加上SUID,SGID的許可權。

SUID

我們先來看一個例項

 ll /usr/bin/passwd  

    -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd  
  • 1
  • 2
  • 3

我們能夠看到在,passwd 屬主的許可權為: rws 
這裡的s 就是特殊許可權SUID。
它表現為,當任何使用者在使用passwd命令時,它的身份將臨時切換為root使用者,並具有root使用者的許可權,而不用考慮該使用者對passwd的許可權。也可以理解為,某二進位制檔案如果具有SUID許可權,則任何使用該二進位制檔案的使用者,其許可權將臨時整合該二進位制檔案屬主的許可權。


SUID特殊許可權使用前提:程序有屬主和屬組;檔案有屬主和屬組

  1. 任何一個可執行程式檔案能不能啟動為程序,取決發起者對程式檔案是否擁有執行許可權
  2. 啟動為程序之後,其程序的屬主為發起者,程序的屬組為發起者所屬的組
  3. 程序訪問檔案時的許可權,取決於程序的發起者
      (a) 程序的發起者,同文件的屬主:則應用檔案屬主許可權
      (b) 程序的發起者,屬於檔案屬組;則應用檔案屬組許可權
      (c) 應用檔案“其它”許可權

任何一個可執行程式檔案能不能啟動為程序:取決發起者對程式檔案是否擁有執行許可權
啟動為程序之後,其程序的屬主為原程式檔案的屬主
SUID只對二進位制可執行程式有效
SUID設定在目錄上無意義
許可權設定:
chmod u+s FILE…
chmod u-s FILE…

 //將 /usr/bin/passwd s許可權去掉  

    chmod u-s /usr/bin/passwd   

    -rwxr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd  

    //此時,如果切換普通使用者,將不具備寫許可權。  也就修改不了自己的密碼 

    Changing password for user mage.
    Changing password for mage.
    (current) UNIX password: 
    passwd: Authentication token manipulation error



    //將許可權恢復  切換回root使用者

    chmod 4755 /usr/bin/passwd   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

SUID是一種特殊許可權,用s 表示。如果一個二進位制檔案具有SUID許可權的話,其屬主x許可權將被s替代。而且在使用數字法進行許可權修改的時候,其數字位單獨用4表示。

SGID

任何一個可執行程式檔案能不能啟動為程序:取決發起者對程式檔案是否擁有執行許可權
啟動為程序之後,其程序的屬主為原程式檔案的屬組
許可權設定:chmod g+s FILE…    chmod g-s FILE…

預設情況下,使用者建立檔案時,其屬組為此使用者所屬的主組
一旦某目錄被設定了SGID,則對此目錄有寫許可權的使用者在此目錄中建立的檔案所屬的組為此目錄的屬組
通常用於建立一個協作目錄 ,
許可權設定:chmod g+s DIR…    chmod g-s DIR…

通過以上描述我們可以發現,如果我們給一個目錄設定了SGID許可權,然後有多個使用者在該目錄下建立了不同的檔案,而這些檔案的屬組都是該目錄的屬組。此時問題出現了,在該目錄下的不同使用者可以相互刪除對方的檔案。那麼此時,我們就需要使用另外一個特殊許可權,來解決這個問題。

Sticky

具有寫許可權的目錄通常使用者可以刪除該目錄中的任何檔案,無論該檔案的許可權或擁有權
在目錄設定Sticky 位,只有檔案的所有者或root可以刪除該檔案
sticky 設定在檔案上無意義 
許可權設定:chmod o+t DIR…    chmod o-t DIR…

許可權位對映

我們首先來看一組例項

 //實驗環境中建立兩個檔案,注意,f1沒有x許可權,f2有x許可權
    -rw-r--r--. 1 root root 0 Jul 25 14:30 f1
    -rwxr--r--. 1 root root 0 Jul 25 14:31 f2  

    //下面分別給兩個檔案加上SUID許可權。
    chmod u+s f1
    chmod u+s f2  

    //執行ll 命令檢視兩個檔案的許可權變化  
    -rwSr--r--. 1 root root 0 Jul 25 14:30 f1
    -rwsr--r--. 1 root root 0 Jul 25 14:31 f2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

從上面的例項我們可以看出
SUID: user,佔據屬主的執行許可權位
   s: 屬主擁有x許可權
   S:屬主沒有x許可權


下面我們來看另外一組例項

 //實驗環境中建立兩個目錄檔案,注意屬組的許可權區別  

    drwxr-xr-x. 2 root root 6 Jul 25 14:36 dir1
    drwxr--r-x. 2 root root 6 Jul 25 14:36 dir2  


    //下面分別給兩個目錄加上SGID許可權  
    chmod g+s dir1
    chmod g+s dir2  

    //執行 ll 命令觀察兩個目錄檔案的許可權變化  

    drwxr-sr-x. 2 root root 6 Jul 25 14:36 dir1
    drwxr-Sr-x. 2 root root 6 Jul 25 14:36 dir2  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

從上面的例項中,我們可以看出
SGID: group,佔據屬組的執行許可權位
  s: group擁有x許可權
  S:group沒有x許可權


最後一組例項

 //實驗環境中建立兩個目錄檔案,注意 o 的許可權區別  
    drwxr-xr-x. 2 root root 6 Jul 25 14:41 dir3
    drwxr-xr--. 2 root root 6 Jul 25 14:41 dir4  

    //下面分別給兩個目錄加上sticky許可權  

    chmod o+t dir3  
    chmod o+t dir4  


    // 執行ll 命令觀察兩個目錄的許可權變化  
    drwxr-xr-t. 2 root root 6 Jul 25 14:41 dir3
    drwxr-xr-T. 2 root root 6 Jul 25 14:41 dir4  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

通過上面的例項
Sticky: other,佔據other的執行許可權位 
t: other擁有x許可權
T:other沒有x許可權

設定檔案的特殊屬性

chattr +i 不能刪除,改名,修改 chattr -i
chattr +a 只能追加內容
lsattr 顯示特定屬性

訪問控制列表 ACL

ACL:Access Control List ,實現靈活的許可權管理
除了檔案的所有者,所屬組和其它人,可以對更多的使用者設定許可權
CentOS7 預設建立的xfs和ext4檔案系統具有ACL功能
CentOS7 之前版本,預設手工建立的ext4檔案系統無ACL功能,需手動增加
  tune2fs –o acl /dev/sdb1
  mount –o acl /dev/sdb1 /mnt/test
ACL生效順序:所有者,自定義使用者,自定義組,其他人

通過例項來了解 為多使用者或者組的檔案和目錄賦予訪問許可權rwx

 // 檢視檔案或者目錄的ACL許可權 使用 getfacl FILE|DIR  
    getfacl f1 

    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--  


    //給檔案f1加上mage的執行許可權  
    setfacl -m u:mage:w f1    

    //可以發現,在許可權位的後面加上了一個加號,這就說明該檔案被賦予了ACL許可權  
    -rw-rwxr--+ 1 root root 0 Jul 25 15:31 f1  
    // 檢視f1的ACL許可權  
    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:w
    group::r--
    mask::rwx
    other::r--  


    //如果此時mage使用者去讀f1檔案,他是不能讀取的。  



    //指定admins組裡的成員對f2檔案有讀寫許可權  

    setfacl -m g:admins:rw f2 

    # file: f2
    # owner: root
    # group: root
    user::rw-
    group::r--
    group:admins:rw-
    mask::rw-
    other::r--  

    //此時mage使用者可以對f2檔案機型寫入嗎   
    //切換到mage使用者   
    echo HelloWorld >> f2 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

下面這些命令可以自己嘗試一下
setfacl -m u:wang:rwx file|directory
setfacl -Rm g:sales:rwX directory //遞迴 
setfacl -M file.acl file|directory //增加許可權
setfacl -m g:salesgroup:rw file| directory
setfacl -m d:u:wang:rx directory //設定目錄的預設許可權
setfacl -x u:wang file |directory
setfacl -X file.acl directory 刪除許可權

 //增加許可權和刪除許可權的檔案格式是不一樣的。  

    //定義一個檔案用來增加許可權  
    nano file.acl

    u:mage:rwx
    g:admins:rw

    //先檢視一下f1 的ACL  
    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    other::r--


    //執行修改許可權命令
    setfacl -M file.acl f1 

    //檢視一下該檔案的ACL
    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx   //新增了許可權
    group::r--
    group:admins:rw-  //新增了許可權  
    mask::rwx
    other::r--


    //我們修改一下 file.acl 將剛才新增的許可權刪除掉   注意格式有所不同的

    nano file.acl

    u:mage
    g:admins


    // 執行修改許可權命令  
    setfacl -X file.acl f1

    # file: f1
    # owner: root
    # group: root
    user::rw-
    group::r--
    mask::r--
    other::r--
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

通過上面的例項可以看出,許可權的修改是可以批量進行的,但是-X 並不能清除ACL的所有許可權。

ACL mask 值

現在我們可以重新來梳理一下,一個檔案的許可權通常涉及到哪幾類使用者。 屬主,屬組,自定義使用者,自定義組,Other,一共五類使用者。 而ACL就是對這五類使用者的許可權進行控制 。
ACL檔案上的group許可權是mask 值(自定義使用者,自定義組,擁有組的最大許可權),而非傳統的組許可權

 //設定檔案的mask 值  

    getfacl f1  

    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx
    group::r--
    group:admins:rw-
    mask::rwx  
    other::r--  

    //設定檔案的mask值位 r--  

    setfacl -m mask::r-- f1  

    # file: f1
    # owner: root
    # group: root
    user::rw-
    user:mage:rwx           #effective:r--
    group::rw-              #effective:r--
    group:admins:rw-        #effective:r--
    mask::r--
    other::r--  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 設定mask值之後我們會發現,自定義使用者,自定義組,以及預設的屬組,都被mask值限定住了。
    可以將mask值理解為最高許可權,除了所有者,Other之外,其他的都在mask 的管轄之內。
    getfacl 可看到特殊許可權:flags
    通過ACL賦予目錄預設x許可權,目錄內檔案也不會繼承x許可權
    base ACL 不能刪除
    setfacl -k dir 刪除預設ACL許可權
    setfacl –b file1清除所有ACL許可權
    getfacl file1 | setfacl –set-file=- file2 複製file1的acl許可權給file2
 //getfacl 可看到特殊許可權:flags
    //如果一個檔案或目錄設定特殊許可權,SGID,SUID,Sticky 

    # file: dir
    # owner: root
    # group: root
    # flags: -s-
    user::rwx
    group::r-x
    other::r-x  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • mask隻影響除所有者和other的之外的人和組的最大許可權Mask需要與使用者的許可權進行邏輯與運算後,才能變成有限的許可權(Effective Permission)
       使用者或組的設定必須存在於mask許可權設定範圍內才會生效
       setfacl -m mask::rx file
  • –set選項會把原有的ACL項都刪除,用新的替代,需要注意的是一定要包含UGO的設定,不能象-m一樣只是新增ACL就可以
    示例: setfacl –set u::rw,u:wang:rw,g::r,o::- file1