攜程網(wǎng)網(wǎng)站做的怎么樣智能營銷方法
【BASH】回顧與知識點梳理 二十四
- 二十四. 權(quán)限規(guī)劃和身份切換
- 24.1 主機(jī)的細(xì)部權(quán)限規(guī)劃:ACL 的使用
- 什么是 ACL 與如何支持啟動 ACL
- 如何啟動 ACL
- 24.2 ACL 的設(shè)定技巧: getfacl, setfacl
- setfacl 指令用法介紹及最簡單的『 u:賬號:權(quán)限 』設(shè)定
- getfacl 指令用法
- 特定的單一群組的權(quán)限設(shè)定:『 g:群組名:權(quán)限 』
- 針對有效權(quán)限設(shè)定:『 m:權(quán)限 』
- 使用默認(rèn)權(quán)限設(shè)定目錄未來文件的 ACL 權(quán)限繼承『 d:[u|g]:[user|group]:權(quán)限 』
- 24.3 使用者身份切換
- su
- sudo
- sudo 的指令用法
- visudo 與 /etc/sudoers
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)
二十四. 權(quán)限規(guī)劃和身份切換
我們一直強調(diào) Linux 的權(quán)限概念是非常重要的! 但是傳統(tǒng)的權(quán)限僅有三種身份(owner, group, others) 搭配三種權(quán)限 (r,w,x) 而已,并沒有辦法單純的針對某一個使用者或某一個群組來設(shè)定特定的權(quán)限需求,例如前一小節(jié)最后的那個任務(wù)! 此時就得要使用 ACL 這個機(jī)制啦!這玩意挺有趣的,底下我們就來談一談:
24.1 主機(jī)的細(xì)部權(quán)限規(guī)劃:ACL 的使用
什么是 ACL 與如何支持啟動 ACL
ACL 是 Access Control List 的縮寫,主要的目的是在提供傳統(tǒng)的 owner,group,others 的read,write,execute 權(quán)限之外的細(xì)部權(quán)限設(shè)定。ACL 可以針對單一使用者,單一文件或目錄來進(jìn)行r,w,x 的權(quán)限規(guī)范,對于需要特殊權(quán)限的使用狀況非常有幫助。
那 ACL 主要可以針對哪些方面來控制權(quán)限呢?他主要可以針對幾個項目:
- 使用者 (user):可以針對使用者來設(shè)定權(quán)限;
- 群組 (group):針對群組為對象來設(shè)定其權(quán)限;
- 默認(rèn)屬性 (mask):還可以針對在該目錄下在建立新文件/目錄時,規(guī)范新數(shù)據(jù)的默認(rèn)權(quán)限;
也就是說,如果你有一個目錄,需要給一堆人使用,每個人或每個群組所需要的權(quán)限并不相同時,在過去,傳統(tǒng)的 Linux 三種身份的三種權(quán)限是無法達(dá)到的, 因為基本上,傳統(tǒng)的 Linux 權(quán)限只能針對一個用戶、一個群組及非此群組的其他人設(shè)定權(quán)限而已,無法針對單一用戶或個人來設(shè)計權(quán)限。 而ACL 就是為了要改變這個問題啊!好了,稍微了解之后,再來看看如何讓你的文件系統(tǒng)可以支持 ACL 吧!
如何啟動 ACL
事實上,原本 ACL 是 unix-like 操作系統(tǒng)的額外支持項目,但因為近年以來 Linux 系統(tǒng)對權(quán)限細(xì)部設(shè)定的熱切需求, 因此目前 ACL 幾乎已經(jīng)預(yù)設(shè)加入在所有常見的 Linux 文件系統(tǒng)的掛載參數(shù)中(ext2/ext3/ext4/xfs 等等)!所以你無須進(jìn)行任何動作, ACL 就可以被你使用啰!不過,如果你不放心系統(tǒng)是否真的有支持 ACL 的話,那么就來檢查一下核心掛載時顯示的信息吧!
[root@study ~]# dmesg | grep -i acl
[ 0.330377] systemd[1]: systemd 208 running in system mode. (+PAM +LIBWRAP +AUDIT
+SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ)
[ 0.878265] SGI XFS with ACLs, security attributes, large block/inode numbers, no
debug enabled
瞧!至少 xfs 已經(jīng)支持這個 ACL 的功能啰!
24.2 ACL 的設(shè)定技巧: getfacl, setfacl
好了,既然知道我們的 filesystem 有支持 ACL 之后,接下來該如何設(shè)定與觀察 ACL 呢? 很簡單,利用這兩個指令就可以了:
getfacl
:取得某個文件/目錄的 ACL 設(shè)定項目;setfacl
:設(shè)定某個目錄/文件的 ACL 規(guī)范。
先讓我們來瞧一瞧 setfacl 如何使用吧!
setfacl 指令用法介紹及最簡單的『 u:賬號:權(quán)限 』設(shè)定
[root@study ~]# setfacl [-bkRd] [{-m|-x} acl參數(shù)] 目標(biāo)文件名
選項與參數(shù):
-m :設(shè)定后續(xù)的 acl 參數(shù)給文件使用,不可與 -x 合用;
-x :刪除后續(xù)的 acl 參數(shù),不可與 -m 合用;
-b :移除『所有的』 ACL 設(shè)定參數(shù);
-k :移除『預(yù)設(shè)的』 ACL 參數(shù),關(guān)于所謂的『預(yù)設(shè)』參數(shù)于后續(xù)范例中介紹;
-R :遞歸設(shè)定 acl ,亦即包括次目錄都會被設(shè)定起來;
-d :設(shè)定『預(yù)設(shè) acl參數(shù)』的意思!只對目錄有效,在該目錄新建的數(shù)據(jù)會引用此默認(rèn)值
上面談到的是 acl 的選項功能,那么如何設(shè)定 ACL 的特殊權(quán)限呢?特殊權(quán)限的設(shè)定方法有很多,我們先來談?wù)勛畛R姷?#xff0c;就是針對單一使用者的設(shè)定方式:
# 1. 針對特定使用者的方式:
# 設(shè)定規(guī)范:『 u:[使用者賬號列表]:[rwx] 』,例如針對 vbird1 的權(quán)限規(guī)范 rx :
[root@study ~]# touch acl_test1
[root@study ~]# ll acl_test1
-rw-r--r--. 1 root root 0 Jul 21 17:33 acl_test1
[root@study ~]# setfacl -m u:vbird1:rx acl_test1
[root@study ~]# ll acl_test1
-rw-r-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 權(quán)限部分多了個 + ,且與原本的權(quán)限 (644) 看起來差異很大!但要如何查閱呢?
[root@study ~]# setfacl -m u::rwx acl_test1
[root@study ~]# ll acl_test1
-rwxr-xr--+ 1 root root 0 Jul 21 17:33 acl_test1
# 設(shè)定值中的 u 后面無使用者列表,代表設(shè)定該文件擁有者,所以上面顯示 root 的權(quán)限成為 rwx 了!
上述動作為最簡單的 ACL 設(shè)定,利用『 u:使用者:權(quán)限
』的方式來設(shè)定的啦!設(shè)定前請加上 -m 這個選項。 如果一個文件設(shè)定了 ACL 參數(shù)后,他的權(quán)限部分就會多出一個 + 號了!但是此時你看到的權(quán)限與實際權(quán)限可能就會有點誤差! 那要如何觀察呢?就透過 getfacl 吧!
getfacl 指令用法
[root@study ~]# getfacl filename
選項與參數(shù):getfacl 的選項幾乎與 setfacl 相同!所以鳥哥這里就免去了選項的說明啊!# 請列出剛剛我們設(shè)定的 acl_test1 的權(quán)限內(nèi)容:
[root@study ~]# getfacl acl_test1
# file: acl_test1 <==說明檔名而已!
# owner: root <==說明此文件的擁有者,亦即 ls -l 看到的第三使用者字段
# group: root <==此文件的所屬群組,亦即 ls -l 看到的第四群組字段
user::rwx <==使用者列表欄是空的,代表文件擁有者的權(quán)限
user:vbird1:r-x <==針對 vbird1 的權(quán)限設(shè)定為 rx ,與擁有者并不同!
group::r-- <==針對文件群組的權(quán)限設(shè)定僅有 r
mask::r-x <==此文件預(yù)設(shè)的有效權(quán)限 (mask)
other::r-- <==其他人擁有的權(quán)限啰!
上面的數(shù)據(jù)非常容易查閱吧?顯示的數(shù)據(jù)前面加上#
的,代表這個文件的默認(rèn)屬性,包括文件名、文件擁有者與文件所屬群組。 底下出現(xiàn)的 user, group, mask, other 則是屬于不同使用者、群組與有效權(quán)限(mask)的設(shè)定值。 以上面的結(jié)果來看,我們剛剛設(shè)定的 vbird1 對于這個文件具有 r 與 x 的權(quán)限啦!這樣看的懂嗎? 如果看的懂的話,接下來讓我們在測試其他類型的 setfacl 設(shè)定吧!
特定的單一群組的權(quán)限設(shè)定:『 g:群組名:權(quán)限 』
# 2. 針對特定群組的方式:
# 設(shè)定規(guī)范:『 g:[群組列表]:[rwx] 』,例如針對 mygroup1 的權(quán)限規(guī)范 rx :[root@study ~]# setfacl -m g:mygroup1:rx acl_test1
[root@study ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x <==這里就是新增的部分!多了這個群組的權(quán)限設(shè)定!
mask::r-x
other::r--
針對有效權(quán)限設(shè)定:『 m:權(quán)限 』
基本上,群組與使用者的設(shè)定并沒有什么太大的差異啦!如上表所示,非常容易了解意義。不過,你應(yīng)該會覺得奇怪的是, 那個 mask 是什么東西啊?其實他有點像是『有效權(quán)限』的意思!
他的意義是: 使用者或群組所設(shè)定的權(quán)限必須要存在于 mask 的權(quán)限設(shè)定范圍內(nèi)才會生效,此即『有效權(quán)限(effective permission)』
我們舉個例子來看,如下所示:
# 3. 針對有效權(quán)限 mask 的設(shè)定方式:
# 設(shè)定規(guī)范:『 m:[rwx] 』,例如針對剛剛的文件規(guī)范為僅有 r :
[root@study ~]# setfacl -m m:r acl_test1
[root@study ~]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:vbird1:r-x #effective:r-- <==vbird1+mask 均存在者,僅有 r 而已,x 不會生效
group::r--
group:mygroup1:r-x #effective:r--
mask::r--
other::r--
您瞧,vbird1 與 mask 的集合發(fā)現(xiàn)僅有 r 存在,因此 vbird1 僅具有 r 的權(quán)限而已,并不存在 x 權(quán)限
!這就是 mask 的功能了!我們可以透過使用 mask 來規(guī)范最大允許的權(quán)限,就能夠避免不小心開放某些權(quán)限給其他使用者或群組了。 不過,通常鳥哥都是將 mask 設(shè)定為 rwx 啦!然后再分別依據(jù)不同的使用者/群組去規(guī)范她們的權(quán)限就是了。
將前一小節(jié)任務(wù)二中 /srv/projecta 這個目錄,讓 myuser1 可以進(jìn)入查閱,但 myuser1 不具有修改的權(quán)力。
答:由于 myuser1 是獨立的使用者與群組,因此無法使用傳統(tǒng)的 Linux 權(quán)限設(shè)定。此時使用 ACL 的設(shè)定如下:
# 1. 先測試看看,使用 myuser1 能否進(jìn)入該目錄?
[myuser1@study ~]$ cd /srv/projecta
-bash: cd: /srv/projecta: Permission denied <==確實不可進(jìn)入!
# 2. 開始用 root 的身份來設(shè)定一下該目錄的權(quán)限吧!
[root@study ~]# setfacl -m u:myuser1:rx /srv/projecta
[root@study ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -suser::rwx
user:myuser1:r-x <==還是要看看有沒有設(shè)定成功喔!
group::rwx
mask::rwx
other::---
# 3. 還是得要使用 myuser1 去測試看看結(jié)果!
[myuser1@study ~]$ cd /srv/projecta
[myuser1@study projecta]$ ll -a
drwxrws---+ 2 root projecta 4096 Feb 27 11:29 . <==確實可以查詢檔名
drwxr-xr-x 4 root root 4096 Feb 27 11:29 ..
[myuser1@study projecta]$ touch testing
touch: cannot touch `testing': Permission denied <==確實不可以寫入!
請注意,上述的 1, 3 步驟使用 myuser1 的身份,2 步驟才是使用 root 去設(shè)定的!
上面的設(shè)定我們就完成了之前任務(wù)二的后續(xù)需求喔!這么簡單呢!接下來讓我們來測試一下,如果我用 root 或者是 pro1 的身份去 /srv/projecta 增加文件或目錄時,該文件或目錄是否能夠具有 ACL 的設(shè)定? 意思就是說,ACL 的權(quán)限設(shè)定是否能夠被次目錄所『繼承?』先試看看:
[root@study ~]# cd /srv/projecta
[root@study ~]# touch abc1
[root@study ~]# mkdir abc2
[root@study ~]# ll -d abc*
-rw-r--r--. 1 root projecta 0 Jul 21 17:49 abc1
drwxr-sr-x. 2 root projecta 6 Jul 21 17:49 abc2
你可以明顯的發(fā)現(xiàn),權(quán)限后面都沒有 + ,代表這個 acl 屬性并沒有繼承喔!如果你想要讓 acl 在目錄底下的數(shù)據(jù)都有繼承的功能,那就得如下這樣做了!
使用默認(rèn)權(quán)限設(shè)定目錄未來文件的 ACL 權(quán)限繼承『 d:[u|g]:[user|group]:權(quán)限 』
# 4. 針對預(yù)設(shè)權(quán)限的設(shè)定方式:
# 設(shè)定規(guī)范:『 d:[ug]:使用者列表:[rwx] 』# 讓 myuser1 在 /srv/projecta 底下一直具有 rx 的預(yù)設(shè)權(quán)限!
[root@study ~]# setfacl -m d:u:myuser1:rx /srv/projecta
[root@study ~]# getfacl /srv/projecta
# file: srv/projecta
# owner: root
# group: projecta
# flags: -suser::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---[root@study ~]# cd /srv/projecta
[root@study projecta]# touch zzz1
[root@study projecta]# mkdir zzz2
[root@study projecta]# ll -d zzz*
-rw-rw----+ 1 root projecta 0 Jul 21 17:50 zzz1
drwxrws---+ 2 root projecta 6 Jul 21 17:51 zzz2
# 看吧!確實有繼承喔!然后我們使用 getfacl 再次確認(rèn)看看!
[root@study projecta]# getfacl zzz2
# file: zzz2
# owner: root
# group: projecta
# flags: -suser::rwx
user:myuser1:r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:user:myuser1:r-x
default:group::rwx
default:mask::rwx
default:other::---
透過這個『針對目錄來設(shè)定的默認(rèn) ACL 權(quán)限設(shè)定值』的項目,我們可以讓這些屬性繼承到次目錄底下呢! 非常方便啊!那如果想要讓 ACL 的屬性全部消失又要如何處理?透過『 setfacl -b 檔名 』即可啦! 太簡單了!鳥哥就不另外介紹了!請自行測試測試吧!
針對剛剛的 /srv/projecta 目錄的權(quán)限設(shè)定中,我需要 1)取消 myuser1 的設(shè)定(連同默認(rèn)值),以及 2)我不能讓 pro3 這個用戶使用該目錄,亦即 pro3 在該目錄下無任何權(quán)限, 該如何設(shè)定?
答:取消全部的 ACL 設(shè)定可以使用 -b 來處理,但單一設(shè)定值的取消,就得要透過 -x 才行了!所以你應(yīng)該這樣作:
# 1.1 找到針對 myuser1 的設(shè)定值
[root@study ~]# getfacl /srv/projecta | grep myuser1
user:myuser1:r-x
default:user:myuser1:r-x
# 1.2 針對每個設(shè)定值來處理,注意,取消某個賬號的 ACL 時,不需要加上權(quán)限項目!
[root@study ~]# setfacl -x u:myuser1 /srv/projecta
[root@study ~]# setfacl -x d:u:myuser1 /srv/projecta# 2.1 開始讓 pro3 這個用戶無法使用該目錄啰!
[root@study ~]# setfacl -m u:pro3:- /srv/projecta
只需要留意,當(dāng)設(shè)定一個用戶/群組沒有任何權(quán)限的 ACL 語法中,在權(quán)限的字段不可留白,而是應(yīng)該加上一個減號(
-
) 才是正確的作法!
24.3 使用者身份切換
什么?在 Linux 系統(tǒng)當(dāng)中還要作身份的變換?這是為啥?可能有底下幾個原因啦!
- 使用一般賬號:系統(tǒng)平日操作的好習(xí)慣,避免作錯一些嚴(yán)重的指令,例如恐怖的『 rm -rf /* 』(千萬作不得!)
- 用較低權(quán)限啟動系統(tǒng)服務(wù)
- 軟件本身的限制
由于上述考慮,所以我們都是使用一般賬號登入系統(tǒng)的,等有需要進(jìn)行系統(tǒng)維護(hù)或軟件更新時才轉(zhuǎn)為root 的身份來動作。 那如何讓一般使用者轉(zhuǎn)變身份成為 root 呢?主要有兩種方式喔:
- 以『
su -
』直接將身份變成 root 即可,但是這個指令卻需要 root 的密碼,也就是說,如果你要以 su 變成 root 的話,你的一般使用者就必須要有 root 的密碼才行; - 以『
sudo 指令
』執(zhí)行 root 的指令串,由于 sudo 需要事先設(shè)定妥當(dāng),且 sudo 需要輸入用戶自己的密碼,因此多人共管同一部主機(jī)時, sudo 要比 su 來的好喔!至少 root 密碼不會流出去!
su
su (switch user)是最簡單的身份切換指令了,他可以進(jìn)行任何身份的切換唷!方法如下:
[root@study ~]# su [-lm] [-c 指令] [username]
選項與參數(shù):: 不加任何參數(shù)及- ,代表切換為root身份,讀取的變量設(shè)定方式為 non-login shell 的方式,變量仍為當(dāng)前用戶的
- :單純使用 - 如『 su - 』代表使用 login-shell 的變量文件讀取方式來登入系統(tǒng);若使用者名稱沒有加上去,則代表切換為 root 的身份。
-l :與 - 類似,但后面需要加欲切換的使用者賬號!也是 login-shell 的方式。
-m :-m 與 -p 是一樣的,表示『使用目前的環(huán)境設(shè)定,而不讀取新使用者的配置文件』
-c :僅進(jìn)行一次指令,所以 -c 后面可以加上指令喔!
這個 su 的用法當(dāng)中,有沒有加上那個減號『-
』差很多喔! 因為涉及 login-shell 與 non-login shell 的變量讀取方法。
# 范例一:假設(shè)你原本是 dmtsai 的身份,想要使用 non-login shell 的方式變成 root
[dmtsai@study ~]$ su <==注意提示字符,是 dmtsai 的身份喔!
Password: <==這里輸入 root 的密碼喔!
[root@study dmtsai]# id <==提示字符的目錄是 dmtsai 喔!
uid=0(root) gid=0(root) groups=0(root) context=unconf.... <==確實是 root 的身份!
[root@study dmtsai]# env | grep 'dmtsai'
USER=dmtsai <==竟然還是 dmtsai 這家伙!
PATH=...:/home/dmtsai/.local/bin:/home/dmtsai/bin <==這個影響最大!
MAIL=/var/spool/mail/dmtsai <==收到的 mailbox 是 vbird1
PWD=/home/dmtsai <==并非 root 的家目錄
LOGNAME=dmtsai
# 雖然你的 UID 已經(jīng)是具有 root 的身份,但是看到上面的輸出訊息嗎?
# 還是有一堆變量為原本 dmtsai 的身份,所以很多數(shù)據(jù)還是無法直接利用。
[root@study dmtsai]# exit <==這樣可以離開 su 的環(huán)境!
單純使用『 su 』切換成為 root 的身份,讀取的變量設(shè)定方式為 non-login shell 的方式,這種方式很多原本的變量不會被改變, 尤其是我們之前談過很多次的 PATH 這個變量,由于沒有改變成為root 的環(huán)境, 因此很多 root 慣用的指令就只能使用絕對路徑來執(zhí)行咯。其他的還有 MAIL 這個變量,你輸入 mail 時, 收到的郵件竟然還是 dmtsai 的,而不是 root 本身的郵件!是否覺得很奇怪啊!
所以切換身份時,請務(wù)必使用如下的范例二:
# 范例二:使用 login shell 的方式切換為 root 的身份并觀察變量
[dmtsai@study ~]$ su -
Password: <==這里輸入 root 的密碼喔!
[root@study ~]# env | grep root
USER=root
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
# 了解差異了吧?下次變換成為 root 時,記得最好使用 su - 喔!
[root@study ~]# exit <==這樣可以離開 su 的環(huán)境!
上述的作法是讓使用者的身份變成 root 并開始操作系統(tǒng),如果想要離開 root 的身份則得要利用exit 離開才行。 那我如果只是想要執(zhí)行『一個只有 root 才能進(jìn)行的指令,且執(zhí)行完畢就恢復(fù)原本的身份
』呢?那就可以加上-c
這個選項啰! 請參考底下范例三!
# 范例三:dmtsai 想要執(zhí)行『 head -n 3 /etc/shadow 』一次,且已知 root 密碼
[dmtsai@study ~]$ head -n 3 /etc/shadow
head: cannot open `/etc/shadow' for reading: Permission denied
[dmtsai@study ~]$ su - -c "head -n 3 /etc/shadow"
Password: <==這里輸入 root 的密碼喔!
root:$6$wtbCCce/PxMeE5wm$KE2IfSJr.YLP7Rcai6oa/T7KFhOYO62vDnqfLw85...:16559:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
[dmtsai@study ~]$ <==注意看,身份還是 dmtsai 喔!繼續(xù)使用舊的身份進(jìn)行系統(tǒng)操作!
由于 /etc/shadow 權(quán)限的關(guān)系,該文件僅有 root 可以查閱。為了查閱該文件,所以我們必須要使用root 的身份工作。 但我只想要進(jìn)行一次該指令而已,此時就使用類似上面的語法吧!好,那接下來,如果我是 root 或者是其他人, 想要變更成為某些特殊賬號,可以使用如下的方法來切換喔!
# 范例四:原本是 dmtsai 這個使用者,想要變換身份成為 vbird1 時?
[dmtsai@study ~]$ su -l vbird1
Password: <==這里輸入 vbird1 的密碼喔!
[vbird1@study ~]$ su -
Password: <==這里輸入 root 的密碼喔!
[root@study ~]# id sshd
uid=74(sshd) gid=74(sshd) groups=74(sshd) ... <==確實有存在此人
[root@study ~]# su -l sshd
This account is currently not available. <==竟然說此人無法切換?
[root@study ~]# finger sshd
Login: sshd Name: Privilege-separated SSH
Directory: /var/empty/sshd Shell: /sbin/nologin
[root@study ~]# exit <==離開第二次的 su
[vbird1@study ~]$ exit <==離開第一次的 su
[dmtsai@study ~]$ exit <==這才是最初的環(huán)境!
su 就這樣簡單的介紹完畢,總結(jié)一下他的用法是這樣的:
- 若要
完整的切換到新使用者的環(huán)境
,必須要使用『su - username
』或『su -l username
』, 才會連同PATH/USER/MAIL 等變量都轉(zhuǎn)成新用戶的環(huán)境; - 如果
僅想要執(zhí)行一次 root 的指令
,可以利用『su - -c "指令串"
』的方式來處理; - 使用 root 切換成為任何使用者時,并不需要輸入新用戶的密碼;
雖然使用 su 很方便啦,不過缺點是,當(dāng)我的主機(jī)是多人共管的環(huán)境時,如果大家都要使用 su 來切換成為 root 的身份,那么不就每個人都得要知道 root 的密碼
,這樣密碼太多人知道可能會流出去,很不妥當(dāng)呢!怎辦?透過 sudo 來處理即可!
sudo
相對于 su 需要了解新切換的用戶密碼 (常常是需要 root 的密碼), sudo 的執(zhí)行則僅需要自己的密碼即可! 甚至可以設(shè)定不需要密碼即可執(zhí)行 sudo
呢!由于 sudo 可以讓你以其他用戶的身份執(zhí)行指令 (通常是使用 root 的身份來執(zhí)行指令),因此并非所有人都能夠執(zhí)行 sudo , 而是僅有規(guī)范到/etc/sudoers 內(nèi)的用戶才能夠執(zhí)行 sudo 這個指令
喔!說的這么神奇,底下就來瞧瞧那 sudo 如何使用?
事實上,一般用戶能夠具有 sudo 的使用權(quán),就是管理員事先審核通過后,才開放 sudo 的使用權(quán)的!因此,除非是信任用戶,否則一般用戶默認(rèn)是不能操作 sudo 的喔!
sudo 的指令用法
由于一開始系統(tǒng)默認(rèn)僅有 root 可以執(zhí)行 sudo ,因此底下的范例我們先以 root 的身份來執(zhí)行,等到談到 visudo 時,再以一般使用者來討論其他 sudo 的用法吧! sudo 的語法如下:
Tips 還記得在安裝 CentOS 7 時,在設(shè)定一般賬號的項目中,有個『讓這位使用者成為管理員』的選項吧?如果你有勾選該選項的話, 那除了 root 之外,該一般用戶確實是可以使用 sudo 的喔(以鳥哥的例子來說, dmtsai 預(yù)設(shè)竟然可以使用 sudo 了!)!這是因為建立賬號的時候,默認(rèn)將此用戶加入 sudo 的支持中了!詳情本章稍后告知!
[root@study ~]# sudo [-b] [-u 新使用者賬號]
選項與參數(shù):
-b :將后續(xù)的指令放到背景中讓系統(tǒng)自行執(zhí)行,而不與目前的 shell 產(chǎn)生影響
-u :后面可以接欲切換的使用者,若無此項則代表切換身份為 root 。
# 范例一:你想要以 sshd 的身份在 /tmp 底下建立一個名為 mysshd 的文件
[root@study ~]# sudo -u sshd touch /tmp/mysshd
[root@study ~]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 Jul 21 23:37 /tmp/mysshd
# 特別留意,這個文件的權(quán)限是由 sshd 所建立的情況喔!# 范例二:你想要以 vbird1 的身份建立 ~vbird1/www 并于其中建立 index.html 文件
[root@study ~]# sudo -u vbird1 sh -c "mkdir ~vbird1/www; cd ~vbird1/www; \
> echo 'This is index.html file' > index.html"
[root@study ~]# ll -a ~vbird1/www
drwxr-xr-x. 2 vbird1 vbird1 23 Jul 21 23:38 .
drwx------. 6 vbird1 vbird1 4096 Jul 21 23:38 ..
-rw-r--r--. 1 vbird1 vbird1 24 Jul 21 23:38 index.html
# 要注意,建立者的身份是 vbird1 ,且我們使用 sh -c "一串指令" 來執(zhí)行的!
sudo 可以讓你切換身份來進(jìn)行某項任務(wù),例如上面的兩個范例。
- 范例一中,我們的 root 使用 sshd 的權(quán)限去進(jìn)行某項任務(wù)! 要注意,因為我們無法使用『 su - sshd 』去切換系統(tǒng)賬號 (因為系統(tǒng)賬號的shell 是 /sbin/nologin), 這個時候 sudo 真是他 X 的好用了!立刻以 sshd 的權(quán)限在 /tmp 底下建立文件!查閱一下文件權(quán)限你就了解意義啦!
- 范例二則更使用多重指令串 (透過分號 ; 來延續(xù)指令進(jìn)行),使用
sh -c
的方法來執(zhí)行一連串的指令, 如此真是好方便!
但是 sudo 預(yù)設(shè)僅有 root 能使用啊!為什么呢?因為 sudo 的執(zhí)行是這樣的流程:
- 當(dāng)用戶執(zhí)行 sudo 時,系統(tǒng)于
/etc/sudoers
文件中搜尋該使用者是否有執(zhí)行 sudo 的權(quán)限; - 若使用者具有可執(zhí)行 sudo 的權(quán)限后,便讓使用者『
輸入用戶自己的密碼
』來確認(rèn); - 若密碼輸入成功,便開始進(jìn)行 sudo 后續(xù)接的指令(但 root 執(zhí)行 sudo 時,不需要輸入密碼);
- 若欲切換的身份與執(zhí)行者身份相同,那也不需要輸入密碼。
所以說,sudo 執(zhí)行的重點是:『能否使用 sudo 必須要看 /etc/sudoers 的設(shè)定值, 而可使用 sudo 者是透過輸入用戶自己的密碼來執(zhí)行后續(xù)的指令串
』喔!由于能否使用與 /etc/sudoers 有關(guān), 所以我們當(dāng)然要去編輯 sudoers 文件啦!不過,因為該文件的內(nèi)容是有一定的規(guī)范的,因此直接使用 vi 去編輯是不好的。 此時,我們得要透過 visudo 去修改這個文件喔!
visudo 與 /etc/sudoers
從上面的說明我們可以知道,除了 root 之外的其他賬號,若想要使用 sudo 執(zhí)行屬于 root 的權(quán)限指令,則 root 需要先使用 visudo 去修改 /etc/sudoers ,讓該賬號能夠使用全部或部分的 root 指令功能。為什么要使用 visudo 呢?這是因為 /etc/sudoers 是有設(shè)定語法的,如果設(shè)定錯誤那會造成無法使用 sudo 指令的不良后果
。因此才會使用 visudo 去修改, 并在結(jié)束離開修改畫面時,系統(tǒng)會去檢驗 /etc/sudoers 的語法就是了。
一般來說,visudo 的設(shè)定方式有幾種簡單的方法喔,底下我們以幾個簡單的例子來分別說明:
-
I. 單一用戶可進(jìn)行 root 所有指令,與 sudoers 文件語法:
假如我們要讓 vbird1 這個賬號可以使用 root 的任何指令,基本上有兩種作法,第一種是直接透過修改 /etc/sudoers ,方法如下:[root@study ~]# visudo ....(前面省略).... root ALL=(ALL) ALL <==找到這一行,大約在 98 行左右 vbird1 ALL=(ALL) ALL <==這一行是你要新增的! ....(底下省略)....
有趣吧!其實 visudo 只是利用 vi 將 /etc/sudoers 文件呼叫出來進(jìn)行修改而已,所以這個文件就是 /etc/sudoers 啦! 這個文件的設(shè)定其實很簡單,如上面所示,如果你找到 98 行 (有 root 設(shè)定的那行) 左右,看到的數(shù)據(jù)就是:
使用者賬號 登入者的來源主機(jī)名=(可切換的身份) 可下達(dá)的指令 root ALL=(ALL) ALL <==這是默認(rèn)值
上面這一行的四個組件意義是:
- 『
使用者賬號
』:系統(tǒng)的哪個賬號可以使用 sudo 這個指令的意思; - 『
登入者的來源主機(jī)名
』:當(dāng)這個賬號由哪部主機(jī)聯(lián)機(jī)到本 Linux 主機(jī),意思是這個賬號可能是由哪一部網(wǎng)絡(luò)主機(jī)聯(lián)機(jī)過來的, 這個設(shè)定值可以指定客戶端計算機(jī)(信任的來源的意思)。默認(rèn)值 root 可來自任何一部網(wǎng)絡(luò)主機(jī) - 『
(可切換的身份)
』:這個賬號可以切換成什么身份來下達(dá)后續(xù)的指令,默認(rèn) root 可以切換成任何人; - 『
可下達(dá)的指令
』:可用該身份下達(dá)什么指令?這個指令請務(wù)必使用絕對路徑撰寫。 預(yù)設(shè) root 可以切換任何身份且進(jìn)行任何指令之意。
那個 ALL 是特殊的關(guān)鍵詞,代表任何身份、主機(jī)或指令的意思。所以,我想讓 vbird1 可以進(jìn)行任何身份的任何指令,就如同上表特殊字體寫的那樣,其實就是復(fù)制上述默認(rèn)值那一行,再將 root 改成 vbird1 即可啊! 此時『
vbird1 不論來自哪部主機(jī)登入,他可以變換身份成為任何人,且可以進(jìn)行系統(tǒng)上面的任何指令
』之意。 修改完請儲存后離開 vi,并以 vbird1 登入系統(tǒng)后,進(jìn)行如下的測試看看:[vbird1@study ~]$ tail -n 1 /etc/shadow <==注意!身份是 vbird1 tail: cannot open `/etc/shadow' for reading: Permission denied # 因為不是 root 嘛!所以當(dāng)然不能查詢 /etc/shadow [vbird1@study ~]$ sudo tail -n 1 /etc/shadow <==透過 sudo 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 vbird1: <==注意啊!這里輸入的是『 vbird1 自己的密碼 』 pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7::: # 看!vbird1 竟然可以查詢 shadow !
注意到了吧!vbird1 輸入自己的密碼就能夠執(zhí)行 root 的指令!所以,系統(tǒng)管理員當(dāng)然要了解 vbird1 這個用戶的『
操守
』才行!否則隨便設(shè)定一個用戶,他惡搞系統(tǒng)怎辦?另外,一個一個設(shè)定太麻煩了, 能不能使用群組的方式來設(shè)定呢?參考底下的第二種方式吧。 - 『
-
II. 利用 wheel 群組以及免密碼的功能處理 visudo
我們在本章前面曾經(jīng)建立過 pro1, pro2, pro3 ,這三個用戶能否透過群組的功能讓這三個人可以管理系統(tǒng)? 可以的,而且很簡單!同樣我們使用實際案例來說明:[root@study ~]# visudo <==同樣的,請使用 root 先設(shè)定 ....(前面省略).... %wheel ALL=(ALL) ALL <==大約在 106 行左右,請將這行的 # 拿掉! # 在最左邊加上 % ,代表后面接的是一個『群組』之意!改完請儲存后離開 [root@study ~]# usermod -a -G wheel pro1 <==將 pro1 加入 wheel 的支持
上面的設(shè)定值會造成『
任何加入 wheel 這個群組的使用者,就能夠使用 sudo 切換任何身份來操作任何指令
』的意思。你當(dāng)然可以將 wheel 換成你自己想要的群組名
。接下來,請分別切換身份成為 pro1 及 pro2 試看看 sudo 的運作。[pro1@study ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro1 ....(前面省略).... [sudo] password for pro1: <==輸入 pro1 的密碼喔! pro3:$6$DMilzaKr$OeHeTDQPHzDOz/u5Cyhq1Q1dy...:16636:0:99999:7::: [pro2@study ~]$ sudo tail -n 1 /etc/shadow <==注意身份是 pro2 [sudo] password for pro2: <==輸入 pro2 的密碼喔! pro2 is not in the sudoers file. This incident will be reported. # 仔細(xì)看錯誤訊息他是說這個 pro2 不在 /etc/sudoers 的設(shè)定中!
這樣理解群組了吧?如果你想要讓 pro3 也支持這個 sudo 的話,不需要重新使用 visudo ,只要利用 usermod 去修改 pro3 的群組支持,讓 pro3 用戶加入 wheel 群組當(dāng)中,那他就能夠進(jìn)行 sudo 啰! 好了!那么現(xiàn)在你知道為啥在安裝時建立的用戶,就是那個 dmstai 預(yù)設(shè)可以使用 sudo 了嗎?請使用『 id dmtsai 』看看, 這個用戶是否有加入 wheel 群組呢?嘿嘿!了解乎?
簡單吧!不過,既然我們都信任這些 sudo 的用戶了,能否提供『
不需要密碼即可使用 sudo
』呢?就透過如下的方式:[root@study ~]# visudo <==同樣的,請使用 root 先設(shè)定 ....(前面省略).... %wheel ALL=(ALL) NOPASSWD: ALL <==大約在 109 行左右,請將 # 拿掉! # 在最左邊加上 % ,代表后面接的是一個『群組』之意!改完請儲存后離開
重點是那個 NOPASSWD 啦!該關(guān)鍵詞是免除密碼輸入的意思喔!
-
III. 有限制的指令操作:
上面兩點都會讓使用者能夠利用 root 的身份進(jìn)行任何事情!這樣總是不太好~如果我想要讓用戶僅能夠進(jìn)行部分系統(tǒng)任務(wù),比方說,系統(tǒng)上面的 myuser1 僅能夠幫 root 修改其他用戶的密碼時,亦即『當(dāng)使用者僅能使用 passwd 這個指令幫忙 root 修改其他用戶的密碼
』時,你該如何撰寫呢?可以這樣做:[root@study ~]# visudo <==注意是 root 身份 myuser1 ALL=(root) /usr/bin/passwd <==最后指令務(wù)必用絕對路
上面的設(shè)定值指的是『
myuser1 可以切換成為 root 使用 passwd 這個指令
』的意思。其中要注意的是: 指令字段必須要填寫絕對路徑才行!否則 visudo 會出現(xiàn)語法錯誤的狀況發(fā)生! 此外,上面的設(shè)定是有問題的!我們使用底下的指令操作來讓您了解:[myuser1@study ~]$ sudo passwd myuser3 <==注意,身份是 myuser1 [sudo] password for myuser1: <==輸入 myuser1 的密碼 Changing password for user myuser3. <==底下改的是 myuser3 的密碼喔!這樣是正確的 New password: Retype new password: passwd: all authentication tokens updated successfully. [myuser1@study ~]$ sudo passwd Changing password for user root. <==見鬼!怎么會去改 root 的密碼?
恐怖啊!我們竟然讓 root 的密碼被 myuser1 給改變了!下次 root 回來竟無法登入系統(tǒng)…欲哭無淚~怎辦? 所以我們必須要限制用戶的指令參數(shù)!修改的方法為將上述的那行改一改先:
[root@study ~]# visudo <==注意是 root 身份 myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
在設(shè)定值中加上驚嘆號『
!
』代表『不可執(zhí)行
』的意思。因此上面這一行會變成:可以執(zhí)行『passwd 任意字符
』,但是『passwd
』與『passwd root
』這兩個指令例外! 如此一來 myuser1 就無法改變 root 的密碼了!這樣這位使用者可以具有 root 的能力幫助你修改其他用戶的密碼, 而且也不能隨意改變 root 的密碼!很有用處的! -
IV. 透過別名建置 visudo:
如上述第三點,如果我有 15 個用戶需要加入剛剛的管理員行列,那么我是否要將上述那長長的設(shè)定寫入 15 行啊? 而且如果想要修改命令或者是新增命令時,那我每行都需要重新設(shè)定,很麻煩ㄟ!有沒有更簡單的方式? 是有的!透過別名即可!我們 visudo 的別名可以是『指令別名、帳戶別名、主機(jī)別名
』等。不過這里我們僅介紹帳戶別名, 其他的設(shè)定值有興趣的話,可以自行玩玩!假設(shè)我的 pro1, pro2, pro3 與 myuser1, myuser2 要加入上述的密碼管理員的 sudo 列表中, 那我可以創(chuàng)立一個帳戶別名稱為 ADMPW 的名稱,然后將這個名稱處理一下即可。處理的方式如下:
[root@study ~]# visudo <==注意是 root 身份 User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2 Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root ADMPW ALL=(root) ADMPWCOM
我透過
User_Alias
建立出一個新賬號,這個賬號名稱一定要使用大寫字符來處理,包括Cmnd_Alias(命令別名)、Host_Alias(來源主機(jī)名別名) 都需要使用大寫字符的!
這個 ADMPW 代表后面接的那些實際賬號。 而該賬號能夠進(jìn)行的指令就如同 ADMPWCOM 后面所指定的那樣!上表最后一行則寫入這兩個別名 (賬號與指令別名), 未來要修改時,我只要修改 User_Alias 以及 Cmnd_Alias 這兩行即可!設(shè)定方面會比較簡單有彈性喔! -
V. sudo 的時間間隔問題:
或許您已經(jīng)發(fā)現(xiàn)了,那就是,如果我使用同一個賬號在短時間內(nèi)重復(fù)操作 sudo 來運作指令的話,在第二次執(zhí)行 sudo 時,并不需要輸入自己的密碼!sudo 還是會正確的運作喔!為什么呢? 第一次執(zhí)行 sudo 需要輸入密碼,是擔(dān)心由于用戶暫時離開座位,但有人跑來你的座位使用你的賬號操作系統(tǒng)之故。 所以需要你輸入一次密碼重新確認(rèn)一次身份。兩次執(zhí)行 sudo 的間隔在五分鐘內(nèi),那么再次執(zhí)行 sudo 時就不需要再次輸入密碼了, 這是因為系統(tǒng)相信你在五分鐘內(nèi)不會離開你的作業(yè),所以執(zhí)行 sudo 的是同一個人!呼呼!真是很人性化的設(shè)計啊~ ^_^。
不過如果兩次 sudo 操作的間隔超過 5 分鐘,那就得要重新輸入一次你的密碼了
-
VI. sudo 搭配 su 的使用方式
很多時候我們需要大量執(zhí)行很多 root 的工作,所以一直使用 sudo 覺得很煩ㄟ!那有沒有辦法使用 sudo 搭配 su , 一口氣將身份轉(zhuǎn)為 root ,而且還用用戶自己的密碼來變成 root 呢?是有的!而且方法簡單的會讓你想笑! 我們建立一個 ADMINS 帳戶別名,然后這樣做:
[root@study ~]# visudo
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -
接下來,上述的 pro1, pro2, pro3, myuser1 這四個人,只要輸入『 sudo su - 』并且輸入『自己的密碼』后, 立刻變成 root 的身份!不但 root 密碼不會外流,用戶的管理也變的非常方便! 這也是實務(wù)上面多人共管一部主機(jī)時常常使用的技巧呢!這樣管理確實方便,不過還是要強調(diào)一下大前提, 那就是『這些你加入的使用者,全部都是你能夠信任的用戶
』!
該系列目錄 --> 【BASH】回顧與知識點梳理(目錄)