Linux sudo命令與其配置文件/etc/sudoers

對linux有一定了解的人多少也會知道點關於sudo命令。sudo命令核心思想是權限的賦予 ,即某個命令的所屬用戶不是你自己,而你卻有權限執行它。但是我們需要注意的是,雖然你有權限執行這個命令,但是在執行的時候卻仍是以這個命令本身所屬用戶來完成的[註釋1]。(su命令類似sudo命令,但是兩者的差別在於前者su是一個粗粒度權限賦予,
對su最好的理解我覺得是change user running command permanent。即永久的切換到了su過去的用戶,然後以這個su到的新用戶幹它能幹的一切事情,而sudo則是指在執行某個命令的時候臨時切換到這個命令的所屬用戶執行[註釋1],而且sudo可以做到以單個命令爲單位將權限賦予給其他用戶,相比su顯得更加靈活。)

大概瞭解了sudo的功能,那麼你知道怎麼配置sudo嗎?下面來簡要說明一下:
配置sudo的配置文件在/etc/sudoers裏面,一般通過visudo命令來安全打開編輯。查看/etc/sudoers的用法可以使用命令: man 5 sudoers。在/etc/sudoers文件裏面主要包括這兩部分:
1. 別名設置
別名主要包括這幾種:User_Alias,Host_Alias,Runas_Alias,Cmnd_Alias,分別是用戶別名,主機別名,運行用戶別名,命令別名。設置這幾個別名的命令主要是爲了配置方便,這個很類似linux用戶羣組或是數據庫中角色的作用,有了別名便可以批量的賦予權限。
設置方法 Alias_Type alias_name = name1, name2, name3, 例如User_Alias User1 = user1, user2, user3。其他類型的alias設置方法類似。
2. 真正的sudo entry
這個就是真正配置哪些用戶可以使用哪些命令了(你甚至可以不使用別名設置那部分)。
格式爲:用戶名(用戶別名) 主機名(主機別名)=[(運行用戶或是Runas_Alias)可選] [tag可選]  可以執行的命令(或Cmmd_Alias)  這樣描述語法很生硬,不易理解,舉例子
user1  host1 = /bin/kill                                                                              # user1 可以在host1上使用命令/bin/kill
user1  host1 = NOPASSWD: /bin/kill                                                     # user1 可以在host1上使用命令/bin/kill 同時可以不必輸入密碼(這裏就是使用了NOPASSWD
                                                                                                                      # 這個tag,默認是PASSWD)
user1  host1 = NOPASSWD: /bin/kill , PASSWORD: /bin/ls              # user1 可以在host1上使用命令/bin/kill無需輸入密碼,但是使用/bin/ls則需要輸入密碼
user1  host1 = (opterator) /bin/kill                                                          # user1 可以在host1上使用命令/bin/kill但是必須是以operator用戶運行這個命令,等價於
                                                                                                                      # su -u opertor /bin/kill
user1  host1 = (:group_name) /bin/kill                                                 # user1 可以在host1上使用命令/bin/kill,且必須以group_name這個用戶羣組裏面的用戶來運行。

%group_name host1 = /bin/kill                                                              # 所有group_name裏面的用戶都可以在host1上執行/bin/kill(linux中一般代表整個用戶羣組用

                                                                                                                     # %group_name)


再舉個實際例子,我之前對sudo su這個命令不理解,爲什麼我可以直接就su到root用戶了呢,連密碼都不需要?查看了一下sudoers文件才知道原來裏面有這麼一行:
xxx     ALL=NOPASSWD: /bin/su


註釋1:
在linux中每個進程都是有與之相關的UID,GID,分別爲有效UID,真實UID,有效GID,真實GID。有效UID,GID是用來判斷權限,而真實UID,GID是用來記賬(哪個進程屬於哪個用戶,或記錄日誌等等)。當配置了sudo entry後,有效UID裏面就包含了這個被配置的用戶UID,因而權限驗證的時候就可以通過。


參考文章:
1. Linux技術管理手冊
2. Unix高級環境編程
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章