如何基于参数阻止sudo命令

时间:2014-08-04 15:40:48

标签: linux bash sudo sudoers

我有一个像这样的权限的文件

[root@testbox ~]# ls -l /etc/resolv.conf
-rw-r--r-- 1 root root 113 Feb 21 21:29 /etc/resolv.conf

我使用/ etc / sudoer为我的用户启用了无密码sudo

%mayur ALL=(ALL) NOPASSWD: ALL

我想要一些方法,如果我尝试编辑这个特定的文件,我会被阻止。 例如..我想基于THE FILE NAME阻止这些命令

$ echo 123 | sudo tee /etc/resolv.conf  ## SHOULD GET BLOCKED
$ touch newfile | echo 123 > newfile | sudo cp newfile /etc/resolv.conf  ## SHOULD GET BLOCKED

我的努力:

%mayur ALL=(ALL) NOPASSWD: ALL,!/* /etc/resolv.conf
  • 这根本没有用。
  • 我也检查过sudoers man page但是它 似乎正则表达式支持不是很好。

任何有效的方法都会有所帮助。感谢。

编辑:我希望能够将多个服务器上的解决方案应用于具有sudo访问权限的多个用户

1 个答案:

答案 0 :(得分:1)

您可以使用包装器:

#!/bin/bash
declare -A EXCLUDE
while IFS= read -r FILE; do
    EXCLUDE[$FILE]=.
done < /etc/sudoers.exclude-list
for ARG in "$@"; do
    TARGET=$(exec /usr/bin/readlink -m -- "$ARG")
    [[ -n $TARGET && -n ${EXCLUDE[$FILE]} ]] && {
        echo "sudo: Sorry, target is not allowed: $TARGET"
        exit 1
    }
done
exec /path/to/real/sudo-in-secured-location "$@"

其中/etc/sudoers.exclude-list是绝对实际文件路径的基于行的列表。条目不得包含额外的空格,列表不得为DOS格式。

此脚本必须具有与真实sudo相同的所有权和权限。