linux之權限管理及訪問控制列表

進程對文件的訪問權限應用模型:

  • 首先檢查進程的屬主與文件的屬主是否相同,如果相同,則應用屬主權限;如果不同就查看suid權限,如果相同就使用suid權限;
  • 其次,則檢查進程的屬組是否屬於文件的數組,如果是,則應用屬組的權限;如果不同就查看sgid權限,如果相同就是用sgid權限
  • 最後只能應用 other 權限。

同用權限

權限說明

類型 r w x
文件 可讀 可寫 可將此文件運行爲進程
目錄 可以使用ls命令獲取其下的所有文件列表 可以修改此目錄下的文件列表,即創建和刪除文件 可以 cd 至目錄中,且可以使用 ls -l 來讀取所有文件的詳細屬性信息

權限組合機制(八進制組合標識法)

原始 二進制 數字
000 0
–x 001 1
-w- 010 2
-wx 011 3
r– 100 4
r-x 101 5
rw- 110 6
rwx 111 7

ls -l可以發現符號鏈接類型的文件權限都是777,但實際上通過符號鏈接訪問其指向的文件的時候,權限由其指向的文件權限決定的。

chmod

  1. chmod [OPTION]... MODE[,MODE]... FILE...

    MODE表示法:

    • 賦權表示法:直接操作一類用戶的所有權限位。
      u=,g=,o=可以一起使用,也可以單獨用其中一個,u=時表示屬主沒有權限,如果屬組屬主相同權限,可以ug=rxa=表示操作所有權限位
    • 授權表示法:操作一類用戶的一個權限位。用法一般爲u+r,g+x,o+w 或者u-r,g-x,o-wa+ 或者 a- 表示操作所有用戶的權限位。
      在這裏插入圖片描述
  2. chmod [OPTION]... OCTAL-MODE FILE...

    八進制權限表示法

    ## 修改前
    ls -l first.sh 
    # -rw-rw-r--. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    ## 修改
    chmod 770 first.sh 
    ## 修改後
    ls -l first.sh 
    #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    
  3. chmod [OPTION]... --reference=RFILE FILE...

    引用參考目標文件的權限

    ##  參考目標文件
    ls -l /var/log/messages
    #-rw-------. 1 root root 70721 11月 18 15:16 /var/log/messages
    ## 將要被修改文件權限
    ls -l first.sh 
    #-rwxrwx---. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    ## 修改文件權限爲參考目標文件
    chmod --reference=/var/log/messages first.sh 
    ## 參考修改後的情況
    ls -l first.sh 
    #-rw-------. 1 vagrant vagrant 176 11月 18 14:58 first.sh
    

    選項: -R,--recursive遞歸修改,只對目錄纔有意義,可能會對沒有執行權限的文件分配可執行權限,有風險,慎用

chown命令

chown命令改變某個文件或目錄的所有者和所屬的組,該命令可以向某個用戶授權,使該用戶變成指定文件的所有者或者改變文件所屬的組。
具體用法看這裏

