對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)
xxx ALL=NOPASSWD: /bin/su
在linux中每個進程都是有與之相關的UID,GID,分別爲有效UID,真實UID,有效GID,真實GID。有效UID,GID是用來判斷權限,而真實UID,GID是用來記賬(哪個進程屬於哪個用戶,或記錄日誌等等)。當配置了sudo entry後,有效UID裏面就包含了這個被配置的用戶UID,因而權限驗證的時候就可以通過。
參考文章:
1. Linux技術管理手冊
2. Unix高級環境編程