系統管理員必備——linux許可權管理之su與sudo詳解 概要:在linux上進行有關許可權的操作時,往往會碰到這樣的問題:1)為什麼安裝軟體需要在apt-get之前加上sudo?剛剛安裝完畢,再次運行apt-get卻不需要再在前面加sudo?2)為何有時運行sudocommand的時候顯示useris not in the sudoers?3)su和sudo有什麼不同?4)多人使用同一台主機,在授權很多使用者具有root許可權的時候如何保證安全性?本文將主要為你解答上述問題。 1.su su–運行替換使用者和組標識的shell,修改有效使用者標識和組標識為USER的. 1.1對比su與su– root(後者等於su-)執行個體比較:hyk@hyk-linux:~$suPassword:(注意,切換以後的pwd並沒有改變)root@hyk-linux:/home#echo $HOME/rootroot@hyk-linux:/home#exit(後面顯示exit)exithyk@hyk-linux:~$su - rootPassword:(切換以後pwd改變了)root@hyk-linux:~#echo $HOME/rootroot@hyk-linux:~#exit(後面顯示logout)logout從以上執行個體,看出:su-,以root身份登入,執行實際使用者login以後的所有操作(包括環境變數的設定等);而前者只是簡單的使用者切換,pwd等資訊。 1.2su的缺點1)不安全su工具在多人蔘與的系統管理中,並不是最好的選擇,su只適用於一兩個人蔘與管理的系統,畢竟su並不能讓普通使用者受限的使用;超級使用者root密碼應該掌握在少數使用者手中。2)麻煩:需要把root密碼告知每個需要root許可權的人。 2.sudo 2.1sudo的出現背景 由於su對切換到超級許可權使用者root後,許可權的無限制性,所以su並不能擔任多個管理員所管理的系統。如果用su來切換到超級使用者來管理系統,也不能明確哪些工作是由哪個管理員進行的操作。特別是對於伺服器的管理有多人蔘與管理時,最好是針對每個管理員的技術特長和管理範圍,並且有針對性的下放給許可權,並且約定其使用哪些工具來完成與其相關的工作,這時我們就有必要用到sudo。 通過sudo,我們能把某些超級許可權有針對性的下放,並且不需要普通使用者知道root密碼,所以sudo相對於許可權無限制性的su來說,還是比較安全的,所以sudo也能被稱為受限制的su;另外sudo是需要授權許可的,所以也被稱為授權許可的su; sudo執行命令的流程是目前使用者切換到root(或其它指定切換到的使用者),然後以root(或其它指定的切換到的使用者)身份執行命令,執行完成後,直接退回到目前使用者;而這些的前提是要通過sudo的設定檔/etc/sudoers來進行授權;注意:hyk@hyk-linux:~$sudo apt-get install aaaa[sudo]password for hyk:看到沒有,執行sudo的時候,我們需要輸入的是目前使用者hyk的密碼,而不是root密碼。 2.2Sudo的特性: §sudo能夠限制使用者只在某台主機上運行某些命令。 §sudo提供了豐富的日誌,詳細地記錄了每個使用者幹了什麼。它能夠將日誌傳到中心主機或者Log Service器。 §sudo使用時間戳檔案來執行類似的“檢票”系統。當使用者調用sudo並且輸入它的密碼時,使用者獲得了一張存活期為5分鐘的票(這個值可以在編譯的時候改變)。也就是說,我剛剛輸入了sudocat /etc/issue 然後可以再次只需要輸入cat/etc/issue即可,不需要再次輸入sudo。 §sudo的設定檔是sudoers檔案,它允許系統管理員集中的系統管理使用者的使用許可權和使用的主機。它所存放的位置預設是在/etc/sudoers,屬性必須為0411。 2.3.sudo的使用許可權:在/etc/sudoers中有出現的使用者 使用方式:sudo-V sudo-h sudo-l sudo-v sudo-k sudo-s sudo-H sudo[ -b ] [ -p prompt ] [ -u username/#uid] -s 用法:sudocommand 說明:以系統管理者的身份執行指令,也就是說,經由sudo所執行的指令就好像是root親自執行 參數: -V顯示版本編號 -h會顯示版本編號及指令的使用方式說明 -l顯示出自己(執行sudo的使用者)的許可權 -v因為sudo在第一次執行時或是在N分鐘內沒有執行(N預設為五)會問密碼,這個參數是重新做一次確認,如果超過N分鐘,也會問密碼 -k將會強迫使用者在下一次執行sudo時問密碼(不論有沒有超過N分鐘) -b將要執行的指令放在背景執行 -pprompt可以更改問密碼的提示,其中%u會代換為使用者的帳號名稱,%h會顯示主機名稱 -uusername/#uid不加此參數,代表要以root的身份執行指令,而加了此參數,可以以username的身份執行指令(#uid為該username的使用者號碼) -s執行環境變數中的SHELL所指定的shell,或是/etc/passwd裡所指定的shell -H將環境變數中的HOME(家目錄)指定為要變更身份的使用者家目錄(如不加-u參數就是系統管理者root) command要以系統管理者身份(或以-u更改為其他人)執行的指令 範例: sudo-l列出目前的許可權 sudo-V列出sudo的版本資訊 2.4.sudoers的配置 sudoers是sudo的主要設定檔,linux下通常在/etc目錄下,如果是solaris,預設不裝sudo的,編譯安裝後通常在安裝目錄的etc目錄下,不過不管sudoers檔案在哪兒,sudo都提供了一個編輯該檔案的命令:visudo來對該檔案進行修改。強烈推薦使用該命令修改sudoers,因為它會幫你校正檔案配置是否正確,如果不正確,在儲存退出時就會提示你哪段配置出錯的。言歸正傳,下面介紹如何配置sudoers首先寫sudoers的預設配置:##############################################################sudoers file.## This file MUST be edited with the 'visudo'command as root.## See the sudoers man page for the detailson how to write a sudoers file.## Host alias specification#User alias specification# Cmnd alias specification# Defaultsspecification# User privilege specificationroot ALL=(ALL)ALL# Uncomment to allow people in group wheel to run allcommands# %wheel ALL=(ALL) ALL# Same thing without apassword# %wheel ALL=(ALL) NOPASSWD: ALL# Samples# %usersALL=/sbin/mount /cdrom,/sbin/umount /cdrom# %userslocalhost=/sbin/shutdown -hnow##################################################################2.4.1.最簡單的配置,讓普通使用者support具有root的所有許可權執行visudo之後,可以看見預設只有一條配置:rootALL=(ALL) ALL那麼你就在下邊再加一條配置:supportALL=(ALL) ALL這樣,普通使用者support就能夠執行root許可權的所有命令以support使用者登入之後,執行:sudosu -然後輸入support使用者自己的密碼,就可以切換成root使用者了2.4.2讓普通使用者support只能在某幾台伺服器上,執行root能執行的某些命令首先需要配置一些Alias,這樣在下面配置許可權時,會方便一些,不用寫大段大段的配置。Alias主要分成4種Host_AliasCmnd_AliasUser_AliasRunas_Alias1)配置Host_Alias:就是主機的列表Host_AliasHOST_FLAG = hostname1, hostname2, hostname32)配置Cmnd_Alias:就是允許執行的命令的列表,命令前加上!表示不能執行此命令.命令一定要使用絕對路徑,避免其他目錄的同名命令被執行,造成安全隱患,因此使用的時候也是使用絕對路徑!Cmnd_AliasCOMMAND_FLAG = command1, command2, command3 ,!command43)配置User_Alias:就是具有sudo許可權的使用者的列表User_AliasUSER_FLAG = user1, user2, user34)配置Runas_Alias:就是使用者以什麼身份執行(例如root,或者oracle)的列表Runas_AliasRUNAS_FLAG = operator1, operator2, operator35)配置許可權配置許可權的格式如下:USER_FLAGHOST_FLAG=(RUNAS_FLAG) COMMAND_FLAG如果不要求輸入密碼驗證的話,則按照這樣的格式來配置USER_FLAGHOST_FLAG=(RUNAS_FLAG) NOPASSWD:COMMAND_FLAG配置樣本:#############################################################################sudoers file.## This file MUST be edited with the 'visudo'command as root.## See the sudoers man page for the detailson how to write a sudoers file.## Host aliasspecificationHost_Alias EPG = 192.168.1.1, 192.168.1.2# Useralias specification# Cmnd alias specificationCmnd_Alias SQUID= /opt/vtbin/squid_refresh, !/sbin/service, /bin/rmCmnd_AliasADMPW = /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd, !/usr/bin/passwdroot# Defaults specification# User privilegespecificationroot ALL=(ALL) ALLsupport EPG=(ALL) NOPASSWD:SQUIDsupport EPG=(ALL) NOPASSWD: ADMPW# Uncomment to allowpeople in group wheel to run all command# %wheel ALL=(ALL) ALL#Same thing without a password# %wheel ALL=(ALL) NOPASSWD: ALL#Samples# %users ALL=/sbin/mount /cdrom,/sbin/umount /cdrom#%users localhost=/sbin/shutdown -hnow#################################################注意:每種linux的發行版往往對sudoers檔案進行了自己的處理,此時,我們往往需要通過mansudoers來尋找相關變數的定義,然後進行設定 2.5授權管理sudo執行個體1)問題:使用者權限不夠:hyk@hyk-linux:~$cat /etc/shadowcat:/etc/shadow: Permission denied2)解決辦法:指定使用者,授權特定命令使用Visudo可以查看/etc的代碼如下:Defaults env_resetDefaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"#Host alias specification#User alias specification#Cmnd alias specification#User privilege specificationroot ALL=(ALL:ALL) ALL#Members of the admin group may gain root privileges%adminALL=(ALL) ALL#Allow members of group sudo to execute any command%sudo ALL=(ALL:ALL) ALL#See sudoers(5) for more information on "#include"directives:#includedir/etc/sudoers.d注意:env_reset:Ifset, sudo will reset the environment to only contain theLOGNAME, MAIL, SHELL, USER, USERNAME and the SUDO_*variables. Any variables in the caller's environment thatmatch the env_keep and env_check lists are then added. The default contents of the env_keep and env_checklists are displayed when sudo is run by root withthe -V option. If the secure_path option is set, itsvalue will be used for the PATH environment variable. This flag is on by default. secure_path:Pathused for every command run from sudo.This optionis not set by default. 加入這一行:%guestALL=/bin/cat表示guest使用者組可以切換到root下執行cat來查看檔案,儲存,退出。實際上,由於secure_path的作用,guestone使用者已經能夠運行more等所有位於/bin下面的命令了3)驗證:查看guestone的通過sudo能執行哪些命令:命令列輸入:guestone@hyk-linux:~$sudo -l 外部參考:【1】linuxsu與sudo命令 http://www.bkjia.com/os/201304/203693.html