如何减少与其他编辑器一起编辑 sudoers 的机会?

如何减少与其他编辑器一起编辑 sudoers 的机会?

是的,推荐用于visudo编辑 sudoers 文件。但我不满足于口头推荐。当我以错误的方式编辑文件时,shell 可以发出警告或要求确认吗?

我想抓住以下情况:

$ sudo vim /etc/sudoers
/etc $ sudo nano sudoers
$ sudo cp what/ever/file /etc/sudoers.d/a

答案1

注意:我不会做以下事情。它不安全,而且还有足够多的其他可能性来破坏您的系统。为什么要选择这个呢?

权利越大sudo,责任越大。


但是,为了避免root编辑sudoers文件,您可以通过运行以下命令使其不可变:

sudo chattr +i /etc/sudoers

然后将以下别名添加到您的.rc.profile文件中,例如.bashrc

alias visudo="sudo chattr -i /etc/sudoers; sudo visudo; sudo chattr +i /etc/sudoers;"
alias sudo='sudo '

它将更改visudo命令以首先重置不可变标志,然后运行visudo,最后immutable再次执行。看这里为什么我们需要第二个别名。

资源文件或重新启动 shell 后,您可以sudo visudo正常使用,但不能以其他方式编辑它。


这只是一般想法,需要对其进行增强以启用visudo和下面文件的其他参数/etc/sudoers.d/。您还可以使用函数或脚本来代替别名。


请注意,这并不真正安全:

  • 当你visudo运行的时候,文件不是一成不变的
  • 任何sudo用户都可以chattr -i随时运行以取消设置不可变标志
  • 你训练自己一种在做事之前不思考的行为

答案2

我在这里提出我的尴尬解决方案。我正在使用 zsh,它是一个 zsh 小部件(命令行插件)。

当当前目录为sudoders.d,或者命令行包含 时sudoers,zsh 会给出警告,除非命令是“cd”或“visudo”。

代码涵盖了 vim、nano、cp、rm、cat > 等场景。

我相信你可以做得更好,但这是基本的想法。

#! /usr/bin/zsh


function catchEditSudoers {
    if ([[ $BUFFER =~ .*sudoers.* ]] && [[ ! $BUFFER =~ .*visudo.* ]] && [[ ! $BUFFER =~ "cd .*" ]]) ||
        ([[ $PWD =~ ".*/sudoers.d" ]] && [[ ! $BUFFER =~ .*visudo.* ]] && [[ ! $BUFFER =~ "cd .*" ]]); then
        zle -R "It's recommanded to use visudo to edit sudoers. Continue anyway? (y/n)"
        read -k reply
        if [[ $reply == y ]]; then
            zle accept-line
        else
            zle send-break
        fi

    else
        zle accept-line
    fi
}

zle -N catchEditSudoers_widget catchEditSudoers

bindkey '^M' catchEditSudoers_widget

在 .zshrc 中获取文件。

相关内容