sudo用途:
sudo用於爲普通用戶授權,一句話:允許哪些用戶在哪些主機上登錄後以哪個用戶身份運行哪些命令。類似Windows系統中的右鍵以管理員方式運行。
一、sudo與su的區別
舉個例子,運維部門來一位新人想交給他完成一些基本的軟件部署任務,但又擔心他對系統架構環境不熟而引發誤操作,此時讓他使用su命令直接切換高權限的管理賬號可能會風險很大,而sudo的靈活授權就可以把權限限定到合理的範圍,從而降低風險。
1. su 實際上就是以目標用戶身份進行登錄,執行su命令切換用戶時必須知道目標用戶的密碼,授權很不靈活,同時也帶來了用戶密碼泄露的安全風險。
2. sudo 則是基於配置文件明確定義指定用戶中以執行哪些命令,只是臨時進行安全上下文切換,而不需要進行用戶登錄切換。在執行sudo 執行命令時只需要輸入用戶自己的密碼即,而不需要知道安全上下文切換的目標用戶密碼。
3. su與sudo都可以執行用戶切換操作,但sudo必須在配置文件中明確定義纔可以進行賬號切換。
su 切換用戶
- su username:不完全切換,HOME不會變爲目標用戶的HOME目錄
- su - username:完全切換,HOME會變爲目標用戶的HOME目錄。
sudo切換用戶- sudo -i 切換爲root用戶
- sudo -u 命令後跟切換的目標用戶名
sudo的相關文件
1. sudo命令來源sudo-1.8.25p1-4.el8.x86_64軟件包。
2. 配置文件:存儲於/etc/sudoers,但支持模塊化配置獨立的配置模塊存儲於/etc/sudoers.d/目錄
3. 日誌文件:sudo的操作記錄存儲於/var/log/secure文件中。
4. 時間探針:sudo的令牌超時機制是基於時間探針文件時間戳來判斷是否超時的,時間探針文件存儲於/run/sudo/ts/目錄下。
學習思路:
- sudo提供了專門的配置文件編輯工具visudo命令,具有語法檢測功能。
- 授權語法輸寫格式:user host=(root) command
- 授權語法共由4個元素:被授權用戶 登錄主機IP=(切換後的用戶身份) 授予哪些操作權限
-
4個授權元素可以是明確的具體對象,也可以是將一組對象組織在一起的別名。
被授權用戶:進程的發起者,可是將一組用戶名或組名組織在一個集合中,集合的名字就是對象別名 登錄主機:可以是一個具體的IP地址,主機名稱,也可以是多個IP地址、主機名稱,網段組織一起的集合。 切換後的用戶身份:進程的最終用戶,如果不填寫則默認爲root用戶,即被授權的用戶以任種身份來執行後面的定義的Command。 command:可以是一系列相關命令的集合,如:將網絡管理類命令組織在一起定義別名。
以上三種元素的別名定義在配置文件中已有明確的範例,可以直接引用,在定義用戶別名時如果其成員中包含用戶組名,則必須使用%進行引用。
最佳操作實踐:
- sudo的配置文件採用模塊化風格的配置,支持includedir引用/etc/sudoers.d目錄中的單獨定義的模塊化配置文件,因此建議根據生產需求基於授權用戶或功能性操作集來單獨定義配置文件,在授權管理上會更清晰。
- 在編輯配置文件時強烈建議使用visudo命令,該命令不加任何選項參數則直接編輯/etc/sudoers文件,所以在定義模塊化配置時使用visudo -f 後加配置模塊文件的路徑。
二、sudo元素別名定義
元素別名可以理解爲變量,別名定義有嚴格的格式要求,sudo中共有四種類型的別名:別名內的成員對象類型受這四種類型的約束,且是必須在系統中存在的對象。
1. 定義語法原則:
a.語法:別名類型 名稱=對象1,對象2,對象3… b.別名可以是在大字母、數字、下劃線的組,注意必須是大寫字母 c.如果別名內有多個成員,則用逗號分隔即可。 d.別名定義必須在同一行內,如果一行寫不下可以使用\進行續行。 e.支持通配符書寫。
2. User_Alias :進程起發始者
例:基於用戶或組名定義別名:User_Alias ADMINS = user1,user2,%admins
例:基於UID或GID定義別名:User_Alias ADMINS = #1023(UID), user2,%#1099(GID)
3. Host_Alias:登錄主機
成員對象可以是:IP地址、主機名、FQDN、CDIR格式網絡號 例:Host_Alias CDNSERVERS =192.168.39.7, 192.168.40.0/24, node1, notd2.microcisco.com
4. Runas_Alias:進程執行的最終用戶
Runas_Alias SRVMGMT=microcisco
5. Cmnd_Alias:被授權用戶允許執行的命令集合
集合成員之間以逗號分隔,每個命令都書寫絕對路徑,命令支持通配符匹配,要執行的命令如果有必須明確指定參數,命令的參數同樣支持通配符匹配。
例1:【定義安裝命令集】Cmnd_Alias INSTALL= /bin/rpm, /usr/bin/up2date, /usr/bin/yum
例2:【基於通配符排除】Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root
6. 默認用戶與runas用戶
授權需求:定義授權模板用戶,將常用的權限都授予該模板用戶,將其他有權限需求的用戶只需要將該模板用戶作爲默認賬號,即可解決頻繁的授權工作。如果有新的權限需求則只需對授權模板用戶授權即可。
配置文件中可以定默認用戶與runas用戶,使用sudo時可以使用-u 選項指定runas用戶,不加-u時使用默認用戶,定義語法如下:
Defaults:microcisco runas_default=vmlab
microcisco IPMI=(tom,root) /usr/bin/cat /etc/shadow,NOPASSWD:SOFTWARE
三、sudo安全
1.sudo自身權限委派sudoedit
默認sudo的配置文件/etc/sudoers權限440,屬主屬組爲root,也就是這個文件其它用戶沒有任何權限,sudoedit則是用於授權哪個用戶可以編輯sudo配置文件,只需在授權規則中將sudoedit命令寫入執行的command列表中即可。
2.sudo的訪問令牌生存週期
爲用戶做sudo授權後,用戶執行命令會要求輸入自己的用戶密碼,默認情況此後的5分鐘之內再用sudo執行命令則不必再次輸入密碼,由次可見sudo也有類似的訪問令牌生存週期機制。
- sudo -V 可以查看令牌期限,字段爲:Authentication timestamp timeout 默認爲5分鐘,原理是執行sudo時通過檢測時間探針文件的時間戳來判斷訪問令牌是否過期,方法就是將執行sudo的當前時間與時間探針文件的時間戳對比,如果當前時間大於時間探針文件時間戳並且超過了5分鐘,則認爲訪問令牌過期,需要重新認證。
- 探針文件存儲於/run/sudo/ts目錄下。可以根據生產需求修改令牌生存週期,visudo編輯配置文件,在env_reset後添加超時時間如:env_reset,timesamp_timeout=1
- sudo-v 可以重置時間探針文件的時間戳
- sudo -k 通過重置密碼時間爲1970年1月1日來作廢sudo的緩存令牌。使用戶在本次或下一次用sudo執行命令時必須輸入密碼。
- sudo -K 通過冊除時間探針文件來作廢sudo的緩存令牌
3.使用sudo時取消輸用密碼過程
對於頻繁使用的命令在每次sudo令牌過期後重新輸入密碼會比較麻煩,在運行shell腳本中涉及到sudo授權的命令時因要求輸入密碼也會打斷腳本的運行。
NOPASSWD可以實現sudo免密執行命令,但同時也存在安全隱患,一定要做好嚴格授權。如下圖所示
正確的授權方式
4.sudo 通配符匹配引發安全漏洞
wang ALL=(root) /bin/cat /var/log/messages
期望授權允許用戶wang,查看 /var/log/目錄下的messages開頭的文件。
安全威脅:sudo cat /var/log/messages /etc/shadow,結果可以查看shadow文件,在glob中代表任意長度任意字符,包括空格、/等。
5.sudo在安全實踐中的注意事項:
- sudo文件默認具有權限suid權限,屬主屬組爲root,其它用戶具備執行權限。
- sudo的訪問令牌生存週期:執行sudo獲取授予權令牌後,若暫時離開管理機時執行sudo -k或-K作廢sudo獲取的訪問令牌。
- sudo在進行目錄授權時,一定要明確排除不希望授權的對象。基於通配符的經典錯誤授權
- 不要將sudoedit命令授權給其它用戶,sudoedit實際上就是sudo命令的軟鏈接
四、實驗部分
1. 編輯默認配置文件:visudo
2. 定義模塊化的配置文件:visudo -f /etc/sudoers.d/vmlab
3. 定義別名
4. 定義sudo默認用戶
Defaults:microcisco runas_default=vmlab
sudo command 用戶默認用戶執行命令。
sudo -u username 用指定用戶執行命令。