Linux就該這么學》最新正式版已出版上市,同學們可在線上京東網當當網淘寶網亞馬遜等電商平臺購買。

*亦可就近在新華書店購買*

章節簡述:

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

5.1 用戶身份與能力

設計Linux系統的初衷之一就是為了滿足多個用戶同時工作的需求,因此Linux系統必須具備很好的安全性。第1章在安裝RHEL 7操作系統時,特別要求設置root管理員密碼,這個root管理員就是存在于所有類UNIX系統中的超級用戶。它擁有最高的系統所有權,能夠管理系統的各項功能,如添加/刪除用戶、啟動/關閉服務進程、開啟/禁用硬件設備等。雖然以root管理員的身份工作時不會受到系統的限制,但俗語講“能力越大,責任就越大”,因此一旦使用這個高能的root管理員權限執行了錯誤的命令可能會直接毀掉整個系統。使用與否,確實需要好好權衡一下。

在學習時是否要使用root管理員權限來控制整個系統呢?面對這個問題,網絡上有很多文章建議以普通用戶的身份來操作—這是一個更安全也更“無責任”的回答。今天,劉遄老師就要冒天下之大不韙給出自己的心得—強烈推薦大家在學習時使用root管理員權限!

這種為root管理員正名的決絕態度在網絡中應該還是很少見的,我之所以力薦root管理員權限,原因很簡單。因為在Linux的學習過程中如果使用普通用戶身份進行操作,則在配置服務之后出現錯誤時很難判斷是系統自身的問題還是因為權限不足而導致的;這無疑會給大家的學習過程徒增坎坷。更何況我們的實驗環境是使用VMware虛擬機軟件搭建的,可以將安裝好的系統設置為一次快照,這即便系統徹底崩潰了,您也可以在5秒鐘的時間內快速還原出一臺全新的系統,而不用擔心數據丟失。

總之,劉遄老師在培訓時都推薦每位學生使用root管理員權限來學習Linux系統,等到工作時再根據生產環境決定使用哪個用戶權限;這些僅與選擇相關,而非技術性問題。

另外,很多圖書或培訓機構的老師會講到,Linux系統中的管理員就是root。這其實是錯誤的,Linux系統的管理員之所以是root,并不是因為它的名字叫root,而是因為該用戶的身份號碼即UID(User IDentification)的數值為0。在Linux系統中,UID就相當于我們的身份證號碼一樣具有唯一性,因此可通過用戶的UID值來判斷用戶身份。在RHEL 7系統中,用戶身份有下面這些。

管理員UID為0:系統的管理員用戶。

系統用戶UID為1~999: Linux系統為了避免因某個服務程序出現漏洞而被黑客提權至整臺服務器,默認服務程序會有獨立的系統用戶負責運行,進而有效控制被破壞范圍。

普通用戶UID從1000開始:是由管理員創建的用于日常工作的用戶。

需要注意的是,UID是不能沖突的,而且管理員創建的普通用戶的UID默認是從1000開始的(即使前面有閑置的號碼)。

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

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

1. ?useradd命令

useradd命令用于創建新的用戶,格式為“useradd [選項] 用戶名”。

可以使用useradd命令創建用戶賬戶。使用該命令創建用戶賬戶時,默認的用戶家目錄會被存放在/home目錄中,默認的Shell解釋器為/bin/bash,而且默認會創建一個與該用戶同名的基本用戶組。這些默認設置可以根據表5-1中的useradd命令參數自行修改。

表5-1?????????????????????????????????????? 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 linuxprobe
[[email protected] ~]# id linuxprobe
uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)

2. ?groupadd命令

groupadd命令用于創建用戶組,格式為“groupadd [選項] 群組名”。

為了能夠更加高效地指派系統中各個用戶的權限,在工作中常常會把幾個用戶加入到同一個組里面,這樣便可以針對一類用戶統一安排權限。創建用戶組的步驟非常簡單,例如使用如下命令創建一個用戶組ronny:

[[email protected] ~]# groupadd ronny

3. ?usermod命令

usermod命令用于修改用戶的屬性,格式為“usermod [選項] 用戶名”。

前文曾反復強調,Linux系統中的一切都是文件,因此在系統中創建用戶也就是修改配置文件的過程。用戶的信息保存在/etc/passwd文件中,可以直接用文本編輯器來修改其中的用戶參數項目,也可以用usermod命令修改已經創建的用戶信息,諸如用戶的UID、基本/擴展用戶組、默認終端等。usermod命令的參數以及作用如表5-2所示。

