一、doas
命令简介
doas
是一个轻量级的权限提升工具,最初由 OpenBSD 开发,旨在替代传统的 sudo
命令,提供更简单、更安全的特权操作方式。它的全称是“Dedicated OpenBSD Application Subexecutor”,但开发者 Ted Unangst 曾在博客中提到,这个名字其实是个意外,而非刻意设计。尽管如此,doas
的核心理念是通过简洁的设计减少复杂性,从而提升安全性。
与 sudo
相比,doas
的配置文件更直观,功能更专注,代码量显著减少(约3000行对比 sudo
的17万行),这使得它更易于审计和维护。doas
于2015年随 OpenBSD 5.8 发布,此后被移植到其他类 Unix 系统,包括 FreeBSD、Linux 和 macOS,成为许多极简主义者和安全意识较高的用户的选择。
本文将详细介绍 doas
的安装、使用方法、配置文件语法、历史背景、安全性分析,以及与 sudo
的对比,最后通过实际案例展示其应用场景。
二、doas
的安装
1. 在 OpenBSD 上
doas
是 OpenBSD 的默认工具,无需额外安装。系统安装后,/etc/doas.conf
文件可能已存在,只需根据需求配置即可。
2. 在 Linux 上
在 Linux 发行版中,doas
通常需要手动安装,以下是几个常见发行版的安装方法:
- Debian/Ubuntu:
注意:在较旧的 Ubuntu 版本(如 20.04 LTS)中,可能需要从源码编译。sudo apt update sudo apt install doas
- Arch Linux:
sudo pacman -S opendoas
- Fedora:
sudo dnf install doas
- Void Linux:
sudo xbps-install -S opendoas
3. 从源码安装
如果发行版未提供预编译包,可以从 GitHub(如 slicer69/doas
或 Duncaen/OpenDoas
)下载源码编译:
git clone https://github.com/slicer69/doas.git
cd doas
make
sudo make install
4. 验证安装
安装完成后,运行以下命令检查版本:
doas -v
输出类似 doas V6.3
,表示安装成功。
三、doas
的基本使用
doas
的语法简单直观:
doas [-u 用户名] 命令
1. 以 root 身份执行命令
默认情况下,doas
以 root
身份运行命令:
doas whoami
若配置正确,输出为 root
。
2. 以其他用户身份执行
使用 -u
选项指定目标用户:
doas -u alice whoami
输出为 alice
,前提是配置文件允许。
3. 检查配置
使用 -C
检查规则:
doas -C /etc/doas.conf whoami
返回匹配的规则或提示无权限。
4. 非交互模式
使用 -n
选项跳过密码提示,若需要密码则失败:
doas -n ls
5. 启动 Shell
使用 -s
启动目标用户的 Shell:
doas -s
默认进入 root
的 Shell。
四、配置文件 /etc/doas.conf
doas
的功能依赖于其配置文件 /etc/doas.conf
,通过简单的规则定义权限。
1. 文件位置与权限
默认位于 /etc/doas.conf
,需 root 权限编辑:
doas vi /etc/doas.conf
文件权限应为 0600
:
sudo chown root:root /etc/doas.conf
sudo chmod 0600 /etc/doas.conf
2. 语法结构
规则以 permit
或 deny
开头:
permit|deny [选项] 用户 [as 目标用户] [cmd 命令 [args 参数]]
permit
:允许。deny
:禁止。用户
:用户名、组名(以:
开头,如:wheel
)或all
。as 目标用户
:指定执行身份。cmd 命令
:限制特定命令。args 参数
:限制命令参数。
3. 常用选项
nopass
:无需密码。keepenv
:保留环境变量。persist
:密码缓存(类似sudo
超时)。setenv {变量}
:设置环境变量。
4. 配置示例
示例 1:基本权限
permit alice
alice
可以以 root
身份运行任何命令。
示例 2:无密码执行特定命令
permit nopass bob cmd /usr/bin/pkg_add
bob
无需密码运行 doas pkg_add
。
示例 3:组权限
permit keepenv :wheel
wheel
组用户保留环境变量执行命令。
示例 4:限制身份与命令
permit alice as bob cmd /bin/ls args dir
alice
只能运行 doas -u bob /bin/ls dir
。
示例 5:禁止操作
deny alice cmd /sbin/shutdown
permit alice
alice
可以运行除 shutdown
外的所有命令。
示例 6:复杂规则
permit persist setenv { PATH=/usr/local/bin:/usr/bin } alice cmd /usr/bin/apt args update
permit persist setenv { PATH=/usr/local/bin:/usr/bin } alice cmd /usr/bin/apt args upgrade
deny alice cmd /usr/bin/apt args full-upgrade
alice
可运行 apt update
和 apt upgrade
,但不可运行 apt full-upgrade
。
示例 7:多用户场景
permit nopass :admins cmd /sbin/reboot
permit nopass :admins cmd /sbin/poweroff
permit bob as webuser cmd /usr/sbin/nginx
admins
组可无密码重启或关机,bob
可作为 webuser
运行 nginx
。
5. 注意事项
- 规则按顺序匹配,最后一条生效。
- 文件需以换行符结尾。
- 编辑后检查语法:
doas -C /etc/doas.conf && echo "OK" || echo "ERROR"
五、历史背景
1. 诞生与动机
doas
由 Ted Unangst 于2015年为 OpenBSD 开发,目的是解决 sudo
的复杂性和潜在安全隐患。Ted 在博客中提到,他对 sudo
默认配置的不满(如过于宽松的权限)促使他设计一个更简单、更安全的替代品。doas
于 OpenBSD 5.8 发布时取代 sudo
成为默认工具,但 sudo
仍作为可选包保留。
2. 移植与发展
随着 doas
的流行,社区将其移植到其他系统:
- Jesse Smith 的移植支持 FreeBSD、NetBSD、DragonFlyBSD、illumos 和 macOS。
- OpenDoas(由 Duncaen 维护)是 Linux 主流版本,支持 Debian、Arch、Fedora 等。
- 2022年,Alpine Linux 3.16 将
doas
作为sudo
的推荐替代品,减少了对sudo
的安全维护。
3. 设计哲学
doas
受 OpenBSD 的安全与简洁哲学驱动,配置文件语法灵感来源于 pf.conf
(OpenBSD 的包过滤器配置文件),强调直观性和可读性。
六、安全性分析
1. 优势
- 代码量少:
doas
约3000行代码对比sudo
的17万行,减少了潜在漏洞面。 - 简单配置:不像
sudoers
的复杂语法,doas.conf
更易理解,降低误配置风险。 - 默认安全性:环境变量默认清除,需显式启用
keepenv
,避免意外泄露。
2. 潜在风险
- Persist 功能:在非 OpenBSD 系统上,
persist
使用时间戳文件实现(类似sudo
),而非 OpenBSD 的内核 API,可能引入竞争条件风险。 - 移植版本差异:如
slicer69/doas
曾因 UID 解析问题导致安全漏洞(CVE-2019-15901),已被修复,但表明移植版本需谨慎选择。
3. 与 sudo
的安全对比
- 漏洞历史:
sudo
因代码复杂,多次曝出严重漏洞(如 CVE-2021-3156,缓冲区溢出)。doas
的漏洞较少,且多为移植版本问题。 - 审计难度:
doas
代码简单,易于审计;sudo
则需专业团队长期维护。
七、与 sudo
的深入对比
特性 | doas | sudo |
---|---|---|
代码行数 | ~3000行 | ~17万行 |
配置文件 | /etc/doas.conf ,简单 | /etc/sudoers ,复杂 |
默认行为 | 以 root 运行,清空环境变量 | 可配置身份,默认保留变量 |
功能复杂度 | 轻量、专注 | 功能丰富,支持复杂规则 |
密码缓存 | persist (移植版有局限) | 默认启用,可调超时 |
适用场景 | 单用户、桌面系统 | 企业、多用户服务器 |
1. 配置复杂度
sudo
的 sudoers
文件如:
%wheel ALL=(ALL:ALL) NOPASSWD: ALL
对比 doas
的:
permit nopass :wheel
doas
更简洁,但缺乏 sudo
的细粒度控制。
2. 功能范围
sudo
支持日志记录、时间限制等高级功能,而 doas
专注于基本权限提升。
3. 系统集成
sudo
是大多数 Linux 发行版的默认工具,生态成熟;doas
需手动配置,普及度较低。
八、实际应用场景
1. 单用户桌面
允许用户 john
更新系统:
permit nopass john cmd /usr/bin/apt update
permit nopass john cmd /usr/bin/apt upgrade
2. Web 服务器管理
允许 dev
管理 nginx
:
permit dev as www cmd /usr/sbin/nginx
3. 安全限制
限制 alice
的操作:
permit alice
deny alice cmd /bin/rm
九、总结
doas
以其简洁、安全和轻量级的特点,成为 sudo
的有力替代品。它适合单用户系统或注重安全性的场景,但在复杂多用户环境中可能不如 sudo
灵活。随着移植版本的完善和社区支持的增强,doas
有望在更多系统中占据一席之地。