第2章 系統使用者/組管理(2) su和sudo
2.1 su
切換使用者或以指定使用者執行命令。
使用su可以指定執行命令的身份(user/group/uid/gid)。
為了向後相容,su預設不會改變當前目錄,且僅設定HOME和SHELL這兩個環境變數(若目標使用者非root,則還設定USER和LOGNAME環境變數)。推薦使用--login選項(即"-"選項)避免環境變數混亂。
su [options...] [-] [user [args...]]
選項說明:
-c command:使用-c選項傳遞要指定的命令到shell上執行。使用-c執行命令會為每個su都分配新的會話環境
-, -l, --login:啟動shell作為登入的shell,模擬真正的登入環境。它會做下面幾件事:
1.清除除了TERM外的所有環境變數
2.初始化HOME,SHELL,USER,LOGNAME,PATH環境變數
3.進入目標使用者的家目錄
4.設定argv[0]為"-"以便設定shell作為登入的shell
使用--login的su是互動式登入。不使用--login的su是非互動式登入(除不帶任何引數的su外
-m, -p, --preserve-environment:保留整個環境變數(不會重新設定HOME,SHELL,USER和LOGNAME),
保留環境的方法是新使用者shell上執行原使用者的各配置檔案,如 ~/.bashrc。
當設定了--login時,將忽略該選項
-s SHELL:執行指定的shell而非預設shell,選擇shell的順序優先順序如下:
1.--shell指定的shell
2.如果使用了--preserve-environment,選擇SHELL環境變數的shell
3.選專案標使用者在passwd檔案中指定的shell
4./bin/sh
注意:
(1). 若su沒有給定任何引數,將預設以root身份執行互動式的shell(互動式,所以需要輸入密碼),即切換到root使用者,但只改變HOME和SHELL環境變數。
(2). su - username是互動式登入,要求密碼,會重置整個環境變數,它實際上是在模擬真實的登入環境。
(3). su username是非互動登入,不會重置除HOME/SHELL外的環境變數。
例如:使用者wangwu家目錄為/home/wangwu,其shell為/bin/csh。
shell> head -1 /etc/passwd ; tail -1 /etc/passwd
root:x:0:0:root:/root:/bin/bash
wangwu:x:2002:2002::/home/wangwu:/bin/csh
首先su到wangwu上,再執行一個完全不帶引數的su。
shell> su - wangwu # 使用su - username後,以登入shell的方式模擬登入,會重新設定各環境變數。su - username是互動式登入
shell> env | egrep -i '^home|^shell|^path|^logname|^user'
HOME=/home/wangwu
SHELL=/bin/csh
USER=wangwu
LOGNAME=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin
PWD=/home/wangwu
shell> su # 不帶任何引數的su,是互動式登入切換回root,但只會改變HOME和SHELL環境變數
shell> env | egrep -i '^home|^shell|^path|^logname|^user|^pwd'
SHELL=/bin/bash
USER=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin
PWD=/home/wangwu
HOME=/root
LOGNAME=wangwu
shell> su - # su - 的方式切換回root
Password:
shell> env | egrep -i '^home|^shell|^path|^logname|^user|^pwd'
SHELL=/bin/bash
USER=root
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/root
LOGNAME=root
shell> su wangwu # 再直接su username,它只會重置SHELL和HOME兩個環境變數,其他環境變數保持不變
shell> env | egrep -i '^home|^shell|^path|^logname|^user|^pwd'
SHELL=/bin/csh
USER=wangwu
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
HOME=/home/wangwu
LOGNAME=wangwu
在某些環境下或指令碼中,可能需要臨時切換身份執行命令,注意這時候的環境變數是否會改變,否則很可能報錯提示命令找不到。
2.2 sudo
sudo可以讓一個使用者以某個身份(如root或其他使用者)執行某些命令,它隱含的執行方式是切換到指定使用者再執行命令,因為涉及到了使用者的切換,所以環境變數是否重置是需要設定的。
sudo支援外掛實現安全策略。預設的安全策略外掛是sudoers,它是通過/etc/sudoers或LDAP來配置的。
安全策略是控制使用者使用sudo命令時具有什麼許可權,但要注意,安全策略可能需要使用者進行身份認證,如密碼認證的機制或其他認證機制,如果開啟了認證要求,則在指定時間內未完成認證時sudo會退出,預設超時時間為5分鐘。
安全策略支援對認證進行快取,使得在一定時間內該使用者無需再次認證就可以執行sudo命令,預設快取時間為5分鐘,sudo -v可以更新認證快取。
sudo支援日誌稽核,可以記錄下成功或失敗的sudo。
2.2.1 /etc/sudoers檔案
該檔案裡主要配置sudo命令時指定的使用者和對應的許可權。
shell> visudo # 以下選取的是部分行
## hostname or IP addresses instead. # 主機別名Host_Alias
# Host_Alias FILESERVERS = fs1, fs2
# Host_Alias MAILSERVERS = smtp, smtp2
## User Aliases # 使用者別名User_Alias
# User_Alias ADMINS = jsmith, mikem
## Command Aliases # 命令別名
# Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig
# Cmnd_Alias LOCATE = /usr/bin/updatedb
root ALL=(ALL) ALL # sudo許可權的配置
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
在這個檔案裡,主要有別名(使用者別名,主機別名,命令別名)的配置和sudo許可權的配置。
安全策略配置格式為:
使用者名稱 主機名=(可切換到的使用者身份) 許可權和命令
① ② ③ ④
①使用者名稱:可以用組,只需在組名前加個百分號%表示。
②主機名:表示該使用者可以在哪些主機上執行sudo,可以用hostname也可以用ip指定。
③可切換的使用者身份,即指定執行命令的使用者,也可以用組。
④許可權和命令:允許執行和不允許執行的命令(多個命令間用逗號分隔)和特殊許可權,命令可以帶其選項及引數。命令要寫絕對路徑。不允許執行的命令需要在命令前加上"!"來表示。可以使用標籤,如NOPASSWD標籤表示切換或以指定使用者執行該標籤後的命令時不需要輸入密碼。一行寫不下時可使用"\"續行。
標籤使用方法:
NOPASSWD:/usr/sbin/useradd,PASSWD:/usr/sbin/userdel
它表示useradd命令不需要輸入密碼,而userdel需要輸入密碼。
對於別名,相當於使用者對於使用者組。許可權配置處都可以使用別名,即①②③④處都能使用別名來配置。
例如,主機別名裡設定多個主機,以後在②位置處直接使用主機別名。
FILESERVERS = fs1, fs2
以下是某設定示例:
DEFAULT=/bin/*,/sbin/ldconfig,/sbin/ifconfig,/usr/sbin/useradd,/usr/sbin/userdel,/bin/rpm,/usr/bin/yum,/sbin/service,/sbin/chkconfig,sudoedit /etc/rc.local,sudoedit /etc/hosts,sudoedit /etc/ld.so.conf,/bin/mount,sudoedit /etc/exports,/usr/bin/passwd [!-]*,!/usr/bin/passwd root,/bin/su - [!-]*,!/bin/su - root,!/bin/su root, /bin/bash, /usr/sbin/dmidecode, /usr/sbin/lsof, /usr/bin/du, /usr/bin/python, /usr/sbin/xm,sudoedit /etc/profile,sudoedit /etc/bashrc,/usr/bin/make,sudoedit /etc/security/limits.conf,/etc/init.d/*,/usr/bin/ruby
ABC ALL=(ALL)NOPASSWD:DEFAULT
其中上面的"/usr/bin/passwd [!-]*"表示允許修改加引數的密碼。"/bin/su - [!-]*"表示允許"su -"到某使用者下,但必須給引數。
2.2.2 sudo和sudoedit命令
當sudo執行指定的command時,它會呼叫fork函式,並設定命令的執行環境(如某些環境變數),然後在子程序中執行command,sudo的主程序等待命令執行完畢,然後傳遞命令的退出狀態碼給安全策略並退出。
sudoedit等價於sudo -e,它是以sudo的方式執行檔案編輯動作。
sudo [options] [command]
選項說明:
-b :(background)該選項告訴sudo在後臺執行指定的命令。
注意,如果使用該選項,將無法使用任務計劃(job)來控制維護這些後臺程序,
需要互動的命令應該考慮是否真的要後臺,因為可能會失敗
-l[l] [command]:當單獨使用-l選項時,將列出(list)使用者可執行和被禁止的命令。
當配合command時,且該command是被允許執行的命令,將列出命令的全路徑及該命令引數。
如果command是不被允許執行的,則sudo直接以狀態碼-1退出。
可以指定多個字母"l"來顯示更詳細的格式
-n :使得sudo變成非互動模式,但如果安全策略是要求輸入密碼的,則sudo將報錯
-S :(stdin)該選項使得sudo從標準輸入而非終端裝置上讀取密碼,給定的密碼必須在尾部加上換行符
-s [command] :(shell)指定要切換到的shell,如果給定command,則在此shell上執行該命令
-U user :(other user)配合-l選項來指定要列出哪個使用者的許可權資訊
-u user :(user)該選項明確指定要以此處指定的使用者而非root來執行command。
若使用uid的方式指定使用者,則需要使用"#uid",但很多時候可能需要對"#"使用"\"轉義,即使用"\#uid"
-E :(environment)該選項告訴sudo在執行命令時保留自己的環境變數,保留環境變數的方式是執行環境配置檔案。
但因為跨了使用者,所以很可能某些家目錄下的環境配置檔案會因為無許可權而執行失敗,此時sudo將報錯
-k [command] :當單獨使用-k選項時,sudo將使得使用者的認證快取失效。下次執行sudo命令需要輸入密碼。
當配合command時,-k選項將忽略使用者的快取,所以sudo將要求使用者輸入密碼,但這次輸入密碼不會更新認證快取
但執行-k選項本身,不需要密碼
-K :(sure kill)類似於-k選項,但它會完全移除使用者的認證快取,且不會配合command,執行-K本身不需要密碼
-v :(validate)該選項使得sudo更新使用者認證快取
-- :暗示sudo命令列引數到此結束
在sudo上可以直接設定環境變數,它會傳遞為command的環境。設定的方式為var=value,如LD_LIBRARY_PATH=/usr/local/pkg/lib
由於sudo預設的安全策略外掛是sudoers,所以當用戶執行sudo時,系統會自動去尋找/etc/sudoers檔案(該檔案裡被root配置了使用者對應的許可權,也即安全策略),檢視sudo要使用的使用者是否有對應的許可權,如果有則執行,如果沒有許可權就失敗退出sudo。
轉載請註明出處:https://www.cnblogs.com/f-ck-need-u/p/7011669.html
如果覺得文章不錯,還請幫忙點下"推薦",各位的支援,能激發和鼓勵我更大的寫作熱情。謝謝!
作者:駿馬金龍
出處:http://www.cnblogs.com/f-ck-need-u/
Linux運維交流群:710427601
Linux&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
網站架構系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
MySQL/MariaDB系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
Perl系列:https://www.cnblogs.com/f-ck-need-u/p/9512185.html
分類: Linux 基礎篇