本文綜合分析了Linux系統下,如何使用runuser命令、su命令和sudo命令以其他用戶身份來運行程序,以及這三個命令的運行效率比較。
一、su 命令臨時切換用戶身份
SU:( Switch user切換用戶),可讓一個普通用戶切換為超級用戶或其他用戶,並可臨時擁有所切換用戶的權限,切換時需輸入欲切換用戶的密碼;也可以讓超級用戶切換為普通用戶,臨時以低權限身份處理事務,切換時無需輸入欲切換用戶的密碼。
zai Linux 系統中,有時候普通用戶有些事情是不能做的,除非是 root 用戶才能做到。這時就需要用 su 命令臨時切換到 root 身份來做事了。
1、su 的語法
su [OPTION選項參數] [用戶]
-, -l, –login
切換用戶時,使環境變量(home,shell,user,logname,path等)和欲切換的用戶相同、不使用則取得用戶的臨時權限,不加載環境變量。用su命令切換用戶后,可以用 exit 命令或快捷鍵[Ctrl+D]可返回原登錄用戶;
-c, –command=COMMAND
使用 -c 傳遞單個命令到 shell 中,執行命令后,就恢復原來的用戶身份,退出所切換到的用戶環境;
–session-command=COMMAND
使用 -c 傳遞單個命令到 shell 中,並且不創建新的會話;
-f, –fast
通過 -f 參數到 shell (針對 csh 或 tcsh);
-m, –preserve-environment
不重置環境變量;
-s, –shell=SHELL
指定執行命令的shell;
–help
顯示幫助信息;
–version
顯示版本信息;
2、su 的范例:
1
2
3
4
5
|
su
-
su
- root
su
- root -c
"ls -l /root"
su
- oracle -c
"ulimit -aHS"
su
-s
/bin/sh
-c
"/usr/local/nginx/sbin/nginx"
|
3、su 的優缺點
su 的確為管理帶來方便,通過切換到 root 下,能完成所有系統管理工具,只要把 root 的密碼交給任何一個普通用戶,他都能切換到 root 來完成所有的系統管理工作。但通過 su 切換到 root 后,也有不安全因素;比如系統有10個用戶,而且都參與管理。如果這10個用戶都涉及到超級權限的運用,做為管理員如果想讓其它用戶通過 su 來切換到超級權限的 root,必須把 root 權限密碼都告訴這10個用戶。如果這10個用戶都有 root 權限,通過 root 權限可、以做任何事,這在一定程度上就對系統的安全造成了威協,想想 Windows 吧,簡直就是惡夢。
“沒有不安全的系統,只有不安全的人”,我們絕對不能保證這10個用戶都能按正常操作流程來管理系統,其中任何一人對系統操作的重大失誤,都可能導致系統崩潰或數據損失,所以 su 工具在多人參與的系統管理中,並不是最好的選擇,su 只適用於一兩個人參與管理的系統,畢竟 su 並不能讓普通用戶受限的使用;超級用戶 root 密碼應該掌握在少數用戶手中,這絕對是真理!所以集權而治的存在還是有一定道理的。
二、sudo 命令
1、sudo 的適用條件
由於su 對切換到超級權限用戶 root 后,權限的無限制性,所以 su 並不能擔任多個管理員所管理的系統。如果用 su 來切換到超級用戶來管理系統,也不能明確哪些工作是由哪個管理員進行的操作。特別是對於服務器的管理有多人參與管理時,最好是針對每個管理員的技術特長和管理范圍,並且有針對性的下放給權限,並且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到 sudo。通過 sudo,我們能把某些超級權限有針對性的下放,並且不需要普通用戶知道 root 密碼,所以 sudo 相對於權限無限制性的 su 來說,還是比較安全的,所以 sudo 也能被稱為受限制的 su。另外 sudo 是需要授權許可的,所以也被稱為授權許可的 su。
sudo 執行命令的流程是當前用戶切換到root(或其它指定切換到的用戶),然后以root(或其它指定的切換到的用戶)身份執行命令,執行完成后,直接退回到當前用戶,而這些的前提是要通過sudo的配置文件/etc/sudoers來進行授權。默認只有 root 用戶能使用 sudo 命令,普通用戶想要使用 sudo,是需要 root 預先設定的,默認 root 能夠 sudo 是因為這個文件中有一行”root ALL=(ALL) ALL”。
2、sudo 配置文件
我們可以用他的專用編輯工具 visodu ,此工具的好處是在添加規則不太准確時,保存退出時會提示給我們錯誤信息;配置好后,可以用切換到您授權的用戶下,通過sudo -l 來查看哪些命令是可以執行或禁止的。
/etc/sudoers 文件中每行算一個規則,前面帶有 # 號可以當作是說明的內容,並不執行;如果規則很長,一行列不下時,可以用 \ 號來續行,這樣看來一個規則也可以擁有多個行。
/etc/sudoers 的規則可分為兩類:一類是別名定義,另一類是授權規則;別名定義並不是必須的,但授權規則是必須的。
sudo授權規則(sudoers配置):
1
|
授權用戶 主機=命令動作
|
這三個要素缺一不可,但在動作之前也可以指定切換到特定用戶下,在這里指定切換的用戶要用( )號括起來,如果不需要密碼直接運行命令的,應該加 NOPASSWD: 參數,但這些可以省略。舉例說明:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %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
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now
## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
|
執行visudo之后,可以看見缺省只有一條配置:
root ALL=(ALL) ALL
那么你就在下邊再加一條配置:
admin ALL=(ALL) ALL
這樣,普通用戶 admin 就能夠執行 root 權限的所有命令。
讓普通用戶support只能在某幾台服務器上,執行root能執行的某些命令,首先需要配置一些Alias,這樣在下面配置權限時,會方便一些,不用寫大段大段的配置。Alias主要分成4種:
Host_Alias
Cmnd_Alias
User_Alias
Runas_Alias
配置Host_Alias:就是主機的列表
Host_Alias HOST_FLAG = hostname1, hostname2, hostname3
配置Cmnd_Alias:就是允許執行的命令的列表,命令前加上 ! 表示不能執行此命令。命令一定要使用絕對路徑,避免其他目錄的同名命令被執行,造成安全隱患 ,因此使用的時候也是使用絕對路徑!
Cmnd_Alias COMMAND_FLAG = command1, command2, command3 ,!command4
配置User_Alias:就是具有sudo權限的用戶的列表
User_Alias USER_FLAG = user1, user2, user3
配置Runas_Alias:就是用戶以什么身份執行(例如root,或者oracle)的列表
Runas_Alias RUNAS_FLAG = operator1, operator2, operator3
配置權限的格式如下:
USER_FLAG HOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG
如果不需要密碼驗證的話,則按照這樣的格式來配置
USER_FLAG HOST_FLAG=(RUNAS_FLAG) NOPASSWD: COMMAND_FLAG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
## Host Aliases
## Groups of machines. You may prefer to use hostnames (perhaps using
## wildcards for entire domains) or IP addresses instead.
Host_Alias EPG = 192.168.1.1, 192.168.1.2
## User Aliases
## These aren't often necessary, as you can use regular groups
## (ie, from files, LDAP, NIS, etc) in this file - just use %groupname
## rather than USERALIAS
# User_Alias ADMINS = jsmith, mikem
## Command Aliases
## These are groups of related commands...
Cmnd_Alias SQUID =
/opt/vtbin/squid_refresh
, !
/sbin/service
,
/bin/rm
Cmnd_Alias ADMPW =
/usr/bin/passwd
[A-Za-z]*, !
/usr/bin/passwd
, !
/usr/bin/passwd
root
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
admin EPG=(ALL) NOPASSWD: SQUID
admin EPG=(ALL) NOPASSWD: ADMPW
## Allows people in group wheel to run all commands
# %wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
## Allows members of the users group to mount and unmount the
## cdrom as root
# %users ALL=/sbin/mount /mnt/cdrom, /sbin/umount /mnt/cdrom
## Allows members of the users group to shutdown this system
# %users localhost=/sbin/shutdown -h now
|
當然新用戶的配置也可以放到,/etc/sudoers.d/ 下的文件里,也會生效,修改也方便。
3、sudo 語法
sudo [ -Vhl LvkKsHPSb ] │ [ -p prompt ] [ -c class│- ] [ -a auth_type ] [-u username│#uid ] command
1
2
3
4
5
6
7
8
9
10
11
|
-V 顯示版本編號
-h 會顯示版本編號及指令的使用方式說明
-l 顯示出自己(執行 sudo 的使用者)的權限
-v 因為 sudo 在第一次執行時或是在 N 分鍾內沒有執行(N 預設為五)會問密碼,這個參數是重新做一次確認,如果超過 N 分鍾,也會問密碼
-k 將會強迫使用者在下一次執行 sudo 時問密碼(不論有沒有超過 N 分鍾)
-b 將要執行的指令放在背景執行
-p prompt 可以更改問密碼的提示語,其中 %u 會代換為使用者的帳號名稱, %h 會顯示主機名稱
-u username/#uid 不加此參數,代表要以 root 的身份執行指令,而加了此參數,可以以 username 的身份執行指令(#uid 為該 username 的使用者號碼)
-s 執行環境變數中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell
-H 將環境變數中的 HOME (家目錄)指定為要變更身份的使用者家目錄(如不加 -u 參數就是系統管理者 root )
command 要以系統管理者身份(或以 -u 更改為其他人)執行的指令
|
三、runuser 命令
runuser命令使用一個替代的用戶或者組ID運行一個Shell。這個命令僅在root用戶時有用。
僅以會話PAM鈎子運行,並且沒有密碼提示。如果用一個非root用戶,並且該用戶沒有權限設置user ID,這個命令將會因為程序沒有setuid而失敗。因runuser不會運行認證和賬戶PAM鈎子,它比su更底層。
1、runuser 語法
語法與 su 命令基本一樣:
-, -l, –login
讓shell成為登錄shell,用 runuser -l PAM 文件替代默認的;
-g –group=group
指定主要的組;
-G –supp-group=group
指定追加組
-c, –command=COMMAND
使用 -c 傳遞單個命令到 shell 中,執行命令后,就退出到 root;
–session-command=COMMAND
通過一個單一的命令用 -c 參數到 shell ,不創建一個新的會話;
-f, –fast
通過 -f 參數到 shell (針對 csh 或 tcsh);
-m, –preserve-environment
不重置環境變量;
-p same as -m
-s, –shell=SHELL
指定執行命令的shell;
2、runuser 樣例
1
2
3
|
runuser -l userNameHere -c
'/path/to/command arg1 arg2'
runuser -l oracle -c
'ulimit -SHa'
runuser -s
/bin/sh
-c
"/usr/local/nginx/sbin/nginx"
|
有時,root用戶由於權限(安全)問題不能瀏覽NFS掛載的共享:
1
|
ls
-l
/nfs/wwwroot/http
|
或
1
|
cd
/nfs/wwwroot/http
|
可能的輸出:
1
|
-
bash
:
cd
:
/nfs/wwwroot/http/
: Permission denied
|
盡管如此,apache用戶被允許瀏覽或訪問掛載在/nfs/wwwroot/http/下基於nfs的系統:
1
|
runuser -l apache -c
'ls -l /nfs/wwwroot/http/'
|
或
1
|
runuser -l apache -c
'cd /nfs/wwwroot/http/; vi index.php'
|
使用runuser命令,無需使用密碼,並且,只能在root用戶下使用。
四、總結:su VS su VS dorunuser
命令 | root 到 用戶 |
用戶 到 root |
任意用戶 到 任意用戶 |
認證方式 | 日志文件 | 備注 |
---|---|---|---|---|---|---|
runuser | Y | N | N | 無 | 無 | 因 runuser 不會運行認證和賬戶 PAM 鈎子,它比 su 更底層。 |
su | Y | Y | Y | 目標用戶的密碼 | /var/log/auth.log 或 /var/log/secure |
你必須與其它用戶分享你的密碼或 root 密碼。 |
sudo | Y | Y | Y | 認證用戶使用他們自己的密碼,而不是目標用戶。 | /var/log/auth.log 或 /var/log/secure |
允許系統管理員委托授權給一個特定的用戶(或用戶組),讓其在提供審計跟蹤命令后可以以 root 或其它用戶運行某些(或全部)命令。 |
su 與 runuser 都可以用來寫系統自啟動腳本,如 Tomcat 服務使用系統用戶啟動的自啟動腳本。什么時候使用哪種命令,根據使用場景自己來決定吧。
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。