表5-2??????????????????????????????????????????? usermod命令中的參數及作用

參數 作用
-c 填寫用戶賬戶的備注信息
-d -m 參數-m與參數-d連用,可重新指定用戶的家目錄并自動把舊的數據轉移過去
-e 賬戶的到期時間,格式為YYYY-MM-DD
-g 變更所屬用戶組
-G 變更擴展用戶組
-L 鎖定用戶禁止其登錄系統
-U 解鎖用戶,允許其登錄系統
-s 變更默認終端
-u 修改用戶的UID

大家不要被這么多參數嚇壞了。我們先來看一下賬戶linuxprobe的默認信息:

[[email protected] ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe)

然后將用戶linuxprobe加入到root用戶組中,這樣擴展組列表中則會出現root用戶組的字樣,而基本組不會受到影響:

[[email protected]?~]# usermod -G root linuxprobe
[[email protected]?~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)

再來試試用-u參數修改linuxprobe用戶的UID號碼值。除此之外,我們還可以用-g參數修改用戶的基本組ID,用-G參數修改用戶擴展組ID。

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

4. ?passwd命令

passwd命令用于修改用戶密碼、過期時間、認證信息等,格式為“passwd [選項] [用戶名]”。

普通用戶只能使用passwd命令修改自身的系統密碼,而root管理員則有權限修改其他所有人的密碼。更酷的是,root管理員在Linux系統中修改自己或他人的密碼時不需要驗證舊密碼,這一點特別方便。既然root管理員可以修改其他用戶的密碼,就表示完全擁有該用戶的管理權限。passwd命令中可用的參數以及作用如表5-3所示。

表5-3?????????????????????????????????????????? passwd命令中的參數以及作用

參數 作用
-l 鎖定用戶,禁止其登錄
-u 解除鎖定,允許用戶登錄
--stdin 允許通過標準輸入修改用戶密碼,如echo "NewPassWord" | passwd --stdin Username
-d 使該用戶可用空密碼登錄系統
-e 強制用戶在下次登錄時修改密碼
-S 顯示用戶的密碼是否被鎖定,以及密碼所采用的加密算法名稱

接下來劉遄老師將演示如何修改用戶自己的密碼,以及如何修改其他人的密碼(修改他人密碼時,需要具有root管理員權限):

[[email protected] ~]# passwd
Changing password for user root.
New password:此處輸入密碼值
Retype new password: 再次輸入進行確認
passwd: all authentication tokens updated successfully.
[[email protected] ~]# passwd linuxprobe
Changing password for user linuxprobe.
New password:此處輸入密碼值
Retype new password: 再次輸入進行確認
passwd: all authentication tokens updated successfully.

假設您有位同事正在度假,而且假期很長,那么可以使用passwd命令禁止該用戶登錄系統,等假期結束回歸工作崗位時,再使用該命令允許用戶登錄系統,而不是將其刪除。這樣既保證了這段時間內系統的安全,也避免了頻繁添加、刪除用戶帶來的麻煩:

[[email protected] ~]# passwd -l linuxprobe
Locking password for user linuxprobe.
passwd: Success
[[email protected] ~]# passwd -S linuxprobe
linuxprobe LK 2017-12-26 0 99999 7 -1 (Password locked.)
[[email protected] ~]# passwd -u linuxprobe
Unlocking password for user linuxprobe.
passwd: Success
[[email protected] ~]# passwd -S linuxprobe
linuxprobe PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.)

5. ?userdel命令

userdel命令用于刪除用戶,格式為“userdel [選項] 用戶名”。

如果我們確認某位用戶后續不再會登錄到系統中,則可以通過userdel命令刪除該用戶的所有信息。在執行刪除操作時,該用戶的家目錄默認會保留下來,此時可以使用-r參數將其刪除。userdel命令的參數以及作用如表5-4所示。

表5-4????????????????????????????????????????????? userdel命令的參數以及作用

參數 作用
-f 強制刪除用戶
-r 同時刪除用戶及用戶家目錄

下面使用userdel命令將linuxprobe用戶刪除,其操作如下:

[[email protected]?~]# id linuxprobe
uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[[email protected]?~]# userdel -r linuxprobe
[[email protected]?~]# id linuxprobe
id: linuxprobe: no such user
5.2?文件權限與歸屬

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

