在多管理員協作的 Linux 環境中,權限最小化原則 是安全基石。su 與 sudo 雖同為切換身份工具,但設計哲學截然不同:前者是「全權委託」,後者是「精準授權」。本文深度解析兩者差異,並提供生產環境配置最佳實踐。
su(Switch User)允許在用戶間切換身份。Root 切換至普通用戶無需密碼;普通用戶切換至任何用戶(含 Root)需驗證目標用戶密碼。
適用場景:單一或極少數管理員的系統、臨時需要完整 Root 權限的維護操作。
| 命令 | 效果 |
|---|---|
su | 切換到 Root,保持當前環境(工作目錄不變) |
su - / su -l | 切換到 Root,載入 Root 完整登入環境(HOME、PATH、SHELL 等) |
su - username | 切換至指定用戶並載入其環境 |
su -c 'command' | 以 Root 身份執行單條命令後自動退回 |
結論:su 僅適合 1-2 人維護的小型環境,企業級生產環境強烈不建議作為常規管理方式。
/var/log/secure 或 /var/log/auth.log 記錄每次提權操作⚠️ 務必使用 visudo 編輯,它會進行語法檢查,防止配置錯誤導致無法提權。
用戶/組 主機=(目標身份) 命令列表
# 範例:允許 beinan 在所有主機以 root 身份執行 more
beinan ALL=(root) /bin/more
| 需求 | 配置語法 | 說明 |
|---|---|---|
| 限制僅能查看特定檔案 | beinan ALL=(root) /bin/more /etc/shadow | 命令後接參數可限制參數 |
| 用戶組授權 | %admin ALL=(ALL) ALL | 組名前加 %,admin 組成員擁有完整 sudo 權限 |
| 目錄級授權 | %ops ALL=(root) /usr/sbin/*, /sbin/* | 通配符授權目錄下所有命令 |
| 排除特定高危命令 | beinan ALL=(root) /usr/sbin/*, !/usr/sbin/fdisk | ! 表示排除,禁止 fdisk |
| 免密碼執行 | beinan ALL=(root) NOPASSWD: /bin/systemctl restart nginx | 自動化腳本常用,需謹慎評估風險 |
sudo -l # 查看當前用戶可執行的 sudo 命令
sudo -u www-data cmd # 以指定用戶身份執行(非 root)
sudo -i # 獲取 root 互動式 shell(類似 su -)
sudo -s # 獲取 root 非登入式 shell
%dba、%webops、%monitoring,人員變動只需增減組員/etc/ssh/sshd_config 設 PermitRootLogin no,強制走 sudo 提權sudo_pair 或自研審批流程/etc/sudoers.d/ 目錄下按角色拆分檔案,Git 管理變更歷史| 誤區 | 事實 |
|---|---|
| sudo 比 su 慢 | 首次驗證有延遲,但會緩存憑證(預設 15 分鐘),後續無感 |
| sudo 不安全,因為用戶密碼可能洩露 | 用戶密碼可定期輪換、雙因子認證;Root 密碼一旦洩露影響面更大 |
| 給 ALL=(ALL) ALL 就好 | 等同於共享 Root 密碼,喪失所有審計與限制優勢 |
su 是「萬能鑰匙」,sudo 是「電子門禁系統」。現代 Linux 運維必須以 sudo 為核心,配合 RBAC 模型、審計日誌、自動化配置管理,構建可追溯、可控制、可合規的特權存取體系。拒絕「為了方便」而濫用 Root,是專業運維的底線。