1. 程式人生 > >linux入門系列9--使用者管理及檔案許可權控制

linux入門系列9--使用者管理及檔案許可權控制

​ 前面文章分享了Linux下常用命令以及Shell程式設計相關知識,本節繼續學習Linux使用者管理及檔案許可權控制。

​ Linux是多使用者多工作業系統,具有很好的穩定性和安全性。既然是多使用者,那就意味著多個使用者可以同時使用同一個Linux作業系統,因此就會涉及使用者的新增、修改、刪除等管理工作以及許可權分配問題;平時使用Linux系統一般是用於資訊處理,而檔案是資訊載體,因此也需要掌握檔案相關的操作和許可權。

​ 相信大家平時在使用windows作業系統時,為了不讓別人輕易看到某些敏感檔案,而把檔案設定為隱藏檔案,Linux下是否也能實現同樣的操作?是否能通過隱藏許可權讓黑客最多隻能檢視某些日誌檔案但不能進行修改和刪除操作?是否能夠對某個使用者或某個使用者組進行特殊的許可權設定,讓其只有能滿足工作需求的最小許可權,從而降低安全風險?本篇文章將逐一解決這些疑問。

一、使用者及使用者組管理

1.1 使用者相關命令

​ 針對初學者,在日常工作中,一般都是領導分配一個擁有一定許可權的賬號,然後開展各項工作,不會開放很高的許可權。但初學階段,正如前面系列文章所演示,都是直接用root賬戶進行操作,這樣的目的是減少許可權帶來的干擾,讓我們更專注於相應知識點的學習。但是在生產環境中建議慎用root,因為許可權太大,控制不當會有安全隱患。

1.1.1 who命令

​ who命令用於檢視登入使用者資訊,包括:who、whoami、who am i。

  • whoami

功能描述:檢視當前登入使用者的使用者名稱

案例:

[root@heimatengyun test]# whoami
root
[root@heimatengyun test]# su - test
Last login: Sat Nov 30 22:55:38 CST 2019 on pts/0
[test@heimatengyun ~]$ whoami
test
[test@heimatengyun ~]$ exit
logout

可以看到,切換使用者後,相應的結果發生變化,只顯示當前登入的使用者。

  • who am i

功能描述:顯示最初登入時用的使用者名稱(無論切換幾次)

案例:

[root@heimatengyun test]# who am i
root     pts/0        2019-12-17 22:23 (192.168.78.1)
[root@heimatengyun test]# su - test
Last login: Tue Dec 17 22:31:09 CST 2019 on pts/0
[test@heimatengyun ~]$ who am i
root     pts/0        2019-12-17 22:23 (192.168.78.1)
[test@heimatengyun ~]$ exit
logout

​ 可以看到,切換後用戶名還是顯示最開始登入時的使用者名稱稱。

  • who

功能描述:顯示當前有哪些使用者真正登入到了本臺機器(不會顯示那些用su命令切換的使用者)

案例:

[root@heimatengyun test]# who
(unknown) :0           2019-12-17 22:22 (:0)
root     pts/0        2019-12-17 22:23 (192.168.78.1)
[root@heimatengyun test]# su - test
Last login: Tue Dec 17 22:34:44 CST 2019 on pts/0
[test@heimatengyun ~]$ who
(unknown) :0           2019-12-17 22:22 (:0)
root     pts/0        2019-12-17 22:23 (192.168.78.1)
[test@heimatengyun ~]$ exit
logout

​ 可以看到用su命令切換使用者後,顯示結果中並咩有test使用者,因此顯示的知識真正登入到本機的所有使用者。

1.1.2 id命令

語法:id 使用者名稱

功能描述:判斷使用者是否存在

案例:

[root@heimatengyun test]# id test
uid=1000(test) gid=1000(test) groups=1000(test)
[root@heimatengyun test]# id lover
id: lover: no such user

​ 如果使用者存在返回使用者資訊,如果使用者不存在則提示no such user

1.1.3 useradd命令

語法:

​ useradd [選項] 使用者名稱

功能描述:

​ 新增新使用者,預設的使用者家目錄存放在/home目錄中,預設的Shell直譯器為 /bin/bash,同時會預設建立一個與該使用者同名的基本使用者組。在建立使用者時,通過以下引數可以修改預設設定。

選項:

引數 作用
-d home-dir,指定使用者的家目錄,預設為/home/username
-e expiredate,賬戶到期時間,格式:YYYY-MM-DD
-u uid,指定使用者預設的UID
-g gid,指定初始使用者基本組,組必須已存在
-G groups,指定一個或多個擴充套件使用者組
-N no-user-group,不建立與使用者同名的基本使用者組
-s shell,指定使用者預設的Shell直譯器

案例:

(1)採用預設引數建立使用者