?-:普通文件。

d:目錄文件。

l:鏈接文件。

b:塊設備文件。

c:字符設備文件。

p:管道文件。

在Linux系統中,每個文件都有所屬的所有者和所有組,并且規定了文件的所有者、所有組以及其他人對文件所擁有的可讀(r)、可寫(w)、可執行(x)等權限。對于一般文件來說,權限比較容易理解:“可讀”表示能夠讀取文件的實際內容;“可寫”表示能夠編輯、新增、修改、刪除文件的實際內容;“可執行”則表示能夠運行一個腳本程序。但是,對于目錄文件來說,理解其權限設置來就不那么容易了。很多資深Linux用戶其實也沒有真正搞明白。

劉遄老師在這里給大家詳細講解一下目錄文件的權限設置。對目錄文件來說,“可讀”表示能夠讀取目錄內的文件列表;“可寫”表示能夠在目錄內新增、刪除、重命名文件;而“可執行”則表示能夠進入該目錄。

文件的讀、寫、執行權限可以簡寫為rwx,亦可分別用數字4、2、1來表示,文件所有者,所屬組及其他用戶權限之間無關聯,如表5-5所示。

表5-5????????????????????????????????????????????? 文件權限的字符與數字表示

權限值

文件權限的數字法表示基于字符表示(rwx)的權限計算而來,其目的是簡化權限的表示。例如,若某個文件的權限為7則代表可讀、可寫、可執行(4+2+1);若權限為6則代表可讀、可寫(4+2)。我們來看這樣一個例子。現在有這樣一個文件,其所有者擁有可讀、可寫、可執行的權限,其文件所屬組擁有可讀、可寫的權限;而且其他人只有可讀的權限。那么,這個文件的權限就是rwxrw-r--,數字法表示即為764。不過大家千萬別再將這三個數字相加,計算出7+6+4=17的結果,這是小學的數學加減法,不是Linux系統的權限數字表示法,三者之間沒有互通關系。

Linux系統的文件權限相當復雜,但是用途很廣泛,建議大家把它徹底搞清楚之后再學習下一節的內容。現在來練習一下。請各位讀者分別計算數字表示法764、642、153、731所對應的字符表示法,然后再把rwxrw-r--、rw--w--wx、rw-r--r--轉換成數字表示法。

下面我們利用上文講解的知識,一起分析圖5-1中所示的文件信息。

文件權限

圖5-1 通過ls命令查看到的文件屬性信息

在圖5-1中,包含了文件的類型、訪問權限、所有者(屬主)、所屬組(屬組)、占用的磁盤大小、修改時間和文件名稱等信息。通過分析可知,該文件的類型為普通文件,所有者權限為可讀、可寫(rw-),所屬組權限為可讀(r--),除此以外的其他人也只有可讀權限(r--),文件的磁盤占用大小是34298字節,最近一次的修改時間為4月2日的凌晨23分,文件的名稱為install.log。

5.3 文件的特殊權限

在復雜多變的生產環境中,單純設置文件的rwx權限無法滿足我們對安全和靈活性的需求,因此便有了SUID、SGID與SBIT的特殊權限位。這是一種對文件權限進行設置的特殊功能,可以與一般權限同時使用,以彌補一般權限不能實現的功能。下面具體解釋這3個特殊權限位的功能以及用法。

1. ?SUID

SUID是一種對二進制程序進行設置的特殊權限,可以讓二進制程序的執行者臨時擁有屬主的權限(僅對擁有執行權限的二進制程序有效)。例如,所有用戶都可以執行passwd命令來修改自己的用戶密碼,而用戶密碼保存在/etc/shadow文件中。仔細查看這個文件就會發現它的默認權限是000,也就是說除了root管理員以外,所有用戶都沒有查看或編輯該文件的權限。但是,在使用passwd命令時如果加上SUID特殊權限位,就可讓普通用戶臨時獲得程序所有者的身份,把變更的密碼信息寫入到shadow文件中。這很像我們在古裝劇中見到的手持尚方寶劍的欽差大臣,他手持的尚方寶劍代表的是皇上的權威,因此可以懲戒貪官,但這并不意味著他永久成為了皇上。因此這只是一種有條件的、臨時的特殊權限授權方法。

