Linux 用戶身份切換
什么?在Linux系統(tǒng)當中還要作身份切換?這是為什么?可能有下面幾個原因
- 安全性:身份切換可以限制用戶的權(quán)限,防止惡意操作和數(shù)據(jù)泄漏。
- 多用戶環(huán)境:在多用戶環(huán)境中,每個用戶擁有自己的賬戶和權(quán)限,需要通過身份切換來切換用戶。
- 程序運行:某些程序需要以不同的權(quán)限運行,例如管理員權(quán)限或普通用戶權(quán)限,需要通過身份切換來切換權(quán)限。
- 系統(tǒng)管理:系統(tǒng)管理員需要在不同的身份之間切換,以便執(zhí)行不同的系統(tǒng)管理任務(wù)。
- 學(xué)習(xí)和實踐:學(xué)習(xí)Linux系統(tǒng)管理需要了解身份切換的操作和原理,以便更好地管理和維護系統(tǒng)。
那么如何讓一般用戶變身份成為root呢?主要有兩種方式
-
通過【su -】直接將身份變成root即可,但是這個命令卻要root的密碼,也就是說,如果你要通過su變成root的話,你的一般用戶就必須要知道root的密碼才行。
-
通過【sudo命令】執(zhí)行root的命令串,由于sudo需要事先設(shè)置妥當,且sudo需要輸入用戶自己的密碼,因此多人共管一臺主機時,sudo要比su要來的好,至少root密碼不會流出去
su
在Linux系統(tǒng)中,su命令用于切換用戶身份,其語法如下:
su [選項] [用戶名]
選項 | 解釋 |
---|---|
- | 表示切換到目標用戶的環(huán)境變量,即切換到目標用戶的家目錄 |
-l | 與-相同,表示切換到目標用戶的環(huán)境變量 |
-c | 執(zhí)行完命令后,退出目標用戶身份,返回原用戶身份 |
-m | -m與-p是一樣的,表示【使用目前的環(huán)境設(shè)置,而不讀取新使用者的配置文件】 |
使用案例
假設(shè)你原本是zhw的身份,想要使用su 命令把自己變成root
[zhw@root ~]$ su # 現(xiàn)在是zhw的身份使用su切換root
密碼: # 輸入密碼
[root@root zhw]# id # 查看提示字符是root
uid=0(root) gid=0(root) 組=0(root) 環(huán)境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 # 確實是root身份
[root@root zhw]# env |grep 'zhw'
USER=zhw <== 竟然還是zhw這個身份
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/zhw/.local/bin:/home/zhw/bin <==這個影響最大
MAIL=/var/spool/mail/zhw
PWD=/home/zhw <== 并非root的家目錄
LOGNAME=zhw
# 雖然你的UID已經(jīng)是具有root身份,但是看到上面的輸出信息了嗎?
# 還是有一堆變量為原本zhw的身份,所以很多數(shù)據(jù)還是無法直接利用
[root@root zhw]# exit <== 這樣可以退出su的環(huán)境 也可以Ctrl + D
單純的使用【su】切換成root身份,讀取的變量設(shè)置方式為非登錄shell的方式,這種方式很多原本的變量不會被修改,由于沒有修改成root的環(huán)境,因此很多root常用的命令只能使用絕對路徑來執(zhí)行。還有MAIL這個變量,你輸入mail時,收到的郵件竟然是zhw用戶的,而不是root本身的郵件,所以切換身份時務(wù)必使用如下案例
使用login shell的方式切換為root的身份
[zhw@root ~]$ su -
密碼:
上一次登錄:二 4月 11 14:52:22 CST 2023pts/2 上
[root@root ~]# env |grep root
HOSTNAME=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@root ~]# exit <== exit退出su的環(huán)境
上述的做法是讓用戶的身份變成root并開始使用系統(tǒng),如果想要退出root的身份則得要利用exit才行,那我如果至少想要執(zhí)行【一個只有root才能執(zhí)行的命令,且執(zhí)行完畢就恢復(fù)原本的身份】呢?
zhw想要執(zhí)行【head -n 3 /etc/shadow】一次,且知道root密碼
[zhw@root ~]$ head -n 3 /etc/shadow
head: 無法打開"/etc/shadow" 讀取數(shù)據(jù): 權(quán)限不夠
[zhw@root ~]$ su - -c 'head -n 3 /etc/shadow'
密碼:
root:$6$0x0W5U0lAIGfNePS$fQegjEeiYdvyV7xK7zyhR9jsXzAwkB6XoA6RxpGo0X/uz8uPhblK9frf36sRtpdyNgJY4jZPQplMR1b/Hqgb9/::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
[zhw@root ~]$ # 注意看 這里執(zhí)行完命令還是zhw的身份
那么如果我是root或是其他人,我想要切換成為某些特殊賬戶,可以使用如下的方法來切換
原本是zhw的用戶,想要切換成pro1時?
[zhw@root ~]$ su -l pro1
密碼:
-bash-4.2$ env |grep pro1
USER=pro1
MAIL=/var/spool/mail/pro1
PWD=/home/pro1
HOME=/home/pro1
LOGNAME=pro1
-bash-4.2$ su -
密碼:
上一次登錄:二 4月 11 15:19:01 CST 2023pts/2 上
[root@root ~]# su -l sshd
This account is currently not available. <== 竟然說此賬戶無法切換?
[root@root ~]# finger sshd
Login: sshd Name: Privilege-separated SSH
Directory: /var/empty/sshd Shell: /sbin/nologin # <== 原來shell是/sbin/nologin
Last login 二 4月 11 15:24 (CST) on pts/2
No mail.
No Plan.
[root@root ~]# exit <== 退出第二次的 su
-bash-4.2$ exit <== 退出第一次的 su
[zhw@root ~]$ <== 這個才是最初的環(huán)境
su命令的優(yōu)點:
su命令可以允許用戶臨時切換為另一個用戶身份,方便執(zhí)行需要特定權(quán)限的命令。
su命令可以避免用戶頻繁登錄和退出,提高了系統(tǒng)使用效率。
su命令可以控制用戶對系統(tǒng)的訪問權(quán)限,增強了系統(tǒng)安全性。
su命令的缺點:
su命令需要用戶輸入目標用戶的密碼,如果密碼被泄露,可能導(dǎo)致系統(tǒng)安全問題。
su命令切換為root用戶身份后,用戶可以執(zhí)行任何命令,可能會造成系統(tǒng)的損壞或數(shù)據(jù)的丟失。
su命令無法控制用戶對系統(tǒng)的訪問權(quán)限范圍,如果目標用戶擁有過多的權(quán)限,可能會導(dǎo)致系統(tǒng)的安全性降低。
sudo
相對于su需要了解新切換的用戶密碼(常常是root的密碼),sudo的執(zhí)行則僅需要自己的密碼即可,甚至可以設(shè)置不需要密碼即可執(zhí)行sudo。由于sudo可以讓你以其他用戶的身份執(zhí)行命令(通常是使用root的身份來執(zhí)行命令),因此并非所有人都能夠執(zhí)行sudo,而是僅有規(guī)范到/etc/sudoers
內(nèi)的用戶才能夠執(zhí)行sudo這個命令。下面介紹一下sudo
sudo [選項] [命令]
選項
-u:指定要切換到的用戶身份
-b:以后臺模式運行命令
使用案例
想要以sshd的身份在/tmp 下創(chuàng)建一個名為mysshd的文件
[root@root zhw]# sudo -u sshd touch /tmp/mysshd
[root@root zhw]# ll /tmp/mysshd
-rw-r--r--. 1 sshd sshd 0 4月 11 15:47 /tmp/mysshd
# 留意以下,這個文件的權(quán)限是由sshd所建立的
但是使用sudo默認僅有root能使用,為什么?因為sudo的執(zhí)行是這樣的流程
sudo命令的執(zhí)行流程如下:
- 用戶輸入sudo命令,并指定要執(zhí)行的命令。
- 系統(tǒng)檢查用戶是否在sudoers文件中有相應(yīng)的權(quán)限,如果沒有,則提示用戶無權(quán)執(zhí)行該命令。
- 如果用戶有權(quán)限執(zhí)行該命令,則要求用戶輸入自己的密碼,而不是目標用戶的密碼。
- 系統(tǒng)檢查密碼是否正確,如果正確,則將用戶切換為目標用戶身份,并執(zhí)行命令。
- 執(zhí)行完命令后,返回原用戶身份。
所以說,sudo的執(zhí)行的重點是【能否使用sudo,必須要看/etc/sudoers的設(shè)置值】由于能否使用與/etc/sudoers
有關(guān),所以我們當然要去編輯sudoers文件,不過該文件的內(nèi)容有一定的規(guī)范,所以直接使用vi去編輯是不好的,此時,我們要通過visudo去修改這個文件
visudo與/etc/sudoers
從上面說明我們可以知道,除了root之外的其外賬號,若想要使用sudo執(zhí)行屬于root的權(quán)限命令,則root需要先使用visudo去修改/etc/sudoers,讓賬號能夠使用全部或部分的root命令功能,為什么要使用visudo呢??
使用visudo命令修改sudoers文件可以避免語法錯誤、競爭條件和自動備份,提高sudoers文件修改的安全性和正確性,方便了系統(tǒng)管理員對sudoers文件的管理
一般來說,visudo的設(shè)置有幾種簡單的方法,下面我們以幾個簡單的例子來說明:
單一用戶可使用root所有命令,與sudoers文件語法
假如我們要讓zhw這個賬號可以使用root的任何命令,基本有兩種語法,第一張是直接修改/etc/sudoers文件
[root@root zhw]# visudo
...(前面省略)...
root ALL=(ALL) ALL # 搜索到這一行
zhw ALL=(ALL) ALL # 這一行是增加的
...(后面省略)...
我們來解釋一下上面的參數(shù)(root ALL=(ALL) ALL)
- 第一個組件:表示授權(quán)的用戶或用戶組,這里是root用戶。
- 第二個組件:表示用戶或用戶組執(zhí)行命令的主機,這里是ALL,表示可以在任何主機上執(zhí)行命令。
- 第三個組件:表示用戶或用戶組可以切換到的目標用戶,這里是ALL,表示可以切換到任何用戶的身份。
- 第四個組件:表示用戶或用戶組可以執(zhí)行的命令,這里是ALL,表示可以執(zhí)行任何命令。
修改后保存退出,登錄到zhw用戶,進行測試看看
[zhw@root ~]$ tail -n 5 /etc/shadow
tail: 無法打開"/etc/shadow" 讀取數(shù)據(jù): 權(quán)限不夠
# 因為不是root,所以當然不能查詢/etc/shadow
[zhw@root ~]$ sudo tail -n 5 /etc/shadow # 通過sudo執(zhí)行
[sudo] zhw 的密碼: # 輸入自己的密碼
myuser2:$6$WHRvq32S$d40vM5Qgw8q7zelrSyCPaeugrRQE94KLICed2RHjWaru3aN6gHoycRN6PTpRIL/rx271Oiqds/M5p2me2IUd11:19458:0:99999:7:::
myuser3:$6$1EIWjK3Y$V07xoA9T2zWtWjbq.C8zbfH1jD6uF5PzqGHS2JANbJyLcLVmNr6mNTJlD6Du7O2369k756FUbouyrQJUsRwqj0:19458:0:99999:7:::
pro1:$6$JyB/VQok$uLn7kywLiGZzYE1CpwZprx5U1fc8EX6JJv2f1e50lJNByJ7Out/JidM8C4GxpAJgESpufvDQxU3iUfYEJGoMG.:19458:0:99999:7:::
pro2:$6$tStx6sam$nn6PawgEIgeqK886H1iWtuhC98h2s0BkawWMFfX98W.RyWcwaeZmL1kesXC3gRFCLf8/5TPqCr8.KzwXOogA50:19458:0:99999:7:::
pro3:$6$IAko7jZE$Mw6oy.c80tcqc/.WpXTLK3Zm7QkHCCKiX.DxyAhUARQY1N5tRAPQEPBXe0oFssxeDFxFGglSdcEud/ij8VEt/.:19458:0:99999:7:::
# 看執(zhí)行成功了可以查詢shadow了
zhw輸入自己的密碼能夠執(zhí)行root的命令了,另外,一個一個設(shè)置太麻煩了,能不能使用用戶組的方式來設(shè)置?參考下面方案
利用wheel用戶組以免密碼的功能處理visudo
之前的案例博客地址 , 任務(wù)一和任務(wù)二
我們在之前的賬戶管理案例中建立了pro1,pro2,pro3,能否通過用戶組的功能讓這三個人可以管理系?可以很簡單,如下案例
[root@root zhw]# visudo
...(前面省略)...
%wheel ALL=(ALL) ALL # 把這行的#拿掉
# 在最左邊加上%,代表后面接的是一個【用戶組】,改完保存退出
...(后面省略)...
[root@root zhw]# usermod -aG wheel pro1 # 將pro1加入wheel的支持
上面的設(shè)置值會造成【任何加入wheel這個用戶組的用戶,就能夠使用sudo切換任何身份來操作任何命令】,也可以將wheel改成你想要的組名,接下里分別切換身份成功pro1,pro2,試試sudo的運行
[pro1@localhost ~]$ sudo tail -n 5 /etc/shadow # 這里的身份是pro1
[sudo] pro1 的密碼:
zhw:!!:19459:0:99999:7:::
csq:!!:19459:0:99999:7:::
pro1:$6$8XzICuAG$PCIjmv4s13f4x4IRcb4thG96JX6Tnl.Ots08wlnmc6Ndkgrq4u9e2EYfhWn5YLksFgEX.ySPSGlfj839f7eyh/:19459:0:99999:7:::
pro2:$6$3.4UjuHd$v1lUPlXjpZ6vn9ewVN1NicSGv5tx9BhyCmrWNWd/xBAsxlXdJJJbovrB/ohR5AUeB5VRRSHcRSGv5o3AcuhS01:19459:0:99999:7:::
pro3:$6$ARlJULFa$BVrVHjmRQp7IgS5c4ViqpgN8DDN9O5b2qbnxhzPQvxessejHO0iVqmDcEikNMelu.Mni76NIfh.V3JlUn6nTQ0:19459:0:99999:7:::
[pro2@localhost ~]$ sudo tail -n 5 /etc/shadow # 這里的身份是pro2
[sudo] pro2 的密碼:
pro2 不在 sudoers 文件中。此事將被報告。
[pro2@localhost ~]$
這樣就立即用戶組了吧?如果你想要pro3也支持這個sudo的話,不需要重新使用visudo,只要利用usemod去修改pro3的用戶組支持,讓pro3用戶加入wheel用戶組,那它就能夠進行sudo了。
Centos7開始,在sudoers文件中,默認已經(jīng)開發(fā)%wheel那一行,以前的Centos舊版本都沒有啟用
不過,既然我們都信任這些sudo的用戶了,能否實現(xiàn)【不需要密碼即可使用sudo】呢?
可通過一下方式實現(xiàn):
[root@localhost ~]# visudo
.....
..
%wheel ALL=(ALL) NOPASSWD: ALL # 找到這行把前面的#去掉
...
....
重點是NOPASSWD 該關(guān)鍵字是免除密碼輸入的意思
有限制的命令操作
以上兩點都可以讓用戶能夠利用root的身份進行任何事情,這樣總是不太好,如果我想讓用戶僅能夠進行部分任系統(tǒng)任務(wù)。比如說,系統(tǒng)上面的myuser1僅能夠幫root修改其他用用戶的密碼時,即【當用戶僅能使用passwd這個命令幫忙root修改其他用戶密碼】時,該如何編寫?可以這樣做
[root@localhost ~]# visudo
....
..
myuser1 ALL=(ALL) /usr/bin/passwd # 添加這一行內(nèi)容,后面的路徑務(wù)必用絕對路徑!
...
..
上述內(nèi)容,設(shè)置值指的是 【myuser1可以切換為root使用passwd命令】,要注意必須要寫絕對路徑,否則visudo會出現(xiàn)語法錯誤
我們測試一下passwd是否可用:
[myuser1@localhost ~]$ sudo passwd myuser3 # 這里的身份是myuser1
[sudo] myuser1 的密碼: # 輸入myuser1的密碼
更改用戶 myuser3 的密碼 。 # 更改myuser3的密碼
新的 密碼:
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經(jīng)成功更新。
[myuser1@localhost ~]$ sudo passwd root # 發(fā)現(xiàn)能改root的密碼!怎么會這樣的?
更改用戶 root 的密碼 。
新的 密碼:
無效的密碼: 密碼是一個回文
重新輸入新的 密碼:
passwd:所有的身份驗證令牌已經(jīng)成功更新。
root的密碼竟然能被myuser1的用戶修改,下次root登錄就登錄不上去了,欲哭無淚,所以我們就要加上限制用戶的命令參數(shù),修改方法如下
[root@localhost ~]# visudo
....
..
myuser1 ALL=(ALL) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
....
..
在設(shè)置值中加上感嘆號【 ! 】代表【不可執(zhí)行】的意思。因此上面這一行會變成:可以執(zhí)行【passwd 任意字符】,但是【passwd】與【passwd root】這兩個命令例外,如此一來myuser1就無法修改root的密碼了。這位用戶可以具有root的能力,幫助root修改其他用戶的密碼,卻不能隨意修改root的密碼。
通過別名創(chuàng)建visudo
如上述的第三點,如果我有15個用戶需要加入剛剛的管理員行列,那么我是否要將上述那長長的設(shè)置15行呢?而且如果想要修改命令或者是新增命令,每一行都要設(shè)置很麻煩。有沒有更簡單的方法呢?可以設(shè)置別名,visudo的別名可以是【命令別名、賬號別名、主機別名】等。這里僅介紹一下賬號別名
假如我的pro1、pro2、pro3、與myuser1、myuser2要加入上述的密碼管理員的sudo列表中,那我可以創(chuàng)建一賬號,別名為ADMPW,然后將這個名稱處理一下,處理的方式如下
[root@localhost ~]# 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(來源主機別名),都需要使用大寫字符。
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
這行指定了一個名為ADMPW的用戶別名,它包含了5個用戶: pro1、pro2、pro3、myuser1和myuser2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]* , !/usr/bin/passwd root
這行指定了一個名為ADMPWCOM的命令別名,它包含了3個命令: !/usr/bin/passwd、/usr/bin/passwd [A-Za-z]* !/usr/bin/passwd root。其中,!/usr/bin/passwd表示禁止使用passwd命令,/usr/bin/passwd [A-Za-z]* 表示使用passwd命令修改非root用戶的密碼,!/usr/bin/passwd root表示禁止使用passwd命令修改root用戶的密碼。
ADMPW ALL = (root) ADMPWCOM
這行指定了一個授權(quán)策略,它允許ADMPW用戶別名中的所有用戶,在所有主機上以任何方式(ALL)執(zhí)行ADMPWCOM命令別名中的命令,但必須以root用戶身份執(zhí)行。也就是說,只有ADMPW用戶別名中的用戶才能執(zhí)行ADMPWCOM命令別名中的命令,并且必須以root用戶身份執(zhí)行。
== 未來要修改時,我們只要修改 User_Alias以及Cmnd_Alias 這兩行即可,設(shè)置方面比較有彈性 ==
sudo的時間間隔問題
或許你已經(jīng)發(fā)現(xiàn)了,那就是如果我們使用同一個賬號在短時間內(nèi)重復(fù)操作sudo來運行命令的話,在第二次執(zhí)行sudo時,并不需要自己的密碼,sudo還是會正確的運行。為什么呢?第一次執(zhí)行sudo需要輸入密碼,是擔(dān)心由于用戶暫時離開座位,但有人跑來你座位使用你的賬號操作系統(tǒng),所以需要你輸入密碼重新確認一次身份。
二次執(zhí)行sudo的間隔在5分鐘內(nèi),那么再次執(zhí)行sudo時就不需要重新輸入密碼了,這是因為系統(tǒng)相信你在5分鐘內(nèi)不會離開,不過兩次sudo操作時間間隔超過5分鐘,那就得重新輸入一次你的密碼了
sudo搭配su的使用方式
很多的時候我們需要大量執(zhí)行很多root的工作,所以一直執(zhí)行sudo覺得很煩,那么有沒有辦法使用sudo搭配su,一口氣將身份轉(zhuǎn)為root,而且還用用戶自己的密碼來變成root呢?如下
[root@localhost ~]# visudo
User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
ADMPW ALL = (root) /bin/su -
[pro2@localhost ~]$ sudo su -
[sudo] pro2 的密碼:
上一次登錄:三 4月 12 17:36:49 CST 2023pts/2 上
[root@localhost ~]#
我們只要輸入【sudo su -】并且輸入【自己的密碼】,就立刻會成為root身份。不但root密碼不會外流,用戶管理也很方便。這些你加入的用戶,全部都是你能夠信任的用戶才行
總結(jié):
sudo命令更加安全和靈活,能夠提供更細粒度的授權(quán)控制,適用于多用戶環(huán)境下的權(quán)限管理;
su命令則更加方便,可以在命令行上直接切換身份,適用于單用戶環(huán)境下的工作。在使用這兩個命令時,需要根據(jù)實際情況選擇合適的方法,避免因誤操作造成不必要的麻煩。文章來源:http://www.zghlxwxcb.cn/news/detail-524168.html
本文參考《鳥哥的Linux私房菜》這本書
文章來源地址http://www.zghlxwxcb.cn/news/detail-524168.html
到了這里,關(guān)于Linux 用戶身份切換(su,sudo)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!