直接編輯 /etc/sudoers 極易語法錯誤導致 sudo 失效,visudo 提供語法檢查、鎖定機制,是修改 sudo 授權的唯一推薦方式。本文系統講解 sudoers 規則結構、用戶/命令/主機/運行身份四維授權模型、別名機制及生產級最佳實踐。
用戶 主機=(運行身份) 命令列表
%組名、用戶別名ALL、IP/主機名、主機別名(root)、(%組)、(ALL)、用戶別名ALL、!排除命令# visudo 打開編輯器 root ALL=(ALL) ALL # root 全權限 test ALL=(root) /usr/sbin/useradd # test 以 root 身份執行 useradd
[test@server ~]$ sudo /usr/sbin/useradd newuser [sudo] password for test: # 輸入 test 自身密碼 [test@server ~]$ tail -1 /etc/passwd newuser:x:501:501::/home/newuser:/bin/bash
User_Alias ADMINS = jsmith, mikem User_Alias DEVOPS = user1, user2, user3, user4 DEVOPS ALL=(root) /usr/sbin/useradd, /usr/sbin/usermod
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/parted, /sbin/mkfs.*, /sbin/mount, /sbin/umount ADMINS ALL=(root) NETWORKING, STORAGE
Host_Alias WEBSERVERS = web01, web02, 192.168.1.100/24 Host_Alias DBSERVERS = db01, db02 DEVOPS WEBSERVERS=(root) NETWORKING
Runas_Alias DBUSERS = oracle, mysql, postgres ADMINS ALL=(DBUSERS) /u01/app/oracle/bin/sqlplus
# /etc/sudoers 核心片段 Defaults env_reset, timestamp_timeout=15, logfile=/var/log/sudo.log Defaults !lecture, !authenticate # 免密(極不推薦生產環境) # 別名定義區 User_Alias FULL_ADMIN = root, alice User_Alias NET_OPS = bob, charlie User_Alias DEV_TEAM = %developers Host_Alias PROD = 10.0.1.0/24, 10.0.2.0/24 Host_Alias STAGING = 10.0.10.0/24 Cmnd_Alias SYS_MGMT = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/groupadd, /usr/sbin/groupmod Cmnd_Alias NET_CMDS = /sbin/ip, /sbin/ifconfig, /bin/ping, /usr/bin/ss, /sbin/iptables Cmnd_Alias SVC_MGMT = /bin/systemctl, /sbin/service, /usr/bin/journalctl Cmnd_Alias PKG_MGMT = /usr/bin/yum, /usr/bin/dnf, /usr/bin/apt, /usr/bin/rpm Cmnd_Alias SHELLS = /bin/bash, /bin/sh, /bin/zsh, /usr/bin/vi, /usr/bin/vim # 授權規則區 FULL_ADMIN ALL=(ALL) ALL NET_OPS PROD=(root) NET_CMDS, SVC_MGMT DEV_TEAM STAGING=(root) SYS_MGMT, PKG_MGMT %wheel ALL=(ALL) ALL, !SHELLS # wheel 組全權但禁 shell 逃逸
visudo:語法錯誤會阻擋保存,避免鎖死自己。ALL。!SHELLS、!/bin/su、!/usr/bin/passwd 防止權限提升鏈。Defaults logfile=/var/log/sudo.log 統一審計。Defaults timestamp_timeout=15 分鐘重新驗證密碼。Defaults env_reset 防止 LD_PRELOAD 等注入攻擊。sudo -l -U username 查看生效規則;sudo -k 清除時間戳重測。| 現象 | 原因 | 修正 |
|---|---|---|
>> /etc/sudoers: syntax error near line N | 語法錯誤(漏逗號、括號不匹配) | visudo -c 語法檢查;對比行號修正 |
| 命令不生效 | 路徑非絕對/命令別名未定義 | which cmd 確認絕對路徑;檢查別名拼寫 |
提示 not in the sudoers file | 用戶未授權或組名寫錯 | 確認 User_Alias 或 %group 拼寫 |
| 免密不生效 | Defaults !authenticate 衝突/組策略 | 檢查 Defaults 順序,後定義覆蓋前定義 |
visudo + 別名機制 + 最小權限 = 可維護、可審計、安全的 sudo 授權體系。將授權規則模組化(別名區 + 規則區),納入版本控制(Git 管理 /etc/sudoers.d/ 碎片文件),實現基礎設施即代碼。