[root@heimatengyun test]# id lover
id: lover: no such user
[root@heimatengyun test]# useradd lover
[root@heimatengyun test]# id lover
uid=1001(lover) gid=1001(lover) groups=1001(lover)
[root@heimatengyun ~]# cat /etc/passwd
...省略部分內容
lover:x:1001:1001::/home/lover:/bin/bash

建立的使用者儲存在/etc/passwd檔案中,可以通過此檔案檢視使用者資訊。

一行為一條使用者記錄,分為7個欄位,每個欄位用冒號分隔。每個欄位分別對應:

使用者名稱:密碼:UID:GID:註釋:家目錄:偽使用者

(2)建立使用者指定家目錄、UID以及Shell直譯器

[root@heimatengyun ~]# useradd -d /home/heima -u 9988 -s /sbin/nologin heimage
[root@heimatengyun ~]# id heimage
uid=9988(heimage) gid=9988(heimage) groups=9988(heimage)
[root@heimatengyun ~]# ls /home/
heima  test

/sbin/nologin是終端直譯器中的一員,但是與Bash直譯器不同,被設定為nologin後,使用者將不能登入到系統中。

RHEL7(Centos7)系統中,使用者身份有3種:管理員、系統使用者、普通使用者。系統的管理員使用者UID為0;系統使用者UID 為 1~999, Linux 系統為了避免因某個服務程式出現漏洞而被黑客提 權至整臺伺服器,預設服務程式會有獨立的系統使用者負責執行,進而有效控制被破壞 範圍;普通使用者 UID 從 1000 開始,是由管理員建立的用於日常工作的使用者。

需要注意的是,UID 是不能衝突的,而且管理員建立的普通使用者的 UID 預設是從 1000 開始的(即使前面有閒置的號碼)。

另外,在 Linux 系統中建立每個使用者時,將自動建立一個與其同名的基本使用者組,而且 這個基本使用者組只有該使用者一個人。如果該使用者以後被歸納入其他使用者組,則這個其他使用者 組稱之為擴充套件使用者組。一個使用者只有一個基本使用者組,但是可以有多個擴充套件使用者組,從而滿 足日常的工作需要。

1.1.4 passwd命令

語法:

​ passwd [選項] 使用者名稱

功能描述:

​ 設定或修改使用者密碼、過期時間、認證資訊等。

選項:

引數 作用
-l lock,鎖定使用者,禁止登入
-u unlock,解除鎖定,允許使用者登入
-e expire,強制使用者在下次登入時修改密碼
-S status,顯示yoghurt的密碼是否被鎖定,以及密碼採用的加密演算法名稱

案例:

(1)修改其他賬戶密碼

[root@heimatengyun test]# passwd lover
Changing password for user lover.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

​ 修改的密碼不能太簡單,否則修改不成功。修改成功後,即可使用賬戶進行登入。在介面中登入後,即可檢視當前登入使用者

[root@heimatengyun test]# who
lover    :0           2019-12-17 23:05 (:0)
root     pts/0        2019-12-17 22:23 (192.168.78.1)

新建一個使用者,如果沒有設定密碼,則使用者無法直接登入,只能通過root使用者使用su命令切換。因此,一般新建使用者就會同時設定密碼。也就是說useradd和passed命令一般是一起使用。

​ 無論是普通使用者還是超級許可權使用者都可以執行passwd命令,但是如果是普通使用者則只能修改自己的密碼。配合選項引數可以實現更豐富的功能,具體用法可以通過man命令進行檢視。

(2)鎖定及解鎖賬戶

假設你部門有一位同事要休假半年,那麼可以通過-l引數鎖定使用者,禁止其登入,等休假完畢回來上班後再使用-u引數將其解鎖。這樣避免了刪除使用者、新增使用者帶來的麻煩同時也保證了這段時間內系統的安全。

[root@heimatengyun ~]# passwd -S test
test PS 2019-11-27 0 99999 7 -1 (Password set, SHA512 crypt.)
[root@heimatengyun ~]# passwd -l test
Locking password for user test.
passwd: Success
[root@heimatengyun ~]# passwd -S test
test LK 2019-11-27 0 99999 7 -1 (Password locked.)
[root@heimatengyun ~]# passwd -u test
Unlocking password for user test.
passwd: Success
[root@heimatengyun ~]# passwd -S test
test PS 2019-11-27 0 99999 7 -1 (Password set, SHA512 crypt.)
1.1.5 usermod命令

語法:

​ usermod [選項] 使用者名稱

功能描述:

​ 修改使用者資訊

Linux系統一切皆檔案,修改使用者也就是修改配置檔案。使用者資訊儲存在/etc/passwd檔案中,可以直接採用文字編輯器修改也可以通過usermod命令進行修改。

選項:

引數 作用
-e expiredate,賬號到期時間,格式為YYYY-MM-DD
-g gid,變更所屬使用者組
-G groups,變更擴充套件使用者組
-L lock,鎖定使用者禁止其登入
-U unlock,解鎖使用者,允許其登入
-u uid,修改使用者的UID

案例:

