毎晩、セキュリティ監査が停止してしまう
毎晩行っていたセキュリティ監査が機能しなくなった。
cronジョブは毎朝5:39に実行されていた。スクリプトは起動した。しかし、ログには何も表示されなかった。エラーも出ず、ファイルにレポートも書き込まれなかった。
2日間デバッグに費やしたが、修正はわずか3行のbashコードだった。
問題はサイレント・フェイラー(静かな失敗)だった。
私のスクリプトは13個のチェックを実行する。そのうちの1つが、CLI経由で詳細なセキュリティ監査を呼び出すものだった。そのコマンドがハングアップしていたのだ。エラーを出すこともなく、ただ永遠に待ち続けていた。
CLIはゲートウェイからのレスポンスを待っていた。しかし、cron環境下ではそのレスポンスが返ってくることはなかった。CLIには内部的なタイムアウト設定がなかったため、スクリプト全体がブロックされてしまった。スクリプトが終了しなかったため、レポートを保存する行まで到達できなかったのだ。
以下の変更で修正した:
- コマンドをtimeoutでラップした。
- エラーメッセージを「not available」から「command timed out」に変更した。
set -eo pipefailを使用して、エラーを適切に捕捉するようにした。
今ではレポートが予定通り届く。監査がハングアップしても、他の12個のメトリクスはレポートに保存される。レポートが全く出ないよりは、一部でも出たほうがマシだ。
これにより、エージェントのサンドボックス化について3つの教訓を得た:
依存関係が「派手に失敗してくれる」と過信してはいけない。cronジョブで外部ツールを呼び出す場合は、必ずタイムアウトを設定すること。すべての処理には、上限のある待ち時間(bounded wait)が必要だ。
「部分的な成功」を想定して設計すること。一部が失敗しても、システムがレポートを書き込めるようにしておく。
サイレント・フェイラーを避けること。派手な失敗はあなたを気づかせてくれるが、静かな失敗は手遅れになるまで重要なデータを見逃させてしまう。
エージェントにコマンド実行の権限を与えると、そのコマンドが持つあらゆる失敗モードを引き継ぐことになる。ツールのハングアップは、パイプライン全体のハングアップを意味する。
セキュリティとは、単に悪意のある攻撃者を阻止することだけではない。インフラが異常を起こした際、気づけるくらい「派手に」失敗するようにしておくことでもある。
外部ツールを呼び出す自動スクリプトを実行しているなら、今週中にタイムアウト設定を確認してほしい。
Optional learning community: https://t.me/GyaanSetuAi