查看passwd命令屬性時發現所有者的權限由rwx變成了rws,其中x改變成s就意味著該文件被賦予了SUID權限。另外有讀者會好奇,那么如果原本的權限是rw-呢?如果原先權限位上沒有x執行權限,那么被賦予特殊權限后將變成大寫的S。

[[email protected] ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[[email protected] ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd

2. ?SGID

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

讓執行者臨時擁有屬組的權限(對擁有執行權限的二進制程序進行設置);

在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)。

SGID的第一種功能是參考SUID而設計的,不同點在于執行程序的用戶獲取的不再是文件所有者的臨時權限,而是獲取到文件所屬組的權限。舉例來說,在早期的Linux系統中,/dev/kmem是一個字符設備文件,用于存儲內核程序要訪問的數據,權限為:

cr--r-----?? 1 root system 2,? 1 Feb 11 2017 ?kmem

大家看出問題了嗎?除了root管理員或屬于system組成員外,所有用戶都沒有讀取該文件的權限。由于在平時我們需要查看系統的進程狀態,為了能夠獲取到進程的狀態信息,可在用于查看系統進程狀態的ps命令文件上增加SGID特殊權限位。查看ps命令文件的屬性信息:

-r-xr-sr-x?? 1 bin system 59346 Feb 11?2017 ?ps

這樣一來,由于ps命令被增加了SGID特殊權限位,所以當用戶執行該命令時,也就臨時獲取到了system用戶組的權限,從而可以順利地讀取設備文件了。

前文提到,每個文件都有其歸屬的所有者和所屬組,當創建或傳送一個文件后,這個文件就會自動歸屬于執行這個操作的用戶(即該用戶是文件的所有者)。如果現在需要在一個部門內設置共享目錄,讓部門內的所有人員都能夠讀取目錄中的內容,那么就可以創建部門共享目錄后,在該目錄上設置SGID特殊權限位。這樣,部門內的任何人員在里面創建的任何文件都會歸屬于該目錄的所屬組,而不再是自己的基本用戶組。此時,我們用到的就是SGID的第二個功能,即在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)。

