1. 程式人生 > 其它 >五、使用者身份與檔案許可權

五、使用者身份與檔案許可權

技術標籤:Linux基礎操作

文章目錄


前言

Linux 是一個多使用者、多工的作業系統,具有很好的穩定性與安全性,在幕後保障 Linux系統安全的則是一系列複雜的配置工作。本章將詳細講解檔案的所有者、所屬組以及其他人可對檔案進行的讀(r)、寫(w)、執行(x)等操作,以及如何在 Linux 系統中新增、刪除、修改使用者賬戶資訊。我們還可以使用 SUID、SGID 與 SBIT 特殊許可權更加靈活地設定系統許可權功能,來彌補對檔案設定一般操作許可權時所帶來的不足。隱藏許可權能夠給系統增加一層隱形的防護層,讓黑客最多隻能檢視關鍵日誌資訊,而不能進行修改或刪除。而檔案的訪問控制列表(Access Control List,ACL)可以進一步讓單一使用者、使用者組對單一檔案或目錄進行特殊的許可權設定,讓檔案具有能滿足工作需求的最小許可權。最後還將講解如何使用 su 命令與 sudo 服務讓普通使用者具備管理員的許可權,不僅可以滿足日常的工作需求,還可以確保系統的安全性。


1. 使用者身份與能力

Linux 系統中的管理員就是 root。這其實是錯誤的,Linux 系統的管理員之所以是 root,並不是因為它的名字叫 root,而是因為該使用者的身份號碼即 UID(User IDentification)的數值為 0。在 Linux 系統中,UID 就相當於我們的身份證號碼一樣具有唯一性,因此可通過使用者的 UID 值來判斷使用者身份。

  • 管理員UID為0:系統的管理員使用者
  • 系統使用者UID1-999:Linux 系統為了避免因某個服務程式出現漏洞而被黑客提權至整臺伺服器,預設服務程式會有獨立的系統使用者負責執行,進而有效控制被破壞範圍
  • 普通使用者UID從1000開始:是由管理員建立的用於日常工作的使用者。需要注意的是,UID 是不能衝突的,而且管理員建立的普通使用者的 UID 預設是從 1000開始的(即使前面有閒置的號碼)

為了方便管理屬於同一組的使用者,Linux 系統中還引入了使用者組的概念。通過使用使用者組號碼(GID,Group IDentification),我們可以把多個使用者加入到同一個組中,從而方便為組中的使用者統一規劃許可權或指定任務。假設有一個公司中有多個部門,每個部門中又有很多員工。如果只想讓員工訪問本部門內的資源,則可以針對部門而非具體的員工來設定許可權。

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

1.1 useradd命令

useradd 命令用於建立新的使用者,格式為“useradd [選項] 使用者名稱”。

可以使用 useradd 命令建立使用者賬戶。使用該命令建立使用者賬戶時,預設的使用者家目錄會被存放在/home 目錄中,預設的 Shell 直譯器為/bin/bash,而且預設會建立一個與該使用者同名的基本使用者組。

useradd 命令中的使用者引數以及作用

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

下面我們建立一個普通使用者並指定家目錄的路徑、使用者的 UID 以及 Shell 直譯器。在下面的命令中,請注意/sbin/nologin,它是終端直譯器中的一員,與 Bash 直譯器有著天壤之別。一旦使用者的直譯器被設定為 nologin,則代表該使用者不能登入到系統中:

[[email protected] ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin xiaogege
[[email protected] ~]#id xiaogege 
uid=8888(xiaogege) gid=8888(xiaogege) groups=8888(xiaogege)

1.2 groupadd命令

groupadd 命令用於建立使用者組,格式為“groupadd [選項] 群組名”。
為了能夠更加高效地指派系統中各個使用者的許可權,在工作中常常會把幾個使用者加入到同一個組裡面,這樣便可以針對一類使用者統一安排許可權。建立使用者組的步驟非常簡單,例如使用如下命令建立一個使用者組 tom:

[[email protected] ~]#groupadd tom

1.3 usermod 命令

usermod 命令用於修改使用者的屬性,格式為“usermod [選項] 使用者名稱”。

在Linux 系統中的一切都是檔案,因此在系統中建立使用者也就是修改配置檔案的過程。使用者的資訊儲存在/etc/passwd 檔案中,可以直接用文字編輯器來修改其中的使用者引數專案,也可以用 usermod 命令修改已經建立的使用者資訊,諸如使用者的 UID、基本/擴充套件使用者組、預設終端等。

usermod 命令中的引數及作用

專案Value
-c填寫使用者賬戶的備註資訊
-d -m引數-m 與引數-d 連用,可重新指定使用者的家目錄並自動把舊的資料轉移過去
-e賬戶的到期時間,格式為 YYYY-MM-DD
-g變更所屬使用者組
-G變更擴充套件使用者組
-L鎖定使用者禁止其登入系統
-U解鎖使用者,允許其登入系統
-s變更預設終端
-u修改使用者的 UID

我們把xiaogege使用者新增到root組中

[[email protected] ~]#usermod -G root xiaogege 
[[email protected] ~]#id xiaogege 
uid=8888(xiaogege) gid=8888(xiaogege) groups=8888(xiaogege),0(root)

-u引數可以修改使用者的UID值

[[email protected] ~]#usermod -u 6666 xiaogege 
[[email protected] ~]#id xiaogege
uid=6666(xiaogege) gid=8888(xiaogege) groups=8888(xiaogege),0(root)

1.4 passwd命令

passwd 命令用於修改使用者密碼、過期時間、認證資訊等,格式為“passwd [選項] [使用者名稱]”。

普通使用者只能使用 passwd 命令修改自身的系統密碼,而 root 管理員則有許可權修改其他所有人的密碼。更酷的是,root 管理員在 Linux 系統中修改自己或他人的密碼時不需要驗證舊密碼,這一點特別方便。

passwd 命令中的引數以及作用

專案Value
-l鎖定使用者,禁止其登入
-u解除鎖定,允許使用者登入
–stdin允許通過標準輸入修改使用者密碼,如echo “NewPassWord”
-d使該使用者可用空密碼登入系統
-e強制使用者在下次登入時修改密碼
-S顯示使用者的密碼是否被鎖定,以及密碼所採用的加密演算法名稱

1.5 userdel 命令

userdel 命令用於刪除使用者,格式為“userdel [選項] 使用者名稱”。

如果我們確認某位使用者後續不再會登入到系統中,則可以通過 userdel 命令刪除該使用者的所有資訊。在執行刪除操作時,該使用者的家目錄預設會保留下來,此時可以使用-r 引數將其刪除。

專案Value
-f強制刪除使用者
-r同時刪除使用者及使用者家目錄

2. 檔案許可權和歸屬

儘管在 Linux 系統中一切都是檔案,但是每個檔案的型別不盡相同,因此 Linux 系統使用了不同的字元來加以區分,常見的字元如下所示。

  • - :普通檔案

  • d:目錄檔案

  • l:連結檔案

  • b:快裝置檔案

  • c:字元裝置檔案

  • p:管道檔案

    在 Linux 系統中,每個檔案都有所屬的所有者和所有組,並且規定了檔案的所有者、所有組以及其他人對檔案所擁有的可讀(r)、可寫(w)、可執行(x)等許可權。

對於一般檔案來說,許可權比較容易理解:“可讀”表示能夠讀取檔案的實際內容;“可寫”表示能夠編輯、新增、修改、刪除檔案的實際內容;“可執行”則表示能夠執行一個指令碼程式。

對目錄檔案來說,“可讀”表示能夠讀取目錄內的檔案列表;“可寫”表示能夠在目錄內新增、刪除、重新命名檔案;而“可執行”則表示能夠進入該目錄。檔案的讀、寫、執行許可權可以簡寫為 rwx,亦可分別用數字 4、2、1 來表示,檔案所有者,所屬組及其他使用者許可權之間無關聯。

檔案許可權的字元與數字表示
在這裡插入圖片描述

檔案許可權的數字法表示基於字元表示(rwx)的許可權計算而來,其目的是簡化許可權的表示。例如,若某個檔案的許可權為 7 則代表可讀、可寫、可執行(4+2+1);若許可權為 6 則代表可讀、可寫(4+2)。

3. 檔案的特殊許可權

在複雜多變的生產環境中,單純設定檔案的 rwx 許可權無法滿足我們對安全和靈活性的需求,因此便有了 SUID、SGID 與 SBIT 的特殊許可權位。這是一種對檔案許可權進行設定的特殊功能,可以與一般許可權同時使用,以彌補一般許可權不能實現的功能。

3.1 SUID

SUID 是一種對二進位制程式進行設定的特殊許可權,可以讓二進位制程式的執行者臨時擁有屬主的許可權(僅對擁有執行許可權的二進位制程式有效)。

例如,所有使用者都可以執行 passwd 命令來修改自己的使用者密碼,而使用者密碼儲存在/etc/shadow 檔案中。仔細檢視這個檔案就會發現
它的預設許可權是 000,也就是說除了 root 管理員以外,所有使用者都沒有檢視或編輯該檔案的許可權。但是,在使用 passwd 命令時如果加上 SUID 特殊許可權位,就可讓普通使用者臨時獲得程式所有者的身份,把變更的密碼資訊寫入到 shadow 檔案中。

檢視 passwd 命令屬性時發現所有者的許可權由 rwx 變成了 rws,其中 x 改變成 s 就意味著該檔案被賦予了 SUID 許可權

[[email protected] ~]#ls -l /etc/shadow
----------. 1 root root 815 Jan  2 13:25 /etc/shadow
[[email protected] ~]#ls -l /bin/passwd 
-rwsr-xr-x. 1 root root 33600 Apr  7  2020 /bin/passwd

3.2 SGID

SGID 主要實現如下兩種功能:

  • 讓執行者臨時擁有屬組的許可權(對擁有執行許可權的二進位制程式進行設定);
  • 在某個目錄中建立的檔案自動繼承該目錄的使用者組(只可以對目錄進行設定)。

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

[[email protected] tmp]#mkdir testdir
[[email protected] tmp]#ls -ald testdir/
drwxr-xr-x. 2 root root 6 Jan  2 13:51 testdir/
[[email protected] tmp]#chmod -Rf 777 testdir/
[[email protected] tmp]#chmod -Rf  g+s testdir/ 
[[email protected] tmp]#ls -ald testdir/
drwxrwsrwx. 2 root root 6 Jan  2 13:51 testdir/

在使用上述命令設定好目錄的 777 許可權(確保普通使用者可以向其中寫入檔案),併為該目錄設定了 SGID 特殊許可權位後,就可以切換至一個普通使用者,然後嘗試在該目錄中建立檔案,並檢視新建立的檔案是否會繼承新建立的檔案所在的目錄的所屬組名稱:

[[email protected] tmp]#su - vyi 
Last login: Sat Jan  2 13:08:30 CST 2021 on pts/0
[[email protected] ~]$cd /tmp/
[[email protected] tmp]$cd testdir/
[[email protected] testdir]$touch 123.txt 
[[email protected] testdir]$echo "ni hao!" >123.txt 
[[email protected] testdir]$cat 123.txt 
ni hao!

3.3 SBIT

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

4. 檔案的隱藏許可權

Linux 系統中的檔案除了具備一般許可權和特殊許可權之外,還有一種隱藏許可權,即被隱藏起來的許可權,預設情況下不能直接被使用者發覺。

4.1 chattr 命令

chattr 命令用於設定檔案的隱藏許可權,格式為“chattr [引數] 檔案”。如果想要把某個隱藏功能新增到檔案上,則需要在命令後面追加“+引數”,如果想要把某個隱藏功能移出檔案,則需要追加“-引數”。

引數作用
i無法對檔案進行修改;若對目錄設定了該引數,則僅能修改其中的子檔案內容而不能新建或刪除檔案
a僅允許補充(追加)內容,無法覆蓋/刪除內容(Append Only)
S檔案內容在變更後立即同步到硬碟(sync)
s徹底從硬碟中刪除,不可恢復(用 0 填充原檔案所在硬碟區域)
A不再修改這個檔案或目錄的最後訪問時間(atime)
b不再修改檔案或目錄的存取時間
D檢查壓縮檔案中的錯誤
d使用 dump 命令備份時忽略本檔案/目錄
c預設將檔案或目錄進行壓縮
u當刪除該檔案後依然保留其在硬碟中的資料,方便日後恢復
t讓檔案系統支援尾部合併(tail-merging)
X可以直接訪問壓縮檔案中的內容
[[email protected] ~]#touch linux.txt 
[[email protected] ~]#chattr +a linux.txt 
[[email protected] ~]#echo "ni haochattr +a linux.txt " >> linux.txt 
[[email protected] ~]#cat linux.txt 
ni haochattr +a linux.txt 
[[email protected] ~]#rm linux.txt 
rm: remove regular file 'linux.txt'? y
rm: cannot remove 'linux.txt': Operation not permitted

可以看到顯示當前沒有許可權執行刪除操作!

4.2 lsattr 命令

lsattr 命令用於顯示檔案的隱藏許可權,格式為“lsattr [引數] 檔案”。在 Linux 系統中,檔案的隱藏許可權必須使用 lsattr 命令來檢視,平時使用的 ls 之類的命令則看不出端倪:

[[email protected] ~]#ls -al linux.txt 
-rw-r--r--. 1 root root 27 Jan  2 21:07 linux.txt

當我們使用lsattr命令後,檔案的隱藏屬性就會立刻顯現出來

[[email protected] ~]#lsattr linux.txt 
-----a-------------- linux.txt
[[email protected] ~]#chattr -a linux.txt 
[[email protected] ~]#lsattr linux.txt 
-------------------- linux.txt

5. 檔案訪問控制列表

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

為了提現實驗效果,我們切換到普通目錄,然後訪問root使用者的家目錄

[[email protected] ~]#su - vyi
Last login: Sat Jan  2 13:54:16 CST 2021 on pts/0
[[email protected] ~]$cd /root
-bash: cd: /root: Permission denied

5.1 setfacl 命令

setfacl 命令用於管理檔案的 ACL 規則,格式為“setfacl [引數] 檔名稱”。

檔案的 ACL提供的是在所有者、所屬組、其他人的讀/寫/執行許可權之外的特殊許可權控制,使用 setfacl 命令可以針對單一使用者或使用者組、單一檔案或目錄來進行讀/寫/執行許可權的控制。其中,針對目錄檔案需要使用-R 遞迴引數;針對普通檔案則使用-m 引數;如果想要刪除某個檔案的 ACL,則可以使用-b 引數。下面來設定使用者在/root 目錄上的許可權:

[[email protected] ~]#setfacl -Rm u:vyi:rwx /root
[[email protected] ~]#su - vyi 
Last login: Sat Jan  2 21:15:03 CST 2021 on pts/1
[[email protected] ~]$cd /root
[[email protected] root]$pwd 
/root

那麼如何檢視一個檔案有沒有設定ACL許可權呢,常用的ls命令是看不到ACL表資訊的,但是卻可以看到檔案的許可權的最後一個點(.),變成了+號,這就意味著該檔案已經設定了ACL了

[[email protected] root]$ls -ld /root
dr-xrwx---+ 3 root root 184 Jan  2 21:07 /root

5.2 getfacl 命令

getfacl 命令用於顯示檔案上設定的 ACL 資訊,格式為“getfacl 檔名稱”。

[[email protected] ~]#getfacl /root/
getfacl: Removing leading '/' from absolute path names
# file: root/
# owner: root
# group: root
user::r-x
user:vyi:rwx
group::r-x
mask::rwx
other::---

6. su 命令與 sudo 服務

6.1 su命令

我們在虛擬機器做實驗為了減少一些不必要的錯誤,因而使用root許可權,在生產環境中千萬不能使用root許可權,以免造成災難性的損害
su 命令可以解決切換使用者身份的需求,使得當前使用者在不退出登入的情況下,順暢地切換到其他使用者,比如從 root 管理員切換至普通使用者:

[[email protected] ~]#id 
uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[[email protected] ~]#su - vyi
Last login: Sat Jan  2 21:17:50 CST 2021 on pts/1

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

6.2 sudo 命令

sudo命令用於給普通使用者提供額外的許可權來完成原本 root 管理員才能完成的任務,格式為“sudo [引數] 命令名稱”。

引數作用
-h列出幫助資訊
-l列出當前使用者可執行的命令
-u使用者名稱或 UID 值 以指定的使用者身份執行命令
-k清空密碼的有效時間,下次執行 sudo 時需要再次進行密碼驗證
-b在後臺執行指定的命令
-p更改詢問密碼的提示語

總結來說,sudo 命令具有如下功能:

  • 限制使用者執行指定的命令:
  • 記錄使用者執行的每一條命令;
  • 配置檔案(/etc/sudoers)提供集中的使用者管理、許可權與主機等引數;
  • 驗證密碼的後 5 分鐘內(預設值)無須再讓使用者再次驗證密碼。