Linux无自动限制sudo权限机制,须通过lastlog -b 90识别90天未登录的普通用户,清除其在/etc/sudoers或/etc/sudoers.d/中的授权条目,并冻结shell、清空crontab、停用systemd用户服务,最后每日cron自动执行验证。

Linux系统本身不提供“自动限制sudo权限”的内置机制,必须通过识别闲置账户 + 主动清理 sudo 配置文件的方式实现。核心不是“禁用sudo开关”,而是移除该用户在 /etc/sudoers 或 /etc/sudoers.d/ 中的授权条目。
准确识别90天未活跃的普通用户
唯一可信依据是 lastlog -b 90(-b 表示“早于90天前登录”),不是密码过期时间或文件修改时间。
- 运行
lastlog -b 90 | awk '$1 !~ /^(root|sync|shutdown|halt|operator|nobody|.*daemon)/ && $5 != "Never" {print $1}'筛出非系统账号且确实登录过但已超90天未登录的用户名 - 排除从未登录过的账号(
$5 == "Never")可避免误操作新用户或服务账户 - 建议脚本开头加
TZ=UTC,防止跨时区服务器因本地时间偏差漏判
安全移除其sudo权限(关键动作)
冻结 shell(如 usermod -s /sbin/nologin)不影响 sudo 权限生效——只要用户还能通过 SSH 密钥或其它方式获得会话,就仍可能提权执行命令。因此必须显式清除授权。
- 检查是否在主配置中直接授权:
grep -w "^username " /etc/sudoers - 检查是否属于某个有权限的组(如
%wheel或%admin),再查该组定义位置 - 重点清理
/etc/sudoers.d/下的独立文件:rm -f /etc/sudoers.d/username或含该用户名的配置片段 - 若用户被写在主文件里,可用
sed -i '/^username /d' /etc/sudoers删除整行(务必先备份:cp /etc/sudoers /etc/sudoers.bak)
配合冻结登录并验证效果
仅删 sudo 权限不够,需同步阻断所有入口,否则残留权限仍有风险。
- 执行
usermod -s /sbin/nologin username彻底禁止交互式登录(比passwd -l更可靠) - 清空其定时任务:
crontab -u username -r - 停用并禁用其 systemd 用户服务:
sudo systemctl --user stop 'app*.service' && sudo systemctl --user disable 'app*.service' - 验证是否失效:切换到该用户后运行
sudo -l,应返回User username is not allowed to run sudo on hostname.
用Cron每日自动执行整套流程
把上述逻辑封装为脚本,并加入系统级定时任务,才能真正实现“自动限制”。
- 将脚本保存为
/usr/local/bin/disable-idle-sudo.sh,添加执行权限:chmod +x - 在
/etc/cron.daily/下创建软链接或复制脚本,确保每日运行 - 脚本内加入日志记录:
echo "$(date): removed sudo for $user" >> /var/log/sudo-revoke.log - 生产环境务必先在测试账号上完整跑通,确认无误后再启用自动执行


















