サーバーが不正アクセスを受けたとき、攻撃者がまず狙うのは「証跡の消去」と「バックドアの設置」です。/etc/passwdや/var/log/auth.logなどの重要ファイルを書き換えられてしまうと、侵入の痕跡を追うことが極めて難しくなります。
「root権限があれば何でもできてしまう」と思っていませんか?実は、Linuxには chattr というコマンドがあり、root権限を持つユーザーでさえ変更・削除できないよう、ファイルに「不変フラグ」を設定できます。
この記事では、chattr と lsattr の基本的な使い方から、セキュリティ観点での実践的な活用法まで、現場で使えるレベルで解説します。
chattrとlsattrとは?Linuxのファイル属性機能を理解する
chattr(change attribute)と lsattr(list attribute)は、ext2/ext3/ext4などのLinuxファイルシステムが持つ「拡張ファイル属性」を操作するコマンドです。
パーミッション(chmod)やオーナー(chown)とは別のレイヤーで機能するため、rootユーザーであってもフラグが設定されたファイルを変更できません。カーネルレベルで書き込みを拒否する仕組みなので、悪意のあるスクリプトや設定ミスによる意図しない上書きを強力に防げます。
主なフラグは次のとおりです。
・+i(Immutable): ファイルの変更・削除・リネーム・ハードリンク作成を全て禁止する。rootでも変更不可。
・+a(Append-only): 追記のみ許可し、既存の内容の変更・削除を禁止する。ログファイルの保護に最適。
・+u(Undeletable): 削除されたデータを保持し、復元できるようにする(実装はファイルシステム依存)。
・+s(Secure deletion): 削除時にブロックをゼロで上書きする(対応ファイルシステムのみ)。
この記事では、セキュリティ対策として最も実用性が高い +i と +a を中心に解説します。
攻撃者がファイル改ざんを狙う仕組み(防御のために知る)
攻撃者がLinuxサーバーへの侵入に成功した後、よく行われる操作を防御目的で整理しておきます。
1. 証跡の消去
/var/log/auth.log や /var/log/secure を空にしたり削除したりすることで、不正ログインの記録を消します。侵入後の調査(フォレンジック)を妨害するのが目的です。
2. バックドアの設置
/etc/passwd や /etc/shadow に不正なアカウントを追加したり、/root/.ssh/authorized_keys に攻撃者の公開鍵を追記して、次回以降のアクセスを確保しようとします。
3. rootkit・マルウェアの常駐化
crontab(/etc/cron.d/ 等)や起動スクリプトに悪意のあるコマンドを仕込み、サーバー再起動後も攻撃コードが動き続けるようにします。
これらの操作を未然に防ぐ手段として、chattr +i や chattr +a が有効です。
具体的な防御手順
1. lsattrで現在のファイル属性を確認する
まず、重要なファイルの現在の属性を確認します。
# 特定ファイルの属性を確認 lsattr /etc/passwd # ディレクトリ以下を再帰的に確認 lsattr -R /etc/ 2>/dev/null | head -30
属性が何も設定されていない場合、出力はダッシュ(-)が並んだ形になります。
# 出力例(フラグなし) --------------e------- /etc/passwd # +i が設定済みの場合 ----i---------e------- /etc/passwd
2. chattr +i で不変フラグ(Immutable)を設定する
+i フラグを設定すると、rootユーザーでさえファイルを変更・削除できなくなります。
# /etc/passwd に不変フラグを設定 sudo chattr +i /etc/passwd # 設定後に確認 lsattr /etc/passwd # → ----i---------e------- /etc/passwd # rootでも変更できないことを確認(エラーになる) sudo sh -c 'echo "test" >> /etc/passwd' # → bash: /etc/passwd: 操作は許可されていません
フラグを解除するには -i を使います(root権限が必要)。
# 不変フラグを解除(変更が必要なときだけ一時的に外す) sudo chattr -i /etc/passwd # 変更・設定後に必ず再設定する sudo chattr +i /etc/passwd
3. chattr +a でログファイルを追記専用にする
+a(Append-only)は、ファイルへの追記のみを許可し、既存内容の変更や削除を防ぎます。ログファイルの改ざん・消去防止に最適です。
# 認証ログを追記専用に設定 sudo chattr +a /var/log/auth.log # syslogも同様に保護 sudo chattr +a /var/log/syslog # 設定確認 lsattr /var/log/auth.log # → -----a--------e------- /var/log/auth.log
4. 重要設定ファイルへの適用例
実際に保護すべきファイルと推奨フラグをまとめます。
| ファイル/ディレクトリ | 推奨フラグ | 理由 |
|---|---|---|
| /etc/passwd | +i | 不正アカウント追加を防ぐ |
| /etc/shadow | +i | パスワードハッシュの書き換えを防ぐ |
| /etc/sudoers | +i | 権限昇格ルールの不正変更を防ぐ |
| /etc/ssh/sshd_config | +i | SSH設定の改ざんを防ぐ |
| /root/.ssh/authorized_keys | +i | 不正な公開鍵の追記を防ぐ |
| /var/log/auth.log | +a | ログの消去・改ざんを防ぐ(追記は必要) |
| /var/log/syslog | +a | システムログの改ざんを防ぐ |
複数ファイルをまとめて設定するスクリプト例です。
#!/bin/bash # 重要ファイルの属性フラグ一括設定スクリプト IMMUTABLE_FILES=( /etc/passwd /etc/shadow /etc/group /etc/gshadow /etc/sudoers /etc/ssh/sshd_config /root/.ssh/authorized_keys ) APPEND_ONLY_FILES=( /var/log/auth.log /var/log/syslog ) for f in "${IMMUTABLE_FILES[@]}"; do [ -f "$f" ] && sudo chattr +i "$f" && echo "[+i 設定済] $f" done for f in "${APPEND_ONLY_FILES[@]}"; do [ -f "$f" ] && sudo chattr +a "$f" && echo "[+a 設定済] $f" done echo "完了。lsattr で設定を確認してください。"
中小企業でも今日からできること
chattr/lsattrはLinux標準コマンドで、追加パッケージの導入は不要です。次の3ステップで今日から始められます。
・ステップ1: lsattrで/etc/passwdなど主要ファイルの現状を確認する(5分)
・ステップ2: /etc/passwd・/etc/shadow・/etc/sudoersに +i を設定する(10分)
・ステップ3: /var/log/auth.logに +a を設定し、ログ保全を確保する(5分)
設定変更が必要なときは chattr -i で一時解除し、変更後に再度 chattr +i をかける運用にすると、うっかり変更のリスクも下げられます。
なお、ディレクトリに対しても chattr +i を適用できますが、その場合はディレクトリ内へのファイル作成・削除もできなくなります。/etc/cron.d/ など新規ファイルを追加する可能性があるディレクトリは、個別のファイルに絞って設定するのが現実的です。
よくある誤解と注意点
「+i フラグは物理アクセスでも防御できる?」
いいえ。物理アクセスがある場合、攻撃者はシングルユーザーモードで起動したり、外部メディアからOSを起動したりして属性を解除できます。chattrはリモート侵害や誤操作からの防御が主な用途です。物理セキュリティとセットで考えてください。
「chattr は xfs や btrfs でも使える?」
xfsでは chattr +i のImmutableフラグが利用可能です。ただし +a(Append-only)の動作はファイルシステムによって差があるため、事前に検証環境で確認してから本番に適用してください。
「ログローテーション(logrotate)が止まってしまう」
+a を設定したログファイルは、logrotateがローテーション時に既存ファイルを切り詰める(truncate)操作ができなくなります。logrotateの prerotate/postrotate でフラグを一時解除する方法が確実です。
# /etc/logrotate.d/auth-log-protected の例 /var/log/auth.log { daily rotate 14 compress missingok notifempty prerotate chattr -a /var/log/auth.log endscript postrotate chattr +a /var/log/auth.log endscript }
「パッケージアップデートでエラーになることがある」
apt/dnfなどのパッケージマネージャーが設定ファイルを更新しようとすると、+iフラグが競合することがあります。メンテナンス作業の前に対象ファイルのフラグを一時解除する手順を決めておくとスムーズです。
本記事のまとめ
| コマンド | 用途 | 主な対象 |
|---|---|---|
| lsattr ファイル名 | 現在のフラグを確認 | 調査・監査全般 |
| chattr +i ファイル名 | 不変(Immutable)フラグを設定 | /etc/passwd・sudoers・sshd_config |
| chattr -i ファイル名 | 不変フラグを解除 | 変更・アップデート時に一時解除 |
| chattr +a ファイル名 | 追記専用フラグを設定 | /var/log/auth.log・syslog |
chattr によるファイル属性保護は、他のセキュリティ対策と組み合わせることで効果を発揮します。SELinuxやfail2ban、AIDE(ファイル整合性監視)と併用することで、多層防御の重要な一層として機能します。
ファイル整合性監視ツール(AIDE)との組み合わせについては、Linuxファイル整合性監視(AIDE)入門もあわせてご覧ください。また、Linuxの詳細な設定については姉妹サイトLinuxMaster.JPでも解説しています。
「Linuxセキュリティ」の記事を読む
このテーマに関連する解説記事を一覧でまとめています。あわせてご覧ください。
