- 既存の OpenBSD 開発者の関心が薄れて停滞していた relayd(8) と httpd(8) の開発が、実運用上のニーズを持つコントリビューターの参加によって再び活発化
- LLM がコーディング知識を代替する時代だからこそ、自分で C を学び挑戦すべきだという判断から出発し、relayd(8) の手作りの imsg 体系からモダナイズ
- 2024〜2026年の
tech@メーリングリストに残っていた未反映パッチと、既存 GitHub ミラーの古い Issue の大半を整理し、新規コントリビューター向けの Git ミラーと README も用意 - relayd(8) は安全な imsg API と TLS・リクエスト解析のセキュリティを強化し、リロード時の衝突を修正。httpd(8) は リクエストスマグリング対策、ユーザー定義ヘッダー、静的ファイルのキャッシュ制御などを追加
- 両デーモンの セキュリティ・安定性・拡張性 はともに向上したが、作業の過程でバックログも増えたため、引き続きアイデアとフィードバックを募集している
関心を失われたプロジェクトを再び動かした背景
- OpenBSD 7.8 の主な変更点で取り上げたように、
relayd(8)とhttpd(8)の開発は停滞していた- 複数のコントリビューターが
tech@メーリングリストにパッチを送っていたが、リポジトリに取り込まれたものはほとんどなかった - 既存の OpenBSD 開発者が、この2つのデーモンにもはや関心を持たなくなっていたことが主な原因だった
- 複数のコントリビューターが
kirill@とともに両デーモンを定期的に使い、実際のユースケースに向き合ってきた経験をもとに、積極的な開発を始めた- 複雑な
httpd(8)・relayd(8)構成で OpenBSD 顧客を支援しなければならない 実務上のニーズ も直接の原動力になった
- 複雑な
LLM 時代に C へ戻った理由
- 最大のきっかけは LLM の登場 だった
- 以前はモダンな C++ コードを専門的に書いていたが、その後はソリューションアーキテクチャやプラットフォームエンジニアリング、チーム構築へ移り、実際のコードはほとんど書かなくなっていた
- 主に宣言的な YAML を書き、OpenBSD
ports(7)のためにコードを読んで移植する程度にとどまっていた
- 「コーディングは解決された」という主張とは異なり、知識が外部に委ねられる時代だからこそ、自分自身がその知識を備えることがより重要だと判断した
- C++ や Rust は難しい判断の一部を肩代わりしてくれるが、C はそうではない点を課題として捉え、
relayd(8)とhttpd(8)に貢献することを決めた
モチベーションではなく規律で続けた貢献
- オープンソースへの貢献は数週間で挫折に終わることもあるが、初期の苦しい段階を越え、継続して作業できる状態に到達した
- 当初はコードベースを受け身で読みながら、さまざまな箇所で落胆した
- 不十分なコメント、一部の良くない設計、複雑に絡み合ったコードが原因であり、それが C コードの特性なのか、自分の経験不足によるものなのかはまだ分からない
- OpenBSD デーモンのメンテナーたちと議論した後、手作りの imsg メッセージ体系 をモダナイズすることにした
- まず
relayd(8)に集中し、その後httpd(8)へ範囲を広げた - モダナイズ作業そのものを、コードベースを理解する手段として活用した
- まず
未反映パッチと古い Issue の整理
- 2024〜2026年の
tech@メーリングリストの記録を確認し、未処理のパッチと Issue を収集した。大半は処理できたと判断している - 2つのデーモンは、現在は OpenBSD から引退している Reyk Floeter が最初に開発した
- Reyk が管理していた relayd GitHub ミラー の古い Issue も確認した
- すべての Issue はクローズ済み、または修正可能な状態であり、一部はもはや有効ではない
新規コントリビューター向けの Git ミラー
- 既存の GitHub ミラーに着想を得て、新規・若手コントリビューターの参入を助け、OpenBSD メーリングリストの外にあるコミュニティとも接点を作るため、別のミラーを構築した
- CVS ツリーを Git ミラー として使い、開発は Gothub インスタンスで先に進め、残りのリポジトリへ同期する
- Primary: https://rsadowski.gothub.org/
- Mirror: https://codeberg.org/rsadowski/relayd
- Mirror: https://github.com/sizeofvoid/relayd
httpd(8)にも同じ方式を適用し、必要な情報を盛り込んだ詳細なREADME.mdを作成した
relayd(8) のモダナイズとコード品質
- imsg 体系を、より安全な
imsg_get_data、imsg_get_type、imsgbuf_getアクセサへ移行した - imsg ペイロードを読み取る全体の流れに適切な エラー処理 を追加した
bgpdと一貫するよう、ロギングとコメントを標準化した- HTTP 開始行の処理を専用関数に分離し、コード構成を改善した
knfmt形式を適用した
relayd(8) のセキュリティ強化
- デフォルトの TLS 暗号スイートを
HIGH:!aNULLからsecureに変更した - CA 権限分離(privsep)エンジンに ECDSA サポート を追加した
- 重複する
Content-Lengthヘッダーは HTTP 400 応答で拒否する - RFC 9112 5.2 に従い、パーサー差異を防ぐため
obs-foldヘッダーを許可しない - プロセス ID を検査し、
IMSG_CTL_PROCFDを親プロセスに限定した - 機密性の高いパスワードデータの消去には
explicit_bzeroを使用した
relayd(8) のバグと安定性改善
- クラッシュを引き起こしていた リロード時の競合状態 を修正した
X509_dup、config_purge、tls_cfgに関連する複数のメモリリークを除去した- NULL チェックと境界チェックを修正した
- OpenSSL の失敗に対して適切なエラー処理を追加した
- TLS 失敗時に OpenSSL エラーキュー を空にするよう変更した
relayd(8) に追加された機能
MKCALENDARHTTP メソッドをサポートした- 複数のリスナーで TLS を使えるようになった
- 名前解決可能な複数のアドレスをサポートした
- 証明書、鍵、OCSP staple のパスを明示的に設定できるようになった
- HTTP ヘルスチェックリクエストに
User-Agentを設定する - 本文のない HTTP 応答を正しく処理する
httpd(8) のモダナイズとコード品質
proc.cを新しい imsg API に移行し、relayd(8)と一貫性を持たせた- 将来の設定オプションを拡張しやすくするため、トークンの順序を変更した
bgpdと一貫するようロギングを標準化した- 重複コードと空の関数を削除した
knfmt形式を適用した- 組み込み機能の処理を専用関数に分離した
httpd(8) のセキュリティ強化
- デフォルトの TLS 暗号スイートを
compatからsecureに変更した - リクエストスマグリング攻撃を防ぐため、CL.TE リクエストフレーミング を拒否する
- RFC 9112 5.2 に従い、
obs-foldヘッダーには HTTP 400 で応答する Content-LengthとTransfer-Encodingヘッダーが同時に存在する場合はエラーとして扱う- 追加の保護として、起動時にランダムな再リンクを行う
- プロセス ID を検査し、
IMSG_CTL_PROCFDを親プロセスに限定した - 応答でサーバー識別情報を隠す
no bannerオプションを追加した
httpd(8) のバグと安定性改善
- HTTP リクエストの suffix range 処理を修正した
server_http_time()が GMT 時刻を正しく出力するよう修正した- マニュアルの仕様に従い、
timegm(3)のエラーを検査する chunked transfer-encodingを使うアップロードの問題を解決した- location の
fcgiparamsが二重に送信されないよう修正した dispatch_parentに適切なエラー処理を追加した- 中断応答を
bufferevent経由で正しくフラッシュするよう変更した scan-buildが検出した不要な保存を削除した- データをコピーする前に
return_uri_lenを検証した
httpd(8) の新機能と残された作業
- ユーザー定義 HTTP ヘッダー をサポートした
- よりよい設定継承のため、location で
gzip-staticを継承する - より多くのフラグオプションに対応できるよう、サーバーフラグを 64 ビット整数へ拡張した
- 静的ファイル向けの キャッシュ制御 を追加した
- 作業を進めるほどバックログは増えており、今後の開発に向けたアイデアとフィードバックを引き続き受け付けている
1件のコメント
Lobste.rs のコメント
カスタム HTTP ヘッダーのサポートは歓迎。以前はこの機能がなく、簡単な用途でも httpd を使えなかったが、今は対応されたのはうれしい
relayd(8) と httpd(8) の開発は停滞しており、複数の貢献者が tech@ メーリングリストにパッチを投稿していたが、リポジトリにはほとんど反映されなかった。既存の OpenBSD 開発者たちがこれらのデーモンにもう関心を持っていなかったのが主な理由だったとのことで、メンテナンスを引き継いでくれたことに感謝する
この 2 つのソフトウェアを定期的に使っているので、再びきちんと管理されるようになってうれしい。開発が停滞していたことはまったく知らなかった
シンプルなソフトウェア構造のおかげで、大規模なチームがなくても開発を再始動し、これだけ多くの機能や修正を取り込めたようだ
ソフトウェア名の後ろの数字がしばらく混乱の元だったが、マニュアルのセクション番号だと知った
1 は実行プログラム・シェルコマンド、2 はシステムコール、3 はライブラリ呼び出し、4 は特殊ファイル、5 はファイル形式・規約、6 はゲーム、7 はその他、8 はシステム管理コマンド、非標準の 9 はカーネルルーチンを意味する
man 1 manまたは短くman manを実行して man(1) を確認すればよい。特にSEE ALSOにある複数のintroページが役に立つこれらの改善が OpenBSD 8.0 に含まれるのか気になる
リンクがもともと読めるように作られているのか気になる。Android 版 Firefox では次のように見える
https://imgur.com/a/oTimS9R
https://i.ibb.co/V0BgWFbV/image.png
https://hypertekst.net/Screenshot.png