​ 通過-G引數將上邊建立的lover使用者加入到root使用者組

[root@heimatengyun test]# id lover
uid=1001(lover) gid=1001(lover) groups=1001(lover)
[root@heimatengyun test]# usermod -G root lover
[root@heimatengyun test]# id lover             
uid=1001(lover) gid=1001(lover) groups=1001(lover),0(root)
1.1.5 userdel命令

語法:

​ userdel [選項] 使用者名稱

功能描述:

​ 當用戶不會再登入系統,則使用此命令刪除使用者

選項:

引數 作用
-f force,強制刪除
-r remove,刪除使用者及使用者家目錄

案例:

​ 刪除之前建立的lover使用者,並刪除目錄

[root@heimatengyun home]# pwd
/home
[root@heimatengyun home]# ls
lover  test
[root@heimatengyun home]# userdel -r lover
userdel: user lover is currently used by process 4419
[root@heimatengyun home]# userdel -rf lover
[root@heimatengyun home]# ls
test

​ 刪除使用者時預設會保留使用者主目錄,新增-r引數則會刪除home目錄下使用者主目錄。-f表示強制刪除,由於前文通過介面上登入了lover使用者,所以提示有程序在使用,通過-f強制刪除使用者。

1.2 使用者組相關命令

1.2.1 groupadd命令

語法:

​ groupadd [選項] 組名

功能描述:

​ 新增使用者組,有時候為了高效的管理系統中各個使用者的許可權,經常會將多個使用者新增到一個指定組中。

案例:

新增heima使用者組並檢視組資訊

[root@heimatengyun ~]# groupadd heima
[root@heimatengyun ~]# cat /etc/group
...省略部分內容
test:x:1000:test
heima:x:1001:

/etc/group檔案包含所有組資訊,可以檢視到剛才新增的heima使用者組。

/etc/group檔案每行表示一條記錄,標識一個使用者組。每條記錄分為四個欄位,用冒號分割。第一欄位:使用者組名稱;第二欄位:使用者組密碼;第三欄位:GID;第四欄位:使用者列表,每個使用者之間用逗號分隔,本欄位可以為空

1.2.2 groupmod命令

語法:

​ groupmod [選項] 新組名 老組名

功能描述:

選項:

引數 作用
-n 修改組名稱

案例:

(1)修改heima組名稱heimage

[root@heimatengyun ~]# groupmod -n heimage heima
[root@heimatengyun ~]# cat /etc/group
...省略部分內容
test:x:1000:test
heimage:x:1001:

(2)新建並新增使用者到heimage組

[root@heimatengyun ~]# cat /etc/group
...省略部分內容
test:x:1000:test
heimage:x:1001:
[root@heimatengyun ~]# useradd -g 1001 heimagege
[root@heimatengyun ~]# id heimagege
uid=1001(heimagege) gid=1001(heimage) groups=1001(heimage)
[root@heimatengyun ~]# cat /etc/group
...省略部分內容
test:x:1000:test
heimage:x:1001:
[root@heimatengyun ~]# cat /etc/passwd
...省略部分內容
heimagege:x:1001:1001::/home/heimagege:/bin/bash
1.2.3 groupdel命令

語法:

​ groupdel 組名

功能描述:

​ 刪除組,前提是組內沒有使用者才能刪除

案例:

(1)刪除使用者組

[root@heimatengyun ~]# groupdel heimage
groupdel: cannot remove the primary group of user 'heimagege'
[root@heimatengyun ~]# userdel heimagege
[root@heimatengyun ~]# groupdel heimage 

(2)檢視組內使用者

如案例1所示,如果組內有使用者則無法直接刪除組。可以通過/etc/group檔案匹配對應的組名檢視對應組內有哪些使用者

[root@heimatengyun ~]# grep 'test' /etc/group
test:x:1000:test

查詢之前建的test組內有哪些使用者,第四個欄位即為該組內所有使用者列表。

二、檔案及相關許可權

2.1 檔案許可權

2.1.1 ll命令檢視檔案許可權

Linux中一切皆檔案,但是每個檔案型別可能不同,如何區分檔案型別呢?每個檔案都有所有者和所有組以及其他人對檔案擁有的讀、寫、執行許可權,如何檢視檔案的這些許可權呢?

當然是通過ls或ll命令就可以檢視

[root@heimatengyun test]# ll
-rw-r--r--. 1 root root   9 Nov 30 20:43 test1.txt
drwxr-xr-x. 2 root root   6 Dec 20 11:32 test1

ll命令顯示結果詳解

以test1.txt檔案為例,各部分代表的含義依次為如下

  • 檔案型別:
    第一個字元“-”表示檔案型別,此處表示test1.txt是一個普通檔案。不同檔案型別用不同字元表示,檔案型別與字元對應關係如下
