本章將和大家分享Linux中的權(quán)限控制。廢話不多說(shuō),下面我們直接進(jìn)入主題。
一、基礎(chǔ)知識(shí)
Linux作為一種多用戶的操作系統(tǒng)(服務(wù)器系統(tǒng)),允許多個(gè)用戶同時(shí)登陸到系統(tǒng)上,并響應(yīng)每個(gè)用戶的請(qǐng)求。
任何需要使用操作系統(tǒng)的用戶,都需要一個(gè)系統(tǒng)賬號(hào),賬號(hào)分為:管理員賬號(hào)與普通用戶賬號(hào)。
在Linux中,操作系統(tǒng)根據(jù)UID來(lái)判斷用戶,而不是用戶名,只要id為0就是管理員,哪怕有多個(gè)id為0的賬號(hào)。
系統(tǒng)在新建賬號(hào)時(shí),會(huì)根據(jù)賬號(hào)類(lèi)型,自動(dòng)分配遞增賬號(hào)的UID與GID (用戶身份編號(hào),組編號(hào)),也可自行分配。通常情況下,應(yīng)當(dāng)保證UID與GID唯一且不重復(fù)。
1、組的類(lèi)別
在Linux中,每個(gè)用戶必須有一個(gè)主組。當(dāng)創(chuàng)建賬號(hào)時(shí),系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)同名組作為該賬戶的主組。用戶必須屬于一個(gè)且只有一個(gè)主組。用戶可以屬于零個(gè)或者多個(gè)附加組。
2、用戶與組的配置文件
在Linux中,萬(wàn)物皆文件,所以用戶與組也以配置文件的形式保存在系統(tǒng)中,以下為用戶和組的主要配置文件詳解:
- /etc/passwd:用戶及其屬性信息(名稱(chēng)、 UID、主組ID等) - /etc/group:組及其屬性信息 - /etc/shadow:用戶密碼及其相關(guān)屬性 - /etc/gshadow:組密碼及其相關(guān)屬性
1)passwd文件格式
依次含義為(用 : 分割):
登錄用戶名
密碼
UID
GID
全名或注釋
用戶主目錄
用戶默認(rèn)使用shell
2)group文件格式
依次含義為(用 : 分割):
群組名稱(chēng)
群組密碼(通常不需要設(shè)定,密碼被記錄在/etc/gshadow)
GID:群組ID
組成員(以“,”來(lái)分割,該賬戶沒(méi)有附加組所以為空)
3)shadow文件格式
依次含義為(用 : 分割):
登錄用戶名
密碼(通常使用shad512加密)
從1970年1月1日起計(jì)算到現(xiàn)在為止密碼最近一次被更改的時(shí)間
密碼再過(guò)幾天就可以被修改(0表示隨時(shí)可改)
密碼幾天后必須變更(99999表示永不過(guò)期)
密碼過(guò)期前多久提示用戶
密碼過(guò)期多久后賬戶將被鎖定
多少天后賬戶將失效(從1970-1-1算起)
4)gshadow文件格式
依次含義為(用 : 分割):
群組名稱(chēng)
群組密碼
組管理員列表
當(dāng)前用戶的附加組
二、用戶賬號(hào)管理
在Linux,管理員在默認(rèn)情況下為root賬戶,UID=0。普通用戶UID默認(rèn)范圍為1-65535。在centos 6中,新建用戶,默認(rèn)系統(tǒng)用戶的UID范圍為1-499,普通用戶為500+。
在centos 7中,系統(tǒng)用戶范圍為1-999,普通用戶為1000+。對(duì)系統(tǒng)的操作權(quán)限由用戶決定。
通常對(duì)用戶賬號(hào)的操作分為添加,修改,刪除。
1、添加賬戶
通過(guò) useradd 命令來(lái)添加用戶,語(yǔ)法如下:
useradd [opentions] login
參數(shù)說(shuō)明:
-u UID 自定義UID(默認(rèn)系統(tǒng)遞增)
-o 配合-u 選項(xiàng),不檢查UID的唯一性(不建議)
-g GID:指明用戶所屬基本組,可為組名,也可以GID
-c comment 指定一段注釋性描述。
-d 目錄 指定用戶主目錄,如果此目錄不存在,則同時(shí)使用-m選項(xiàng),可以創(chuàng)建主目錄。
-g 用戶組 指定用戶所屬的用戶組(主組)。
-G 用戶組,用戶組 指定用戶所屬的附加組。
-s Shell文件 指定用戶的登錄Shell。
-u 用戶號(hào) 指定用戶的用戶號(hào),如果同時(shí)有-o選項(xiàng),則可以重復(fù)使用其他用戶的標(biāo)識(shí)號(hào)。
示例1(常用):
useradd -d /usr/ddz ddz
創(chuàng)建了一個(gè)用戶ddz,并將他的家目錄(主目錄)設(shè)置到/usr/ddz
示例2:
groupadd 組名 添加用戶組 -g :添加組時(shí)指定組ID groupmod 組名 修改用戶組信息 -n :修改組名 -g :修改組ID groupdel 組名 刪除組 *如果一個(gè)組下有用戶,那么這個(gè)組是無(wú)法刪除的。
useradd -s /sbin/bash -g root -G mage,wang ddz
此命令新建了一個(gè)用戶ddz,設(shè)置該用戶使用的shell為/sbin/bash,設(shè)置他的主組屬于root用戶組,設(shè)置附加組為mage和wang。(當(dāng)設(shè)置組時(shí),要保證組已經(jīng)存在,否則請(qǐng)先創(chuàng)建該組)
小技巧:
增加用戶賬號(hào)就是在/etc/passwd文件中為新用戶增加一條記錄,同時(shí)系統(tǒng)會(huì)自動(dòng)更新其他系統(tǒng)文件如/etc/shadow,/etc/group等。
通常情況創(chuàng)建賬戶,賬戶ID會(huì)按照最大的值遞增,但是遞增的值必須在最大范圍內(nèi)。
在部署軟件時(shí),通常會(huì)需要使用賬戶,所以需要指定UID,來(lái)部署所有的賬號(hào)都用同一個(gè)UID,來(lái)方便管理。
newusers [passwd格式文件] 用于批量創(chuàng)建賬戶,只需要每一列賬戶信息格式,按照passwd中書(shū)寫(xiě),之后上傳到Linux中替換即可。
chpasswd 批量修改用戶口令。將文件格式寫(xiě)為:user:passwd 。每行一個(gè),之后導(dǎo)入Linux即可。
創(chuàng)建賬戶的默認(rèn)值設(shè)定位于: /etc/default/useradd文件中,該文件記錄了創(chuàng)建用戶賬戶時(shí)的默認(rèn)信息,可通過(guò)修改該文件來(lái)修改創(chuàng)建賬戶時(shí)的信息。
2、刪除帳號(hào)
如果一個(gè)用戶的賬號(hào)不再使用,可以從系統(tǒng)中刪除。刪除用戶賬號(hào)就是要將/etc/passwd等系統(tǒng)文件中的該用戶記錄刪除,必要時(shí)還需刪除用戶的主目錄。
通常在運(yùn)維工作中,一般使用讓賬號(hào)失效,或者修改賬戶名的方式,來(lái)便捷的操作賬號(hào)。
刪除一個(gè)已有的用戶賬號(hào)使用userdel命令,其格式如下:
userdel 選項(xiàng) 用戶名
常用的選項(xiàng)是 -r,它的作用是把用戶的主目錄一起刪除。
例如:
userdel -r sam
此命令刪除用戶sam在系統(tǒng)文件中(主要是/etc/passwd, /etc/shadow, /etc/group等)的記錄,同時(shí)刪除用戶的主目錄。
刪除賬號(hào)需要該賬戶沒(méi)有人在使用,才能刪除成功。請(qǐng)使用命令刪除,不要去手動(dòng)改文件。
3、修改帳號(hào)
修改用戶賬號(hào)就是根據(jù)實(shí)際情況更改用戶的有關(guān)屬性,如用戶號(hào)、主目錄、用戶組、登錄Shell等。
修改已有用戶的信息使用usermod命令,其格式如下:
usermod 選項(xiàng) 用戶名
常用的選項(xiàng)包括-c, -d, -m, -g, -G, -s, -u以及-o等,這些選項(xiàng)的意義與useradd命令中的選項(xiàng)一樣,可以為用戶指定新的資源值。
另外,有些系統(tǒng)可以使用選項(xiàng):-l 新用戶名。這個(gè)選項(xiàng)指定一個(gè)新的賬號(hào),即將原來(lái)的用戶名改為新的用戶名。
例如:
usermod -s /bin/ksh -d /home/z -g developer sam
此命令將用戶sam的登錄Shell修改為ksh,主目錄改為/home/z,用戶組改為developer。
4、查詢(xún)賬號(hào)口令
id [opentions] [User]
相關(guān)參數(shù):
-u:顯示UID
-g:顯示GID
-G:顯示用戶所屬的組ID
-n:顯示名稱(chēng)
5、用戶口令管理
用戶管理的一項(xiàng)重要內(nèi)容是用戶口令的管理。用戶賬號(hào)剛創(chuàng)建時(shí)沒(méi)有口令,但是被系統(tǒng)鎖定,無(wú)法使用(在passwd文件中,密碼列顯示為??!或者!表示用戶被鎖定,是無(wú)法登陸的),必須為其指定口令后才可以使用,即使是指定空口令。
指定和修改用戶口令的Shell命令是passwd。超級(jí)用戶可以為自己和其他用戶指定口令,普通用戶只能用它修改自己的口令。命令的格式為:
passwd 選項(xiàng) 用戶名
可使用的選項(xiàng):
-l 鎖定口令,即禁用賬號(hào)。
-u 口令解鎖。
-d 使賬號(hào)無(wú)口令。
-f 強(qiáng)迫用戶下次登錄時(shí)修改口令。
如果默認(rèn)用戶名,則修改當(dāng)前用戶的口令。
例如,假設(shè)當(dāng)前用戶是sam,則下面的命令修改該用戶自己的口令:
passwd Old password:****** New password:******* Re-enter new password:*******
如果是超級(jí)用戶,可以用下列形式指定任何用戶的口令:
passwd sam New password:******* Re-enter new password:*******
普通用戶修改自己的口令時(shí),passwd命令會(huì)先詢(xún)問(wèn)原口令,驗(yàn)證后再要求用戶輸入兩遍新口令,如果兩次輸入的口令一致,則將這個(gè)口令指定給用戶;而超級(jí)用戶為用戶指定口令時(shí),就不需要知道原口令。
為了系統(tǒng)安全起見(jiàn),用戶應(yīng)該選擇比較復(fù)雜的口令,例如最好使用8位長(zhǎng)的口令,口令中包含有大寫(xiě)、小寫(xiě)字母和數(shù)字,并且應(yīng)該與姓名、生日等不相同。
為用戶指定空口令時(shí),執(zhí)行下列形式的命令:
passwd -d sam
此命令將用戶sam的口令刪除,這樣用戶sam下一次登錄時(shí),系統(tǒng)就不再詢(xún)問(wèn)口令。
passwd命令還可以用-l(lock)選項(xiàng)鎖定某一用戶,使其不能登錄,例如:
passwd -l sam
利用組來(lái)簡(jiǎn)化授權(quán)操作,當(dāng)對(duì)整個(gè)組授權(quán)時(shí),整個(gè)組下的賬號(hào)權(quán)限都會(huì)進(jìn)行修改
用戶相關(guān)的其他指令:
chfn [USER] 修改用戶的備注文檔
chsh [Shell] 修改用戶的指定shell
三、用戶組的管理
每個(gè)用戶都有一個(gè)用戶組,系統(tǒng)可以對(duì)一個(gè)用戶組中的所有用戶進(jìn)行集中管理。不同 Linux 系統(tǒng)對(duì)用戶組的規(guī)定有所不同,如 Linux 下的用戶屬于與它同名的用戶組,這個(gè)用戶組在創(chuàng)建用戶時(shí)同時(shí)創(chuàng)建。
用戶組的管理涉及用戶組的添加、刪除和修改。組的添加、刪除和修改實(shí)際上就是對(duì)/etc/group文件的更新。
1、增加組
增加一個(gè)新的用戶組使用groupadd命令,其格式如下:
groupadd 選項(xiàng) 用戶組
可以使用的選項(xiàng)有:
-g GID 指定新用戶組的組標(biāo)識(shí)號(hào)(GID)。
-o 一般與-g選項(xiàng)同時(shí)使用,表示新用戶組的GID可以與系統(tǒng)已有用戶組的GID相同。
-r 創(chuàng)建系統(tǒng)組。
示例1:
groupadd group1
此命令向系統(tǒng)中增加了一個(gè)新組group1,新組的組標(biāo)識(shí)號(hào)是在當(dāng)前已有的最大組標(biāo)識(shí)號(hào)的基礎(chǔ)上加1。
示例2:
groupadd -g 101 group2
此命令向系統(tǒng)中增加了一個(gè)新組group2,同時(shí)指定新組的組標(biāo)識(shí)號(hào)是101。
2、刪除組
如果要?jiǎng)h除一個(gè)已有的用戶組,使用groupdel命令,其格式如下:
groupdel 用戶組
示例:
groupdel group1
此命令從系統(tǒng)中刪除組group1。要想刪除組,要確保該組不是主組,才能把這個(gè)組刪掉。
3、修改組
修改用戶組的屬性使用groupmod命令,其語(yǔ)法如下:
groupmod 選項(xiàng) 用戶組
常用的選項(xiàng)有:
-g GID 為用戶組指定新的組標(biāo)識(shí)號(hào)。
-o 與-g選項(xiàng)同時(shí)使用,用戶組的新GID可以與系統(tǒng)已有用戶組的GID相同。
-n 新用戶組 將用戶組的名字改為新名字。
示例1:
groupmod -g 102 group2
此命令將組group2的組標(biāo)識(shí)號(hào)修改為102。
示例2:
groupmod -g 10000 -n group3 group2
此命令將組group2的標(biāo)識(shí)號(hào)改為10000,組名修改為group3。
4、切換組(臨時(shí)切換主組)
如果一個(gè)用戶同時(shí)屬于多個(gè)用戶組,那么用戶可以在用戶組之間切換,以便具有其他用戶組的權(quán)限。
用戶可以在登錄后,使用命令newgrp切換到其他用戶組。例如:
newgrp root
這條命令將當(dāng)前用戶切換到root用戶組,前提條件是root用戶組確實(shí)是該用戶的主組或附加組。類(lèi)似于用戶賬號(hào)的管理,用戶組的管理也可以通過(guò)集成的系統(tǒng)管理工具來(lái)完成。
更改查看組成員
可以通過(guò)以下命令,來(lái)更改和查看組中的成員:
groupmems [opentions] [action]
參數(shù)如下:
-g 更改為指定組(只有root可以使用)
-a 指定用戶加入組
-d 從組中刪除該用戶
-p 從組中清除所有成員
-l 顯示組成員列表
示例1:
groupmems -l -g root
此命令表示查看root組中存在的成員。
示例2:
groupmems -a Father -g root
此命令表示將Father用戶加入root組中。
小技巧:
一個(gè)用戶可以加入不同的組,但是有且只有一個(gè)主組。
一個(gè)用戶的權(quán)限為他所屬的多個(gè)組的累加權(quán)限 。假設(shè)user賬戶附加組group1 = write group2 = read ,那么user就擁有 write + read權(quán)限。
組和用戶的關(guān)系是多對(duì)多 一個(gè)用戶可以有多個(gè)組,一個(gè)組也可以有多個(gè)用戶。
在windows中,只有管理員才允許對(duì)用戶組進(jìn)行操作,但在Linux中,只要有組的口令,就可以讓賬號(hào)進(jìn)入組。
root組的權(quán)限與普通組權(quán)限大致相同,賬號(hào)并不是加入root組就能獲得用戶權(quán)限。
四、文件的權(quán)限控制
1、文件權(quán)限與歸屬
在Linux系統(tǒng)中,每個(gè)文件都有歸屬的所有者和所有組,并且規(guī)定了文件的所有者、所有組以及其他人對(duì)文件所擁有的讀(r)、寫(xiě)(w)、執(zhí)行(x)等權(quán)限。
對(duì)于一般文件來(lái)說(shuō),權(quán)限比較容易理解:“可讀”表示能夠讀取文件的實(shí)際內(nèi)容;“可寫(xiě)”表示能夠編輯、新增、修改、刪除文件的實(shí)際內(nèi)容;“可執(zhí)行”則表示能夠運(yùn)行一個(gè)腳本程序。
但是,對(duì)于目錄文件來(lái)說(shuō),理解其權(quán)限設(shè)置來(lái)就不那么容易了。很多資深Linux用戶其實(shí)也沒(méi)有真正搞明白。
對(duì)目錄文件來(lái)說(shuō),“可讀”表示能夠讀取目錄內(nèi)的文件列表;“可寫(xiě)”表示能夠在目錄內(nèi)新增、刪除、重命名文件;而“可執(zhí)行”則表示能夠進(jìn)入該目錄。
讀寫(xiě)執(zhí)行權(quán)限對(duì)于文件與目錄可執(zhí)行命令的區(qū)別:
文件的讀、寫(xiě)、執(zhí)行權(quán)限英文全稱(chēng)分別是read、write、execute,可以簡(jiǎn)寫(xiě)為r、w、x,亦可分別用數(shù)字4、2、1來(lái)表示,文件所有者,所屬組及其他用戶權(quán)限之間無(wú)關(guān)聯(lián)。
文件權(quán)限的字符與數(shù)字表示:
文件權(quán)限的數(shù)字法表示基于字符(rwx)的權(quán)限計(jì)算而來(lái),其目的是簡(jiǎn)化權(quán)限的表示方式。例如,若某個(gè)文件的權(quán)限為**7**則代表可讀、可寫(xiě)、可執(zhí)行(4+2+1);若權(quán)限為6則代表可讀、可寫(xiě)(4+2)。我們來(lái)看這樣一個(gè)例子,現(xiàn)在有這樣一個(gè)文件,其所屬者擁有可讀、可寫(xiě)、可執(zhí)行的權(quán)限,其所屬組擁有可讀、可寫(xiě)的權(quán)限,而其他人只有可讀的權(quán)限。那么,這個(gè)文件的權(quán)限就是rwxrw-r--,數(shù)字法表示即為764。不過(guò)大家千萬(wàn)別再將這三個(gè)數(shù)字相加,計(jì)算出7+6+4=17的結(jié)果,這是小學(xué)的數(shù)學(xué)加減法,不是Linux系統(tǒng)的權(quán)限數(shù)字表示法,三者之間沒(méi)有互通關(guān)系。
以rw-r-x-w-權(quán)限為例進(jìn)行講解,要想轉(zhuǎn)換成數(shù)字法,首先要進(jìn)行各個(gè)位之上的數(shù)字替代,如圖(字符與數(shù)字權(quán)限轉(zhuǎn)換示意圖)所示:
減號(hào)是占位符,代表這里沒(méi)有權(quán)限,數(shù)字法用0表示,也就是說(shuō)rw-轉(zhuǎn)換后是420,r-x轉(zhuǎn)換后是401,-w-轉(zhuǎn)換后是020,三組數(shù)字之間每組數(shù)字進(jìn)行相加后得出652便是轉(zhuǎn)換后的數(shù)字法權(quán)限。
而數(shù)字法轉(zhuǎn)回到字符權(quán)限相比來(lái)說(shuō)就有些難度了,以652權(quán)限為例進(jìn)行講解。首先數(shù)字6是由4+2得到的,不可能是4+1+1,因?yàn)槊總€(gè)權(quán)限只能占一位,所以數(shù)字5則是4+1得到的,2便是本身,沒(méi)有權(quán)限即是空值0。
數(shù)字與字符權(quán)限轉(zhuǎn)換示意圖:
心中牢記:文件的所屬者、所屬組和其他人權(quán)限之間無(wú)關(guān)聯(lián),不要寫(xiě)成rrwwx—-的樣子,一定要把rwx權(quán)限位對(duì)應(yīng)到正確的位置,寫(xiě)成rw-r-x-w-。
通過(guò)ls命令查看到的文件屬性信息:
包含了文件的類(lèi)型(第一個(gè)字符表示文件的類(lèi)型,d表示文件夾,減號(hào)表示普通文件)、訪問(wèn)權(quán)限、所有者(屬主)、所屬組(屬組)、占用的磁盤(pán)大小、最后修改時(shí)間和文件名稱(chēng)等信息。通過(guò)分析可知,該文件的類(lèi)型為普通文件,所有者權(quán)限為可讀、可寫(xiě)(rw-),所屬組權(quán)限為可讀(r--),除此以外的其他人也只有可讀權(quán)限(r--),文件的磁盤(pán)占用大小是34298字節(jié),最近一次的修改時(shí)間為4月2日的凌晨23分,文件的名稱(chēng)為install.log。
其中排在權(quán)限前面的減號(hào)(-)是文件類(lèi)型,新手經(jīng)常會(huì)把它跟無(wú)權(quán)限混淆。盡管在Linux系統(tǒng)中一切都是文件,但是不同的文件由于作用不同,因此類(lèi)型也不盡相同,有一點(diǎn)點(diǎn)像Windows系統(tǒng)的后綴名。常見(jiàn)的文件類(lèi)型包括有:普通文件(-)、目錄文件(d)、鏈接文件(l)、管道文件(p)、塊設(shè)備文件(b)以及字符設(shè)備文件(c)。
普通文件的范圍特別廣泛,比如純文本信息、服務(wù)配置信息、日志信息以及Shell腳本等等都包含在內(nèi),所以幾乎在每個(gè)目錄下都能看到普通文件(-)和目錄文件(d)的身影。塊設(shè)備文件(b)和字符設(shè)備文件(c)一般是指硬件設(shè)備,比如鼠標(biāo)、鍵盤(pán)、光驅(qū)、硬盤(pán)等等都是設(shè)備文件,主要集中在/dev/目錄中最為常見(jiàn),不過(guò)其實(shí)很少會(huì)對(duì)鼠標(biāo)鍵盤(pán)進(jìn)行硬件級(jí)別的管理吧~
2、文件的特殊權(quán)限
在復(fù)雜多變的生產(chǎn)環(huán)境中,單純?cè)O(shè)置文件的rwx權(quán)限無(wú)法滿足我們對(duì)安全和靈活性的需求,因此便有了SUID、SGID與SBIT的特殊權(quán)限位。這是一種對(duì)文件權(quán)限進(jìn)行設(shè)置的特殊功能,可以與一般權(quán)限同時(shí)使用,以彌補(bǔ)一般權(quán)限不能實(shí)現(xiàn)的功能。
下面具體解釋這3個(gè)特殊權(quán)限位的功能以及用法。
1)SUID
SUID是一種對(duì)二進(jìn)制程序進(jìn)行設(shè)置的特殊權(quán)限,能夠讓二進(jìn)制程序的執(zhí)行者臨時(shí)擁有所屬主的權(quán)限(僅對(duì)擁有執(zhí)行權(quán)限的二進(jìn)制程序有效)。例如,所有用戶都可以執(zhí)行passwd命令來(lái)修改自己的用戶密碼,而用戶密碼保存在/etc/shadow文件中。仔細(xì)查看這個(gè)文件就會(huì)發(fā)現(xiàn)它的默認(rèn)權(quán)限是000,也就是說(shuō)除了root管理員以外,所有用戶都沒(méi)有查看或編輯該文件的權(quán)限。但是,在使用passwd命令時(shí)如果加上SUID特殊權(quán)限位,就可讓普通用戶臨時(shí)獲得程序所屬者的身份,把變更的密碼信息寫(xiě)入到shadow文件中。這很像在古裝劇中見(jiàn)到的手持尚方寶劍的欽差大臣,他手持的尚方寶劍代表的是皇上的權(quán)威,因此可以懲戒貪官,但這并不意味著他永久成為了皇上。因此這只是一種有條件的、臨時(shí)的特殊權(quán)限授權(quán)方法。
查看passwd命令屬性時(shí)發(fā)現(xiàn)所屬者的權(quán)限由rwx變成了rws,其中x改變成s就意味著該文件被賦予了SUID權(quán)限。另外有讀者會(huì)好奇,那么如果原本的權(quán)限是rw-呢?如果原先權(quán)限位上沒(méi)有x執(zhí)行權(quán)限,那么被賦予特殊權(quán)限后將變成大寫(xiě)的S。
[root@localhost ~]# ls -l /etc/shadow ----------. 1 root root 1345 7月 22 22:06 /etc/shadow [root@localhost ~]# ls -l /bin/passwd -rwsr-xr-x. 1 root root 27856 4月 1 2020 /bin/passwd
注意:一定要小心這個(gè)權(quán)限,因?yàn)橐坏┠硞€(gè)命令文件被設(shè)置上了SUID權(quán)限,那么就意味著凡是執(zhí)行的人都可以臨時(shí)獲取到更高的權(quán)限,千萬(wàn)不要設(shè)置到vim、cat、rm等命令上面!??!
2)SGID
SGID特殊權(quán)限有兩種應(yīng)用場(chǎng)景,當(dāng)對(duì)二進(jìn)制程序進(jìn)行設(shè)置時(shí),能夠讓執(zhí)行者臨時(shí)獲取到文件所屬組的權(quán)限;而對(duì)目錄進(jìn)行設(shè)置時(shí),則是讓目錄內(nèi)新創(chuàng)建的文件自動(dòng)繼承該目錄原有用戶組的名稱(chēng)。
第一種功能是參考SUID而設(shè)計(jì)的,不同點(diǎn)在于執(zhí)行程序的用戶獲取的不再是文件所屬者的臨時(shí)權(quán)限,而是獲取到文件所屬組的權(quán)限。舉例來(lái)說(shuō),在早期的Linux系統(tǒng)中,/dev/kmem是一個(gè)字符設(shè)備文件,用于存儲(chǔ)內(nèi)核程序要訪問(wèn)的數(shù)據(jù),權(quán)限為:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
大家看出問(wèn)題了嗎?除了root管理員或?qū)儆趕ystem組成員外,其他用戶都沒(méi)有讀取該文件的權(quán)限。由于在平時(shí)我們需要查看系統(tǒng)的進(jìn)程狀態(tài),為了能夠獲取到進(jìn)程的狀態(tài)信息,可在用于查看系統(tǒng)進(jìn)程狀態(tài)的ps命令文件上增加SGID特殊權(quán)限位。查看ps命令文件的屬性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
這樣一來(lái),由于ps命令被增加了SGID特殊權(quán)限位,所以當(dāng)用戶執(zhí)行該命令時(shí),也就臨時(shí)獲取到了system用戶組的權(quán)限,從而順利地讀取到了設(shè)備文件。
前文提到,每個(gè)文件都有其歸屬的所屬者和所屬組,當(dāng)創(chuàng)建或傳送一個(gè)文件后,這個(gè)文件就會(huì)自動(dòng)歸屬于執(zhí)行這個(gè)操作的用戶(即該用戶是文件的所有者)。如果現(xiàn)在需要在一個(gè)部門(mén)內(nèi)設(shè)置共享目錄,讓部門(mén)內(nèi)的所有人員都能夠讀取目錄中的內(nèi)容,那么就可以創(chuàng)建部門(mén)共享目錄后,在該目錄上設(shè)置SGID特殊權(quán)限位。這樣,部門(mén)內(nèi)的任何人員在里面創(chuàng)建的任何文件都會(huì)歸屬于該目錄的所屬組,而不再是自己的基本用戶組。此時(shí),用到的就是SGID的第二個(gè)功能,即在某個(gè)目錄中創(chuàng)建的文件自動(dòng)繼承該目錄的用戶組(只可以對(duì)目錄進(jìn)行設(shè)置)。
[root@localhost ~]# cd /tmp [root@localhost tmp]# mkdir testdir [root@localhost tmp]# ls -ald testdir drwxr-xr-x. 2 root root 6 7月 23 22:27 testdir [root@localhost tmp]# chmod -R 777 testdir [root@localhost tmp]# chmod -R g+s testdir [root@localhost tmp]# ls -ald testdir drwxrwsrwx. 2 root root 6 7月 23 22:27 testdir
在使用上述命令設(shè)置好目錄的777權(quán)限(確保普通用戶可以向其中寫(xiě)入文件),并為該目錄設(shè)置了SGID特殊權(quán)限位后,就可以切換至一個(gè)普通用戶,然后嘗試在該目錄中創(chuàng)建文件,并查看新創(chuàng)建的文件是否會(huì)繼承新創(chuàng)建的文件所在的目錄的所屬組名稱(chēng):
[root@localhost ~]# su - dev1 上一次登錄:二 7月 23 22:34:01 CST 2024pts/0 上 [dev1@localhost ~]$ cd /tmp/testdir [dev1@localhost testdir]$ echo "linuxprobe.com" > test [dev1@localhost testdir]$ ls -al test -rw-r--r--. 1 dev1 root 15 7月 23 22:35 test
除了上面提到的SGID的這兩個(gè)功能,再介紹兩個(gè)與本小節(jié)內(nèi)容相關(guān)的命令:chmod和chown。
chmod命令用于設(shè)置文件的一般權(quán)限及特殊權(quán)限,英文全稱(chēng)為:“change mode”,語(yǔ)法格式為:“chmod [參數(shù)] 文件名”。
這是一個(gè)與日常設(shè)置文件權(quán)限強(qiáng)相關(guān)的命令,例如要把一個(gè)文件的權(quán)限設(shè)置成其所有者可讀可寫(xiě)可執(zhí)行、所屬組可讀可寫(xiě)、其他人沒(méi)有任何權(quán)限,則相應(yīng)的字符法表示為rwxrw----,其對(duì)應(yīng)的數(shù)字法表示為760。
[root@linuxprobe ~]# ls -l anaconda-ks.cfg -rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg [root@linuxprobe ~]# chmod 760 anaconda-ks.cfg [root@linuxprobe ~]# ls -l anaconda-ks.cfg -rwxrw----. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
chown命令用于設(shè)置文件的所有者和所有組,英文全稱(chēng)為:“change own”,語(yǔ)法格式為:“chown 所有者:所有組 文件名”。
chmod和chown命令是用于修改文件屬性和權(quán)限的最常用命令,它們還有一個(gè)特別的共性,就是針對(duì)目錄進(jìn)行操作時(shí)需要加上大寫(xiě)參數(shù)-R來(lái)表示遞歸操作,即對(duì)目錄內(nèi)所有的文件進(jìn)行整體操作。
使用“所有者:所有組”的格式輕松把剛剛那個(gè)文件的所屬信息修改一下,變更后的效果如下:
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg [root@linuxprobe ~]# ls -l anaconda-ks.cfg -rwxrw----. 1 linuxprobe linuxprobe 1407 Jul 21 05:09 anaconda-ks.cfg
3)SBIT
現(xiàn)在,大學(xué)里的很多老師都要求學(xué)生將作業(yè)上傳到服務(wù)器的特定共享目錄中,但總是有幾個(gè)“破壞分子”喜歡刪除其他同學(xué)的作業(yè),這時(shí)就要設(shè)置SBIT(Sticky Bit)特殊權(quán)限位了(也可以稱(chēng)之為特殊權(quán)限位之粘滯位)。SBIT特殊權(quán)限位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。換句話說(shuō),當(dāng)對(duì)某個(gè)目錄設(shè)置了SBIT粘滯位權(quán)限后,那么該目錄中的文件就只能被其所有者執(zhí)行刪除操作了。
最初不知道是哪位非資深技術(shù)人員將Sticky Bit直譯成了“粘滯位”,劉遄老師建議將其稱(chēng)為“保護(hù)位”,這既好記,又能立刻讓人了解它的作用。RHEL 8系統(tǒng)中的/tmp作為一個(gè)共享文件的目錄,默認(rèn)已經(jīng)設(shè)置了SBIT特殊權(quán)限位,因此除非是該目錄的所有者,否則無(wú)法刪除這里面的文件。
與前面所講的SUID和SGID權(quán)限顯示方法不同,當(dāng)目錄被設(shè)置SBIT特殊權(quán)限位后,文件的其他人權(quán)限部分的x執(zhí)行權(quán)限就會(huì)被替換成t或者T,原本有x執(zhí)行權(quán)限則會(huì)寫(xiě)成t,原本沒(méi)有x執(zhí)行權(quán)限則會(huì)被寫(xiě)成T。
/tmp目錄上的SBIT權(quán)限默認(rèn)已經(jīng)存在,體現(xiàn)為“其他用戶”權(quán)限字段的權(quán)限變?yōu)閞wt:
[root@linuxprobe ~]# ls -ald /tmp drwxrwxrwt. 17 root root 4096 Oct 28 00:29 /tmp
其實(shí),文件能否被刪除并不取決于自身的權(quán)限,而是看其所在目錄是否有寫(xiě)入權(quán)限。為了避免現(xiàn)在很多讀者不放心,所以下面的命令還是賦予了這個(gè)test文件最大的777權(quán)限(rwxrwxrwx):
[root@linuxprobe ~]# cd /tmp [root@linuxprobe tmp]# echo "Welcome to linuxprobe.com" > test [root@linuxprobe tmp]# chmod 777 test [root@linuxprobe tmp]# ls -al test -rwxrwxrwx. 1 root root 26 Oct 29 14:29 test
隨后,切換到一個(gè)普通用戶身份下,嘗試刪除這個(gè)其他人創(chuàng)建的文件就會(huì)發(fā)現(xiàn),即便讀、寫(xiě)、執(zhí)行權(quán)限全開(kāi),但是由于SBIT特殊權(quán)限位的緣故,依然無(wú)法刪除該文件:
[root@linuxprobe tmp]# su - linuxprobe [linuxprobe@linuxprobe ~]$ cd /tmp [linuxprobe@linuxprobe tmp]$ rm -f test rm: cannot remove 'test': Operation not permitted
工作中對(duì)特殊權(quán)限善加使用,能夠?qū)崿F(xiàn)很多巧妙的功能,chmod命令設(shè)置特殊權(quán)限時(shí)的參數(shù)如下:
參數(shù) | 作用 |
u+s | 設(shè)置SUID權(quán)限 |
u-s | 取消SUID權(quán)限 |
g+s | 設(shè)置SGID權(quán)限 |
g-s | 取消SGID權(quán)限 |
o+t | 設(shè)置SBIT權(quán)限 |
o-t | 取消SBIT權(quán)限 |
切換回root管理員的身份下,在家目錄中創(chuàng)建一個(gè)名為linux的新目錄,隨后設(shè)置上SBIT權(quán)限吧:
[linuxprobe@linuxprobe tmp]$ exit Logout [root@linuxprobe tmp]# cd ~ [root@linuxprobe ~]# mkdir linux [root@linuxprobe ~]# chmod -R o+t linux/ [root@linuxprobe ~]# ls -ld linux/ drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
上面的o+t參數(shù)是在一般權(quán)限已經(jīng)設(shè)置完畢的前提下,又新增了一項(xiàng)特殊權(quán)限,那如果我們想一般權(quán)限和特殊權(quán)限一起設(shè)置,有什么高效率的方法呢?
其實(shí)SUID、SGID與SBIT也有對(duì)應(yīng)的數(shù)字法表示,分別是4、2、1。也就是說(shuō)777還不是最大權(quán)限,滿權(quán)限應(yīng)該是7777,第一個(gè)數(shù)字代表的是特殊權(quán)限位。既然知道了數(shù)字表示法是由“特殊權(quán)限+一般權(quán)限”構(gòu)成的,那就以上面linux目錄的權(quán)限為例梳理下計(jì)算方法吧。
在“rwxr-xr-t”權(quán)限中,最后一位是t,代表該文件的一般權(quán)限為“rwxr-xr-x”,并帶有SBIT特殊權(quán)限。對(duì)于讀(r)、寫(xiě)(w)、執(zhí)行(x)權(quán)限的數(shù)字計(jì)算方法大家應(yīng)該很熟悉了——即755,而SBIT特殊權(quán)限位是1,合并后結(jié)果為1755。
再增加點(diǎn)難度,如果權(quán)限是“rwsrwSr--”呢?首先不要慌,看到大寫(xiě)S代表原先沒(méi)有執(zhí)行權(quán)限,因此一般權(quán)限為“rwxrw-r--”,數(shù)字法計(jì)算后結(jié)果是764。帶有的SUID和SGID特殊權(quán)限數(shù)字法表示是4和2,心算得出結(jié)果是6,合并后結(jié)果為6764。
權(quán)限的字符表示法轉(zhuǎn)數(shù)字表示法:
將數(shù)字法轉(zhuǎn)換成字符法難度略微高一些,以5537為例為大家講解。首先特殊權(quán)限的5是由4+1組成的,意味著是有SUID和SBIT。SUID和SGID的寫(xiě)法是原先有執(zhí)行權(quán)限則是小寫(xiě)s,如果沒(méi)有執(zhí)行權(quán)限則是大寫(xiě)S,而SBIT的寫(xiě)法則是原先有執(zhí)行權(quán)限是小寫(xiě)t,沒(méi)有執(zhí)行權(quán)限是大寫(xiě)T。一般權(quán)限的537進(jìn)行字符轉(zhuǎn)換后應(yīng)為“r-x-wxrwx”,然后在此基礎(chǔ)上增加SUID和SGID特殊權(quán)限,合并后結(jié)果是“r-s-wxrwt”。
權(quán)限的數(shù)字表示法轉(zhuǎn)字符標(biāo)識(shí)法:
3、文件的隱藏屬性
Linux系統(tǒng)中的文件除了具備一般權(quán)限和特殊權(quán)限之外,還有一種隱藏權(quán)限,即被隱藏起來(lái)的權(quán)限,默認(rèn)情況下不能直接被用戶發(fā)覺(jué)。有用戶曾經(jīng)在生產(chǎn)環(huán)境和RHCE考試題目中碰到過(guò)明明權(quán)限充足但卻無(wú)法刪除某個(gè)文件的情況,或者僅能在日志文件中追加內(nèi)容而不能修改或刪除內(nèi)容,這在一定程度上阻止了黑客篡改系統(tǒng)日志的圖謀,因此這種“奇怪”的文件也保障了Linux系統(tǒng)的安全性。
既然叫隱藏權(quán)限了,那肯定不能用常規(guī)的ls命令就讓我們看到它的真面目,專(zhuān)用的設(shè)置命令是chattr,專(zhuān)用的查看命令是lsattr。
1)chattr命令
chattr命令用于設(shè)置文件的隱藏權(quán)限,英文全稱(chēng)為:“change attributes”,語(yǔ)法格式為:“chattr [參數(shù)] 文件名稱(chēng)”。
如果想要把某個(gè)隱藏功能添加到文件上,則需要在命令后面追加“+參數(shù)”,如果想要把某個(gè)隱藏功能移出文件,則需要追加“-參數(shù)”。
chattr命令中的參數(shù)及其作用:
參數(shù) | 作用 |
i | 無(wú)法對(duì)文件進(jìn)行修改;若對(duì)目錄設(shè)置了該參數(shù),則僅能修改其中的子文件內(nèi)容而不能新建或刪除文件 |
a | 僅允許補(bǔ)充(追加)內(nèi)容,無(wú)法覆蓋/刪除內(nèi)容(Append Only) |
S | 文件內(nèi)容在變更后立即同步到硬盤(pán)(sync) |
s | 徹底從硬盤(pán)中刪除,不可恢復(fù)(用0填充原文件所在硬盤(pán)區(qū)域) |
A | 不再修改這個(gè)文件或目錄的最后訪問(wèn)時(shí)間(atime) |
b | 不再修改文件或目錄的存取時(shí)間 |
D | 檢查壓縮文件中的錯(cuò)誤 |
d | 使用dump命令備份時(shí)忽略本文件/目錄 |
c | 默認(rèn)將文件或目錄進(jìn)行壓縮 |
u | 當(dāng)刪除該文件后依然保留其在硬盤(pán)中的數(shù)據(jù),方便日后恢復(fù) |
t | 讓文件系統(tǒng)支持尾部合并(tail-merging) |
x | 可以直接訪問(wèn)壓縮文件中的內(nèi)容 |
為了讓讀者能夠更好地見(jiàn)識(shí)隱藏權(quán)限的效果,我們先來(lái)創(chuàng)建一個(gè)普通文件,然后立即嘗試刪除(這個(gè)操作肯定會(huì)成功):
[root@linuxprobe ~]# echo "for Test" > linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y
實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn)。如果您沒(méi)有親眼見(jiàn)證過(guò)隱藏權(quán)限強(qiáng)大功能的美妙,就一定不會(huì)相信原來(lái)Linux系統(tǒng)會(huì)如此安全。接下來(lái)再次新建一個(gè)普通文件,并為其設(shè)置不允許刪除與覆蓋(+a參數(shù))權(quán)限,然后再?lài)L試將這個(gè)文件刪除:
[root@linuxprobe ~]# echo "for Test" > linuxprobe [root@linuxprobe ~]# chattr +a linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y rm: cannot remove ‘linuxprobe’: Operation not permitted
可見(jiàn),上述操作失敗了。
2)lsattr命令
lsattr命令用于查看文件的隱藏權(quán)限,英文全稱(chēng)為:“l(fā)ist attributes”,語(yǔ)法格式為:“l(fā)sattr [參數(shù)] 文件名稱(chēng)”。
在Linux系統(tǒng)中,文件的隱藏權(quán)限必須使用lsattr命令來(lái)查看,平時(shí)使用的ls之類(lèi)的命令則看不出端倪:
[root@linuxprobe ~]# ls -al linuxprobe -rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe
一旦使用lsattr命令后,文件上被賦予的隱藏權(quán)限馬上就會(huì)原形畢露:
[root@linuxprobe ~]# lsattr linuxprobe -----a---------- linuxprobe
此時(shí)按照顯示的隱藏權(quán)限的類(lèi)型(字母),使用chattr命令將其去掉:
[root@linuxprobe ~]# chattr -a linuxprobe [root@linuxprobe ~]# lsattr linuxprobe ---------------- linuxprobe [root@linuxprobe ~]# rm linuxprobe rm: remove regular file ‘linuxprobe’? y
一般我們會(huì)將-a參數(shù)設(shè)置到日志文件(/var/log/messages)上面,這樣在不影響系統(tǒng)正常寫(xiě)入日志的前提下,還可以防止黑客清理自己的作案證據(jù)。如果希望徹底的保護(hù)起某個(gè)文件,不允許任何人修改和刪除它的話,不妨加上-i參數(shù)試試,效果特別好。
4、文件訪問(wèn)控制列表
不知道大家是否發(fā)現(xiàn),前文講解的一般權(quán)限、特殊權(quán)限、隱藏權(quán)限其實(shí)有一個(gè)共性,那就是權(quán)限是針對(duì)某一類(lèi)用戶設(shè)置的,能夠?qū)芏嗳送瑫r(shí)生效。如果希望對(duì)某個(gè)指定的用戶進(jìn)行單獨(dú)的權(quán)限控制,就需要用到文件的訪問(wèn)控制列表(FACL,F(xiàn)ile Access Control Lists)了。通俗來(lái)講,基于普通文件或目錄設(shè)置ACL訪問(wèn)控制其實(shí)就是針對(duì)指定的用戶或用戶組設(shè)置文件或目錄的操作權(quán)限,更加精準(zhǔn)的派發(fā)權(quán)限。另外,如果針對(duì)某個(gè)目錄設(shè)置了ACL,則目錄中的文件會(huì)繼承其權(quán)限;若針對(duì)文件設(shè)置了ACL,則文件不再繼承其所在目錄的權(quán)限。
為了更直觀地看到ACL對(duì)文件權(quán)限控制的強(qiáng)大效果,我們先切換到普通用戶,然后嘗試進(jìn)入root管理員的家目錄中。在沒(méi)有針對(duì)普通用戶對(duì)root管理員的家目錄設(shè)置ACL之前,其執(zhí)行結(jié)果如下所示:
[root@localhost ~]# su - dev1 上一次登錄:三 7月 24 22:53:31 CST 2024pts/0 上 [dev1@localhost ~]$ cd /root -bash: cd: /root: 權(quán)限不夠 [dev1@localhost ~]$ exit
1)setfacl命令
setfacl命令用于管理文件的ACL權(quán)限規(guī)則,英文全稱(chēng)為:“set files ACL”,語(yǔ)法格式為:“ setfacl [參數(shù)] 文件名稱(chēng)”。
ACL權(quán)限提供的是在所有者、所屬組、其他人的讀/寫(xiě)/執(zhí)行權(quán)限之外的特殊權(quán)限控制,使用setfacl命令可以針對(duì)單一用戶或用戶組、單一文件或目錄來(lái)進(jìn)行讀/寫(xiě)/執(zhí)行權(quán)限的控制。其中,針對(duì)目錄文件需要使用-R遞歸參數(shù);針對(duì)普通文件則使用-m參數(shù);如果想要?jiǎng)h除某個(gè)文件的ACL,則可以使用-b參數(shù)。
setfacl命令中的參數(shù)以及作用:
參數(shù) | 作用 |
-m | 修改權(quán)限 |
-M | 從文件中讀取權(quán)限 |
-x | 刪除某個(gè)權(quán)限 |
-b | 刪除全部權(quán)限 |
-R | 遞歸子目錄 |
例如我們?cè)臼菬o(wú)法進(jìn)入到/root目錄中的,現(xiàn)在給這位普通用戶單獨(dú)設(shè)置下權(quán)限:
[root@localhost ~]# setfacl -Rm urwx /root
隨后再切換到這位普通用戶的身份下,就能正常進(jìn)入:
[root@localhost ~]# su - dev1 上一次登錄:四 7月 25 21:37:50 CST 2024pts/0 上 [dev1@localhost ~]$ cd /root [dev1@localhost root]$ ls anaconda-ks.cfg initial-setup-ks.cfg myfolder ProgramFiles 公共 模板 視頻 圖片 文檔 下載 音樂(lè) 桌面 [dev1@localhost root]$ exit
是不是覺(jué)得效果很酷呢?但是現(xiàn)在有這樣一個(gè)小問(wèn)題—怎么去查看文件上有哪些ACL呢?常用的ls命令是看不到ACL表信息的,但是卻可以看到文件的權(quán)限最后一個(gè)點(diǎn)(.)變成了加號(hào)(+),這就意味著該文件已經(jīng)設(shè)置了ACL?,F(xiàn)在大家是不是感覺(jué)學(xué)得越多,越不敢說(shuō)自己精通Linux系統(tǒng)了吧?就這么一個(gè)不起眼的點(diǎn)(.),竟然還表示這么一種重要的權(quán)限。
[root@localhost ~]# ls -ld /root dr-xrwx---+ 17 root root 4096 7月 25 21:30 /root
2)getfacl命令
getfacl命令用于查看文件的ACL權(quán)限規(guī)則,英文全稱(chēng)為:“get files ACL”,語(yǔ)法格式為:“ getfacl [參數(shù)] 文件名稱(chēng)”。
getfacl命令用于顯示文件上設(shè)置的ACL信息,格式為“getfacl 文件名稱(chēng)”。Linux系統(tǒng)中的命令就是這么又可愛(ài)又好記。想要設(shè)置ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令。下面使用getfacl命令顯示在root管理員家目錄上設(shè)置的所有ACL信息。
[root@localhost ~]# getfacl /root getfacl: Removing leading '/' from absolute path names # file: root # owner: root # group: root user::r-x userrwx group::r-x mask::rwx other::---
ACL權(quán)限還可以針對(duì)某個(gè)用戶組來(lái)設(shè)置,例如允許某個(gè)組的用戶都可以讀寫(xiě)/etc/fstab這個(gè)文件:
[root@localhost ~]# setfacl -m grw /etc/fstab [root@localhost ~]# getfacl /etc/fstab getfacl: Removing leading '/' from absolute path names # file: etc/fstab # owner: root # group: root user::rw- group::r-- grouprw- mask::rw- other::r--
設(shè)置錯(cuò)了想刪除?沒(méi)問(wèn)題!清空所有ACL權(quán)限用-b參數(shù),指定刪除某一條權(quán)限就用-x參數(shù):
[root@localhost ~]# setfacl -x g:devgroup1 /etc/fstab [root@localhost ~]# getfacl /etc/fstab getfacl: Removing leading '/' from absolute path names # file: etc/fstab # owner: root # group: root user::rw- group::r-- mask::r-- other::r--
對(duì)于ACL權(quán)限的設(shè)置都是立即且永久生效的,不需要再編輯什么配置文件,這點(diǎn)特別方便~但是也有個(gè)安全隱患,如果我們不小心設(shè)置錯(cuò)了權(quán)限怎么辦?就會(huì)覆蓋掉文件原始的權(quán)限信息,并且永遠(yuǎn)都找不回來(lái)了。
溫馨提示:操作前備份一下,總是好的習(xí)慣。
例如:將 /home 目錄上的ACL權(quán)限備份一份,要用-R遞歸參數(shù),這樣不僅能夠把目錄本身的權(quán)限備份了,里面的文件權(quán)限也都能自動(dòng)備份。需要注意 getfacl 在備份目錄權(quán)限時(shí)不能使用絕對(duì)路徑的形式,因此我們需要先切換到最上層根目錄,然后再進(jìn)行操作:
[root@localhost ~]# cd / [root@localhost /]# getfacl -R home > backup.acl [root@localhost /]# ls -l 總用量 60 -rw-r--r--. 1 root root 21822 7月 25 21:56 backup.acl
ACL權(quán)限的恢復(fù)也很簡(jiǎn)單,使用的是“--restore”參數(shù),由于備份時(shí)已經(jīng)指定了是對(duì)home目錄進(jìn)行的操作,所以不需要寫(xiě)對(duì)應(yīng)的目錄名稱(chēng),它能夠自動(dòng)找到要恢復(fù)的對(duì)象:
[root@localhost /]# setfacl --restore backup.acl
5、su命令與sudo命令
由于為了避免因權(quán)限因素導(dǎo)致配置服務(wù)失敗,從而建議使用root管理員來(lái)學(xué)習(xí),但是在生產(chǎn)環(huán)境中還是要對(duì)安全多一份敬畏之心,不要用root管理員去做所有事情。因?yàn)橐坏﹫?zhí)行了錯(cuò)誤的命令,可能會(huì)直接導(dǎo)致系統(tǒng)崩潰,這樣一來(lái),不但客戶指責(zé)、領(lǐng)導(dǎo)批評(píng),沒(méi)準(zhǔn)獎(jiǎng)金也會(huì)雞飛蛋打。但轉(zhuǎn)頭一想,盡管Linux系統(tǒng)為了安全性考慮,使得許多系統(tǒng)命令和服務(wù)只能被root管理員來(lái)使用,但是這也讓普通用戶受到了更多的權(quán)限束縛,從而導(dǎo)致無(wú)法順利完成特定的工作任務(wù)。
su命令可以解決切換用戶身份的需求,使得當(dāng)前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:
[root@localhost ~]# su - dev1 上一次登錄:四 7月 25 21:40:57 CST 2024pts/0 上 [dev1@localhost ~]$ id uid=1001(dev1) gid=1001(devgroup1) 組=1001(devgroup1),1003(devgroup3) 環(huán)境=unconfined_uunconfined_tc0.c1023
細(xì)心的讀者一定會(huì)發(fā)現(xiàn),上面的su命令與用戶名之間有一個(gè)減號(hào)(-),這意味著完全切換到新的用戶,即把環(huán)境變量信息也變更為新用戶的相應(yīng)信息,而不是保留原始的信息。強(qiáng)烈建議在切換用戶身份時(shí)添加這個(gè)減號(hào)(-)。
另外,當(dāng)從root管理員切換到普通用戶時(shí)是不需要密碼驗(yàn)證的,而從普通用戶切換成root管理員就需要進(jìn)行密碼驗(yàn)證了;這也是一個(gè)必要的安全檢查:
[dev1@localhost ~]$ su - root 密碼:此處輸入管理員密碼 上一次登錄:四 7月 25 21:30:37 CST 2024從 192.168.110.1pts/0 上
盡管像上面這樣使用su命令后,普通用戶可以完全切換到root管理員身份來(lái)完成相應(yīng)工作,但這將暴露root管理員的密碼,從而增大了系統(tǒng)密碼被黑客獲取的幾率,這并不是最安全的方案。
接下來(lái)將介紹如何使用sudo命令把特定命令的執(zhí)行權(quán)限賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的工作,也可以避免泄露root管理員密碼。我們要做的就是合理配置sudo服務(wù),以便兼顧系統(tǒng)的安全性和用戶的便捷性。
溫馨提示:
授權(quán)原則:在保證普通用戶完成相應(yīng)工作的前提下,盡可能少的賦予額外的權(quán)限。
sudo命令用于給普通用戶提供額外的權(quán)限,語(yǔ)法格式為:“ sudo [參數(shù)] 用戶名”。
使用sudo命令可以給普通用戶提供額外的權(quán)限來(lái)完成原本只有root管理員才能完成的任務(wù)??梢韵拗朴脩魣?zhí)行指定的命令、記錄用戶執(zhí)行過(guò)的每一條命令、集中的管理用戶與權(quán)限(/etc/sudoers)以及驗(yàn)證密碼后一段時(shí)間內(nèi)免驗(yàn)證的方便措施。
sudo命令中的常用參數(shù)以及作用:
參數(shù) | 作用 |
-h | 列出幫助信息 |
-l | 列出當(dāng)前用戶可執(zhí)行的命令 |
-u 用戶名或UID值 | 以指定的用戶身份執(zhí)行命令 |
-k | 清空密碼的有效時(shí)間,下次執(zhí)行sudo時(shí)需要再次進(jìn)行密碼驗(yàn)證 |
-b | 在后臺(tái)執(zhí)行指定的命令 |
-p | 更改詢(xún)問(wèn)密碼的提示語(yǔ) |
當(dāng)然,如果擔(dān)心直接修改配置文件會(huì)出現(xiàn)問(wèn)題,則可以使用sudo命令提供的visudo命令來(lái)配置用戶權(quán)限。
visudo命令用于編輯配置用戶sudo權(quán)限文件,語(yǔ)法格式為:“ visudo [參數(shù)]”。
這是一條會(huì)自動(dòng)調(diào)用vi編輯器來(lái)配置/etc/sudoers權(quán)限文件的命令,能夠解決多個(gè)用戶同時(shí)修改權(quán)限而導(dǎo)致的沖突問(wèn)題,不僅如此,visudo命令還可以對(duì)配置文件內(nèi)的參數(shù)進(jìn)行語(yǔ)法檢查,在發(fā)現(xiàn)參數(shù)錯(cuò)誤時(shí)進(jìn)行報(bào)錯(cuò)提醒,比用戶直接修改文件更友好、安全、方便。
>>> /etc/sudoers: syntax error near line 1 <<< What now? Options are: (e)dit sudoers file again e(x)it without saving changes to sudoers file (Q)uit and save changes to sudoers file (DANGER!)
使用visudo命令配置權(quán)限文件時(shí),其操作方法與Vim編輯器中用到的方法完全一致,因此在編寫(xiě)完成后記得在末行模式下保存并退出。配置權(quán)限文件時(shí),按照下面的格式將第101行(大約)填寫(xiě)上指定的信息:
誰(shuí)可以使用 允許使用的主機(jī)=(以誰(shuí)的身份) 可執(zhí)行命令的列表
誰(shuí)可以使用:稍后要為那位用戶進(jìn)行命令授權(quán)。
允許使用的主機(jī):可以填寫(xiě)ALL代表不限制來(lái)源主機(jī),亦可填寫(xiě)如192.168.10.0/24的網(wǎng)段限制來(lái)源地址,只有從允許網(wǎng)段登錄時(shí)才能使用sudo命令。
以誰(shuí)的身份:可以填寫(xiě)ALL代表系統(tǒng)最高權(quán)限,也可以是另外一位用戶的名字。
可執(zhí)行命令的列表:可以填寫(xiě)ALL代表不限制命令的列表,亦可填寫(xiě)如/usr/bin/cat的文件名稱(chēng)來(lái)限制命令列表,多個(gè)命令文件之間用逗號(hào)(,)間隔。
在Linux系統(tǒng)中配置服務(wù)文件時(shí),雖然沒(méi)有硬性規(guī)定,但從經(jīng)驗(yàn)來(lái)講新增的參數(shù)位置不建議太靠上,避免服務(wù)一些必要的功能沒(méi)加載完成時(shí),我們填寫(xiě)的新參數(shù)不被執(zhí)行成功。一般會(huì)在配置文件中找一下相似的參數(shù),然后在相鄰位置進(jìn)行新的修改,或者選擇文件的中下部位置。
[root@localhost ~]# visudo 省略... 99 ## Allow root to run any commands anywhere 100 root ALL=(ALL) ALL 101 dev2 ALL=(ALL) ALL 102 103 ## Allows members of the 'sys' group to run networking, software, 省略...
在填寫(xiě)完畢后記得要先保存再退出,然后切換至指定的普通用戶身份,此時(shí)就可以用sudo -l命令查看到所有可執(zhí)行的命令了(下面的命令中,驗(yàn)證的是該普通用戶的密碼,而不是root管理員的密碼,請(qǐng)讀者不要搞混了):
[root@localhost ~]# su - dev2 上一次登錄:一 7月 22 21:54:09 CST 2024pts/0 上 [dev2@localhost ~]$ sudo -l 我們信任您已經(jīng)從系統(tǒng)管理員那里了解了日常注意事項(xiàng)。 總結(jié)起來(lái)無(wú)外乎這三點(diǎn): #1) 尊重別人的隱私。 #2) 輸入前要先考慮(后果和風(fēng)險(xiǎn))。 #3) 權(quán)力越大,責(zé)任越大。 [sudo] dev2 的密碼:此處輸入dev2用戶的密碼 匹配 %2$s 上 %1$s 的默認(rèn)條目: !visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE 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 用戶 dev2 可以在 localhost 上運(yùn)行以下命令: (ALL) ALL
接下來(lái)是見(jiàn)證奇跡的時(shí)刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的文件信息的,但是,只需要在想執(zhí)行的命令前面加上sudo命令就行了:
[root@localhost ~]# su - dev2 上一次登錄:四 7月 25 23:35:47 CST 2024pts/0 上 [dev2@localhost ~]$ ls /root ls: 無(wú)法打開(kāi)目錄/root: 權(quán)限不夠 [dev2@localhost ~]$ sudo ls /root [sudo] dev2 的密碼: anaconda-ks.cfg initial-setup-ks.cfg myfolder ProgramFiles 公共 模板 視頻 圖片 文檔 下載 音樂(lè) 桌面 [dev2@localhost ~]$ sudo ls /root anaconda-ks.cfg initial-setup-ks.cfg myfolder ProgramFiles 公共 模板 視頻 圖片 文檔 下載 音樂(lè) 桌面
效果立竿見(jiàn)影!但是考慮到生產(chǎn)環(huán)境中不允許某個(gè)普通用戶擁有整個(gè)系統(tǒng)中所有命令的最高執(zhí)行權(quán)(這也不符合前文提到的權(quán)限賦予原則,即盡可能少地賦予權(quán)限),因此ALL參數(shù)就有些不合適了。因此只能賦予普通用戶具體的命令以滿足工作需求,這也受到了必要的權(quán)限約束。如果需要讓某個(gè)用戶只能使用root管理員的身份執(zhí)行指定的命令,切記一定要給出該命令的絕對(duì)路徑,否則系統(tǒng)會(huì)識(shí)別不出來(lái),這時(shí)可以先使用whereis命令找出命令所對(duì)應(yīng)的保存路徑:
[dev2@localhost ~]$ exit 登出 [root@localhost ~]# whereis cat cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz [root@localhost ~]# whereis reboot reboot: /usr/sbin/reboot /usr/share/man/man2/reboot.2.gz /usr/share/man/man8/reboot.8.gz
然后使用visudo命令繼續(xù)編輯權(quán)限文件,將原先101行所新增的參數(shù)作如下修改,多個(gè)命令之間用英文逗號(hào)(,)分隔。
[root@localhost ~]# visudo 省略... 99 ## Allow root to run any commands anywhere 100 root ALL=(ALL) ALL 101 dev2 ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot 102 103 ## Allows members of the 'sys' group to run networking, software, 省略...
在編輯好后依然是先保存再退出。再次切換到指定的普通用戶,然后嘗試正常查看某個(gè)系統(tǒng)文件的內(nèi)容,此時(shí)系統(tǒng)提示沒(méi)有權(quán)限(Permission denied)。再使用sudo命令就能順利地查看文件內(nèi)容了:
[root@localhost ~]# su - dev2 上一次登錄:五 7月 26 23:21:09 CST 2024pts/0 上 [dev2@localhost ~]$ cat /etc/shadow cat: /etc/shadow: 權(quán)限不夠 [dev2@localhost ~]$ sudo cat /etc/shadow [sudo] dev2 的密碼:此處輸入dev2用戶的密碼 root:$6$FZjns6bztDTKQTKq$qJuaQ5KdExQzIznFeCSJHDXkeSN9vS3u8G/kw6HhLuZb91kftob6IhgSo.iqqlEgdBd8Oov3M2OKclNXvBuSQ0::0:99999:7::: bin:*:18353:0:99999:7::: daemon:*:18353:0:99999:7::: adm:*:18353:0:99999:7::: lp:*:18353:0:99999:7::: sync:*:18353:0:99999:7::: shutdown:*:18353:0:99999:7::: halt:*:18353:0:99999:7::: 省略... [dev2@localhost ~]$ exit 登出
不知大家是否發(fā)覺(jué)在每次執(zhí)行sudo命令后都會(huì)要求驗(yàn)證一下密碼。雖然這個(gè)密碼就是當(dāng)前登錄用戶的密碼,但是每次執(zhí)行sudo命令都要輸入一次密碼其實(shí)也挺麻煩的,這時(shí)可以添加NOPASSWD參數(shù),使得用戶下次再執(zhí)行sudo命令時(shí)就不用密碼驗(yàn)證啦~
[root@localhost ~]# visudo 省略... 99 ## Allow root to run any commands anywhere 100 root ALL=(ALL) ALL 101 dev2 ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot 102 103 ## Allows members of the 'sys' group to run networking, software, 省略...
這樣,當(dāng)切換到普通用戶后再執(zhí)行命令時(shí),就不用再頻繁地驗(yàn)證密碼了,我們?cè)谌粘9ぷ髦幸簿屯纯熘翗O了。
[root@localhost ~]# su - dev2 上一次登錄:五 7月 26 23:48:06 CST 2024pts/0 上 [dev2@localhost ~]$ reboot User root is logged in on sshd. User root is logged in on sshd. Please retry operation after closing inhibitors and logging out other users. Alternatively, ignore inhibitors and users with 'systemctl reboot -i'. [dev2@localhost ~]$ sudo reboot
請(qǐng)細(xì)心留意上面的用戶身份變換,visudo命令只有root管理員才可以執(zhí)行,普通用戶使用會(huì)提示權(quán)限不足。
五、組和權(quán)限設(shè)定的命令
該點(diǎn)其實(shí)上文已經(jīng)提到過(guò)了,就是chown 和 chmod 這2個(gè)命令。
1、chmod命令
chmod命令用于設(shè)置文件的一般權(quán)限及特殊權(quán)限,英文全稱(chēng)為:“change mode”,語(yǔ)法格式為:“chmod [參數(shù)] 文件名”。
這是一個(gè)與日常設(shè)置文件權(quán)限強(qiáng)相關(guān)的命令,例如要把一個(gè)文件的權(quán)限設(shè)置成其所有者可讀可寫(xiě)可執(zhí)行、所屬組可讀可寫(xiě)、其他人沒(méi)有任何權(quán)限,則相應(yīng)的字符法表示為rwxrw----,其對(duì)應(yīng)的數(shù)字法表示為760。
[root@linuxprobe ~]# ls -l anaconda-ks.cfg -rw-------. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg [root@linuxprobe ~]# chmod 760 anaconda-ks.cfg [root@linuxprobe ~]# ls -l anaconda-ks.cfg -rwxrw----. 1 root root 1407 Jul 21 05:09 anaconda-ks.cfg
2、chown命令
chown命令用于設(shè)置文件的所有者和所有組,英文全稱(chēng)為:“change own”,語(yǔ)法格式為:“chown 所有者:所有組 文件名”。
chmod和chown命令是用于修改文件屬性和權(quán)限的最常用命令,它們還有一個(gè)特別的共性,就是針對(duì)目錄進(jìn)行操作時(shí)需要加上大寫(xiě)參數(shù)-R來(lái)表示遞歸操作,即對(duì)目錄內(nèi)所有的文件進(jìn)行整體操作。
使用“所有者:所有組”的格式輕松把剛剛那個(gè)文件的所屬信息修改一下,變更后的效果如下:
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg [root@linuxprobe ~]# ls -l anaconda-ks.cfg -rwxrw----. 1 linuxprobe linuxprobe 1407 Jul 21 05:09 anaconda-ks.cfg
鏈接:https://www.cnblogs.com/xyh9039/p/18300859
-
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209523 -
服務(wù)器
+關(guān)注
關(guān)注
12文章
9160瀏覽量
85428 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6825瀏覽量
123333 -
權(quán)限控制
+關(guān)注
關(guān)注
0文章
5瀏覽量
6394
原文標(biāo)題:掌握Linux權(quán)限控制,輕松提高系統(tǒng)安全性!
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論