Linux,以编程方式添加到 sudoers 文件

Linux,以编程方式添加到 sudoers 文件

以编程方式更新文件的正确方法是什么sudoers?具体来说:

  • 我怎样才能添加到我的文件中的行,timestamp_timeout=600尾(将nag 时间增加到 10 小时),并以编程方式执行此操作而不破坏系统(我尝试过一次,导致我的 Linux 系统无法启动,不得不重新安装)。我读过这可能对此很重要。Defaults env_resetsudoerssudochmod 440
  • 我知道这很危险,我明白为什么它受到保护,但这些是我的家庭系统,其中我有一个脚本可以运行数十个简单的配置更改(而且我也相当定期地重建这些系统,所以这对我很有用)以便能够自动执行此操作)。
  • 我最感兴趣的是如何使用可以放入bash脚本中的标准 Linux 工具来完成此操作,但我也非常有兴趣了解如何在 Ansible 中完成这个确切的操作,以便我可以推出这样的简单更改sudoers我的家庭网络上的所有文件。
  • 这一页该文件有一个讨论sudoers,但我不太明白其中的引用visudo -c -f;的引用我思考建议的是:复制文件sudoers,然后对该副本进行更改,然后visudo -c -f检查新文件是否有效,然后覆盖sudoers,然后chmod 440在该新文件上,是这样吗?我不确定实施此操作的步骤。

答案1

警告: 以下作品。这样做是否是个好主意还有待商榷。但如果您要这样做,这是不太安全的方法之一。

您可以通过设置和导出变量以使用更改文件的脚本SUDO_EDITOR来调用来完成此操作。sed例如

export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
visudo
unset SUDO_EDITOR

当然,这需要以 root 身份运行。通常SUDO_EDITOR是未定义的......但它可以用来告诉visudo使用viornanojoe或任何你喜欢的东西(它比 visudo 优先于许多程序使用的更通用的 EDITOR 和 VISUAL 环境变量。visudo 将使用它们,如果它们已定义,但 SUDO_EDITOR 未定义)。在本例中,我们使用流编辑器 ( sed) 而不是交互式编辑器。

如果您所做的任何更改无效,visudo我们会注意到并询问您该怎么做。您的选择是:

What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)

您将需要使用选项xesed再次运行,并将Q保存损坏的更改。

顺便说一句,如果您需要进行其他更改,/etc/sudoers并且出于某种原因不能直接将文件放入,/etc/sudoers.d/那么我强烈建议您在 /etc/sudoers 的副本(例如 /tmp/sudoers)上测试您的更改并使用选项-fvisudo.

您可以验证是否进行了正确的更改diff。如果它有效,那就太好了,您可以在没有-f /tmp/sudoers.如果失败,请cp再次运行该命令以再次复制原始文件(即恢复 SUDO_EDITOR 命令所做的任何操作),更改 SUDO_EDITOR 并visudo再次运行。重复直到它达到你想要的效果。

# cp -af /etc/sudoers /tmp/
# export SUDO_EDITOR='sed -i -e "s/^Defaults.*env_reset$/&,timestamp_timeout=600/"'
# visudo -f /tmp/sudoers 
# unset SUDO_EDITOR
# diff -u /etc/sudoers /tmp/sudoers
--- /etc/sudoers    2020-07-18 02:57:35.220317224 +1000
+++ /tmp/sudoers    2021-10-15 03:26:13.048804192 +1100
@@ -9,7 +9,7 @@
 
 Defaults exempt_group=sudo
 
-Defaults   env_reset
+Defaults   env_reset,timestamp_timeout=600
 Defaults   mail_badpass
 Defaults   secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

顺便说一句,您可以在此处使用任何修改文件的内容 - 如果您更喜欢 perl 或 python 甚至 shell 脚本(例如周围的包装脚本edex其他可编写脚本的编辑器),那么您没有理由不能设置SUDO_EDITOR运行它的sed。只要它改变了给定的文件visudo,它就会起作用。请注意空格和嵌套引用。

答案2

以编程方式,最好的方法是将文件添加到/etc/sudoers.d您需要的所有指令中。这些文件需要由 0440 拥有root并具有模式 0440。将文件添加到/etc/sudoers.d可以带来三个好处:降低/etc/sudoers与任意更改相关的风险;在大多数情况下,这意味着/etc/sudoers可以保留系统的默认设置,这简化了涉及修改的未来升级/etc/sudoers;并且可以轻松查看对默认配置所做的更改。

即使对于您的超时设置,添加文件也将起作用:Defaults行可以重复,因此添加

Defaults timestamp_timeout=600

与将其附加到现有行具有相同的效果Defaults env_reset

为此,您需要确保/etc/sudoers包含

@includedir /etc/sudoers.d

这是最近安装的默认设置sudo,但您可以通过编程方式确保这一点,如下所示:

if ! sudo grep -q '^[@#]includedir /etc/sudoers.d$' /etc/sudoers; then
    sudo sed '$a\\n@includedir /etc/sudoers.d' /etc/sudoers > /etc/sudoers.new
    sudo visudo -c -f /etc/sudoers.new && sudo mv /etc/sudoers{.new,}
fi

(不要尝试SUDO_EDITOR在这里使用这个技巧,因为visudowill 也会处理/etc/sudoers.d/README,从而导致@include循环。)

相关内容