Sudoers含通配符命令无法匹配零长度参数问题求助
解决sudoers中带可选参数的命令匹配问题
嘿,我来帮你搞定这个sudo规则的坑~你之前遇到的问题,核心是sudoers里的*通配符在单独作为参数项时,其实是要求这个位置有非空内容的——哪怕文档说它匹配零或多个字符,实际用在参数占位时,它没法匹配“完全空的参数位置”,这就导致你的规则只有当args和subargs都存在时才命中。下面给你两种靠谱的解决方案,还有你关心的安全风险缓解思路:
核心解决方案:覆盖所有参数组合
方式1:拆分规则(直观好维护)
直接写三条规则,分别对应「无args无subargs」「有args无subargs」「有args有subargs」三种场景:
# 场景1:command subcommand(无任何额外参数) your_user_group ALL=(target_users) NOPASSWD: /path/to/command subcommand # 场景2:command [args] subcommand(只有args,无subargs) your_user_group ALL=(target_users) NOPASSWD: /path/to/command * subcommand # 场景3:command [args] subcommand [subargs](两个参数都有) your_user_group ALL=(target_users) NOPASSWD: /path/to/command * subcommand *
sudo会自动匹配其中符合当前命令的规则,这样不管args和subargs有没有,都能命中。
方式2:正则表达式(更简洁)
如果嫌多条规则麻烦,可以用sudo的正则匹配功能(规则前加=启用),一条规则搞定所有情况:
your_user_group ALL=(target_users) NOPASSWD: =/path/to/command( .* subcommand( .*)?)?
给你拆解下这个正则的逻辑:
- 整个
( .* subcommand( .*)?)?是可选的,对应「有没有args+subcommand」的情况 .* subcommand匹配「空格+任意内容(包括空,也就是直接跟subcommand)」,覆盖无args的场景( .*)?匹配subcommand后面可选的「空格+任意内容」,覆盖有无subargs的情况
注意:如果你的sudo配置里有Defaults !regexp,得先把这行注释掉,否则正则规则会失效。
安全风险缓解方案
虽然你已经接受了风险,但还是给你几个降低风险的小技巧:
限制参数不含空格:把规则里的
*换成[^ ]*(匹配不含空格的任意非空字符),这样用户就没法在args里写fake subcommand evil来伪造子命令了。比如调整后的规则:your_user_group ALL=(target_users) NOPASSWD: /path/to/command subcommand, \ /path/to/command [^ ]* subcommand, \ /path/to/command [^ ]* subcommand [^ ]*, \ /path/to/command subcommand [^ ]*用命令别名管理:把允许的命令组合定义成别名,后续维护起来更方便,也更清晰:
Cmnd_Alias SAFE_COMMAND = /path/to/command subcommand, \ /path/to/command * subcommand, \ /path/to/command * subcommand * your_user_group ALL=(target_users) NOPASSWD: SAFE_COMMAND开启sudo审计日志:确保sudo的日志功能正常运行(默认是开启的,日志一般在
/var/log/auth.log或/var/log/secure),这样所有通过这条规则执行的命令都会被记录,万一出问题能快速溯源。
内容的提问来源于stack exchange,提问作者Jeff Hemmen
相关产品推荐
相关产品推荐

