深入解析 doas:有望替代 sudo 的极简权限管理工具

一、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
    sudo apt update
    sudo apt install doas
    
    注意:在较旧的 Ubuntu 版本(如 20.04 LTS)中,可能需要从源码编译。
  • Arch Linux
    sudo pacman -S opendoas
    
  • Fedora
    sudo dnf install doas
    
  • Void Linux
    sudo xbps-install -S opendoas
    
3. 从源码安装

如果发行版未提供预编译包,可以从 GitHub(如 slicer69/doasDuncaen/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 身份执行命令

默认情况下,doasroot 身份运行命令:

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. 语法结构

规则以 permitdeny 开头:

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 updateapt 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 的深入对比

特性doassudo
代码行数~3000行~17万行
配置文件/etc/doas.conf,简单/etc/sudoers,复杂
默认行为以 root 运行,清空环境变量可配置身份,默认保留变量
功能复杂度轻量、专注功能丰富,支持复杂规则
密码缓存persist(移植版有局限)默认启用,可调超时
适用场景单用户、桌面系统企业、多用户服务器
1. 配置复杂度

sudosudoers 文件如:

%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 有望在更多系统中占据一席之地。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值