某 Linux 服務器長期存在詭異現象:普通用戶執行 crontab -e 時報錯 seteuid: Operation not permitted,只能切換 Root 以 crontab -u user -e 代為編輯。經排查,根因是 /usr/bin/crontab 缺少 SUID 權限位。本文記錄完整排查思路、修復命令與驗證方法。
$ crontab -e
seteuid: Operation not permitted
$ crontab -l
seteuid: Operation not permitted
| 屬性 | 異常狀態 | 正常狀態 |
|---|---|---|
| ls -l 輸出 | -rwxr-xr-x 1 root root 70592 Jul 12 2005 /usr/bin/crontab | -rwsr-xr-x 1 root root 70592 Jul 12 2005 /usr/bin/crontab |
| 權限位解讀 | 所有者 rwx,組 rx,其他 rx | 所有者 rws(SUID),組 rx,其他 rx |
| 關鍵差異 | 無 s 標誌 | 第 4 位為 s,表示執行時獲得文件所有者 (root) 權限 |
crontab 需要讀寫 /var/spool/cron/ 下用戶專屬文件,該目錄權限通常為 drwx-wx--T root crontab(僅 root 和 crontab 組可寫,粘滯位防止誤刪)。普通用戶無直接寫入權限,crontab 必須以 Root 權限代寫,因此必須設置 SUID 位。
# 必須以 root 執行
chmod u+s /usr/bin/crontab
# 或等價數字模式
chmod 4755 /usr/bin/crontab
$ ls -l /usr/bin/crontab
-rwsr-xr-x 1 root root 70592 Jul 12 2005 /usr/bin/crontab
$ crontab -e
# 正常進入編輯器
$ crontab -l
# 正常顯示內容
chmod 755 覆蓋導致(最常見)# 1. 基線掃描腳本(加入每日 cron)
#!/bin/bash
expected="4755"
actual=$(stat -c '%a' /usr/bin/crontab)
if [[ "$actual" != "$expected" ]]; then
echo "ALERT: crontab permission changed to $actual" | mail -s "Permission Drift" root
chmod 4755 /usr/bin/crontab
fi
# 2. RPM/Deb 包驗證
rpm -V cronie # RHEL/CentOS,輸出包含 .M 表示模式被修改
debsums -c cron # Debian/Ubuntu
| 特殊位 | 字母標誌 | 數值 | 文件效果 | 目錄效果 |
|---|---|---|---|---|
| SUID | 所有者 x 位變 s/S | 4000 | 執行時獲得文件所有者權限 | 無 |
| SGID | 組 x 位變 s/S | 2000 | 執行時獲得文件所屬組權限 | 新建文件繼承目錄所屬組 |
| Sticky | 其他 x 位變 t/T | 1000 | 無 | 僅所有者/root可刪除文件 |
s(小寫)表示原有 x 權限存在;S(大寫)表示原無 x 權限。
總結:crontab SUID 位缺失是經典權限漂移案例。運維應建立關鍵二進制文件權限基線,納入自動化合規掃描,做到「變更即告警、漂移即修復」。