就在前不久,sudo 再一次曝出 安全问题,允许用户绕过权限管理,就可以直接获取 root 权限。最新的更新已经修复了这一漏洞,但是面对不断曝光出漏洞的 sudo,我们是否应当考虑寻找它的替代品呢?

本文对使用 MacOS 的用户而言用处不大,但如果想要了解一下也是可以接着往下看的。

sudo 的缺点

几乎可以在所有的 Linux 服务器上找到 sudo。它能够方便地让用户获取到 root 权限,在不用登陆为 root 用户时就修改一些敏感内容。当然这只是 sudo 强大功能的冰山一角,它能够构建出一套非常复杂的权限管理系统,只是作为普通用户,我们几乎不会应用到这么多。

而作为如此强大的一个工具,其绝大部分的功能对于普通的管理员来说,都是多余的:我们用不着配置如此强大的权限管理系统,在绝大多数情况下,我们所需要的只是一句 sudo command 或是 sudo -i 罢了。因此,sudo 的优点几乎被抵消殆尽,而它的缺点就被无限放大了。

为了实现如此复杂的功能,sudo 的源码非常复杂,而这就带来了非常严重而又现实的问题,即代码中存在漏洞的可能性非常之高。同时,由于它几乎默认安装于所有的 Linux 与 Mac 上,破解带来的收益又非常高。一旦找到提权的漏洞,且用户没有及时更新,所带来的后果可能是非常严重的。

使用 doas 替代 sudo

因此,可以使用 doas 替代 sudo。相对于 sudo,doas 的配置更为简单易懂,非常便于使用。同时,doas 的代码量非常小,出现漏洞的概率也随之降低。因而,对于个人使用的服务器而言,doas 已然够用,无需 sudo 那些复杂的功能。

下载,安装与配置

doas 可以从 GitHub 上下载其源码。
默认情况下,它将被安装到 /usr/local/bin 下,而其配置文件的位置为 /usr/local/etc/doas.conf 。如果想要更改这些设置,就需要编辑 Makefile,修改其中的 PREFIX 与 DOAS_CONF 两项。例如,我要把配置文件的位置改为 /etc/doas.conf,只要将 DOAS_CONF 中的 $(PREFIX) 删除即可。

随后,使用 sudo make clean install 命令进行安装 (没错,你还是需要用到一下 sudo 命令的,之后的安装过程中可能还会再用到,不过等配置完成后就不再需要了)。

需要先通过 root 权限创建 doas.conf 文件,然后编辑。

doas.conf 的内容非常简单易懂。

permit|deny [options] identity [as target] [cmd command [args ...]]

其中,options 包括:

  1. nopass,执行命令时不需要输入密码
  2. nolog,命令执行成功时不会记录
  3. persist,授权后,一段时间内不会要求再次输入密码
  4. keepenv,如果没有其他说明,保持环境变量不变
  5. setenv,设置临时的环境变量,具体方法为 setenv { -ENV PS1=$DOAS_PS1 SSH_AUTH_SOCK }

而 [as target] 意为以某个用户的身份,如果不写,默认为全体用户,即任意身份。 cmd 部分同理,不写则默认可以执行任意命令。

因此,一个最简单的 doas.conf 文件会是这样的 (假设用户名称为 test)

permit test

意思即为:允许 test 用户以任意身份执行任意命令。

另外值得一提的是,就像 sudo 有着 visudo 这条命令一样,doas 同样有着 vidoas 命令。它要求以 root 用户执行,并且在保存时会进行格式检查,防止出错。建议在修改该文件时,可以通过这条命令进行修改。

有些 Linux 发行版,以及 MacOS,默认情况下会阻止 doas 使用 PAM 认证。因此还需要运行以下命令

cp /etc/pam.d/sudo /etc/pam.d/doas

来确保 doas 能够正常工作。

需要注意的地方

首先是编译所需要安装的
如果使用的是 Ubuntu,那么需要运行以下命令安装编译所需的软件

sudo apt install build-essential make bison flex libpam0g-dev 

如果是 MacOS,则改为这句

xcode-select --install

如果使用的是 OpenSUSE,那么至少需要安装这个包(可能其他需要的包我之前已经安装过了,没有测试)

sudo zypper in bison

其次是,每次修改完源代码需要编译安装时,千万记得要 clean,即要么

make clean
sudo make install

要么直接

sudo make clean install

最后最后,千万不要在完全确定 doas 可以替代 sodo 之前,或是没有给 root 用户设定密码之前,就 visudo 把当前用户删掉,不然拯救起来是非常麻烦的一件事情,而且心态可能会爆炸。

别问我怎么知道的。

解决方法是,如果是 MacOS 用户,通过 finder 找到 /private/etc/sudoers 文件,右键选择 Get Info,在最下方的 Sharing & Permissions 中修改权限,使自己有权限更改(最后的更改好像必须在终端里进行,直接双击打开更改好像还是有问题)。

MacOS 的解决方案

如果是 Linux 用户,如果有实体机那 Live CD 直接 mount 后就能修改,如果是服务器,那只能希望服务商有修改 root 密码这一功能了。

其它一些想说的内容

对于个人电脑而言,最重要的保护还是开启防火墙,定时清理杀毒,不连接不认识的网络,同时保证不会被不怀好意的人有物理接触。上述的内容主要还是针对于服务器,特别是 Linux 服务器而言的。

每天我的服务器都会被扫描无数次,尝试登陆并失败的 log 文件一天甚至就能涨到 1M 大,这还是我服务器上挂的网站没啥名气,没什么人会愿意来攻击的结果。因此服务器才需要如此强调安全性。其实许多安全问题都不是我们能解决的,我们只能是在漏洞被修复后,尽快更新,并希望在此期间没有造成严重后果罢了。