特殊權限

  1. SUID:setuid,用戶在運行二進制程序時,若此程序擁有SUID權限,則此程序會根據程序文件本身的屬主身份運行,而不是調用此程序的用戶.

    需要特別說明的suid僅對二進制命令程序有效,不能作用在shell等腳本文件上,而且suid權限僅在命令執行過程中有效。

    # 命令格式
    chmod u{+|-}s file...
    

    SUID的權限位在屬主的可以執行權限x的位置,如果發起調用的用戶原來有執行權限,則顯示爲s,否則顯示爲S

    給文件設置SUID,意思在於沒權限不要緊,你只要來調用我就將我的屬主權限借給你

    示例

    # 輸出當前用戶
    whoami
    # vagrant
    
    # 使用 cat 查看 /etc/shadow
    cat /etc/shadow
    # cat: /etc/shadow: permission denied
    
    
    # 查看 /etc/shadow 權限位情況,只有 root 用戶纔有權限
    ll /etc/shadow
    # ----------. 1 root root 919 6月  13 17:33 /etc/shadow
    

    root 是超級用戶,對所有文件具有最大權限,給/etc/cat添加SUID,使其在被調用的時候,使用root權限,而不是調用者的權限。

    # 查看當前用戶
    whoami
    # root
    
    # 查看 /bin/cat 的權限位
    ll /bin/cat
    # -rwxr-xr-x. 1 root root 54160 10月 30  2018 /bin/cat
    
    # 添加 SUID 權限
    chmod u+s /bin/cat
    ll /bin/cat
    # -rwsr-xr-x. 1 root root 54160 10月 30  2018 /bin/cat
    
    
    # 切換用戶
    su - vagrant
    whoami
    # vagrant
    cat /etc/shadow
    # root:$1$GcxvZm4N$67SLqTRkOUb2z5dNFck6P1:18407:0:99999:7:::
    # bin:*:17834:0:99999:7:::
    # daemon:*:17834:0:99999:7:::
    # adm:*:17834:0:99999:7:::
    # lp:*:17834:0:99999:7:::
    # ...
    
  2. SGID

    sgid既可以針對文件也可以針對目錄。

    對於文件來說,sgid僅對二進制命令程序有效,執行命令的用戶可以獲得該程序執行期間所屬組的權限,這一點和suid基本類似。

    對於目錄來說,意義就非常重大了。**當用戶對某一目錄有寫和執行權限時,該用戶就可以在該目錄下建立文件,如果該目錄用 SGID 修飾,則該用戶在這個目錄下建立的文件都是屬於這個目錄所屬的組。**若該目錄的組擁有寫權限,則可以互相修改彼此文件。

    # 命令格式
    chmod g{+|-}s file...
    

    SGID的權限位在屬組的可以執行權限x的位置,如果發起調用的用戶本身有執行權限,則顯示爲s,否則顯示爲S

    演示準備:

    # 準備兩個兩個用戶 user1  user2 , 一個用戶組 group1 , 並將 group1 設置爲 user1 和 user2 的附加組
    useradd user1
    useradd user2
    groupadd group1
    usermod -aG group1 user1
    usermod -aG group1 user2
    
    # 查看命令執行情況
    id user1
    #uid=1006(user1) gid=1007(user1) groups=1007(user1),1009(group1)
    id user2
    #uid=1007(user2) gid=1008(user2) groups=1008(user2),1009(group1)
    
    # 給 user1 、user2 設置密碼
    passwd user1
    # ...
    passwd user2
    # ...
    
    # 創建操作目錄
    cd /tmp
    mkdir testsgid
    ll -d testsgid
    # drwxrwxr-x. 2 root root 6 Jun 14 03:42 testsgid
    chown :group1 testsgid
    chmod g+w testsgid
    ll -d testsgid
    # drwxrwxr-x. 2 root group1 6 Jun 14 03:52 /tmp/testsgid
    

    演示

    su - user1
    cd /tmp/testsgid
    touch user1.test
    ll user1.test
    # -rw-rw-r--. 1 user1 user1 0 Jun 14 03:44 user1.test
    ## 這裏 user1.test 的屬主和數組都是user1
    
    su - user2
    cd /tmp/testsgid
    touch user2.test
    ll user2.test
    # -rw-rw-r--. 1 user2 user2 0 Jun 14 03:57 user2.test
    ## 這裏 user2.test 的屬主和數組都是user2
    
    
    # 對 testsgid 添加 sgid 修飾
    chmod g+s /tmp/testsgid
    ll -d /tmp/testsgid
    # drwxrwsr-x. 2 root group1 42 Jun 14 03:57 /tmp/testsgid
    
    
    su - user2
    cd /tmp/testsgid
    touch user2.sgid.test
    ll user2.sgid.test
    # -rw-rw-r--. 1 user2 group1 0 Jun 14 04:03 user2.sgid.test
    ## 這時新創建文件的屬主就變成 testsgid 文件夾的屬主了
    
    ### ... 同樣使用 user1 在 testsgid 中創建文件,屬主也都變成 group1 了
    
    
  3. sticky

    一般情況下,對於屬組/全局可寫的目錄,組內的所有用戶/全局用戶都可以在該目錄創建文件或者刪除文件,無論是否屬主是否是自己。

    若是對目錄使用了sticky權限,則每個用戶都可以創建新文件/目錄,但是隻能刪除屬主是自己的部分。

    root用戶除外,root依然可以刪除所有。

    # 命令格式
    chmod o{+|-}t file...
    

    sticky的權限位在其他用戶的可以執行權限x的位置,如果發起調用的用戶本身有執行權限,則顯示爲s,否則顯示爲T

    sticky 權限目前只對目錄有效,用來阻止非文件的所有者刪除文件。系統中的/tmp/var/tmp兩個目錄默認就是具有sticky權限的。

    ll -d /tmp
    # drwxrwxrwt. 17 root root 4096 Jun 14 04:05 /tmp
    
    

    權限信息中最後一位 t 表明該目錄被設置了 sticky 權限。

