一、Linux文件和目錄簡單操作{#一-linux文件和目錄簡單操作} 1.1 查看文件 ls 查看當前目錄下的文件 如: -a 顯示所有文件及目錄 (ls內定將文件名或目錄名稱開頭為"."的視為隱藏檔,不會列出) -l 除文件名稱外,亦將文件型態、許可權、擁有者、文件大小等資訊詳細列出 -r 將文件 ...
一、Linux文件和目錄簡單操作
1.1 查看文件
ls 查看當前目錄下的文件
如:
-a 顯示所有文件及目錄
(ls內定將文件名或目錄名稱開頭為"."的視為隱藏檔,不會列出)
-l 除文件名稱外,亦將文件型態、許可權、擁有者、文件大小等資訊詳細列出
-r 將文件以相反次序顯示(原定依英文字母次序)-t
將文件依建立時間之先後次序列出
-A 同 -a ,老師 (父目錄)
-F 在列出的文件名稱後加一符號;例如可執行檔則加 "*", 目錄則加 "/"
-R 若目錄下有文件,則以下之文件亦皆依序列出
1.2 創建文件
touch + 文件路徑/文件名 創建普通文件
(文件路徑:可以是相對路徑也可以是絕對路徑)
mkdir + 目錄路徑/目錄名 創建目錄文件
1.3 刪除文件
刪除普通文件:rm + 文件路徑/文件名
刪除目錄文件
1、 刪除空目錄 rmdir + 目錄路徑/目錄名
rm -r +目錄路徑/ 目錄名 ( -r 是rm的參數)
2、 刪除非空目錄
rm -r +目錄路徑/ 目錄名
1.4 文件複製與重命名
文件複製粘貼
語法: cp [options] source... directory
-a:此選項通常在複製目錄時使用,它保留鏈接、文件屬性,並複製目錄下的所有內容。其作用等於dpR參數組合。
-d:複製時保留鏈接。這裡所說的鏈接相當於Windows系統中的快捷方式。
-f:覆蓋已經存在的目標文件而不給出提示。
-i:與-f選項相反,在覆蓋目標文件之前給出提示,要求用戶確認是否覆蓋,回答"y"時目標文件將被覆蓋。
-p:除複製文件的內容外,還把修改時間和訪問許可權也複製到新文件中。
-r:若給出的源文件是一個目錄文件,此時將複製該目錄下所有的子目錄和文件。
-l:不複製文件,只是生成鏈接文件。
1.5 文件移動
語法:mv [options] source... directory
-i: 若指定目錄已有同名文件,則先詢問是否覆蓋舊文件;
-f: 在 mv 操作要覆蓋某已有的目標文件時不給任何指示;
二、Linux壓縮/解壓文件操作
1.zip
壓縮文件
zip test.zip test.jpg test.png
#將test.jpg和test.png壓縮成一個zip包
zip test.zip *.jpg
#將所有.jpg的文件壓縮成一個zip包
壓縮目錄
zip -r test.zip test
#將文件夾test壓縮成一個zip包
解壓縮
unzip test.zip
#將test.zip中的所有文件解壓出來
#把/home目錄下麵的mydata.zip解壓到mydatabak目錄裡面
unzip mydata.zip -d mydatabak
2.rar
centos預設沒有安裝rar,需要安裝。
wget https://www.rarlab.com/rar/rarlinux-x64-6.0.2.tar.gz
tar -zxvf rarlinux-x64-6.0.2.tar.gz
cd rar
make
如果wget的地址失效,到rar官網下載 http://www.rarsoft.com/download.htm
rar a test.rar test.jpg test.png
#這條命令是將test.jpg和test.png壓縮成一個rar包
rar a test.rar *.jpg
#這條命令是將所有.jpg的文件壓縮成一個rar包
rar a test.rar test
#這條命令是將文件夾test壓縮成一個rar包
解壓縮
unrar e test.rar
#這條命令是將test.rar中的所有文件解壓出來
unrar e test.rar -w 解壓的指定目錄
3.tar
打包文件
tar -cvf file.tar 目錄
#將目錄打包成file.tar
解包
tar xvf xxx.tar
- tar.gz
壓縮文件
tar -zcvf xxx.tar.gz 目錄
#將目錄添加到xxx.tar.gz
參數說明:
-z:表示gz壓縮
-c:建立新的存檔
-x:從存檔展開文件
-v:詳細顯示處理的文件;
-f:指定存檔或設備
解壓縮
tar -zxvf xxx.tar.gz
5.xz
壓縮文件
xz -z 要壓縮的文件
#如果要保留被壓縮的文件加上參數 -k ,如果要設置壓縮率加入參數 -0 到 -9調節壓縮率。如果不設置,預設壓縮等級是6.
解壓縮
xz -d 要解壓的文件
# -k 參數保留被解壓縮的文件
6.tar.xz
創建tar.xz文件
#1.創建xxx.tar文件
tar cvf xxx.tar xxx/
#2.將 xxx.tar壓縮成為 xxx.tar.xz
xz -z xxx.tar
解壓tar.xz文件
#1.將 xxx.tar.xz解壓成 xxx.tar
xz -d xxx.tar.xz
#2.再用 tar xvf xxx.tar來解包
tar xvf xxx.tar
7 .bz2
解壓1:bzip2 -d FileName.bz2
解壓2:bunzip2 FileName.bz2
壓縮: bzip2 -z FileName
.tar.bz2
解壓:tar jxvf FileName.tar.bz2
壓縮:tar jcvf FileName.tar.bz2 DirName
8 .bz
解壓1:bzip2 -d FileName.bz
解壓2:bunzip2 FileName.bz
壓縮:未知
.tar.bz
解壓:tar jxvf FileName.tar.bz
壓縮:未知
9 .Z
解壓:uncompress FileName.Z
壓縮:compress FileName
.tar.Z
解壓:tar Zxvf FileName.tar.Z
壓縮:tar Zcvf FileName.tar.Z DirName
三、Linux的許可權控制
3.1.基礎知識
Linux作為一種多用戶的操作系統(伺服器系統),允許多個用戶同時登陸到系統上,並響應每個用戶的請求。
任何需要使用操作系統的用戶,都需要一個系統賬號,賬號分為:**管理員賬號與普通用戶賬號。**
在Linux中,操作系統**根據UID來判斷用!根據UID來判斷用戶!**
而不是用戶名!**只要id為0就是管理員,哪怕有多個id為0 的賬號**
系統在新建賬號時,會根據賬號類型,自動分配遞增賬號的UID與GID
(用戶身份編號,組編號),也可自行分配。**通常情況下,應當保證UID與GID唯一且不重覆。**
3.1.1 組的類別
在Linux中,每個用戶必須有一個主組。當創建賬號時,系統會自動創建一個同名組作為該賬戶的主組。用戶必須屬於一個且只有一個主組。用戶可以屬於零個或者多個附加組。
3.1.2 用戶與組的配置文件
在Linux中,**萬物皆文件**,所以用戶與組也以配置文件的形式保存在系統中,以下為用戶和組的主要配置文件詳解:
- /etc/passwd:用戶及其屬性信息(名稱、 UID、主組ID等)
- /etc/group:組及其屬性信息
- /etc/shadow:用戶密碼及其相關屬性
- /etc/gshadow:組密碼及其相關屬性
passwd文件格式如下圖:
依次含義為:
- 登錄用戶名
- 密碼
- UID
- GID
- 全名或註釋
- 用戶主目錄
- 用戶預設使用shell
group文件格式如下圖:
依次含義為:
- 群組名稱
- 群組密碼(通常不需要設定,密碼被記錄在/etc/gshadow)
- GID:群組ID
- 附加組(以,來分割,該賬戶沒有附加組所以為空)
shadow文件格式如下圖:
依次含義為:
- 登錄用戶名
- 密碼(通常使用shad512加密)
- 從1970年1月1日起計算到現在為止密碼最近一次被更改的時間
- 密碼再過幾天就可以被修改(0表示隨時可改)
- 密碼幾天後必須變更(99999表示永不過期)
- 密碼過期前多久提示用戶
- 密碼過期多久後賬戶將被鎖定
- 多少天後賬戶將失效(從1970-1-1算起)
gshadow文件格式如下圖:
依次含義為:
- 群組名稱
- 群組密碼
- 組管理員列表
- 當前用戶的附加組
3.2.用戶賬號管理
在Linux,管理員在預設情況下為root賬戶,UID=0。普通用戶UID預設範圍為1-65535。在centos
6中,新建用戶,預設系統用戶的UID範圍為1-499。普通用戶為500+。在centos
7中,系統用戶範圍為1-999。普通用戶為1000+。**對系統的操作許可權由用戶決定。**
通常對用戶賬號的操作分為添加,修改,刪除。
3.2.1 添加賬戶
通過:useradd命令,來添加用戶語法如下:
useradd [opentions] login
參數說明:
-
-u UID 自定義UID (預設系統遞增)
-
-o 配合-u 選項,不檢查UID的唯一性(不建議)
-
-g GID:指明用戶所屬基本組,可為組名,也可以GID
-
-c comment 指定一段註釋性描述。
-
-d 目錄
指定用戶主目錄,如果此目錄不存在,則同時使用-m選項,可以創建主目錄。 -
-g 用戶組 指定用戶所屬的用戶組。
-
-G 用戶組,用戶組 指定用戶所屬的附加組。
-
-s Shell文件 指定用戶的登錄Shell。
-
-u 用戶號
指定用戶的用戶號,如果同時有-o選項,則可以重覆使用其他用戶的標識號。
實例1
# useradd -d /usr/ddz ddz
創建了一個用戶ddz,並將他的家目錄設置到/user/ddz
實例2
groupadd 組名 添加用戶組 -g :添加組時指定組ID groupmod 組名 修改用戶組信息 -n :修改組名 -g :修改組ID groupdel 組名 刪除組 *如果一個組下有用戶,那麼這個組是無法刪除的。
# useradd -s /sbin/bash -g root –G mage,wang ddz
此命令新建了一個用戶ddz,設置該用戶使用的shell為/sbin/bash,設置他的主組屬於group用戶組,設置附加組為mage和wang。(**當設置組時,要保證組已經存在,否則請先創建該組**)
小技巧:
- 增加用戶賬號就是在/etc/passwd文件中為新用戶增加一條記錄,同時系統會**自動更新**其他系統文件如/etc/shadow,
/etc/group等。 - 通常情況創建賬戶,賬戶ID會按照最大的值遞增,但是遞增的值必須在最大範圍內。
- 在部署軟體時,通常會需要使用賬戶,所以需要指定UID,來部署所有的賬號都用同一個UID,來方便管理。
- newusers [passwd格式文件]
用於批量創建賬戶,只需要每一列賬戶信息格式,按照passwd中書寫,之後上傳到Linux中替換即可。 - chpasswd 批量修改用戶口令。將文件格式寫為:user:passwd
。每行一個,之後倒入linux即可。 - 創建賬戶的預設值設定位於:
/etc/default/useradd文件中,該文件記錄了創建用戶賬戶時的預設信息,可通過修改該文件來修改創建賬戶時的信息。
3.2.2 刪除帳號
如果一個用戶的賬號不再使用,可以從系統中刪除。刪除用戶賬號就是要將/etc/passwd等系統文件中的該用戶記錄刪除,必要時還刪除用戶的主目錄。
通常在運維工作中,一般使用讓賬號失效,果然修改賬戶名的方式,來便捷的操作賬號。
刪除一個已有的用戶賬號使用userdel
命令,其格式如下:
userdel 選項 用戶名
常用的選項是 -r,它的作用是把用戶的主目錄一起刪除。
例如:
# userdel -r sam
此命令刪除用戶sam在系統文件中(主要是/etc/passwd, /etc/shadow,
/etc/group等)的記錄,同時刪除用戶的主目錄。
刪除賬號需要該賬戶沒有人在使用,才能刪除成功。請使用命令刪除,不要去手動改文件。
3.2.3 修改帳號
修改用戶賬號就是根據實際情況更改用戶的有關屬性,如用戶號、主目錄、用戶組、登錄Shell等。
修改已有用戶的信息使用usermod
命令,其格式如下:
usermod 選項 用戶名
常用的選項包括-c, -d, -m, -g, -G, -s, -u以及-o等
,這些選項的意義與useradd
命令中的選項一樣,可以為用戶指定新的資源值。
另外,有些系統可以使用選項:-l 新用戶名
這個選項指定一個新的賬號,即將原來的用戶名改為新的用戶名。
例如:
# usermod -s /bin/ksh -d /home/z -g developer sam
此命令將用戶sam的登錄Shell修改為ksh,主目錄改為/home/z,用戶組改為developer。
3.2.4 查詢賬號口令
id [opentions] [User]
相關參數:
- -u:顯示UID
- -g:顯示GID
- -G:顯示用戶所屬的組ID
- -n:顯示名稱
3.2.5 用戶口令的管理
用戶管理的一項重要內容是用戶口令的管理。用戶賬號剛創建時沒有口令,但是被系統鎖定,無法使用(在passwd文件中,密碼列顯示為!!或者!表示用戶被鎖定,是無法登陸的),必須為其指定口令後才可以使用,即使是指定空口令。
指定和修改用戶口令的Shell命令是passwd
。超級用戶可以為自己和其他用戶指定口令,普通用戶只能用它修改自己的口令。命令的格式為:
passwd 選項 用戶名
可使用的選項:
- -l 鎖定口令,即禁用賬號。
- -u 口令解鎖。
- -d 使賬號無口令。
- -f 強迫用戶下次登錄時修改口令。
如果預設用戶名,則修改當前用戶的口令。
例如,假設當前用戶是sam,則下麵的命令修改該用戶自己的口令:
$ passwd
Old password:******
New password:*******
Re-enter new password:*******
如果是超級用戶,可以用下列形式指定任何用戶的口令:
# passwd sam
New password:*******
Re-enter new password:*******
普通用戶修改自己的口令時,passwd命令會先詢問原口令,驗證後再要求用戶輸入兩遍新口令,如果兩次輸入的口令一致,則將這個口令指定給用戶;而超級用戶為用戶指定口令時,就不需要知道原口令。
為了系統安全起見,用戶應該選擇比較複雜的口令,例如最好使用8位長的口令,口令中包含有大寫、小寫字母和數字,並且應該與姓名、生日等不相同。
為用戶指定空口令時,執行下列形式的命令:
# passwd -d sam
此命令將用戶sam的口令刪除,這樣用戶sam下一次登錄時,系統就不再詢問口令。
passwd命令還可以用-l(lock)選項鎖定某一用戶,使其不能登錄,例如:
# passwd -l sam
利用組來簡化授權操作,當對整個組授權時,整個組下的賬號許可權都會進行修改
其他 : 用戶相關的其他指令
chfn [USER] 修改用戶的備註文檔
chsh [Shell] 修改用戶的指定shell
3.用戶組
3.3.用戶組的管理
每個用戶都有一個用戶組,**系統可以對一個用戶組中的所有用戶進行集中管理**。不同Linux
系統對用戶組的規定有所不同,如Linux下的用戶屬於與它同名的用戶組,這個用戶組在創建用戶時同時創建。
用戶組的管理涉及用戶組的添加、刪除和修改。組的增加、刪除和修改實際上就是對/etc/group文件的更新。
3.3.1增加組
1、增加一個新的用戶組使用groupadd命令。其格式如下:
groupadd 選項 用戶組
可以使用的選項有:
- -g GID 指定新用戶組的組標識號(GID)。
- -o
一般與-g選項同時使用,表示新用戶組的GID可以與系統已有用戶組的GID相同。 - -r 創建系統組
實例1:
# groupadd group1
此命令向系統中增加了一個新組group1,新組的組標識號是在當前已有的最大組標識號的基礎上加1。
實例2:
# groupadd -g 101 group2
此命令向系統中增加了一個新組group2,同時指定新組的組標識號是101。
3.3.2 刪除組
2、如果要刪除一個已有的用戶組,使用groupdel命令,其格式如下:
groupdel 用戶組
例如:
# groupdel group1
此命令從系統中刪除組group1。**要想刪除組,要確保該組不是主組,才能把這個組刪掉。**
3.3.3 修改組
3、修改用戶組的屬性使用groupmod命令。其語法如下:
groupmod 選項 用戶組
常用的選項有:
- -g GID 為用戶組指定新的組標識號。
- -o 與-g選項同時使用,用戶組的新GID可以與系統已有用戶組的GID相同。
- -n新用戶組 將用戶組的名字改為新名字
實例1:
# groupmod -g 102 group2
此命令將組group2的組標識號修改為102。
實例2:
# groupmod –g 10000 -n group3 group2
此命令將組group2的標識號改為10000,組名修改為group3。
3.3.4 切換組(臨時切換主組)
4、如果一個用戶同時屬於多個用戶組,那麼用戶可以在用戶組之間切換,以便具有其他用戶組的許可權。
用戶可以在登錄後,使用命令newgrp切換到其他用戶組,這個命令的參數就是目的用戶組。例如:
$ newgrp root
這條命令將當前用戶切換到root用戶組,前提條件是root用戶組確實是該用戶的主組或附加組。類似於用戶賬號的管理,用戶組的管理也可以通過集成的系統管理工具來完成。
3.5 更改查看組成員
5 、可以通過以下命令,來更改和查看組中的成員
#groupmems [opentions] [action]
參數如下:
- -g 更改為指定組(只有root可以使用)
- -a 指定用戶加入組
- -d 從組中刪除該用戶
- -p 從組中清楚所有成員
- -l 顯示組成員列表
實例1
$groupmems -l -g root
此命令表示查看root組中存在的成員。
實例2
$groupmems -a Father -g root
此命令表示將Father用戶加入root組中。
小技巧:
- 一個用戶可以加入不同的組,但是有且只有一個主組。
- 一個用戶的許可權為他所屬的多個組的累加許可權 。假設user賬戶附加組group1
= write group2 = read ,那麼user就擁有 write + read許可權。 - 組和用戶的關係是多對多
一個用戶可以有多個組,一個組也可以有多個用戶。 - 在windows中,只有管理員才允許對用戶組進行操作,但在Linux中,只要有組的口令,就可以讓賬號進入組。
- root組的許可權與普通組許可權大致相同!!賬號並不是加入root組就能獲得用戶許可權!
3.4 文件的許可權控制
3.4.1 文件許可權與歸屬
在Linux系統中,每個文件都有歸屬的所有者和所有組,並且規定了文件的所有者、所有組以及其他人對文件所擁有的讀(r)、寫(w)、執行(x)等許可權。對於一般文件來說,許可權比較容易理解:"可讀"表示能夠讀取文件的實際內容;"可寫"表示能夠編輯、新增、修改、刪除文件的實際內容;"可執行"則表示能夠運行一個腳本程式。但是,對於目錄文件來說,理解其許可權設置來就不那麼容易了。很多資深Linux用戶其實也沒有真正搞明白。對目錄文件來說,"可讀"表示能夠讀取目錄內的文件列表;"可寫"表示能夠在目錄內新增、刪除、重命名文件;而"可執行"則表示能夠進入該目錄。可以參考表格5-5,幫助同學們理解當文件和目錄被設置rwx許可權後,能夠被執行的命令的區別:
表5-5 讀寫執行許可權對於文件與目錄可執行命令的區別
文件的讀、寫、執行許可權英文全稱分別是read、write、execute,可以簡寫為r、w、x,亦可分別用數字4、2、1來表示,文件所有者,所屬組及其他用戶許可權之間無關聯,如表5-6所示。
表5-6 文件許可權的字元與數字表示
文件許可權的數字法表示基於字元(rwx)的許可權計算而來,其目的是簡化許可權的表示方式。例如,若某個文件的許可權為**7**則代表可讀、可寫、可執行(4+2+1);若許可權為6則代表可讀、可寫(4+2)。我們來看這樣一個例子。現在有這樣一個文件,其所有者擁有可讀、可寫、可執行的許可權,其文件所屬組擁有可讀、可寫的許可權;而且其他人只有可讀的許可權。那麼,這個文件的許可權就是rwxrw-r--,數字法表示即為764。不過大家千萬別再將這三個數字相加,計算出7+6+4=17的結果,這是小學的數學加減法,不是Linux系統的許可權數字表示法,三者之間沒有互通關係。
以rw-r-x-w-許可權為例進行講解,要想轉換成數字法,首先要進行各個位之上的數字替代,如圖5-1所示。
圖5-1 字元與數字許可權轉換示意圖
減號是占位符,代表這裡沒有許可權,數字法用0表示,也就是說rw-轉換後是420,r-x轉換後是401,-w-轉換後是020,三組數字之間每組數字進行相加後得出652便是轉換後的數字法許可權。
而數字法轉回到字元許可權相比來說就有些難度了,以652許可權為例進行講解。首先數字6是由4+2得到的,不可能是4+1+1,因為每個許可權只能占一位,所以數字5則是4+1得到的,2便是本身,沒有許可權即是空值0,可以按照表5-6所示的格式填寫進去後得到420401020這樣一串數字。有了這些信息就好辦了,如圖5-2所示,把他們都轉換回來。
圖5-2 數字與字元許可權轉換示意圖
心中牢記------文件的所有者、所有組和其他人許可權之間無關聯,不要寫成rrwwx----的樣子,一定要把rwx許可權位對應到正確的位置,寫成rw-r-x-w-。
Linux系統的文件許可權相當複雜,但是用途很廣泛,建議大家把它徹底搞清楚之後再學習下一節的內容。現在來練習一下。請各位讀者分別計算數字表示法764、652、153、731所對應的字元表示法,然後再把rwxrw-r--、rw--w--wx、rw-r--r--轉換成數字表示法。
下麵我們利用上文講解的知識,一起分析圖5-3中所示的文件信息。
圖5-3 通過ls命令查看到的文件屬性信息
在圖5-3中,包含了文件的類型、訪問許可權、所有者(屬主)、所屬組(屬組)、占用的磁碟大小、最後修改時間和文件名稱等信息。通過分析可知,該文件的類型為普通文件,所有者許可權為可讀、可寫(rw-),所屬組許可權為可讀(r--),除此以外的其他人也只有可讀許可權(r--),文件的磁碟占用大小是34298位元組,最近一次的修改時間為4月2日的凌晨23分,文件的名稱為install.log。
其中排在許可權前面的減號(-)是文件類型,新手經常會把它跟無許可權混淆。儘管在Linux系統中一切都是文件,但是不同的文件由於作用不同,因此類型也不盡相同,有一點點像Windows系統的尾碼名。常見的文件類型包括有:普通文件(-)、目錄文件(d)、鏈接文件(l)、管道文件(p)、塊設備文件(b)以及字元設備文件(c)。
普通文件的範圍特別廣泛,比如純文本信息、服務配置信息、日誌信息以及Shell腳本等等都包含在內,所以幾乎在每個目錄下都能看到普通文件(-)和目錄文件(d)的身影。塊設備文件(b)和字元設備文件(c)一般是指硬體設備,比如滑鼠、鍵盤、光碟機、硬碟等等都是設備文件,主要集中在/dev/目錄中最為常見,不過其實很少會對滑鼠鍵盤進行硬體級別的管理吧~
3.4.2 文件的特殊許可權
在複雜多變的生產環境中,單純設置文件的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。
[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1312 Jul 21 05:08 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 34512 Aug 13 2018 /bin/passwd
醒目的紅色提醒告誡著用戶一定要小心這個許可權,因為一旦某個命令文件被設置上了SUID許可權,那麼就意味著凡是執行的人都可以臨時獲取到更高的許可權,千萬不要設置到vim、cat、rm等命令上面!!!
2. SGID
SGID特殊許可權有兩種應用場景,當對二進位程式進行設置時,能夠讓執行者臨時獲取到文件所有組的許可權;而對目錄進行設置時,則是讓目錄內新創建的文件自動繼承該目錄原有用戶組的名稱。
第一種功能是參考SUID而設計的,不同點在於執行程式的用戶獲取的不再是文件所有者的臨時許可權,而是獲取到文件所屬組的許可權。舉例來說,在早期的Linux系統中,/dev/kmem是一個字元設備文件,用於存儲內核程式要訪問的數據,許可權為:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
大家看出問題了嗎?除了root管理員或屬於system組成員外,所有用戶都沒有讀取該文件的許可權。由於在平時我們需要查看系統的進程狀態,為了能夠獲取到進程的狀態信息,可在用於查看系統進程狀態的ps命令文件上增加SGID特殊許可權位。查看ps命令文件的屬性信息:
-r-xr-**s**r-x 1 bin system 59346 Feb 11 2017 ps
這樣一來,由於ps命令被增加了SGID特殊許可權位,所以當用戶執行該命令時,也就臨時獲取到了system用戶組的許可權,從而順利地讀取到了設備文件。
前文提到,每個文件都有其歸屬的所有者和所屬組,當創建或傳送一個文件後,這個文件就會自動歸屬於執行這個操作的用戶(即該用戶是文件的所有者)。如果現在需要在一個部門內設置共用目錄,讓部門內的所有人員都能夠讀取目錄中的內容,那麼就可以創建部門共用目錄後,在該目錄上設置SGID特殊許可權位。這樣,部門內的任何人員在裡面創建的任何文件都會歸屬於該目錄的所屬組,而不再是自己的基本用戶組。此時,用到的就是SGID的第二個功能,即在某個目錄中創建的文件自動繼承該目錄的用戶組(只可以對目錄進行設置)。
[root@linuxprobe ~]# cd /tmp
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x. 2 root root 6 Oct 27 23:44 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir
[root@linuxprobe tmp]# chmod -R g+s testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx. 2 root root 6 Oct 27 23:44 testdir
在使用上述命令設置好目錄的777許可權(確保普通用戶可以向其中寫入文件),併為該目錄設置了SGID特殊許可權位後,就可以切換至一個普通用戶,然後嘗試在該目錄中創建文件,並查看新創建的文件是否會繼承新創建的文件所在的目錄的所屬組名稱:
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r--. 1 linuxprobe root 15 Oct 27 23:47 test
除了上面提到的SGID的這兩個功能,再介紹兩個與本小節內容相關的命令:chmod和chown。
chmod命令用於設置文件的一般許可權及特殊許可權,英文全稱為:"change
mode",語法格式為:"chmod [參數] 文件名"。
這是一個與日常設置文件許可權強相關的命令,例如要把一個文件的許可權設置成其所有者可讀可寫可執行、所屬組可讀可寫、其他人沒有任何許可權,則相應的字元法表示為rwxrw----,其對應的數字法表示為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命令用於設置文件的所有者和所有組,英文全稱為:"change
own",語法格式為:"chown 所有者:所有組 文件名"。
chmod和chown命令是用於修改文件屬性和許可權的最常用命令,它們還有一個特別的共性,就是針對目錄進行操作時需要加上大寫參數-R來表示遞歸操作,即對目錄內所有的文件進行整體操作。
使用"所有者:所有組"的格式輕鬆把剛剛那個文件的所屬信息修改一下,變更後的效果如下:
[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
現在,大學里的很多老師都要求學生將作業上傳到伺服器的特定共用目錄中,但總是有幾個"破壞分子"喜歡刪除其他同學的作業,這時就要設置SBIT(Sticky
Bit)特殊許可權位了(也可以稱之為特殊許可權位之粘滯位)。SBIT特殊許可權位可確保用戶只能刪除自己的文件,而不能刪除其他用戶的文件。換句話說,當對某個目錄設置了SBIT粘滯位許可權後,那麼該目錄中的文件就只能被其所有者執行刪除操作了。
最初不知道是哪位非資深技術人員將Sticky
Bit直譯成了"粘滯位",劉遄老師建議將其稱為"保護位",這既好記,又能立刻讓人瞭解它的作用。RHEL
8系統中的/tmp作為一個共用文件的目錄,預設已經設置了SBIT特殊許可權位,因此除非是該目錄的所有者,否則無法刪除這裡面的文件。
與前面所講的SUID和SGID許可權顯示方法不同,當目錄被設置SBIT特殊許可權位後,文件的其他人許可權部分的x執行許可權就會被替換成t或者T,原本有x執行許可權則會寫成t,原本沒有x執行許可權則會被寫成T。
/tmp目錄上的SBIT許可權預設已經存在,體現為"其他用戶"許可權欄位的許可權變為rwt:
[root@linuxprobe ~]# ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Oct 28 00:29 /tmp
其實,文件能否被刪除並不取決於自身的許可權,而是看其所在目錄是否有寫入許可權(其原理會在下個章節講到)。為了避免現在很多讀者不放心,所以下麵的命令還是賦予了這個test文件最大的777許可權(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
隨後,切換到一個普通用戶身份下,嘗試刪除這個其他人創建的文件就會發現,即便讀、寫、執行許可權全開,但是由於SBIT特殊許可權位的緣故,依然無法刪除該文件:
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ rm -f test
rm: cannot remove 'test': Operation not permitted
工作中對特殊許可權善加使用,能夠實現很多巧妙的功能,chmod命令設置特殊許可權時的參數如表5-7所示。
表5-7 SUID、SGID、SBIT特殊許可權的設置參數
參數 作用
u+s 設置SUID許可權
u-s 取消SUID許可權
g+s 設置SGID許可權
g-s 取消SGID許可權
o+t 設置SBIT許可權
o-t 取消SBIT許可權
切換回root管理員的身份下,在家目錄中創建一個名為linux的新目錄,隨後設置上SBIT許可權吧:
[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參數是在一般許可權已經設置完畢的前提下,又新增了一項特殊許可權,那如果我們想一般許可權和特殊許可權一起設置,有什麼高效率的方法呢?
其實SUID、SGID與SBIT也有對應的數字法表示,分別即是4、2、1。也就是說777還不是最大許可權,滿許可權應該是7777,第一個數字代表的是特殊許可權位。既然知道了數字表示法是由"特殊許可權+一般許可權"構成的,那就以上面linux目錄的許可權為例為同學們梳理下計算方法吧。
在"rwxr-xr-t"許可權中,最後一位是t,代表該文件的一般許可權為"rwxr-xr-x",並帶有SBIT特殊許可權。對於讀(r)、寫(w)、執行(x)許可權的數字計算方法大家應該很熟悉了------即755,而SBIT特殊許可權位是1,合併後結果為1755。
再增加點難度,如果許可權是"rwsrwSr--"呢?首先不要慌,看到大寫S代表原先沒有執行許可權,因此一般許可權為"rwxrw-r--",數字法計算後結果是764。帶有的SUID和SGID特殊許可權數字法表示是4和2,心算得出結果是6,合併後結果為6764。這個示例確實難度高一些,讀者們可以參考學習圖5-4的計算過程,搞明白了再往下看。
圖5-4 許可權的字元表示法轉數字表示法
將數字法轉換成回字元法難度略微高一些,以5537為例為大家講解。首先特殊許可權的5是由4+1組成的,意味著是有SUID和SBIT。SUID和SGID的寫法是原先有執行許可權則是小寫s,如果沒有執行許可權則是大寫S,而SBIT的寫法則是原先有執行許可權是小寫t,沒有執行許可權是大寫T。一般許可權的537進行字元轉換後應為"r-x-wxrwx",然後在此基礎上增加SUID和SGID特殊許可權,合併後結果是"r-s-wxrwt"。可以參考圖5-5所示的計算過程來學習理解。
圖5-5 許可權的數字表示法轉字元標識法
3.4.3 文件的隱藏屬性
Linux系統中的文件除了具備一般許可權和特殊許可權之外,還有一種隱藏許可權,即被隱藏起來的許可權,預設情況下不能直接被用戶發覺。有用戶曾經在生產環境和RHCE考試題目中碰到過明明許可權充足但卻無法刪除某個文件的情況,或者僅能在日誌文件中追加內容而不能修改或刪除內容,這在一定程度上阻止了黑客篡改系統日誌的圖謀,因此這種"奇怪"的文件也保障了Linux系統的安全性。
既然叫隱藏許可權了,那肯定不能用常規的ls命令就讓我們看到它的真面目,專用的設置命令是chattr,專用的查看命令是lsattr。
1. chattr命令
chattr命令用於設置文件的隱藏許可權,英文全稱為:"change
attributes",語法格式為:"chattr [參數] 文件名稱"。
如果想要把某個隱藏功能添加到文件上,則需要在命令後面追加"+參數",如果想要把某個隱藏功能移出文件,則需要追加"-參數"。chattr命令中可供選擇的隱藏許可權參數非常豐富,具體如表5-8所示。
表5-8 chattr命令中的參數及其作用
參數 作用
i 無法對文件進行修改;若對目錄設置了該參數,則僅能修改其中的子文件內容而不能新建或刪除文件
a 僅允許補充(追加)內容,無法覆蓋/刪除內容(Append Only)
S 文件內容在變更後立即同步到硬碟(sync)
s 徹底從硬碟中刪除,不可恢復(用0填充原文件所在硬碟區域)
A 不再修改這個文件或目錄的最後訪問時間(atime)
b 不再修改文件或目錄的存取時間
D 檢查壓縮文件中的錯誤
d 使用dump命令備份時忽略本文件/目錄
c 預設將文件或目錄進行壓縮
u 當刪除該文件後依然保留其在硬碟中的數據,方便日後恢復
t 讓文件系統支持尾部合併(tail-merging)
x 可以直接訪問壓縮文件中的內容
為了讓讀者能夠更好地見識隱藏許可權的效果,我們先來創建一個普通文件,然後立即嘗試刪除(這個操作肯定會成功):
[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
實踐是檢驗真理的唯一標準。如果您沒有親眼見證過隱藏許可權強大功能的美妙,就一定不會相信原來Linux系統會如此安全。接下來再次新建一個普通文件,併為其設置不允許刪除與覆蓋(+a參數)許可權,然後再嘗試將這個文件刪除:
[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
可見,上述操作失敗了。
2. lsattr命令
lsattr命令用於查看文件的隱藏許可權,英文全稱為:"list
attributes",語法格式為:"lsattr [參數] 文件名稱"。
在Linux系統中,文件的隱藏許可權必須使用lsattr命令來查看,平時使用的ls之類的命令則看不出端倪:
[root@linuxprobe ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe
一旦使用lsattr命令後,文件上被賦予的隱藏許可權馬上就會原形畢露:
[root@linuxprobe ~]# lsattr linuxprobe
-----a---------- linuxprobe
此時按照顯示的隱藏許可權的類型(字母),使用chattr命令將其去掉:
[root@linuxprobe ~]# chattr -a linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
---------------- linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
一般我們會將-a參數設置到日誌文件(/var/log/messages)上面,這樣在不影響系統正常寫入日誌的前提下,還可以防止駭客清理自己的作案證據。如果希望徹底的保護起某個文件,不允許任何人修改和刪除它的話,不妨加上-i參數試試,效果特別好。
在熱映美劇《越獄》的第一季中,主人公邁克爾·斯科菲爾德(Scofield)把裝有越獄計劃的硬碟開窗扔進了湖中,結果在第二季被警探打撈出來恢復了數據,又有了第二、第三、第四、第五季......他和哥哥的逃亡故事。所以想徹底刪除某個文件時,可以使用-s參數來保證其被刪除後不可恢復,文件的硬碟數據會被用零塊重新填充,那就更保險了。
3.4.4 文件訪問控制列表
不知道大家是否發現,前文講解的一般許可權、特殊許可權、隱藏許可權其實有一個共性------許可權是針對某一類用戶設置的,能夠對很多人同時生效。如果希望對某個指定的用戶進行單獨的許可權控制,就需要用到文件的訪問控制列表(FACL,File
Access Control
Lists)了。通俗來講,基於普通文件或目錄設置ACL訪問控制其實就是針對指定的用戶或用戶組設置文件或目錄的操作許可權,更加精準的派發許可權。另外,如果針對某個目錄設置了ACL,則目錄中的文件會繼承其許可權;若針對文件設置了ACL,則文件不再繼承其所在目錄的許可權。
為了更直觀地看到ACL對文件許可權控制的強大效果,我們先切換到普通用戶,然後嘗試進入root管理員的家目錄中。在沒有針對普通用戶對root管理員的家目錄設置ACL之前,其執行結果如下所示:
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ cd /root
-bash: cd: /root: Permission denied
[gerry@gerry root]$ exit
1. setfacl命令
setfacl命令用於管理文件的ACL許可權規則,英文全稱為:"set files
ACL",語法格式為:" setfacl [參數] 文件名稱"。
ACL許可權提供的是在所有者、所屬組、其他人的讀/寫/執行許可權之外的特殊許可權控制,使用setfacl命令可以針對單一用戶或用戶組、單一文件或目錄來進行讀/寫/執行許可權的控制。其中,針對目錄文件需要使用-R遞歸參數;針對普通文件則使用-m參數;如果想要刪除某個文件的ACL,則可以使用-b參數。setfacl命令的常用參數如表5-9所示:
表5-9 setfacl命令中的參數以及作用
參數 作用
-m 修改許可權
-M 從文件中讀取許可權
-x 刪除某個許可權
-b 刪除全部許可權
-R 遞歸子目錄
例如我們原本是無法進入到/root目錄中的,現在給這位普通用戶單獨設置下許可權吧:
[root@gerry ~]# setfacl -Rm u:gerry:rwx /root
隨後再切換到這位普通用戶的身份下,就能正常進入了呢:
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ cd /root
[gerry@linuxprobe root]$ ls
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
[gerry@gerry root]$ exit
是不是覺得效果很酷呢?但是現在有這樣一個小問題---怎麼去查看文件上有那些ACL呢?常用的ls命令是看不到ACL表信息的,但是卻可以看到文件的許可權最後一個點(**.**)變成了加號(**+**),這就意味著該文件已經設置了ACL了。現在大家是不是感覺學得越多,越不敢說自己精通Linux系統了吧?就這麼一個不起眼的點(.),竟然還表示這麼一種重要的許可權。
[root@gerry ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2020 /root
2. getfacl命令
getfacl命令用於查看文件的ACL許可權規則,英文全稱為:"get files
ACL",語法格式為:" getfacl [參數] 文件名稱"。
getfacl命令用於顯示文件上設置的ACL信息,格式為"getfacl
文件名稱"。Linux系統中的命令就是這麼又可愛又好記。想要設置ACL,用的是setfacl命令;要想查看ACL,則用的是getfacl命令。下麵使用getfacl命令顯示在root管理員家目錄上設置的所有ACL信息。
[root@gerry ~]# getfacl /root
ggetfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
ACL許可權還可以針對某個用戶組來設置,例如允許某個組的用戶都可以讀寫/etc/fstab個文件:
[root@gerry ~]# setfacl -m g:gerry:rw /etc/fstab
[root@gerry ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:gerry:rw-
mask::rw-
other::r--
設置錯了想刪除?沒問題!清空所有ACL許可權用-b參數,指定刪除某一條許可權就用-x參數:
[root@gerry ~]# setfacl -x g:gerry /etc/fstab
[root@gerry ~]# 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--
對於ACL許可權的設置都是立即且永久生效的,不需要再編輯什麼配置文件,這點特別方便~但是也有個安全隱患,如果我們不小心設置錯了許可權怎麼辦?就會覆蓋掉文件原始的許可權信息,並且永遠都找不回來了。
操作前備份一下,總是好的習慣。
例如將/home目錄上的ACL許可權備份一份,要用-R遞歸參數,這樣不僅能夠把目錄本身的許可權備份了,裡面的文件許可權也都能自動備份,另再外加上第3章節學習過的輸出重定向操作就可以實現。需要註意getfacl在備份目錄許可權時不能使用絕對路徑的形式,因此我們需要先切換到最上層根目錄,然後再進行操作:
[root@linuxprobe ~]# cd /
[root@linuxprobe /]# getfacl -R home > backup.acl
[root@linuxprobe /]# ls -l
-rw-r--r--. 1 root root 834 Jul 18 14:14 backup.acl
ACL許可權的恢復也很簡單,使用的是"--restore"參數,由於備份時已經指定了是對home目錄進行的操作,所以不需要寫對應的目錄名稱,它能夠自動找到要恢復的對象:
[root@linuxprobe /]# setfacl --restore backup.acl
3.4.5 su命令與sudo服務
各位讀者在實驗環境中很少遇到安全問題,並且為了避免因許可權因素導致配置服務失敗,從而建議使用root管理員來學習本書,但是在生產環境中還是要對安全多一份敬畏之心,不要用root管理員去做所有事情。因為一旦執行了錯誤的命令,可能會直接導致系統崩潰,這樣一來,不但客戶指責、領導批評,沒準獎金也會雞飛蛋打。但轉頭一想,儘管Linux系統為了安全性考慮,使得許多系統命令和服務只能被root管理員來使用,但是這也讓普通用戶受到了更多的許可權束縛,從而導致無法順利完成特定的工作任務。
su命令可以解決切換用戶身份的需求,使得當前用戶在不退出登錄的情況下,順暢地切換到其他用戶,比如從root管理員切換至普通用戶:
[root@linuxprobe ~]# su - gerry
[gerry@gerry ~]$ id
uid=1000(gerry) gid=1000(gerry) groups=1000(gerry) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
細心的讀者一定會發現,上面的su命令與用戶名之間有一個減號(-),這意味著完全切換到新的用戶,即把環境變數信息也變更為新用戶的相應信息,而不是保留原始的信息。強烈建議在切換用戶身份時添加這個減號(-)。
另外,當從root管理員切換到普通用戶時是不需要密碼驗證的,而從普通用戶切換成root管理員就需要進行密碼驗證了;這也是一個必要的安全檢查:
[linuxprobe@linuxprobe ~]$ su - root
Password: 此處輸入管理員密碼
[root@linuxprobe ~]#
儘管像上面這樣使用su命令後,普通用戶可以完全切換到root管理員身份來完成相應工作,但這將暴露root管理員的密碼,從而增大了系統密碼被黑客獲取的幾率;這並不是最安全的方案。
接下來將介紹如何使用sudo命令把特定命令的執行許可權賦予給指定用戶,這樣既可保證普通用戶能夠完成特定的工作,也可以避免泄露root管理員密碼。我們要做的就是合理配置sudo服務,以便兼顧系統的安全性和用戶的便捷性。
Tips
授權原則:在保證普通用戶完成相應工作的前提下,儘可能少地賦予額外的許可權。
sudo命令用於給普通用戶提供額外的許可權,語法格式為:" sudo [參數]
用戶名"。
使用sudo命令可以給普通用戶提供額外的許可權來完成原本只有root管理員才能完成的任務。可以限制用戶執行指定的命令、記錄用戶執行過的每一條命令、集中的管理用戶與許可權(/etc/sudoers)以及驗證密碼後一段時間內免驗證的方便措施。常見的sudo命令可用參數如表5-10所示:
表5-10 sudo命令中的可用參數以及作用
參數 作用
-h 列出幫助信息
-l 列出當前用戶可執行的命令
-u 用戶名或UID值 以指定的用戶身份執行命令
-k 清空密碼的有效時間,下次執行sudo時需要再次進行密碼驗證
-b 在後臺執行指定的命令
-p 更改詢問密碼的提示語
當然,如果擔心直接修改配置文件會出現問題,則可以使用sudo命令提供的visudo命令來配置用戶許可權。
visudo命令用於編輯配置用戶sudo許可權文件,語法格式為:" visudo [參數]"。
這是一條會自動調用vi編輯器來配置/etc/sudoers許可權文件的命令,能夠解決多個用戶同時修改許可權而導致的衝突問題,不僅如此,visudo命令還可以對配置文件內的參數進行語法檢查,在發現參數錯誤時進行報錯提醒,比用戶直接修改文件更友好、安全、方便。
>>> /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命令配置許可權文件時,其操作方法與Vim編輯器中用到的方法完全一致,因此在編寫完成後記得在末行模式下保存並退出。配置許可權文件時,按照下麵的格式將第101行(大約)填寫上指定的信息:
誰可以使用 允許使用的主機=(以誰的身份) 可執行命令的列表
誰可以使用:稍後要為那位用戶進行命令授權。
允許使用的主機:可以填寫ALL代表不限制來源主機,亦可填寫如192.168.10.0/24的網段限制來源地址,只有從允許網段登錄時才能使用sudo命令。
以誰的身份:可以填寫ALL代表系統最高許可權,也可以是另外一位用戶的名字。
可執行命令的列表:可以填寫ALL代表不限制命令的列表,亦可填寫如/usr/bin/cat的文件名稱來限制命令列表,多個命令文件之間用逗號(,)間隔。
在Linux系統中配置服務文件時,雖然沒有硬性規定,但從經驗來講新增的參數位置不建議太靠上,避免服務一些必要的功能沒載入完成時,我們填寫的新參數不被執行成功。一般會在配置文件中找一下相似的參數,然後在相鄰位置進行新的修改,或者選擇文件的中下部位置。
[root@gerry ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 gerry ALL=(ALL) ALL
在填寫完畢後記得要先保存再退出,然後切換至指定的普通用戶身份,此時就可以用sudo
-l命令查看到所有可執行的命令了(下麵的命令中,驗證的是該普通用戶的密碼,而不是root管理員的密碼,請讀者不要搞混了):
[root@gerry ~]# su - gerry
[gerry@gerry ~]$ 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 linuxprobe: 此處輸入linuxprobe用戶的密碼
Matching Defaults entries for linuxprobe on localhost:
!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
User linuxprobe may run the following commands on localhost:
(ALL) ALL
接下來是見證奇跡的時刻!作為一名普通用戶,是肯定不能看到root管理員的家目錄(/root)中的文件信息的,但是,只需要在想執行的命令前面加上sudo命令就行了:
[linuxprobe@linuxprobe ~]$ ls /root
ls: cannot open directory '/root': Permission denied
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
效果立竿見影!但是考慮到生產環境中不允許某個普通用戶擁有整個系統中所有命令的最高執行權(這也不符合前文提到的許可權賦予原則,即儘可能少地賦予許可權),因此ALL參數就有些不合適了。因此只能賦予普通用戶具體的命令以滿足工作需求,這也受到了必要的許可權約束。如果需要讓某個用戶只能使用root管理員的身份執行指定的命令,切記一定要給出該命令的絕對路徑,否則系統會識別不出來,這時可以先使用whereis命令找出命令所對應的保存路徑:
[linuxprobe@linuxprobe ~]$ exit
logout
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# whereis reboot
reboot: /usr/sbin/reboot /usr/share/man/man2/reboot.2.gz /usr/share/man/man8/reboot.8.gz
然後使用visudo命令繼續編輯許可權文件,將原先101行所新增的參數作如下修改,多個命令之間用逗號(,)間隔。
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot
在編輯好後依然是先保存再退出。再次切換到指定的普通用戶,然後嘗試正常查看某個系統文件的內容,此時系統提示沒有許可權(Permission
denied)。再使用sudo命令就能順利地查看文件內容了:
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow
[sudo] password for linuxprobe: 此處輸入linuxprobe用戶的密碼
root:$6$tTbuw5DkOPYqq.vI$RMk9FCGHoJOq2qAPRURTQm.Qok2nN3yFn/i4f/falVGgGND9XoiYFbrxDn16WWiziaSJ0/cR06U66ipEoGLPJ.::0:99999:7:::
bin:*:17784:0:99999:7:::
daemon:*:17784:0:99999:7:::
adm:*:17784:0:99999:7:::
lp:*:17784:0:99999:7:::
sync:*:17784:0:99999:7:::
shutdown:*:17784:0:99999:7:::
halt:*:17784:0:99999:7:::
………………省略部分輸出信息………………
[linuxprobe@linuxprobe ~]$ exit
logout
大家千萬不要以為到這裡就結束了,劉遄老師還有更壓箱底的寶貝。不知大家是否發覺在每次執行sudo命令後都會要求驗證一下密碼。雖然這個密碼就是當前登錄用戶的密碼,但是每次執行sudo命令都要輸入一次密碼其實也挺麻煩的,這時可以添加NOPASSWD參數,使得用戶下次再執行sudo命令時就不用密碼驗證啦~
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot
這樣,當切換到普通用戶後再執行命令時,就不用再頻繁地驗證密碼了,我們在日常工作中也就痛快至極了。
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ reboot
User root is logged in on tty2.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
[linuxprobe@linuxprobe ~]$ sudo reboot
同學們請細心留意上面的用戶身份變換,visudo命令只有root管理員才可以執行,普通用戶使用會提示許可權不足。
3.5 組和許可權設定的命令(chown,chmod)
chown
chmod
:::