Linux最優秀的地方之一就是多任務環境,爲了讓各個使用者具有較爲安全的文件數據,因此文件的權限管理變得尤爲重要,在Linux系統中一般將文件可存取訪問的身份分爲3個類別:owner、group、others,我們稱爲權限對象,且這三類身份都具有:read、write、execute等權限,我們稱爲權限類型。
一、權限對象
1、owner身份(文件所有者)
由於Linux是多用戶、多任務的操作系統,因此可能常常有多人同時在某臺主機上工作,爲了考慮每個人的隱私,文件所有者這個權限就尤爲重要。每個人均可在主機上設置文件的權限,讓其成爲個人的“私密文件”,即個人所有者。因爲設置了適當的文件權限,除本人(文件所有者)之外的用戶無法查看文件內容。
2、group身份(與文件所有者同組的用戶)
羣組是權限中最有用的功能之一,羣組簡單理解就是用戶組,類似於我們公司的各個部門之間,或者學校班級之間的劃分,每個班級就是一個羣組,羣組內的資源是共享的,羣組間是相互隔離的。
3、others身份(其他人)
不屬於文件所有者或文件所屬羣組成員的用戶。
tips:這麼說大家可能還不是很瞭解,這裏舉個栗子:
張三、李四、王五是舍友住在三室一廳的房子裏,他們分別是自己房間的所有者(owner);這裏有一個用戶組(group),這個組有張三、李四、王五三個成員,這個組裏的成員都可以進入客廳;隔壁趙六,既不能進入他們的個人房間,也不能去他們三個共用的客廳,顯而易見就是**其他人(others)**了。
二、權限類型
①對於文件而言
權 限 | 說 明 |
---|---|
讀權限(r) | 可獲取文件的數據 |
寫權限(w) | 可修改文件的數據 |
執行權限(x) | 可以將此文件運行爲進程 |
②對於文件而言
權 限 | 說 明 |
---|---|
讀權限(r) | 可使用ls命令獲取其下的所有文件列表 |
寫權限(w) | 可在此目錄下“創建/刪除//複製/移動”文件 |
執行權限(x) | 可以cd至此目錄中,並且可以使用ls -l命令來獲取所有文件的詳細屬性信息 |
三、文件屬性介紹
在Linux中,是如何查看文件的權限信息呢?ls命令就可以查看文件的相關屬性(也可以使用 " ll " 命令,等價於 " ls -l " )。其中,標紅的部分就是Linux的文檔權限屬性信息。
對於這十個字段,所表達的含義可以結合這張圖來理解:
十位字符表示含義:
第1位:表示文檔類型,取值常見的有"d"表示文件夾、"-"表示文件、"l"表示軟鏈接、"s"表示套接字等等;
第2-4位:表示文檔所有者的權限情況,第2位表示讀權限的情況,取值有r、-;第3位表示寫權限的情況,取值有w、-;第4位表示執行權限的情況,取值有x、-。
第5-7位:表示與所有者同在一個組的用戶的權限情況,第5位表示讀權限的情況,取值有r、-;第6位表示寫權限的情況,取值有w、-;第7位表示執行權限的情況,取值有x、-。
第8-10位:表示其他用戶的權限情況,第8位表示讀權限的情況,取值有r、-;第9位表示寫權限的情況,取值有w、-;第10位表示執行權限的情況,取值有x、-。
四、權限管理命令
1、chmod命令
chmod - change file mode bits(修改文件或目錄的權限)
只有root用戶和文檔的所有者,纔可以給文檔設置權限。
chmod [選項] 權限模式 文件
選 項 | 作 用 |
---|---|
-R | 遞歸設置權限(當文件類型爲目錄時使用) |
權限模式就是該文件需要設置的權限信息,分爲字母形式和數字形式。
①字母形式
給誰設置 | 含 義 | 分配方式 | 含 義 | 權限字符 | 含 義 |
---|---|---|---|---|---|
u | 所有者(owner) | + | 新增權限(相對當前) | r | 讀權限 |
g | 用戶組(group) | w | 刪除權限(相對當前) | - | 寫權限 |
o | 其他人(others) | = | 將權限設置成具體的值(注重結果) | x | 執行權限 |
a | 所有人(all) | — | — | - | 沒有權限 |
實例:創建/tmp/test(-rw-rwx—)文件並給其設置權限,要求所有者擁有全部的權限,同組用戶擁有讀和執行權限,其他用戶擁有讀權限和寫權限。
[root@localhost tmp]# chmod u=rwx,g=rx,o=rw test //第一種方法
[root@localhost tmp]# ll
總用量 0
-rwxr-xrw-. 1 root root 0 3月 12 20:14 test
[root@localhost tmp]# chmod u+x,g-w,o+rw test //第二種方法
[root@localhost tmp]# ll
總用量 0
-rwxr-xrw-. 1 root root 0 3月 12 20:14 test
②數字形式
權 限 | 數 值 |
---|---|
讀權限(r) | 4 |
寫權限(w) | 2 |
執行權限(x) | 1 |
實例:爲/tmp/test文件設置權限,要求所有者擁有全部的權限,同組用戶擁有讀和執行權限,其他用戶只讀權限。
全部權限(u):讀+寫+執行=4+2+1=7
讀和執行(g):讀+執行=4+1=5
讀權限(o):讀=4
[root@localhost tmp]# chmod 754 test
[root@localhost tmp]# ll
總用量 0
-rwxr-xr--. 1 root root 0 3月 12 20:14 test
tips:如果權限數字中但凡出現2與3的數字,則該權限有不合理的情況。爲什麼呢?
那是因爲2表示只有寫權限,3表示擁有寫和執行權限。那麼大家想一想,用戶沒有讀權限,如何打開文件去寫呢?
2、chown命令
chown - change file owner and group(更改文件所有者和所屬組,僅管理員可用)
chown [選項]… [所有者][:[所屬組]] 文件…
選 項 | 作 用 |
---|---|
-R | 遞歸修改(將目錄內的目錄或文件一併修改) |
[root@localhost tmp]# ll //初始信息
總用量 0
drwxr-xr-x. 2 root root 18 3月 12 21:09 test
[root@localhost tmp]# chown tom:jerry test //修改所屬者和所屬組
[root@localhost tmp]# ll //修改成功
總用量 0
drwxr-xr-x. 2 tom jerry 18 3月 12 21:09 test
3、chgrp命令(瞭解)
chgrp - change group ownership(更改文件所屬組,僅管理員可用)
chgrp [選項]… 所屬組 文件…
選 項 | 作 用 |
---|---|
-R | 遞歸修改(將目錄內的目錄或文件一併修改) |
[root@localhost tmp]# ll //初始信息
總用量 0
drwxr-xr-x. 2 tom jerry 18 3月 12 21:09 test
[root@localhost tmp]# chgrp root test/ //修改所屬組
[root@localhost tmp]# ll //修改成功
總用量 0
drwxr-xr-x. 2 tom root 18 3月 12 21:09 test
五、進程安全上下文
1、任何一個可執行程序文件是否可以執行,取決於發起者對文件是否有x權限;
2、若進程啓動成功,進程的屬主爲發起者,屬組爲進程發起者的所屬組;
3、進程所能夠訪問文件的權限,取決於進程的發起者:
① 進程的屬主與文件的屬主是否相同;如果相同,則應用屬主的權限;
② 否則,則檢查進程的屬主是否屬於文件的屬組;如果是,則應用屬組的權限;
③ 否則,就只能應用others的權限。
六、基本權限ACL
ACL的全稱是Access Control List(訪問控制列表),一個針對文件/目錄的訪問控制列表。它在UGO權限管理的基礎上爲文件系統提供了一個額外的、更靈活的權限管理機制。ACL允許你給任何的用戶或用戶組設置任何文件/目錄的訪問權限。
作爲UGO權限管理的補充,ACL自然有UGO辦不到的事情,例如:
① 可以針對用戶來設置權限
② 可以針對用戶組來設置權限
③ 子文件/目錄繼承父母錄的權限
1、查看ACL
getfacl - get file access control lists(獲取文件訪問控制列表)
getfacl [-aceEsRLPtpndvh] 文件 …
選 項 | 作 用 |
---|---|
-R | 遞歸列出所有文件和目錄的acl |
2、配置ACL
setfacl - set file access control lists(設置文件訪問控制列表)
setfacl [-bkndRLPvh] [{-m|-x} acl_參數] 文件 …
選 項 | 作 用 |
---|---|
-m | 配置文件的acl,不可與-x合用 |
-x | 刪除acl,不可與-m合用 |
-b | 刪除所有acl |
-k | 刪除默認acl |
-R | 遞歸地對所有文件和目錄應用操作 |
-d | 配置"默認acl參數",只對目錄有效,該目錄新建的數據會繼承此默認值 |
3、實例
① 創建/tmp/testdir目錄,併爲tom(others)用戶賦予x權限使其可以進入testdir目錄。
[root@localhost tmp]# mkdir testdir //創建/tmp/testdir(drw-r--r--)目錄
[root@localhost tmp]# chmod 644 testdir/ //修改testdir目錄權限
[root@localhost tmp]# ll
總用量 0
drw-r--r--. 2 root root 6 3月 13 10:33 testdir
root@localhost testdir]# su - tom //切換至tom用戶(tom用戶屬於其他人)
[tom@localhost tmp]$ cd testdir/ //嘗試進入testdir目錄(因爲沒有x權限,所以拒絕訪問)
bash: cd: testdir/: 權限不夠
[tom@localhost tmp]$ su - root //切換至root用戶
密碼:
上一次登錄:五 3月 13 10:21:37 CST 2020從 192.168.140.1pts/0 上
[root@localhost ~]# setfacl -m u:tom:x /tmp/testdir/ //爲tom用戶對testdir目錄添加x權限
[root@localhost tmp]# ll //查看文件信息也發生了變化
總用量 0
drw-r-xr--+ 2 root root 22 3月 13 10:33 testdir
[root@localhost tmp]# getfacl testdir/ //查看testdir目錄的acl
# file: testdir/
# owner: root
# group: root
user::rw-
user:tom:--x //tom用戶擁有x權限
group::r--
mask::r-x
other::r--
[root@localhost tmp]# su - tom //切換至tom用戶測試是否可以進入testdir目錄
上一次登錄:五 3月 13 10:47:38 CST 2020pts/0 上
[tom@localhost ~]$ cd /tmp/testdir/
[tom@localhost testdir]$ //進入成功
② 刪除tom用戶對/tmp/testdir目錄的所有acl權限。
[root@localhost ~]# setfacl -x u:tom /tmp/testdir/ //刪除tom用戶對testdir目錄的權限acl權限
[root@localhost ~]# getfacl /tmp/testdir/ //查看testdir目錄的acl
getfacl: Removing leading '/' from absolute path names
# file: tmp/testdir/
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r-- //user:tom:--x 這條記錄以及被刪除
③ 使/tmp/testdir目錄下"文件/目錄"繼承/tmp/testdir目錄的acl權限。
[root@localhost ~]# chmod 745 /tmp/testdir/ 修改testdir目錄的權限爲(-rw-rw-r-x)
[root@localhost ~]# setfacl -m d:u:tom:rw /tmp/testdir/ //爲tom用戶對testdir添加子目錄/文件會繼承的rw權限
[root@localhost ~]# touch /tmp/testdir/testfile //創建testfile文件
[root@localhost ~]# getfacl -R /tmp/testdir/ //遞歸查看testdir目錄下全部文件的acl
getfacl: Removing leading '/' from absolute path names
# file: tmp/testdir/
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
default:user::rw-
default:user:tom:rwx //其子目錄/文件默認tom用戶擁有rw權限
default:group::r--
default:mask::rwx
default:other::r--
# file: tmp/testdir//testfile
# owner: root
# group: root
user::rw-
user:tom:rw- //tom用戶擁有rw權限
group::r--
mask::rw-
other::r--
[root@localhost ~]# su - tom //切換至tom用戶測試是否可以進入向testfile文件中寫入內容
上一次登錄:五 3月 13 13:35:50 CST 2020pts/0 上
[tom@localhost ~]$ echo "Hello World" > /tmp/testdir/testfile
[tom@localhost ~]$ cat /tmp/testdir/testfile
Hello World
④ 刪除/tmp/testdir目錄的全部acl權限。
[root@localhost tmp]# setfacl -b /tmp/testdir/ 移除所有acl權限
七、權限掩碼umask
在我們創建新的目錄和文件時本身也是有它默認的權限,這個默認權限是什麼呢?就是由權限掩碼umask所確定的。它的功能可以說與chmod剛好相反,代表默認拿走的,也就是說不要的權限。
所以說umask就是用來指定"目前用戶在新建文件或者目錄時的權限默認值"。那麼如何得知或設置這個umask呢?
1、查看umask
[root@localhost ~]# umask //以數字類型的方式顯示出權限設置
0022
//其中第一個0與特殊權限有關,可以暫時不用理會
//後三位022則與普通權限(rwx)有關
[root@localhost ~]# umask -S //以符號類型的方式顯示出權限設置
u=rwx,g=rx,o=rx
那麼這個數字具體是怎麼表示權限的呢?
文件:666-umask 目錄:777-umask
那又爲什麼文件是666去減呢?那是因爲文件默認不能擁有執行權限,如果普通文件都有執行權限,那麼勢必安全性就會很低(一些木馬程序就有權限被執行)!所以,如果減得的結果中有執行權限,則會加1進行修改。
例如:
umask:023
文件:666-023=643 需要加"1",所以爲644
目錄:777-023=745
2、設置umask
設置umask很簡單,這裏不做過多講述。
[root@localhost ~]# umask 023 //設置umask爲023
[root@localhost ~]# umask
0023
八、文件特殊權限SUID、SGID、SBIT
1、Set UID
當s這個標誌出現在文件所有者的x權限上時,就被稱爲Set UID,簡稱爲SUID。那麼這個特殊權限的特殊性的作用是什麼呢?
① SUID權限僅對二進制程序(binary program)有效;
② 執行者對於該程序需要具有x的可執行權限;
③ 本權限僅在執行該程序的過程中(run-time)有效;
④ 執行者將具有該程序所有者(owner)的權限。
這麼說大家可能不太理解,SUID這個權限的目的到底是什麼呢?
例如:當用戶修改自己密碼的時候需要使用passwd這個命令,這個二進制文件的權限爲:"-rwsr-xr-x",所以系統中每一個用戶都可以執行,但是在修改密碼的過程中需要將密碼寫入/etc/shadow文件中,但是這個文件的權限爲:"----------"。從進程安全上下文中,大家可以知道一個命令對文件的調用權限取決於發起者對文件的權限,所以根本是拒絕寫入的!這時就用到了這個s權限,執行passwd命令的過程中發起者就擁有了root的權限,所以用戶就可以藉助root的權力,修改/etc/passwd文件了。
tips:屬主的執行權限爲如果原本有執行權限,顯示爲小寫s;否則爲大寫S。
2、Set GID
如果這個s放在文件的所屬用戶組的x權限上時,就被稱爲Set GID,簡稱爲SGID。和SUID一樣,只是SGID是獲得該程序所屬用戶組的權限。
① SGID對二進制程序有用;
② 程序執行者對該程序需要具有x的可執行權限;
③ 執行者將具有該程序所屬組(group)的權限。
④ SGID主要用在目錄上:在此目錄下創建新的文件時,新的文件的屬組和目錄的屬組相同。
tips:屬組的執行權限爲如果原本有執行權限,顯示爲小寫s;否則爲大寫S。
3、Sticky Bit
這個就是針對others來設置的了,目前只針對目錄有效,作用是:當用戶在該目錄下建立文件或目錄時,僅有自己和root纔有權力刪除。
最有代表的就是/tmp目錄(drwxrwxrwt),任何人都可以在裏面增加、修改文件,但僅有root與該目錄/文件的創建者能夠刪除自己的目錄或文件。
tips:其他人的執行權限爲如果原本有執行權限,顯示爲小寫t;否則爲大寫T。