還有一種爲特殊權限位設置權限的方式,在基於通用權限八進制授權機制的基礎上,在左側再增加一位八進制數字,用以表示特殊權限位。如 chmod 7777 file

facl 訪問控制列表

file access control lists

這個功能主要是提供在傳統的ugosuid/sgid/sticky之外的另一種更靈活、更精細的權限控制方式,通過facl可以針對單一的用戶或者組設置特定的權限。

facl允許你給任何的用戶或用戶組設置任何文件/目錄的訪問權限。

  1. getfacl用來獲取指定文件/目錄的facl信息

    格式getfacl file_path

  2. setfacl用來設置文件/目錄的facl權限

參數 示例 說明
-m setfacl -m u:username:rwx filepath
setfacl -m g:groupname:rwx filepath
配置後面的 acl 參數給文件/目錄使用,不可與 -x 合用;
-x setfacl -x u:username filepath
setfacl -x g:username filepath
刪除指定用戶/組的所有 facl 參數,不可與 -m同用
-R setfacl -R -m g:groupname:rwx filepath 遞歸執行
-d 配置“默認 acl 參數”,只對目錄有效,在該目錄新建的數據會引用此默認值;
-b 移除所有的 ACL 配置參數;
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
group::rw-
other::r--

$ setfacl -m u:user1:rwx user2.sgid.test 
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
mask::rwx
other::r--

$ setfacl -m g:basher:rwx user2.sgid.test
$ getfacl user2.sgid.test 
# file: user2.sgid.test
# owner: user2
# group: group1
user::rw-
user:user1:rwx
group::rw-
group:basher:rwx
mask::rwx
other::r--


$ ll user2.sgid.test
# 看到權限的後面多了個 + 號
-rw-rwxr--+ 1 user2 group1 0 Jun 14 04:03 user2.sgid.test

umask命令

umask 設置了用戶創建文件的默認權限,它與 chmod 的效果剛好相反,umask設置的是權限“補碼”,而chmod設置的是文件權限碼。一般在/etc/profile$ [HOME]/.bash_profile$[HOME]/.profile中設置umask值。

一般來說,umask命令是在/etc/profile文件中設置的,每個用戶在登錄時都會引用這個文件,所以如果希望改變所有用戶的umask,可以在該文件中加入相應的條目。如果希望永久 性地設置自己的umask值,那麼就把它放在自己$HOME目錄下的.profile.bash_profile文件中。

  • 對於文件來說,這一數字的最大值分別是6。系統不允許你在創建一個文本文件時就賦予它執行權限,必須在創建後用chmod命令增加這一權限。

  • 目錄則允許設置執行權限,這樣針對目錄來說umask中各個數字最大可以到7

若沒有文件掩碼時,文件的默認權限爲0666,文件夾的默認權限爲0777。但是系統爲了保護用戶創建文件和文件夾的權限,此時系統會有一個默認的用戶掩碼(umask),大多數的Linux系統的默認掩碼爲0022。用戶掩碼的作用是用戶在創建文件時從文件的默認權限中減去掩碼的結果爲文件的權限。

創建文件的權限=默認權限(文件0666,文件夾0777)-umask

在用戶不修改umask的情況下,創建文件的權限爲:0666-0022=0644。創建文件夾的權限爲:0777-0022=0755

詳細用法看這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章