Plan 9にはパスワード等シークレットを一元管理するための認証エージェントとしてfactotum(4)が存在しています。factotum はデータを永続化しませんし、そのメモリ領域はカーネルによって保護された状態にあって、デバッガは当然アタッチできないしプロセスの kill(1) さえできません*1。代わりに、暗号化した状態で永続化するためのsecstore(8)があって、この2つが協調して動作します。
筆者は現在、Google Cloud上でCompute Engineを使って3台モデルのPlan 9システムを運用していますが、普段はLinux上で plan9port も使っています。そうしたとき、plan9port の factotum からGCPにある secstored を参照したくなるのだけども、secstored には機密情報が入っているのでインターネットからアクセス可能な場所に置きたくはありません。なので今までは二重管理も仕方ないと思っていたのですが、2025年4月のエイプリルフールネタでTailscaleがPlan 9に対応したとあった*2ので試してみました。
エイプリルフールの記事は以下の2つです。9fansもとても盛り上がっていました。
必要なもの
Tailscaleアカウント
なければ取得しておきましょう。
Goコンパイラ
TailscaleはGoで実装されているのでPlan 9用のGoコンパイラが必要です。他OSでクロスコンパイルする方法がいちばん早いと思いますが、Plan 9の9k(64bit)カーネルでGoを最初からビルドするで紹介したのように最初から順に更新してもいいと思います。
カーネルの更新
9legacyを使っている場合は、Tailscale対応のために不動小数点の扱いと ndb/dns の修正が入っているので、最新のコードに更新しておきましょう。古いPlan 9を使っている場合は、tailscaled を実行したときに以下のようなエラーとなって動作しません。
cpu% tailscaled logtail started Program starting: v1.82.0-ERR-BuildInfo, Go 1.24.2: []string{"tailscaled"} logpolicy: using UserCacheDir, "/usr/lufia/lib/cache/Tailscale" logpolicy.ConfigFromFile /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: open /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: '/usr/lufia/lib/cache/Tailscale' does not exist logpolicy.Config.Validate for /usr/lufia/lib/cache/Tailscale/tailscaled.log.conf: config is nil dns: using dns.noopManager
インストール
準備ができたらTailscaleをソースからビルドします。
go install tailscale.com/cmd/tailscaled@latest go install tailscale.com/cmd/tailscale@latest
tailscaleネットワークに参加
ビルドが終わればあとは tailscaled を実行するだけなのですが、オプションが色々あって難しいので、Arch Linuxの tailscale パッケージを参考にオプションを与えました。具体的にはsystemdのユニットファイルが以下のようになっていたので
EnvironmentFile=/etc/default/tailscaled
ExecStart=/usr/sbin/tailscaled --state=/var/lib/tailscale/tailscaled.state --socket=/run/tailscale/tailscaled.sock --port=${PORT} $FLAGS
ExecStopPost=/usr/sbin/tailscaled --cleanup
なのでPlan 9でも次のようなで起動します。ここでは --socket オプションと --port オプションを渡していませんがデフォルトで動作します。
tailscaled --state $home/lib/tailscaled/tailscaled.state
デーモンが起動したら、あとは tailscale up とするとログインURLが出力されるので、それにアクセスすればネットワークに参加できます。
tailscale up
これで比較的安全に secstored とローカルの factotum が連携できるようになって嬉しいですね。