符號 檔案型別
- 普通檔案
d 目錄檔案
l 連線檔案
b 塊裝置檔案
c 字元裝置檔案
p 管理檔案
s 套接字檔案
  • 檔案許可權:

    “rw-r--r--.”,可以分為四段,前三段每三位為一段,最後一個點單獨為一段。第一段rw-表示檔案建立者/所有者對該檔案所具有的許可權,第二段r--表示建立者/所有者所在的組的其他使用者所具有的許可權,第三段r--表示其他組的其他使用者所具有的許可權。第四段.

字元 許可權型別
r read,讀取許可權,數字表示為4。對檔案而言,具有讀取檔案內容的許可權;對目錄來說,具有瀏覽目錄的許可權
w write,寫入許可權,數字表示為2。對檔案而言,具有新增、修改檔案內容的許可權;對目錄來說,具有刪除、移動目錄內檔案的許可權
x execute,執行許可權,數字表示為1。對檔案而言,具有執行檔案的許可權;對目錄來說,該使用者具有進入目錄的許可權。
s或S SUID,Set UID,可執行的檔案搭配這個許可權,便能得到特權,任意存取該檔案的所有者能使用的全部系統資源。請注意具備SUID許可權的檔案,黑客經常利用這種許可權,以SUID配上root帳號擁有者,無聲無息地在系統中開扇後門,供日後進出使用。
t或T sticky,/tmp和 /var/tmp目錄供所有使用者暫時存取檔案,亦即每位使用者皆擁有完整的許可權進入該目錄,去瀏覽、刪除和移動檔案。
.或+ 如果為+表示設定了ACL

此處test1.txt檔案,其建立者/所有者具有可讀可寫的許可權,其建立者/所有者所在的組的其他使用者具有可讀許可權,其他組的其他使用者則具有可讀許可權。

檔案許可權除了可以使用rwx表示,也可以用數字表示。如777代表:rwxrwxrwx(r=4,w=2,x=1,4+2+1=7=rwx),由此可以看出數字表示會簡潔一些。

  • 連線個數

    對於檔案,表示指向它的連結檔案的個數;對於目錄檔案,表示它的第一級子目錄的個數。注意此處看到的值要減2才等於該目錄下的子目錄的實際個數,比如test1目錄下其實並沒有任何檔案和目錄,但此處顯示為2,這是因為要加上.目錄和..目錄。在linux下,.目錄表示當前目錄,..目錄表示上一級目錄。

  • 所有者和所屬組

    表示該檔案的所有者/建立者(owner)及其所在的組(group)。

  • 檔案大小

    如果是檔案,則表示該檔案的大小,單位為位元組。如果是目錄,則表示該目錄符所佔的大小,並不表示該目錄下所有檔案的大小。

  • 修改日期

    該檔案最後修改的日期時間。

  • 檔名稱

    檔案或目錄的名稱。

不同的shell視窗,還能用顏色區分檔案的屬性,能一目瞭然通過顏色區分檔案型別,普通檔案、可執行檔案、壓縮檔案、目錄、連線檔案都有不同的顏色區分。不同工具可以根據自己需要進行顏色方案的修改和配置,這裡就不說了。

2.1.2 檔案許可權設定
2.1.2.1 chmod命令

語法:

​ chmod [選項] [ugoa] [+-=] [rwx或數字] 檔案或目錄

選項引數:

選項 含義
-R recursive,遞迴執行
屬性符號 作用
u 檔案擁有者
g 檔案所屬組
o 檔案所屬組外的其他使用者
a 所有使用者,相當於是ugo同時使用
操作符號 作用
+ 新增許可權
- 刪除許可權
= 設定許可權,未指定的部分將被清除
許可權符號 作用
r 對於檔案有檢視許可權,對於目錄可以列出目錄內容
w 對於檔案有修改許可權,對於目錄可以在目錄中建立和刪除
x 對於檔案有執行許可權,對於目錄可以進入目錄

功能描述:

​ 改變檔案或目錄許可權

案例:

(1)分別通過ugoa新增檔案的可執行許可權

