10.9. 監査記録を書き込む

プログラムやセッション開始時、もしくは不審な動作がある時には、監査ログを 書き込んでください。 情報として、日付や時間、uid、euid、gid、egid、端末情報、プロセス id、コマンド ラインの値を取ってください。 監査ログをとるのに syslog(3)が役立つのはよく知られています。 ログを採るシステムは、たくさんの情報(非常に役立ちます)を記録できますが、 その情報の取り扱いに注意しないと、攻撃に利用されてしまう点がやっかいな問題 です。 最終的には、攻撃者がプログラムに送る入力を部分的にコントロールします。 攻撃者が送ったと思われるデータを記録した時に、「予想通り」の文字リスト を設定し、「予想通り」でない文字はみなエスケープしてください。そうすれば ログが汚染されるようなことにはなりません。 そうしないと、本当に困った事態になります。たとえばユーザが制御文字(NIL や EOF) を入れると、やっかいな事態を発生します。 たとえば、攻撃者が改行を埋め込むと、好みのログを改行とともに入れることで、ログ の記録をねつ造できます。 ひどい話ですが、これらの文字のエスケープは、標準規格に沿っていないようです。 私は URL エスケープが好みですが(%hh の hh はエスケープするバイトの 16 進値 です)、C の規格をはじめとして、他のエスケープが存在します(\ooo は 8 進値で \X は X には特別な符号が入ります。たとえば \n は改行です)。 また、キャレットを使ったしくみ(^I は control-I です)もありますが、127 より 大きなバイト値はうまく扱えません。

ユーザがサービス拒否攻撃(もしくは少なくとも監査の停止)を引き起こす危険性 があります。その攻撃は、監査履歴を削除する多量のイベントを発生することで、 システムが記録を保存するリソースを食い潰します。 この攻撃に対する対処方法の 1 つは、監査記録する速度に制限を設けることです。 意図的に反応速度を遅くし、「あまりに多くの」監査記録があれば削除します。 攻撃の疑いがあるものに対してだけ、反応速度を遅くするようにしてください。 しかし、単独の攻撃者が複数ユーザであるかのごとく装っているケースがよく あります。

もちろん何が「不審な動作」なのかを選択するのは、プログラムの動作と予定して いた使い方に左右されます。 以前論じた入力のフィルタチェックに引っかかったケースは、この対象となります (たとえば、NIL が入った)。 通常利用に由来しない入力は、おそらくログを採った方がよいでしょう。 たとえば、必須のフィールドがある CGI プログラムが怪しげに失敗する等。 /etc/passwd や /etc/shadow のような書式は、怪しいケースがたくさんあります。 同様に Windows の「レジストリ」ファイルや .pwl ファイルにアクセスしようと するのも不審です。

監査履歴にパスワードを記録しないでください。 誤って、別のシステムにパスワードを入れてしまう場合がよくあります。そうすると、 パスワードの記録があるシステムの管理者に、管轄外の別のコンピュータへの侵入を 認めることになるかもしれません。