這一節(jié),我們來(lái)說(shuō)一下用戶切換相關(guān)命令
為什么要進(jìn)行用戶切換?
在操作過(guò)程中需要使用特定的用戶進(jìn)行特定的操作饿肺,多數(shù)情況下是因?yàn)闄?quán)限勺阐,比如要修改一個(gè)文件卷中,只有root用戶有權(quán)限修改,那么就要切換到root用戶下進(jìn)行操作渊抽。切換用戶一般有兩個(gè)命令:
1. su命令
su命令不加參數(shù)蟆豫,默認(rèn)切到root用戶,需要輸入root用戶密碼進(jìn)行驗(yàn)證懒闷,
exit命令可退出root用戶十减。
su命令可以加一個(gè)“-”再加上用戶名,此時(shí)愤估,不但身份變化了嫉称,同時(shí)也擁有了此用戶的“用戶環(huán)境”,比如用戶家目錄以及此用戶的其它個(gè)性化設(shè)置灵疮。
普通用戶切換其它用戶需要知道其它用戶的密碼织阅,root用戶使用su命令切換其它用戶,不需要知道用戶密碼
2. sudo命令
Linux是多用戶多任務(wù)的操作系統(tǒng), 共享該系統(tǒng)的用戶往往不只一個(gè)震捣。
出于安全性考慮, 有必要通過(guò)useradd
創(chuàng)建一些非root用戶, 只讓它們擁有不完全的權(quán)限; 如有必要荔棉,再來(lái)提升權(quán)限執(zhí)行。
sudo就是來(lái)解決這個(gè)需求的: 這些非root用戶不需要知道root的密碼蒿赢,就可以提權(quán)到root润樱,執(zhí)行一些root才能執(zhí)行的命令。
執(zhí)行sudo -u <用戶名> <命令>
, 將允許當(dāng)前用戶羡棵,提權(quán)到<用戶名>
的身份壹若,再執(zhí)行后面的<命令>
, 即使<命令>
原本需要root權(quán)限。
提權(quán)到<用戶名>
身份時(shí)皂冰,是以<用戶名>
的身份來(lái)執(zhí)行命令的店展,因此創(chuàng)建的文件默認(rèn)屬于<用戶名>
用戶。
因此秃流,當(dāng)userB執(zhí)行如下命令時(shí):
sudo -u userA touch /tmp/belong-to-who.tmp
創(chuàng)建的/tmp/belong-to-who.tmp
文件屬于用戶userA赂蕴。
如果不帶-u
, 則默認(rèn)使用root用戶,而大多數(shù)時(shí)候sudo都是要提權(quán)到root的舶胀,所以-u <用戶名>
可以省略為:
sudo <命令>
需要注意的是: 執(zhí)行sudo時(shí)輸入的密碼是當(dāng)前用戶的密碼, 并非<用戶名>
的密碼概说。
sudo -u <用戶名>
和su - <用戶名>
相比:
前者需要輸入當(dāng)前用戶的密碼碧注,提權(quán)到<用戶名>
身份執(zhí)行命令后返回當(dāng)前用戶;
后者則是輸入目標(biāo)用戶的密碼,切換到目標(biāo)用戶糖赔。
賦予用戶sudo操作的權(quán)限
通過(guò)useradd
添加的用戶萍丐,并不具備sudo權(quán)限。在ubuntu/centos等系統(tǒng)下, 需要將用戶加入admin組或者wheel組或者sudo組放典。
以root用戶身份執(zhí)行如下命令, 將用戶加入wheel/admin/sudo組:
usermod -a -G wheel <用戶名>
如果提示wheel組不存在, 則還需要先創(chuàng)建該組:
groupadd wheel
用公式講解/etc/sudoers的內(nèi)容
sudo的權(quán)限控制可以在/etc/sudoers
文件中查看到碉纺。
如果想要控制某個(gè)用戶(或某個(gè)組用戶)只能執(zhí)行root權(quán)限中的一部分命令, 或者允許某些用戶使用sudo時(shí)不需要輸入密碼,就需要對(duì)該文件有所了解。
一般來(lái)說(shuō)刻撒,通過(guò)cat /etc/sudoers
指令來(lái)查看該文件, 會(huì)看到如下幾行代碼:
root ALL=(ALL:ALL) ALL
%wheel ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
對(duì)/etc/sudoers
文件進(jìn)行編輯的代碼公式可以概括為:
授權(quán)用戶/組 主機(jī)=[(切換到哪些用戶或組)] [是否需要輸入密碼驗(yàn)證] 命令1,命令2,...
凡是[ ]
中的內(nèi)容, 都能省略; 命令和命令之間用,
號(hào)分隔;
為了方便說(shuō)明, 將公式的各個(gè)部分稱呼為字段1 - 字段5:
授權(quán)用戶/組 主機(jī) =[(切換到哪些用戶或組)] [是否需要輸入密碼驗(yàn)證] 命令1,命令2,...
字段1 字段2 =[(字段3)] [字段4] 字段5
字段3骨田、字段4,是可以省略的声怔。
在上面的默認(rèn)例子中, "字段1"不以%
號(hào)開頭的表示"將要授權(quán)的用戶", 比如例子中的root
态贤;
以%
號(hào)開頭的表示"將要授權(quán)的組", 比如例子中的%wheel
組 和 %sudo
組。
"字段2"表示允許登錄的主機(jī), ALL表示所有; 如果該字段不為ALL,表示授權(quán)用戶只能在某些機(jī)器上登錄本服務(wù)器來(lái)執(zhí)行sudo命令. 比如:
jack mycomputer=/usr/sbin/reboot,/usr/sbin/shutdown
表示: 普通用戶jack在主機(jī)(或主機(jī)組)mycomputer上, 可以通過(guò)sudo執(zhí)行reboot和shutdown兩個(gè)命令醋火。"字段3"和"字段4"省略悠汽。
"字段3"如果省略, 相當(dāng)于(root:root)
,表示可以通過(guò)sudo
提權(quán)到root; 如果為(ALL)
或者(ALL:ALL)
, 表示能夠提權(quán)到(任意用戶:任意用戶組)
芥驳。
請(qǐng)注意柿冲,"字段3"如果沒(méi)省略,必須使用( )
雙括號(hào)包含起來(lái)。這樣才能區(qū)分是省略了"字段3"還是省略了"字段4"兆旬。
"字段4"的可能取值是NOPASSWD:
假抄。請(qǐng)注意NOPASSWD后面帶有冒號(hào):
。表示執(zhí)行sudo時(shí)可以不需要輸入密碼丽猬。比如:
lucy ALL=(ALL) NOPASSWD: /bin/useradd
表示: 普通用戶lucy可以在任何主機(jī)上, 通過(guò)sudo執(zhí)行/bin/useradd
命令, 并且不需要輸入密碼.
又比如:
peter ALL=(ALL) NOPASSWD: ALL
表示: 普通用戶peter可以在任何主機(jī)上, 通過(guò)sudo執(zhí)行任何命令, 并且不需要輸入密碼宿饱。
"字段5"是使用逗號(hào)分開一系列命令,這些命令就是授權(quán)給用戶的操作; ALL表示允許所有操作。
你可能已經(jīng)注意到了, 命令都是使用絕對(duì)路徑, 這是為了避免目錄下有同名命令被執(zhí)行脚祟,從而造成安全隱患谬以。
如果你將授權(quán)寫成如下安全性欠妥的格式:
lucy ALL=(ALL) chown,chmod,useradd
那么用戶就有可能創(chuàng)建一個(gè)他自己的程序, 也命名為userad, 然后放在它的本地路徑中, 如此一來(lái)他就能夠使用root來(lái)執(zhí)行這個(gè)"名為useradd的程序"。這是相當(dāng)危險(xiǎn)的!
命令的絕對(duì)路徑可通過(guò)which
指令查看到: 比如which useradd
可以查看到命令useradd
的絕對(duì)路徑: /usr/sbin/useradd
公式還要擴(kuò)充
例子1:
papi ALL=(root) NOPASSWD: /bin/chown,/usr/sbin/useradd
表示: 用戶papi能在所有可能出現(xiàn)的主機(jī)上, 提權(quán)到root下執(zhí)行/bin/chown, 不必輸入密碼; 但運(yùn)行/usr/sbin/useradd 命令時(shí)需要密碼.
這是因?yàn)?code>NOPASSWD:只影響了其后的第一個(gè)命令: 命令1.
上面給出的公式只是簡(jiǎn)化版由桌,完整的公式如下:
授權(quán)用戶/組 主機(jī)=[(切換到哪些用戶或組)] [是否需要輸入密碼驗(yàn)證] 命令1, [(字段3)] [字段4] 命令2, ...
在具有sudo操作的用戶下, 執(zhí)行sudo -l
可以查看到該用戶被允許和被禁止運(yùn)行的命令.
通配符和取消命令
例子2:
papi ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk
用例子2來(lái)說(shuō)明通配符*
的用法, 以及命令前面加上!
號(hào)表示取消該命令为黎。
該例子的意思是: 用戶papi在所有可能出現(xiàn)的主機(jī)上, 能夠運(yùn)行目錄/usr/sbin和/sbin下所有的程序, 但fdisk除外.
開始編輯
“你講了這么多,但是在實(shí)踐中,我去編輯/etc/sudoers文件,系統(tǒng)提示我沒(méi)權(quán)限啊行您,怎么辦?”
這是因?yàn)?code>/etc/sudoers的內(nèi)容如此敏感铭乾,以至于該文件是只讀的。所以邑雅,編輯該文件前片橡,請(qǐng)確認(rèn)清楚你知道自己正在做什么妈经。
強(qiáng)烈建議通過(guò)visudo
命令來(lái)修改該文件淮野,通過(guò)visudo
修改捧书,如果配置出錯(cuò),會(huì)有提示骤星。
不過(guò)经瓷,系統(tǒng)文檔推薦的做法,不是直接修改/etc/sudoers
文件洞难,而是將修改寫在/etc/sudoers.d/
目錄下的文件中舆吮。
如果使用這種方式修改sudoers,需要在/etc/sudoers
文件的最后行队贱,加上#includedir /etc/sudoers.d
一行(默認(rèn)已有):
#includedir /etc/sudoers.d
注意了色冀,這里的指令#includedir
是一個(gè)整體, 前面的#
號(hào)不能丟,并非注釋柱嫌,也不能在#
號(hào)后有空格锋恬。
任何在/etc/sudoers.d/
目錄下,不以~
號(hào)結(jié)尾的文件和不包含.
號(hào)的文件编丘,都會(huì)被解析成/etc/sudoers
的內(nèi)容与学。
文檔中是這么說(shuō)的:
# This will cause sudo to read and parse any files in the /etc/sudoers.d
# directory that do not end in '~' or contain a '.' character.
# Note that there must be at least one file in the sudoers.d directory (this
# one will do), and all files in this directory should be mode 0440.
# Note also, that because sudoers contents can vary widely, no attempt is
# made to add this directive to existing sudoers files on upgrade.
# Finally, please note that using the visudo command is the recommended way
# to update sudoers content, since it protects against many failure modes.
其他小知識(shí)
輸入密碼時(shí)有反饋
當(dāng)使用sudo后輸入密碼,并不會(huì)顯示任何東西 —— 甚至連常規(guī)的星號(hào)都沒(méi)有嘉抓。有個(gè)辦法可以解決該問(wèn)題索守。
打開/etc/sudoers
文件找到下述一行:
Defaults env_reset
修改成:
Defaults env_reset,pwfeedback
修改sudo會(huì)話時(shí)間
如果你經(jīng)常使用sudo 命令,你肯定注意到過(guò)當(dāng)你成功輸入一次密碼后抑片,可以不用再輸入密碼就可以運(yùn)行幾次sudo命令卵佛。
但是一段時(shí)間后,sudo 命令會(huì)再次要求你輸入密碼敞斋。默認(rèn)是15分鐘级遭,該時(shí)間可以調(diào)整。添加timestamp_timeout=分鐘數(shù)
即可渺尘。
時(shí)間以分鐘為單位挫鸽,-1表示永不過(guò)期,但強(qiáng)烈不推薦鸥跟。
比如我希望將時(shí)間延長(zhǎng)到1小時(shí)丢郊,還是打開/etc/sudoers
文件找到下述一行:
Defaults env_reset
修改成:
Defaults env_reset,pwfeedback,timestamp_timeout=60