就在前不久,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 包括:
- nopass,执行命令时不需要输入密码
- nolog,命令执行成功时不会记录
- persist,授权后,一段时间内不会要求再次输入密码
- keepenv,如果没有其他说明,保持环境变量不变
- 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 中修改权限,使自己有权限更改(最后的更改好像必须在终端里进行,直接双击打开更改好像还是有问题)。

如果是 Linux 用户,如果有实体机那 Live CD 直接 mount 后就能修改,如果是服务器,那只能希望服务商有修改 root 密码这一功能了。
其它一些想说的内容
对于个人电脑而言,最重要的保护还是开启防火墙,定时清理杀毒,不连接不认识的网络,同时保证不会被不怀好意的人有物理接触。上述的内容主要还是针对于服务器,特别是 Linux 服务器而言的。
每天我的服务器都会被扫描无数次,尝试登陆并失败的 log 文件一天甚至就能涨到 1M 大,这还是我服务器上挂的网站没啥名气,没什么人会愿意来攻击的结果。因此服务器才需要如此强调安全性。其实许多安全问题都不是我们能解决的,我们只能是在漏洞被修复后,尽快更新,并希望在此期间没有造成严重后果罢了。
