【问题标题】:How to block sudo commands based on arguments [closed]如何根据参数阻止 sudo 命令 [关闭]
【发布时间】:2014-08-04 15:40:48
【问题描述】:

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

[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

我想要某种方式,如果我尝试编辑此特定文件,我会被阻止。 例如..我想根据文件名阻止这些命令

$ 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 手册页,但它 似乎对正则表达式的支持不是很好。

任何有效的东西都会有所帮助。谢谢。

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

【问题讨论】:

  • 不要这样做。您将永远在可能导致的幼稚、业余尝试中发现所有漏洞,并且只会实现比让每个人都充分意识到更危险的安全幻觉充当超级用户的风险。

标签: linux bash sudo sudoers


【解决方案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 具有相同的所有权和权限。

【讨论】:

  • 谢谢,这可能是 bash 输入验证/过滤的基础。
  • @MayurRokade 我实际上的意思是它将替换/usr/bin/sudo,其中/usr/bin/sudo 将被移动到用户无法访问但脚本仍可访问的地方。不过,您确实必须知道自己在做什么。
  • 我明白你想说的,这就像USER-COMMANDS -&gt; SUDO_WRAPPER -&gt; SUDOERS_EXCLUDE_LIST -&gt; REAL_SUDO 而不是普通的USER-COMMANDS -&gt; REAL_SUDO
  • @konsolebox 是的,恕我直言,这就是重点——一旦你允许一切,试图限制伤害是一场你只能输的战斗(终于找到了我要找的东西:stackoverflow.com/questions/504272/…)。跨度>
  • 我实际上以为您是在说我的脚本可能以某种方式被愚弄或可能导致安全漏洞。很明显,如果允许,任何人都可以使用 sudo 运行 shell。但是,如果这是您关心的问题,我认为应该是 OP 的线程,您应该在其中说出这些建议。我的脚本按照 OP 的要求工作。它也可以改进成为更好的过滤器。
猜你喜欢
  • 2014-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多