chattrで侵入者の証拠隠滅を防止する
コンピュータが不正アクセスを受けた場合、コンピュータの中には攻撃者によって残された様々な痕跡が存在します。侵入された証拠を記録しているこれらのログは、必ず守る必要があります。
正確で信用できるログが残っていなければ、攻撃者の侵入経路やその手法を解析することができません。
攻撃者が残した痕跡の数々はインシデントの分析を行ううえで非常に重要な情報です。
しかし攻撃者よってroot権限まで奪われてしまった場合に、それらの痕跡が消されることを防ぐことはできるでしょうか?
多くのOSでは、ファイルの属性に作成日や更新日が保存されます。
またLinuxとBSD系OSでは、ファイルとディレクトリに拡張属性を割り当てることが可能です。
拡張属性は、すべてのユーザーに適用される点やパーミッションやアクセスコントロール[Hack #4]に優先するという点において従来のUnixのパーミッション管理と異なります。
Linuxではファイルの属性を確認するlsattrコマンドや、変更するchattrコマンドが用意されています。
BSD系のOSでは属性の確認にls -loを、変更にはchflagsを使います。
ログファイルの保護に便利な属性として「追加のみ許可」があります。
この属性が設定されているファイルにはデータを追加できるだけで、削除することが許されません。
Linuxで、ファイルに「追加のみ許可」属性を設定するには以下のようにコマンドを実行します。
# chattr +a filenameまたBSDでは以下のようにコマンドを実行します。
# chflags sappnd filename以下のコマンドを実行し、「追加のみ許可」属性を設定したファイルがどうなるかを確認してみましょう。
# touch /var/log/logfile
# echo "append-only not set" > /var/log/logfile
# chattr +a /var/log/logfile
# echo "append-only set" > /var/log/logfilesh: /var/log/logfile: Operation not permitted 「追加のみ許可」属性を設定したファイルの上書きは失敗しています。
この状態でも以下のようにファイルへの追記は可能です。
# echo "appending to file" >> /var/log/logfile # cat /var/log/logfile append-only not set appending to file
root権限を奪った攻撃者であれば、このファイルから痕跡を消そうとするため、 chattr -aコマンドを使用して、属性を変更しようとするかもしれません。
これを防ぐために「追加のみ許可」属性の削除を許さないよう設定することも可能です。
Linuxではカーネルの「capability」機能を使用し、BSD系のOSでは「securelevel」機能を使 用します。
Linuxのcapabilityを用いると、rootアカウントの強大な権限を制限することができ ます。
例えばファイルに設定されている「追加のみ許可」属性の変更を禁止するには、 capabilityの設定からCAP_LINUX_IMMUTABLEを削除します。
capabilityの 設 定 を変 更 するには、lcap(http://snort-wireless.org/other/lcap- 0.0.6.tar.bz2)ユーティリティを使用するとよいでしょう。
lcapのソースアーカイブを入手し、以下のようにコンパイルしてください。
# tar xvfj lcap-0.0.6.tar.bz2 && cd lcap-0.0.6 && make 「追加のみ許可」属性の変更を禁止するには、以下の例に従ってlcapを実行します。
# ./lcap CAP_LINUX_IMMUTABLE # ./lcap CAP_SYS_RAWIO
最初の実行例では「追加のみ許可」属性を変更するcapabilityを禁止してい ます。
次の実行例ではraw I/Oを使用するcapabilityを禁止しています。
この場合、ファイルシステムに直接アクセスしてファイルを変更することを防ぐと同時に CAP_LINUX_IMMUTABLEの制限を迂回できる/dev/memや/dev/kmemへのアクセスも禁止します。
ブート時にこれらの制限を適用するには、/etc/rc.localといったスタートアップスク リプトにこれらのコマンドを記述します。
このコマンドはスタートアップスクリプトの末尾に記述するとよいでしょう。
これはスタートアップスクリプトの処理そのものが、capabilityによって影響されることを防ぐためです。
一度lcapによって禁止されたcapabilityは、システムをリブートしないかぎり元に戻すことはできません。
BSD系のOSではsecurelevelを使用して同様のことを実現します。
securelevelとは特定の機能を制限できるカーネル変数です。
securelevelを1に設定すると前に説明したLinuxの2つのcapabilityを設定した状態と同じ効果が得られます。
いったんsecurelevelに0以上を設定すると、通常のリブートではsecurelevelを下げることができません。
securelevelのデフォルト値はBSD系OSの種類によって異なり、マルチユーザーモードのOpenBSDは1で、FreeBSDは-1が設定されています†。
セキュリティレベルを変更するには、/etc/sysctl.confに次の行を追加します††。
kern.securelevel=1 ログファイルに「追加のみ許可」属性を設定するとログローテーションスクリプトが失 敗してしまいますが、これによってログの完全性を飛躍的に高め、インシデントの際に 貴重な情報をもたらします。