概要
- Gord という取引データ管理システムで、再現困難な higgs-bugson が発生
- NFS+Kerberos認証 環境下で、ファイルコピー時に稀に -EACCES(Permission denied) エラー
- バグ再現と原因特定のため、 FUSEファイルシステム や bpftrace など多様な手法を利用
- 原因は NFSクライアントのGSSシーケンス番号管理の不整合 による署名検証失敗
- 過負荷時の再送信 で発生しやすく、根本的な解決にはカーネル側の修正が必要
GordのNFS+Kerberos環境で発生した謎のバグ調査記
- 取引データを管理・配布する Gordシステム で、稀に -EACCES(Permission denied) エラー発生
- NFSv3 のデフォルトセキュリティは脆弱で、 Kerberos認証 を併用
- Kerberos利用時、ユーザー認証情報は rpc_gssdデーモン 経由でカーネルに供給
- ファイルコピー時、権限設定が正しいにも関わらず、偶発的に失敗
- Kerberos無効化 でエラーが消失し、認証関連の問題と推測
バグ再現への挑戦と調査手法
- 長時間の書き込みテストや 大量並列コピー で再現性を検証
- FUSE(Filesystem in USErspace) でメモリ上にランダムファイルを生成し、軽量なテスト環境構築
- bpftrace でカーネル関数の戻り値(-EACCES)やコールスタックをリアルタイム監視
- パケットキャプチャ(PCAP) と組み合わせて、問題発生時の詳細な状況を記録
バグの核心:GSSシーケンス番号の同期ズレ
- NFSの RPCリクエスト はXIDで識別され、GSS認証は シーケンス番号 で署名
- サーバ過負荷時、クライアントが同じXIDでリクエストを再送信
- 再送信時、 新しいGSSシーケンス番号 が割り当てられる
- サーバからのレスポンスが遅延し、古いGSSシーケンス番号で署名された応答が届く
- カーネルは最新のシーケンス番号で検証するため、 署名不一致(GSS_S_BAD_SIG) で失敗
- 3回連続で失敗すると、 -EACCES が返される
- 再送信が連鎖的に失敗 することで、現象が自己増幅
再現性・本番との差異
- テスト環境では 小型NFSサーバ で意図的に過負荷をかけ、同時多発的にバグを再現
- 本番環境では、通常1〜2ジョブのみ失敗し、同時多発は稀
- 再現性の低さ が調査を困難にしていた要因
まとめと教訓
- NFS+Kerberos利用時の再送信と認証情報管理 の複雑さ
- カーネルやプロトコルの 実装上の罠 が実運用で顕在化するリスク
- eBPF/bpftraceやFUSE など現代的なツールの活用による効率的なデバッグ
- 根本的な解決には NFSクライアントのGSSシーケンス番号管理ロジック の見直しが必要
- ネットワーク・認証系の問題 は、偶発的エラーが深刻な障害の前兆となる可能性
参考用語
- higgs-bugson :再現困難なバグの俗称
- NFS(Network File System) :ネットワーク越しにファイルシステムを共有するプロトコル
- Kerberos :チケットベースの認証プロトコル
- rpc_gssd :NFS用Kerberos認証情報を管理するデーモン
- FUSE :ユーザー空間でファイルシステムを実装できる仕組み
- eBPF/bpftrace :Linuxカーネルの動的トレースツール
- GSSAPI :汎用セキュリティサービスAPI
- XID :RPCリクエストの識別子
- GSSシーケンス番号 :Kerberos認証のための連番