[[email protected] ~]# cd /tmp
[[email protected] tmp]# mkdir testdir
[[email protected] tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Feb 11 11:50 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 Feb 11 11:50 testdir/

在使用上述命令設置好目錄的777權限(確保普通用戶可以向其中寫入文件),并為該目錄設置了SGID特殊權限位后,就可以切換至一個普通用戶,然后嘗試在該目錄中創建文件,并查看新創建的文件是否會繼承新創建的文件所在的目錄的所屬組名稱:

[[email protected] tmp]# su - linuxprobe
Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
[[email protected] ~]$ cd /tmp/testdir/
[[email protected] testdir]$ echo "linuxprobe.com" > test
[[email protected] testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test

除了上面提到的SGID的這兩個功能,我們再介紹兩個與本小節內容相關的命令:chmod和chown。

chmod命令是一個非常實用的命令,能夠用來設置文件或目錄的權限,格式為“chmod [參數] 權限 文件或目錄名稱”。如果要把一個文件的權限設置成其所有者可讀可寫可執行、所屬組可讀可寫、其他人沒有任何權限,則相應的字符法表示為rwxrw----,其對應的數字法表示為760。通過前面的基礎學習和當前的練習實踐,現在大家可以感受到使用數字法來設置文件權限的便捷性了吧。

[[email protected] ~]# ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test
[[email protected] ~]# chmod 760?test
[[email protected] ~]# ls -l test
-rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test

除了設置文件或目錄的權限外,還可以設置文件或目錄的所有者和所屬組,這里使用的命令為chown,其格式為“chown [參數] 所有者:所屬組 文件或目錄名稱”。

chmod和chown命令是用于修改文件屬性和權限的最常用命令,它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫參數-R來表示遞歸操作,即對目錄內所有的文件進行整體操作。

[[email protected] ~]# ls -l test
-rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test
[[email protected] ~]# chown root:bin test
[[email protected] ~]# ls -l test
-rwxrw----. 1 root bin 15 Feb 11 11:50 test

3. ?SBIT

現在,大學里的很多老師都要求學生將作業上傳到服務器的特定共享目錄中,但總是有幾個“破壞分子”喜歡刪除其他同學的作業,這時就要設置SBIT(Sticky Bit)特殊權限位了(也可以稱之為特殊權限位之粘滯位)。SBIT特殊權限位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。換句話說,當對某個目錄設置了SBIT粘滯位權限后,那么該目錄中的文件就只能被其所有者執行刪除操作了。

最初不知道是哪位非資深技術人員將Sticky Bit直譯成了“粘滯位”,劉遄老師建議將其稱為“保護位”,這既好記,又能立刻讓人了解它的作用。RHEL 7系統中的/tmp作為一個共享文件的目錄,默認已經設置了SBIT特殊權限位,因此除非是該目錄的所有者,否則無法刪除這里面的文件。

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

[[email protected] tmp]# su - linuxprobe
Last login: Wed Feb 11 12:41:20 CST 2017 on pts/0
[[email protected] tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp
[[email protected] ~]$ cd /tmp
[[email protected] tmp]$ ls -ald
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 .
[[email protected] tmp]$ echo "Welcome to linuxprobe.com" > test
[[email protected] tmp]$ chmod 777 test
[[email protected] tmp]$ ls -al test 
-rwxrwxrwx. 1 linuxprobe linuxprobe 10 Feb 11 12:59 test

其實,文件能否被刪除并不取決于自身的權限,而是看其所在目錄是否有寫入權限(其原理會在下個章節講到)。為了避免現在很多讀者不放心,所以上面的命令還是賦予了這個test文件最大的777權限(rwxrwxrwx)。我們切換到另外一個普通用戶,然后嘗試刪除這個其他人創建的文件就會發現,即便讀、寫、執行權限全開,但是由于SBIT特殊權限位的緣故,依然無法刪除該文件:

[[email protected] tmp]# su - blackshield
Last login: Wed Feb 11 12:41:29 CST 2017 on pts/1
[[email protected] ~]$ cd /tmp
[[email protected] tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted

當然,要是也想對其他目錄來設置SBIT特殊權限位,用chmod命令就可以了。對應的參數o+t代表設置SBIT粘滯位權限:

[[email protected]?tmp]$?exit
Logout
[[email protected]?tmp]#?cd?~
[[email protected]?~]#?mkdir?linux
[[email protected]?~]#?chmod?-R?o+t?linux/
[[email protected]?~]#?ls?-ld?linux/
drwxr-xr-t.?2?root?root?6?Feb?11?19:34?linux/
5.4 文件的隱藏屬性

Linux系統中的文件除了具備一般權限和特殊權限之外,還有一種隱藏權限,即被隱藏起來的權限,默認情況下不能直接被用戶發覺。有用戶曾經在生產環境和RHCE考試題目中碰到過明明權限充足但卻無法刪除某個文件的情況,或者僅能在日志文件中追加內容而不能修改或刪除內容,這在一定程度上阻止了黑客篡改系統日志的圖謀,因此這種“奇怪”的文件也保障了Linux系統的安全性。

1. ?chattr命令

chattr命令用于設置文件的隱藏權限,格式為“chattr [參數] 文件”。如果想要把某個隱藏功能添加到文件上,則需要在命令后面追加“+參數”,如果想要把某個隱藏功能移出文件,則需要追加“-參數”。chattr命令中可供選擇的隱藏權限參數非常豐富,具體如表5-6所示。

表5-6????????????????????????????????? chattr命令中用于隱藏權限的參數及其作用

參數 作用
i 無法對文件進行修改;若對目錄設置了該參數,則僅能修改其中的子文件內容而不能新建或刪除文件
a 僅允許補充(追加)內容,無法覆蓋/刪除內容(Append Only)
S 文件內容在變更后立即同步到硬盤(sync)
s 徹底從硬盤中刪除,不可恢復(用0填充原文件所在硬盤區域)
A 不再修改這個文件或目錄的最后訪問時間(atime)
b 不再修改文件或目錄的存取時間
D 檢查壓縮文件中的錯誤
d 使用dump命令備份時忽略本文件/目錄
c 默認將文件或目錄進行壓縮
u 當刪除該文件后依然保留其在硬盤中的數據,方便日后恢復
t 讓文件系統支持尾部合并(tail-merging)
x 可以直接訪問壓縮文件中的內容

為了讓讀者能夠更好地見識隱藏權限的效果,我們先來創建一個普通文件,然后立即嘗試刪除(這個操作肯定會成功):

[[email protected] ~]# echo "for Test" > linuxprobe
[[email protected] ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y

實踐是檢驗真理的唯一標準。如果您沒有親眼見證過隱藏權限強大功能的美妙,就一定不會相信原來Linux系統會如此安全。接下來我們再次新建一個普通文件,并為其設置不允許刪除與覆蓋(+a參數)權限,然后再嘗試將這個文件刪除:

[[email protected] ~]# echo "for Test" > linuxprobe
[[email protected] ~]# chattr +a linuxprobe
[[email protected] ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
rm: cannot remove ‘linuxprobe’: Operation not permitted

可見,上述操作失敗了。

2. ?lsattr命令

lsattr命令用于顯示文件的隱藏權限,格式為“lsattr [參數] 文件”。在Linux系統中,文件的隱藏權限必須使用lsattr命令來查看,平時使用的ls之類的命令則看不出端倪:

[[email protected] ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe

一旦使用lsattr命令后,文件上被賦予的隱藏權限馬上就會原形畢露。此時可以按照顯示的隱藏權限的類型(字母),使用chattr命令將其去掉:

[[email protected] ~]# lsattr linuxprobe
-----a---------- linuxprobe
[[email protected] ~]# chattr -a linuxprobe
[[email protected] ~]# lsattr linuxprobe 
---------------- linuxprobe
[[email protected] ~]# rm linuxprobe 
rm: remove regular file ‘linuxprobe’? y

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

5.5?文件訪問控制列表

不知道大家是否發現,前文講解的一般權限、特殊權限、隱藏權限其實有一個共性—權限是針對某一類用戶設置的。如果希望對某個指定的用戶進行單獨的權限控制,就需要用到文件的訪問控制列表(ACL)了。通俗來講,基于普通文件或目錄設置ACL其實就是針對指定的用戶或用戶組設置文件或目錄的操作權限。另外,如果針對某個目錄設置了ACL,則目錄中的文件會繼承其ACL;若針對文件設置了ACL,則文件不再繼承其所在目錄的ACL。

為了更直觀地看到ACL對文件權限控制的強大效果,我們先切換到普通用戶,然后嘗試進入root管理員的家目錄中。在沒有針對普通用戶對root管理員的家目錄設置ACL之前,其執行結果如下所示:

[[email protected] ~]# su - linuxprobe
Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0
[[email protected] ~]$ cd /root
-bash: cd: /root: Permission denied
[[email protected] root]$ exit

1. ?setfacl命令

setfacl命令用于管理文件的ACL規則,格式為“setfacl [參數] 文件名稱”。文件的ACL提供的是在所有者、所屬組、其他人的讀/寫/執行權限之外的特殊權限控制,使用setfacl命令可以針對單一用戶或用戶組、單一文件或目錄來進行讀/寫/執行權限的控制。其中,針對目錄文件需要使用-R遞歸參數;針對普通文件則使用-m參數;如果想要刪除某個文件的ACL,則可以使用-b參數。下面來設置用戶在/root目錄上的權限:

[[email protected] ~]# setfacl -Rm u:linuxprobe:rwx /root
[[email protected] ~]# su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[[email protected] ~]$ cd /root
[[email protected] root]$ ls
anaconda-ks.cfg Downloads Pictures?Public
[[email protected] root]$ cat?anaconda-ks.cfg
[[email protected] root]$ exit

是不是覺得效果很酷呢?但是現在有這樣一個小問題—怎么去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是卻可以看到文件的權限最后一個點(.)變成了加號(+),這就意味著該文件已經設置了ACL了。現在大家是不是感覺學得越多,越不敢說自己精通Linux系統了吧?就這么一個不起眼的點(.),竟然還表示這么一種重要的權限。

[[email protected] ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root

2. ?getfacl命令

getfacl命令用于顯示文件上設置的ACL信息,格式為“getfacl 文件名稱”。Linux系統中的命令就是這么又可愛又好記。想要設置ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令。下面使用getfacl命令顯示在root管理員家目錄上設置的所有ACL信息。

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

出現問題?大膽提問!

因讀者們硬件不同或操作錯誤都可能導致實驗配置出錯,請耐心再仔細看看操作步驟吧,不要氣餒~

Linux技術交流請加A群:560843(滿),B群:340829(推薦),C群:463590(推薦),點此查看全國群

*本群特色:通過口令驗證確保每一個群員都是《Linux就該這么學》的讀者,答疑更有針對性,不定期免費領取定制禮品。

5.6 su命令與sudo服務

各位讀者在實驗環境中很少遇到安全問題,并且為了避免因權限因素導致配置服務失敗,從而建議使用root管理員來學習本書,但是在生產環境中還是要對安全多一份敬畏之心,不要用root管理員去做所有事情。因為一旦執行了錯誤的命令,可能會直接導致系統崩潰,這樣一來,不但客戶指責、領導批評,沒準獎金也會雞飛蛋打。但轉頭一想,盡管Linux系統為了安全性考慮,使得許多系統命令和服務只能被root管理員來使用,但是這也讓普通用戶受到了更多的權限束縛,從而導致無法順利完成特定的工作任務。

su命令可以解決切換用戶身份的需求,使得當前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:

[[email protected] ~]# id 
uid=0(root) gid=0(root) groups=0(root)
[[email protected] ~]# su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[[email protected] ~]$ id 
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

細心的讀者一定會發現,上面的su命令與用戶名之間有一個減號(-),這意味著完全切換到新的用戶,即把環境變量信息也變更為新用戶的相應信息,而不是保留原始的信息。強烈建議在切換用戶身份時添加這個減號(-)。

另外,當從root管理員切換到普通用戶時是不需要密碼驗證的,而從普通用戶切換成root管理員就需要進行密碼驗證了;這也是一個必要的安全檢查:

[[email protected] root]$ su root
Password:
[[email protected] ~]# su - linuxprobe
Last login: Mon Aug 24 19:27:09 CST 2017 on pts/0
[[email protected] ~]$ exit
logout
[[email protected] ~]#

盡管像上面這樣使用su命令后,普通用戶可以完全切換到root管理員身份來完成相應工作,但這將暴露root管理員的密碼,從而增大了系統密碼被黑客獲取的幾率;這并不是最安全的方案。

劉遄老師接下來將介紹如何使用sudo命令把特定命令的執行權限賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的工作,也可以避免泄露root管理員密碼。我們要做的就是合理配置sudo服務,以便兼顧系統的安全性和用戶的便捷性。sudo服務的配置原則也很簡單—在保證普通用戶完成相應工作的前提下,盡可能少地賦予額外的權限。

sudo命令用于給普通用戶提供額外的權限來完成原本root管理員才能完成的任務,格式為“sudo [參數] 命令名稱”。sudo服務中可用的參數以及相應的作用如表5-7所示。

表5-7????????????????????????????????????????? sudo服務中的可用參數以及作用

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

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

限制用戶執行指定的命令:

記錄用戶執行的每一條命令;

配置文件(/etc/sudoers)提供集中的用戶管理、權限與主機等參數;

驗證密碼的后5分鐘內(默認值)無須再讓用戶再次驗證密碼。

當然,如果擔心直接修改配置文件會出現問題,則可以使用sudo命令提供的visudo命令來配置用戶權限。這條命令在配置用戶權限時將禁止多個用戶同時修改sudoers配置文件,還可以對配置文件內的參數進行語法檢查,并在發現參數錯誤時進行報錯。

只有root管理員才可以使用visudo命令編輯sudo服務的配置文件。

visudo: >>> /etc/sudoers: syntax error near line 111 <<<
What now?
Options are:
(e)dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file (DANGER!)

使用visudo命令配置sudo命令的配置文件時,其操作方法與Vim編輯器中用到的方法一致,因此在編寫完成后記得在末行模式下保存并退出。在sudo命令的配置文件中,按照下面的格式將第99行(大約)填寫上指定的信息:

誰可以使用? 允許使用的主機=(以誰的身份)? 可執行命令的列表

[[email protected] ~]# visudo
 96 ##
 97 ## Allow root to run any commands anywhere
 98 root ALL=(ALL) ALL
 99 linuxprobe ALL=(ALL) ALL

在填寫完畢后記得要先保存再退出,然后切換至指定的普通用戶身份,此時就可以用sudo -l命令查看到所有可執行的命令了(下面的命令中,驗證的是該普通用戶的密碼,而不是root管理員的密碼,請讀者不要搞混了):

[[email protected] ~]# su - linuxprobe
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[[email protected] ~]$ sudo -l
[sudo] password for linuxprobe:此處輸入linuxprobe用戶的密碼
Matching Defaults entries for linuxprobe 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 linuxprobe may run the following commands on this host:
(ALL) ALL

接下來是見證奇跡的時刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的文件信息的,但是,只需要在想執行的命令前面加上sudo命令就可以了:

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

效果立竿見影!但是考慮到生產環境中不允許某個普通用戶擁有整個系統中所有命令的最高執行權(這也不符合前文提到的權限賦予原則,即盡可能少地賦予權限),因此ALL參數就有些不合適了。因此只能賦予普通用戶具體的命令以滿足工作需求,這也受到了必要的權限約束。如果需要讓某個用戶只能使用root管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑,否則系統會識別不出來。我們可以先使用whereis命令找出命令所對應的保存路徑,然后把配置文件第99行的用戶權限參數修改成對應的路徑即可:

[[email protected] ~]$ exit
logout
[[email protected] ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[[email protected] ~]# visudo
 96 ##
 97 ## Allow root to run any commands anywhere
 98 root ALL=(ALL) ALL
 99 linuxprobe ALL=(ALL) /usr/bin/cat

在編輯好后依然是先保存再退出。再次切換到指定的普通用戶,然后嘗試正常查看某個文件的內容,此時系統提示沒有權限。這時再使用sudo命令就可以順利地查看文件內容了:

[[email protected] ~]# su - linuxprobe
Last login: Thu Sep 3 15:51:01 CST 2017 on pts/1
[[email protected] ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[[email protected] ~]$ sudo cat /etc/shadow
root:$6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7:::
bin:*:16141:0:99999:7:::
daemon:*:16141:0:99999:7:::
adm:*:16141:0:99999:7:::
lp:*:16141:0:99999:7:::
sync:*:16141:0:99999:7:::
shutdown:*:16141:0:99999:7:::
halt:*:16141:0:99999:7:::
mail:*:16141:0:99999:7:::
operator:*:16141:0:99999:7:::
games:*:16141:0:99999:7:::
ftp:*:16141:0:99999:7:::
nobody:*:16141:0:99999:7:::
………………省略部分文件內容………………

大家千萬不要以為到這里就結束了,劉遄老師還有更壓箱底的寶貝。不知大家是否發覺在每次執行sudo命令后都會要求驗證一下密碼。雖然這個密碼就是當前登錄用戶的密碼,但是每次執行sudo命令都要輸入一次密碼其實也挺麻煩的,這時可以添加NOPASSWD參數,使得用戶執行sudo命令時不再需要密碼驗證:

[[email protected] ~]$ exit
logout
[[email protected] ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[[email protected] ~]# visudo
 96 ##
 97 ## Allow root to run any commands anywhere
 98 root ALL=(ALL) ALL
 99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff

這樣,當切換到普通用戶后再執行命令時,就不用再頻繁地驗證密碼了,我們在日常工作中也就痛快至極了。

[[email protected] ~]# su - linuxprobe
Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1
[[email protected] ~]$ poweroff
User root is logged in on seat0.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.
[[email protected]inuxprobe ~]$ sudo poweroff

本章節的復習作業(答案就在問題的下一行哦,用鼠標選中即可看到的~)

1.在RHEL 7系統中,root管理員是誰?

答:是UID為0的用戶,默認是root管理員。

2.如何使用Linux系統的命令行來添加或刪除用戶?

答:添加和刪除用戶的命令分別是useradd與userdel。

3.若某個文件的所有者具有文件的讀/寫/執行權限,其余人僅有讀權限,那么用數字法表示應該是什么?

答:所有者權限為rwx,所屬組和其他人的權限為r--,因此數字法表示應該是744。

4.某鏈接文件的權限用數字法表示為755,那么相應的字符法表示是什么呢?

答:在Linux系統中,不同文件具有不同的類型,因此這里應寫成lrwxr-xr-x。

5.如果希望用戶執行某命令時臨時擁有該命令所有者的權限,應該設置什么特殊權限?

答:特殊權限中的SUID。

6.若對文件設置了隱藏權限+i,則意味著什么?

答:無法對文件進行修改;若對目錄設置了該參數,則僅能修改其中的子文件內容而不能新建或刪除文件。

7.使用訪問控制列表(ACL)來限制linuxprobe用戶組,使得該組中的所有成員不得在/tmp目錄中寫入內容。

答:想要設置用戶組的ACL,則需要把u改成g,即setfacl -Rm g:linuxprobe:r-x /tmp。

8.當普通用戶使用sudo命令時是否需要驗證密碼?

答:系統在默認情況下需要驗證當前登錄用戶的密碼,若不想要驗證,可添加NOPASSWD參數。

本文原創地址:http://www.52437949.com/chapter-05.html編輯:劉遄,審核員:暫無