[root@heimatengyun test1]# ll
total 8
-rw-r--r--. 1 root root 6 Dec 20 14:52 hello
-rw-r--r--. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod u+x hello
[root@heimatengyun test1]# ll
total 8
-rwxr--r--. 1 root root 6 Dec 20 14:52 hello
-rw-r--r--. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod g+x hello
[root@heimatengyun test1]# ll
total 8
-rwxr-xr--. 1 root root 6 Dec 20 14:52 hello
-rw-r--r--. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod o+x hello
[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rw-r--r--. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod a+x test
[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxr-xr-x. 1 root root 6 Dec 20 14:51 test

從示例可以看到可以通過u、g、o分別對不同部分賦予許可權,也可以直接用o一次性賦值。根據實際需要靈活選擇即可。

(2)移除所有者或所屬組之外其他使用者的執行許可權

[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxr-xr-x. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod o-x test
[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxr-xr--. 1 root root 6 Dec 20 14:51 test

(3)用數字設定許可權

[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxr-xr--. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod 777 test
[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test

(4)通過=號設定許可權

[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chmod o=w test
[root@heimatengyun test1]# ll
total 8
-rwxr-xr-x. 1 root root 6 Dec 20 14:52 hello
-rwxrwx-w-. 1 root root 6 Dec 20 14:51 test

(5)改變目錄下所有檔案

[root@heimatengyun test]# chmod -R 777 test1
[root@heimatengyun test]# ll
drwxrwxrwx. 2 root root  29 Dec 20 14:52 test1
[root@heimatengyun test]# cd test1/
[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test

可以看到內部的所有檔案許可權一次性被修改。

2.1.2.2 chown命令

語法:

​ chown [選項] 終端使用者[:最終所屬組] 檔案或目錄

引數:

引數 作用
-R 遞迴修改

功能描述:

​ 改變檔案或目錄的所有者

案例:

(1)修改檔案所有者

[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 root root 6 Dec 20 14:51 test
[root@heimatengyun test1]# chown test test
[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 root root 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 test root 6 Dec 20 14:51 test

(2)遞迴修改目錄及其下所有檔案所有者

[root@heimatengyun test]# chown -R test:test /root/test/test1
[root@heimatengyun test]# ll
drwxrwxrwx. 2 test test  29 Dec 20 14:52 test1
[root@heimatengyun test]# cd test1/
[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 test test 6 Dec 20 14:51 test

這種用法在修改所有者時同時修改了所屬組。注意,修改的當前目錄及其下的所有檔案都會修改,上級目錄不會影響。如此處的/root/test目錄不會變化,只會影響test1目錄。

2.1.2.3 chgrp命令

語法:

​ chgrp 終端使用者組 檔案或目錄

功能描述:

​ 改變檔案或目錄的所屬組

案例:

[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 test test 6 Dec 20 14:51 test
[root@heimatengyun test1]# chgrp root test
[root@heimatengyun test1]# ll
total 8
-rwxrwxrwx. 1 test test 6 Dec 20 14:52 hello
-rwxrwxrwx. 1 test root 6 Dec 20 14:51 test

2.2 檔案特殊許可權

​ 單純設定檔案的 rwx 一般許可權無法滿足我們對安全和靈活性的需求,因此便有了 SUID、SGID 與 SBIT 的特殊許可權位。

​ 這是一種對檔案許可權進行設定的特殊功 能,可以與一般許可權同時使用,以彌補一般許可權不能實現的功能。

2.2.1 SUID

​ 針對二進位制程式設定的特殊許可權,可以讓二進位制程式的執行者臨時擁有屬主的許可權(僅對擁有執行許可權的二進位制程式有效)。SUID是一種有條件的、臨時的特殊許可權授權方法,下文以passwd命令進行介紹。

​ 還記得1.1.4講的passwd命令嗎?該命令用於修改使用者密碼,所有使用者都可以執行 passwd 命 令來修改自己的使用者密碼,而使用者密碼儲存在/etc/shadow 檔案中,執行passwd命令本質就是修改shadow檔案。

​ 但仔細檢視這個檔案就會發 現它的預設許可權是 000,也就是說除了 root 管理員以外,所有使用者都沒有檢視或編輯該檔案的許可權。

[root@heimatengyun test1]# ll /etc/shadow
----------. 1 root root 1157 Dec 20 00:06 /etc/shadow

​ 既然沒有此密碼檔案讀寫許可權,那為何所有使用者都可以執行命令修改密碼呢?先不急,我們來看看passed命令的許可權。

[root@heimatengyun test1]# ll /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

​ 可以看到所有者許可權為rws,以前講過可執行許可權為x,此處為s。對,就是因為所有者的許可權由 rwx變成了rws,其中x改變成s就意味著該檔案被賦予了SUID 許可權。在使用 passwd 命令時如果加上 SUID 特殊許可權位,就可讓普通使用者臨時獲得程式所有者的身份,把變更的密碼資訊寫入到 shadow 檔案中。

說明:設定SUID後,如果原本沒有執行許可權,則為S,有執行許可權則為s。如rwx將變為rws,rw-變為rwS。

設定SUID許可權,就是使用之前介紹的chmod命令即可,針對命令或可執行二進位制檔案進行設定。

[root@heimatengyun test]# ll
-rwxrwxrwx. 1 root root 145 Dec  1 16:06 mypid.sh
[root@heimatengyun test]# chmod u+s mypid.sh 
[root@heimatengyun test]# ll
-rwsrwxrwx. 1 root root 145 Dec  1 16:06 mypid.sh
2.2.2 SGID

主要應用場景和功能有:

(1)讓執行者臨時擁有所屬組許可權,對擁有執行許可權的二進位制程式進行設定。

(2)在某個目錄中建立的檔案自動繼承該目錄的使用者組,只可以對目錄進行設定。

SGID 的第一種功能是參考 SUID 而設計的,不同點在於執行程式的使用者獲取的不再是文 件所有者的臨時許可權,而是獲取到檔案所屬組的許可權。

針對第二種功能,我們知道,每個檔案都有其歸屬的所有者和所屬組,當建立或傳送一個檔案後,這個檔案就會自動歸屬於執行這個操作的使用者,即該使用者就是檔案的所有者。

假設有這樣一種情況,需要在部門內建立一個共享目錄,部門內所有人員都能讀取目錄中的內容。如果每個人都去建立各自的檔案,所有者和所屬組都是建立者自己,別人無法使用。SGID的出現就是為了解決這個問題,建立部門共享目錄後,在該目錄上設定 SGID 特殊許可權位。這樣,部門內的任何人員在裡面建立的任何檔案都會歸屬於該目錄的所屬組,而不再是自己的基本使用者組。

SGID功能就是在某個目錄中建立的檔案自動繼承該目錄的使用者組,只可以對目錄進行設定。

下面演示在目錄上建立SGID

[root@heimatengyun test]# mkdir sgid
[root@heimatengyun test]# ll
drwxr-xr-x. 2 root root  6 Dec 20 18:11 sgid
[root@heimatengyun test]# chmod 777 sgid/
[root@heimatengyun test]# ll
drwxrwxrwx. 2 root root  6 Dec 20 18:11 sgid
[root@heimatengyun test]# chmod g+s sgid/
[root@heimatengyun test]# ll
drwxrwsrwx. 2 root root  6 Dec 20 18:11 sgid

建立SGID後,就可以切換到普通使用者,建立檔案,觀察檔案的所屬組

[root@heimatengyun test]# su - test
Last login: Fri Dec 20 17:26:36 CST 2019 on pts/0
[test@heimatengyun ~]$ cd sgid/
[test@heimatengyun sgid]$ echo 'hello'>hello
[test@heimatengyun sgid]$ ll
total 4
-rw-rw-r--. 1 test root 6 Dec 20 18:14 hello

可以看到test普通使用者建立的檔案所屬組變為給上層資料夾一致屬於root,不再屬於test自己。這樣針對所屬組設定許可權,其他使用者就可以實現操作檔案。

2.2.3 SBIT

SBIT 特殊許可權位可確保使用者只能刪除自己的檔案,而不能刪除其他使用者的檔案。當對某個目錄設定了 SBIT 粘滯位許可權後,那麼該目錄中的檔案就只能被其所有者執行刪除操作了。

回到上文的例子,當一個部門共享一個目錄後,如何避免使用者刪除其他使用者的檔案呢?顯然用SBIT就可以保證使用者不能刪除別人的檔案。

設定目錄SBIT,同樣用chmod命令

[root@heimatengyun test]# mkdir sbit
[root@heimatengyun test]# ll
drwxr-xr-x. 2 root root  6 Dec 20 18:26 sbit
[root@heimatengyun test]# chmod -R o+t sbit/
[root@heimatengyun test]# ll
drwxr-xr-t. 2 root root  6 Dec 20 18:26 sbit

與前面所講的 SUID 和 SGID 許可權顯示方法不同,當目錄被設定 SBIT 特殊許可權位後,檔案的其他人許可權部分的 x 執行許可權就會被替換成 t 或者 T,原本有 x 執行許可權則會寫成 t,原本沒有 x 執行許可權則會被寫成 T。

我們仔細觀察,就會發現/tmp目錄其實就是預設設定了SBIT,它是一個共享目錄,保證使用者只能刪除自己的檔案。

[root@heimatengyun /]# ll -d /tmp/
drwxrwxrwt. 15 root root 4096 Dec 20 18:30 /tmp/

建立新使用者並在tmp下建立檔案,驗證用其他使用者去刪除看能否刪除,答案肯定是不能刪除的。

[root@heimatengyun /]# useradd heimagege
[root@heimatengyun /]# su - heimagege
[heimagege@heimatengyun ~]$ cd /tmp/
[heimagege@heimatengyun tmp]$ echo 'heimagege'>heimagege
[heimagege@heimatengyun tmp]$ ll
-rw-rw-r--. 1 heimagege heimagege 10 Dec 20 18:34 heimagege
[root@heimatengyun /]# su - test
Last login: Fri Dec 20 18:29:10 CST 2019 on pts/0
[test@heimatengyun ~]$ cd /tmp/
[test@heimatengyun tmp]$ rm -f heimagege 
rm: cannot remove ‘heimagege’: Operation not permitted

2.3 檔案隱藏屬性

​ Linux 系統中的檔案除了具備一般許可權和特殊許可權之外,還有一種隱藏許可權,即被隱藏起 來的許可權,預設情況下不能直接被使用者發覺。當你新接手一臺伺服器,碰到明明許可權充足但卻無法刪除某個檔案的情況,或者僅能在日誌檔案中追加內容而不能修改或刪除內容,這肯you可能就是設定了檔案隱藏屬性。這種屬性在一定程度上阻止了黑客篡改系統日誌的圖謀,因此這種“奇怪”的檔案也保障了Linux 系統的安全性。

2.3.1 chattr命令

語法:

​ chattr [選項] [+-=引數] 檔案

選項及引數:

選項 作用
R 遞迴
引數 作用
i 無法對檔案進行修改;若對目錄設定了該引數,則僅能修改其中的子檔案內容 而不能新建或刪除檔案
a 僅允許補充(追加)內容,無法覆蓋/刪除內容(Append Only)
S 檔案內容在變更後立即同步到硬碟(sync)
s 徹底從硬碟中刪除,不可恢復(用 0 填充原檔案所在硬碟區域)
A 不再修改這個檔案或目錄的最後訪問時間(atime)
b 不再修改檔案或目錄的存取時間
d 使用 dump 命令備份時忽略本檔案/目錄
u 當刪除該檔案後依然保留其在硬碟中的資料,方便日後恢復

功能描述:

​ 設定檔案的隱藏許可權

案例:

通過隱藏屬性,設定檔案不能刪除

[root@heimatengyun test]# echo 'test chattr'>testattr
[root@heimatengyun test]# chattr +a testattr 
[root@heimatengyun test]# rm testattr 
rm: remove regular file ‘testattr’? y
rm: cannot remove ‘testattr’: Operation not permitted
2.3.2 lsattr命令

語法:

​ lsattr 檔案

功能描述:

​ 顯示檔案的隱藏許可權

案例:

​ 檢視檔案隱藏屬性,刪除隱藏屬性

[root@heimatengyun test]# lsattr testattr 
-----a---------- testattr
[root@heimatengyun test]# chattr -a testattr 
[root@heimatengyun test]# lsattr testattr    
---------------- testattr
[root@heimatengyun test]# rm testattr 
rm: remove regular file ‘testattr’? y
[root@heimatengyun test]# 

​ 可以看到,刪除隱藏屬性後文件刪除成功。

2.3 檔案訪問控制列表

前文講解的一般許可權、特殊許可權、隱藏許可權都是針對某一類使用者設定的。如果希望對某個指定的使用者進行單獨的許可權控制,就需要用到檔案 的訪問控制列表(ACL)了。

2.3.1 setfacl命令

基於普通檔案或目錄設定 ACL 其實就是針對指定的使用者或使用者組設定檔案或目錄的操作許可權。另外,如果針對某個目錄設定了 ACL,則目錄中 的檔案會繼承其 ACL;若針對檔案設定了 ACL,則檔案不再繼承其所在目錄的 ACL。

檔案的 ACL 提供的是在所有者、所屬組、其他人的讀/寫/執行許可權之外的特殊許可權控制,使用 setfacl 命令可以針對單一使用者或使用者組、單一檔案或目錄來進行讀/寫/執行許可權的控制。

語法:

​ setfacl [引數] 檔名稱

引數選項:

引數 作用
-R 遞迴引數
-m modify修改目錄或檔案的ACL
-b 刪除擴充套件ACL,保留原有的基礎許可權

功能描述:

​ 管理檔案的 ACL 規則

案例:

讓普通使用者能訪問root目錄

[root@heimatengyun ~]# ll -d /root/
dr-xr-x---. 16 root root 4096 Dec 20 11:49 /root/
[root@heimatengyun ~]# su - test
Last login: Fri Dec 20 18:34:47 CST 2019 on pts/0
[test@heimatengyun ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[test@heimatengyun ~]$ exit
logout

未設定ACL前其他使用者是不能訪問root目錄的,設定root目錄ACL允許test訪問。

[root@heimatengyun ~]# setfacl -Rm u:test:rwx /root/
[root@heimatengyun ~]# ll -d /root/                 
dr-xrwx---+ 16 root root 4096 Dec 20 11:49 /root/
[root@heimatengyun ~]# su - test
Last login: Fri Dec 20 22:10:26 CST 2019 on pts/0
[test@heimatengyun ~]$ ls /root/
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates  Videos  Desktop          Downloads  Music                 Public    test

同時通過ll命令可以看到許可權後邊的點變為了+。這個標識說明已經設定了ACL。

2.3.2 getfacl命令

語法:

​ getfacl 檔名稱

功能描述:

​ 檢視檔案上設定的ACL資訊

案例:

(1)檢視檔案上設定的ACL

[test@heimatengyun ~]$ getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:test:rwx
group::r-x
mask::rwx
other::---

(2)刪除檔案ACL

[root@heimatengyun ~]# ll -d /root/
dr-xrwx---+ 16 root root 4096 Dec 20 11:49 /root/
[root@heimatengyun ~]# setfacl -b /root/
[root@heimatengyun ~]# ll -d /root/     
dr-xr-x---. 16 root root 4096 Dec 20 11:49 /root/

2.4 臨時許可權提升

​ 平時學習一般直接用root可以避免各種配置服務或許可權導致的干擾問題,使得學習中心放在相應的知識點上。但是正式工作中,往往很少用root操作,因此可能會涉及使用者切換以及使用者提權問題。

2.4.1 su命令

​ su 命令可以解決切換使用者身份的需求,使得當前使用者在不退出登入的情況下,順暢地切 換到其他使用者。

​ 由於前文已經演示了su命令的用法,因此不再贅述。只是要注意su命令與使用者名稱之間有一個減號(-),這意味著完全切 換到新的使用者,即把環境變數資訊也變更為新使用者的相應資訊,而不是保留原始的資訊。強 烈建議在切換使用者身份時新增這個減號(-)。另外,當從 root 管理員切換到普通使用者時是不需要密碼驗證的,而從普通使用者切換成 root 管理員就需要進行密碼驗證了;這也是一個必要的安全檢查。

2.4.2 sudo命令

​ 儘管使用 su 命令後,普通使用者可以完全切換到 root 管理員身份來完成相應工作,但這將暴露 root 管理員的密碼,從而增大了系統密碼被黑客獲取的機率;這並不是最安全的方案。

​ sudo 命令可以把特定命令的執行許可權賦予給指定使用者而無需給出root密碼, 這樣既可保證普通使用者能夠完成特定的工作,也可以避免洩露 root 管理員密碼。

語法格式:

​ sudo [引數] 命令

引數:

引數 作用
-l 列出當前使用者可執行的命令

功能描述:

​ sudo 命令用於給普通使用者提供額外的許可權來完成原本 root 管理員才能完成的任務。

​ 使用sudo之前需要先配置sudo服務,配置檔案為/etc/sudoers,可以直接編輯此檔案,也可以使用visudo命令進行配置。

案例:

(1)為普通使用者test新增sudo許可權

​ 未為普通使用者配置sudo服務時,通過sodo命令檢視能執行的命令,將提升沒有配置。

[root@heimatengyun ~]# su - test
Last login: Fri Dec 20 22:14:02 CST 2019 on pts/0
[test@heimatengyun ~]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.
[sudo] password for test: 
Sorry, user test may not run sudo on heimatengyun.

​ 通過visudo命令,在“root ALL=(ALL) ALL”後仿照新增“test ALL=(ALL) ALL”,然後儲存退出。操作方式跟vi編輯器一致。

配置內容解釋:test ALL=(ALL) ALL 其中test為使用者名稱,表示誰可以使用sudo,第一個ALL表示是執行使用的主機,等號之後括號內的ALL表示以誰的身份執行,最後的ALL表示可執行命令的列表。“誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的列表”

配置後,再次使用test使用者來檢視,將得出如下結果:

[root@heimatengyun ~]# su - test
Last login: Fri Dec 20 22:41:52 CST 2019 on pts/0
[test@heimatengyun ~]$ sudo -l
[sudo] password for test: 
Matching Defaults entries for test on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
    DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
    PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
    LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User test may run the following commands on this host:
    (ALL) ALL

表明針對test使用者的sudo服務配置成功。配置成功之後,就可以採用sudo提升test使用者的許可權了。

[test@heimatengyun ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[test@heimatengyun ~]$ sudo ls /root/
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Pictures  Templates  Videos
Desktop          Downloads  Music                 Public    test
[test@heimatengyun ~]$ 

是不是很神奇,test使用者通過sudo提權就可以看到root目錄內容了。

(2)按需為使用者配置sudo許可權

我們前邊直接給了ALL最大的許可權,實際情況應該按需分配最小許可權,比如我們只給test使用者cat命令許可權。

通過whereis命令檢視cat所在路徑,一定要給命令的絕對路徑,不然系統無法識別命令。

[test@heimatengyun ~]$ whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz

通過visudo命令修改之前新增的內容為:test ALL=(ALL) /usr/bin/cat。儲存後切換到test普通使用者檢視效果

[root@heimatengyun ~]# visudo 
...省略部分內容
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
#test ALL=(ALL) ALL
test ALL=(ALL) /usr/bin/cat
...省略部分內容
[test@heimatengyun ~]$ sudo -l
[sudo] password for test: 
Matching Defaults entries for test on this host:
    requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
    DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
    PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
    LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
    LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
    LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
    secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User test may run the following commands on this host:
    (ALL) /usr/bin/cat
[test@heimatengyun ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[test@heimatengyun ~]$ sudo cat /etc/shadow
...省略部分內容
heimagege:!!:18250:0:99999:7:::
[test@heimatengyun ~]$ ls /root/
ls: cannot open directory /root/: Permission denied
[test@heimatengyun ~]$ 

從實驗結果可以看出,配置cat命令後,只能執行cat命令,再次使用ls命令就不能看到root目錄內容。這樣許可權就得到了很好的控制。

學習完使用者及檔案相關許可權知識後,下一篇文章我們將講解防火牆相關知識