進程對文件的訪問權限應用模型:
- 首先檢查進程的屬主與文件的屬主是否相同,如果相同,則應用屬主權限;如果不同就查看
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
-
chmod [OPTION]... MODE[,MODE]... FILE...
MODE
表示法:- 賦權表示法:直接操作一類用戶的所有權限位。
u=,g=,o=
可以一起使用,也可以單獨用其中一個,u=
時表示屬主沒有權限,如果屬組屬主相同權限,可以ug=rx
。a=
表示操作所有權限位 - 授權表示法:操作一類用戶的一個權限位。用法一般爲
u+r,g+x,o+w 或者u-r,g-x,o-w
,a+
或者a-
表示操作所有用戶的權限位。
- 賦權表示法:直接操作一類用戶的所有權限位。
-
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
-
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
命令改變某個文件或目錄的所有者和所屬的組,該命令可以向某個用戶授權,使該用戶變成指定文件的所有者或者改變文件所屬的組。
具體用法看這裏
特殊權限
-
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::: # ...
-
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 了
-
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
這個功能主要是提供在傳統的ugo
和suid/sgid/sticky
之外的另一種更靈活、更精細的權限控制方式,通過facl
可以針對單一的用戶或者組設置特定的權限。
facl
允許你給任何的用戶或用戶組設置任何文件/目錄的訪問權限。
-
getfacl
用來獲取指定文件/目錄的facl
信息格式
getfacl file_path
-
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