Linux上のOpenDoasで永続機能(persist)を使う

OpenBSD由来のDoasコマンドというものがあります．Linux等でのsudoに似たものですが，小さくシンプルです．このDoasコマンドの移植版のOpenDoasはLinuxなどでも動作します．
sudoコマンドは1度認証に成功するとそのセッションでしばらくの間認証が必要なくsudoが実行できて便利ですが，OpenBSDのDoasでは同様の機能をOpenBSDのkernel APIを使ってタイムアウトを確認しておりこのAPIはOpenBSDだけのものなので当初OpenDoasには実装されていませんでした．
いつの間にかOpenDoasにも実装されているのに気づいたので試してみました．

Duncaen/OpenDoas: A portable fork of the OpenBSD doas command

src/usr.bin/doas/

GitHubを見るとこの辺で入ったようです．結構前ですね……．

add support for the verified auth ioctls using ‘persist’ rules. ok de… · Duncaen/OpenDoas@27235dd

Debian/Raspberry Pi OSにはパッケージがあるのでこちらを使います．

$ rmadison opendoas
opendoas | 6.8.2-1 | stable | source, arm64, armel, armhf, i386, mips64el, mipsel, ppc64el, s390x
opendoas | 6.8.2-1 | testing | source, armel, armhf, i386, mips64el, ppc64el, s390x
opendoas | 6.8.2-1 | unstable | source, armel, armhf, i386, mips64el, ppc64el, s390x
opendoas | 6.8.2-1 | unstable-debug | source
opendoas | 6.8.2-1+b1 | stable | amd64
opendoas | 6.8.2-1+b1 | testing | amd64, arm64, riscv64
opendoas | 6.8.2-1+b1 | unstable | amd64, arm64, riscv64
$ apt show opendoas
Package: opendoas
Version: 6.8.2-1
Priority: optional
Section: admin
Maintainer: Scupake <scupake@riseup.net>
Installed-Size: 99.3 kB
Provides: doas
Depends: libc6 (>= 2.33), libpam0g (>= 0.99.7.1)
Breaks: doas (<< 6.8.2)
Replaces: doas (<< 6.8.2)
Homepage: https://github.com/Duncaen/OpenDoas
Download-Size: 20.9 kB
APT-Manual-Installed: yes
APT-Sources: http://raspbian.raspberrypi.org/raspbian bookworm/main armhf Packages
Description: minimal replacement for sudo, with persist support
OpenDoas: a portable version of OpenBSD's doas command
doas is a minimal replacement for the venerable sudo. It was initially written
by Ted Unangst of the OpenBSD project to provide 95% of the features of sudo
with a fraction of the codebase.

OpenDoasの導入

$ sudo apt install opendoas

sudoコマンドでのsodoグループのように wheel グループを作成し，このグループのユーザーがdoasを使えるようにすることにします．(sudoグループを流用しても良かったかも?)

$ sudo addgroup --system wheel (1)
$ sudo usermod -aG wheel matoken (2)
$ grep ^wheel: /etc/group (3)
wheel:x:140:matoken

wheel グループの作成

wheel グループにユーザー matoken を追加

確認

doasの設定

$ sudo install -m 0400 /dev/zero /etc/doas.conf
$ echo 'permit persist :wheel' | sudo tee /etc/doas.conf (1)
permit persist :wheel
$ ls -l /etc/doas.conf (2)
-r-------- 1 root root 22 11月 1 05:46 /etc/doas.conf

/etc/doas.conf に whell グループがdoasで権限変更できるように設定， persist オプションで永続化も．

ファイル権限確認

Note

Example 1. DOAS.CONF(5)より

persist After the user successfully authenticates, do not ask for a password again for some time.

doasと永続化の動作確認

$ doas -s (1)
doas: Operation not permitted
$ newgrp wheel (2)
$ doas -s (3)
doas (matoken@raspberrypi) password:
#
exit
$ doas -s (4)
#
exit
$ doas ls -lA /run/doas/
total 0
---------- 1 root wheel 0 Nov 1 2024 29125-5366-34816-25582434-1001
$ doas -s (5)
doas (matoken@raspberrypi) password:

グループに追加したけど反映されていない状態なので権限がない

とりあえずnewgrpコマンドで利用可能に

1度目のdoasは認証が必要

すぐにdoasを叩くと認証が必要ない

時間が経ってから再度doasを実行すると認証が必要

永続化のクリア

$ doas -s (1)
doas (matoken@raspberrypi) password:
#
exit
$ doas -L (2)
$ doas -s (3)
doas (matoken@raspberrypi) password:

1度目の実行

-L オプションで永続化の認証をクリア

すぐにdoasを実行しても永続化の認証がクリアされているので再度認証が必要

Note

Example 2. DOAS(1)より

-L Clear any persisted authentications from previous invocations, then immediately exit. No command is executed.

という感じで普通に使えそうです．
ちなみにsudoコマンドでは永続化のタイムアウト時間は設定ファイルで変更可能ですが，doasではハードコードされており設定では変更できないようです．

timestamp_set(fd, 5 * 60);

環境

$ dpkg-query -W opendoas
opendoas 6.8.2-1
$ lsb_release -dr
No LSB modules are available.
Description: Raspbian GNU/Linux 12 (bookworm)
Release: 12
$ arch
armv7l
$ grep ^Model /proc/cpuinfo
Model : Raspberry Pi 3 Model B Rev 1.2