sudo更改身份:
- 我們知道,使用 su 命令可以讓普通用戶切換到 root 身份去執行某些特權命令,但存在一些問題,比如說:僅僅為了一個特權操作就直接賦予普通用戶控制系統的完整權限;
- 當多人使用同一台主機時,如果大家都要使用 su 命令切換到 root 身份,那勢必就需要 root 的密碼,這就導致很多人都知道 root 的密碼;
- 考慮到使用 su 命令可能對系統安裝造成的隱患,最常見的解決方法是使用 sudo 命令,此命令也可以讓你切換至其他用戶的身份去執行命令。
- 相對於使用 su 命令還需要新切換用戶的密碼,sudo 命令的運行只需要知道自己的密碼即可,甚至於,我們可以通過手動修改 sudo 的配置文件,使其無需任何密碼即可運行。
su 切換身份:su -l username –c ‘command’ 切換時需要知道對方的口令
sudo
• 來自sudo包,man 5 sudoers
• sudo能夠授權指定用戶在指定主機上運行某些命令。如果未授權用戶嘗試使
用 sudo,會提示聯系管理員
• sudo可以提供日志,記錄每個用戶使用sudo操作
• sudo為系統管理員提供配置文件,允許系統管理員集中地管理用戶的使用權
限和使用的主機
• sudo使用時間戳文件來完成類似“檢票”的系統,默認存活期為5分鍾的“入場券”
• 通過visudo命令編輯配置文件,具有語法檢查功能
visudo -c 檢查語法
visudo -f /etc/sudoers.d/test
授權規則格式:
用戶 登入主機=(代表用戶) 命令
示例:
root ALL=(ALL) ALL
格式說明:
user: 運行命令者的身份
host: 通過哪些主機(IP地址)
(runas):以哪個用戶的身份
command: 運行哪些命令
root ALL=(ALL) ALL
用戶名 被管理主機的地址=(可使用的身份) 授權命令(絕對路徑)
%wheel ALL=(ALL) ALL
%組名 被管理主機的地址=(可使用的身份) 授權命令(絕對路徑)
模塊 | 含義 |
---|---|
用戶名或群組名 | 表示系統中的那個用戶或群組,可以使用 sudo 這個命令。 |
被管理主機的地址 | 用戶可以管理指定 IP 地址的服務器。這里如果寫 ALL,則代表用戶可以管理任何主機;如果寫固定 IP,則代表用戶可以管理指定的服務器。如果我們在這里寫本機的 IP 地址,不代表只允許本機的用戶使用指定命令,而是代表指定的用戶可以從任何 IP 地址來管理當前服務器。 |
可使用的身份 | 就是把來源用戶切換成什么身份使用,(ALL)代表可以切換成任意身份。這個字段可以省略。 |
授權命令 | 表示 root 把什么命令命令授權給用戶,換句話說,可以用切換的身份執行什么命令。需要注意的是,此命令必須使用絕對路徑寫。默認值是 ALL,表示可以執行任何命令。 |
常用選項:
sudo -i -u wang 切換身份 sudo [-u user] COMMAND -V 顯示版本信息等配置信息 -u user 默認為root -l,ll 列出用戶在主機上可用的和被禁止的命令 -v 再延長密碼有效期限5分鍾,更新時間戳 -k 清除時間戳(1970-01-01),下次需要重新輸密碼 -K 與-k類似,還要刪除時間戳文件 -b 在后台執行指令 -p 改變詢問密碼的提示符號
示例一:
讓用戶進行掛載光盤:
which mount 查看當前的mount在哪個路徑。
/usr/bin/mount
vim /etc/sudoers
修改里邊的配置文件讓wang賬號以root賬號的權限進行掛載光盤和卸載光盤:
su - wang 切換至wang賬號
sudo mount /dev/cdrom /mnt wang賬號以root賬號進行掛載光盤,注意格式和賦予的權限一致,否則無法執行
操作如下:
[root@centos7home]#su - wang Last login: Fri Oct 25 16:04:14 CST 2019 on pts/0 [wang@centos7~]$sudo mount /dev/cdrom /mnt 通過sudo命令進行掛載光盤 mount: /dev/sr0 is write-protected, mounting read-only [wang@centos7~]$df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda2 104806400 4404968 100401432 5% / devtmpfs 740204 0 740204 0% /dev tmpfs 756008 0 756008 0% /dev/shm tmpfs 756008 10472 745536 2% /run tmpfs 756008 0 756008 0% /sys/fs/cgroup /dev/sda3 52403200 48840 52354360 1% /data /dev/sda1 1038336 166960 871376 17% /boot tmpfs 151204 12 151192 1% /run/user/42 tmpfs 151204 0 151204 0% /run/user/1104 /dev/sr0 10491772 10491772 0 100% /mnt
[wang@centos7~]$sudo umount /mnt 配置文件中也賦予wang賬號可以卸載掛載權限
示例二:
賦予wang在任何機器上有root的所有權限:
wang以root身份擁有所有權限之后就可以做任何事情,如:創建用戶,再次登錄時不需要輸入wang賬號口令,原因是有五分鍾的有效期。
[root@centos7home]#su - wang [wang@centos7~]$sudo useradd zhang [wang@centos7~]$sudo useradd xiao
%wheel是一個組,默認有root的權限,只要將組加入到此組內就會有root權限:
示例:
gpasswd -a wang -g wheel 將wang加入wheel組內 [root@centos7home]#id wang uid=1104(wang) gid=1104(wang) groups=1104(wang),10(wheel) [root@centos7home]#su - wang 切換到wang賬號也是可以以root身份進行創建賬號 Last login: Fri Oct 25 16:09:56 CST 2019 on pts/0 [wang@centos7~]$sudo useradd test 用sudo命令可以創建test用戶 [root@centos7~]#gpasswd -d wang wheel 刪除wang在wheel組里 Removing user wang from group wheel
示例三:
用wang在任何機器上代表liu用戶執行權限liu用戶的所有權限:
1)cp /etc/fstab /data/ 復制一個fstab文件到data下 chmod 000 /data/fstab 將此文件的權限改為000 setfacl -m u:liu:rw /data/fstab 授予liu用戶讀寫權限 2)su - wang sudo -u liu cat /data/fstab 其中wang用戶可以通過liu用戶進行讀取文件里邊的內容。 sudo -u liu vim /data/fstab 也可以修改里邊的權限。
示例四:
如果將root里邊/etc/passwd 的root用戶的ID改為1000,普通用戶的ID改為0,此時,root用戶就成為普通用戶,wang成為管理用戶,默認配置文件中root用戶可以切換到的任何用戶具有所有執行權限,因此我們可以通過切換到wang用戶進行執行root的權限。
[wang@centos7~]#su - root Last failed login: Fri Oct 25 09:19:01 CST 2019 from 192.168.34.1 on ssh:notty There were 17 failed login attempts since the last successful login. [root@centos7~]$sudo -u wang cat /data/fstab 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 root: # # /etc/fstab # Created by anaconda on Thu Aug 22 15:21:16 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=38dd5f68-4f30-411c-b80a-0f4a60b06c6f / xfs defaults 0 0 UUID=4357cc0e-6ee7-4a8f-8064-d1a54bdbf17f /boot xfs defaults 0 0 UUID=eb4bf5e6-2645-4b1c-bda8-12c5831b81c2 /data xfs defaults 0 0 UUID=b8c37e0b-3628-40b6-ac44-c36ca09b448f swap swap defaults 0 0
當wang只有普通用戶的賬號權限而沒有root權限時,且沒有root賬號和密碼,怎么辦?
當沒有root賬號且沒有密碼的情況下,我們只需要將wang用戶授權進行切換至任何用戶的操作,只需要我們切換至root下,就可以進行root所擁有的權限操作:
[wang@centos7~]$sudo -i 進行切換身份,默認就會切換至root權限 [sudo] password for wang: 只需要輸入wang賬號的密碼就可以切換至root賬號。 [root@centos7~]#
sudo 寫入用法:
1、我們也可以切換在/etc/sudoers.d文件下建一個新文件,避免與之前的/etc/sudoers配置文件混用,以下的格式,也可以切換至root用戶進行查看:
1)cd /etc/sudoers.d vim test wang ALL=(ALL) ALL su - wang 切換至wang用戶也會用sudo切換至root權限查看內容: sudo cat /etc/fstab
visudo 用法:
此命令可以檢查自己配置文件哪行書寫存在錯誤並提示你去改正:
1)先對其進行聲明變量,顯示顏色方便修改文件:
cd /etc/profile.d/ vim a.sh export EDITOR=vim . /etc/profile.d/a.sh 讓其a.sh文件生效
2) visudo,如果我們寫入錯誤的行,會提示我們語法有問題,然后按e我們去修改錯誤的地方,然后保存退出。
visudo -c也可以具有語法檢測功能,表示之前在/etc/sudoers.d/test文件權限不對,權限過大,建議我們修改為440權限,防止普通用戶查看到里邊的內容。
chmod 440 /etc/sudoers.d/test 修改當前的test權限之后就不會再報有語法問題。 [root@centos7sudoers.d]#visudo -c /etc/sudoers: parsed OK /etc/sudoers.d/test: parsed OK
sudoedit 用法:
修改vim /etc/sudoers.d/test文件中的內容:
內容:wang 192.168.34.100=sudoedit 表示wang賬號可以切換至root賬號下都能進行操作
[root@centos7sudoers.d]#su - wang 切換至wang 賬號可以查看里邊的內容。 Last login: Fri Oct 25 17:29:13 CST 2019 on pts/0 [wang@centos7~]$sudoedit cat /etc/fstab 切換到wang之后就可以用sudoedit命令執行root所有權限 sudoedit: cat: editing files in a writable directory is not permitted # # /etc/fstab # Created by anaconda on Thu Aug 22 15:21:16 2019 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=38dd5f68-4f30-411c-b80a-0f4a60b06c6f / xfs defaults 0 0 UUID=4357cc0e-6ee7-4a8f-8064-d1a54bdbf17f /boot xfs defaults 0 0 UUID=eb4bf5e6-2645-4b1c-bda8-12c5831b81c2 /data xfs defaults 0 0 UUID=b8c37e0b-3628-40b6-ac44-c36ca09b448f swap swap defaults 0 0
總結:wang (普通用戶),ALL(賦予在哪個IP上登陸)=(ALL)(代表哪個賬號) ALL(最后一個是賦予什么權限,如果是單個權限,需要我們寫入命令的完整路徑及命令)
Users和runas:
username
#uid 授權用戶ID
%group_name 授權組
%#gid 授權組ID
sudo別名和示例
別名有四種類型:User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias
別名格式:[A-Z]([A-Z][0-9]_)* 必須以大寫字母開頭
別名定義:
Alias_Type NAME1 = item1, item2, item3 : NAME2 = item4, item5
示例1:
Wang ALL=(ALL) ALL Wang用戶對所有主機擁有root所有權限 %wheel ALL=(ALL) ALL 在%wheel組里邊的用戶對所有主機具有root所有權限
wang ALL=(root) /sbin/pidof,/sbin/ifconfig wang 用戶在任何主機以root身份執行pidof和ifconfig命令 %wheel ALL=(ALL) NOPASSWD: ALL 用戶組在%wheel組的在任何主機登陸時不需要輸入密碼的權限。
User_Alias NETADMIN= test1,tets2 將兩個用戶(test1,test2)進行賦予別名,命名為NETADMIN Cmnd_Alias NETCMD = /usr/sbin/ip 將命令(IP)賦予別名為NETCMD NETADMIN ALL=(root) NETCMD test1,test2用戶在任何主機上以root身份執行IP命令
User_Alias SYSADER=wang,liu,%admins 將用戶wang,liu以及組admins 賦予SYSADER別名中 User_Alias DISKADER=tom 將用戶tom 賦予DISKADER中 Host_Alias SERS=www.baidu.com,172.16.0.0/24 將網址和IP地址賦予SERS別名 Runas_Alias OP=root 將要切換的身份root賦予別名OP Cmnd_Alias SYDCMD=/bin/chown,/bin/chmod 將執行的命令chown和chmod賦予SYDCMD別名 Cmnd_Alias DSKCMD=/sbin/parted,/sbin/fdisk 將執行的命令parted和fdisk命令賦予DSKCMD SYSADER SERS=(OP) SYDCMD,DSKCMD 將wang liu和組%admins在baidu和172.16.0.0機器上以root身份進行執行parted和fdisk名。 DISKADER ALL=(OP) DSKCMD 將tom在任何機器以root身份執行parted和fdisk命令
示例5
User_Alias ADMINUSER =user1,user2 將user1和user2用戶賦予別名到ADMINUSER Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, 將useradd和usermod命令賦予ADMINCMD別名 /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root 將passwd秘鑰修改時只能修改以字母開頭,忽略大小寫,但是不能修改root命令 ADMINUSER ALL=(root) NOPASSWD:ADMINCMD,PASSWD:/usr/sbin/userdel 將user1和user2在任何機器以root身份不需要登錄密碼執行useradd命令,刪除用戶命令需要輸入口令
Defaults:wang runas_default=tom 默認wang賬號默認代表是tom,如果代表jerry 需要加上-u選項。 wang ALL=(tom,jerry) ALL 默認wang用戶在任何機器代表tom,jerry用戶執行所有權限
wang 192.168.1.6,192.168.1.8=(root) /usr/sbin/,!/usr/sbin/useradd wang賬號在在兩個IP地址上代表root用戶執行/usr/bin下的所有命令
wang ALL=(ALL) /bin/cat /var/log/messages* 當前是wang賬號可以在任何機器上以任何身份進行查看messages*下的所有文件 sudo cat /var/log/messages /etc/passwd 此寫法有bug,后面追加文件還會查看到后面的文件內容
wang ALL=(ALL) /bin/cat /var/log/messages*,!/bin/cat /var/log/messages* * [wang@centos7~]$sudo cat /var/log/messages /etc/fstab Sorry, user wang is not allowed to execute '/bin/cat /var/log/messages /etc/fstab' as root on centos7.localdomain. 提示結果是不可以訪問后面的文件