概要
Linuxの標準的なファイルシステム(ext2/ext3/ext4)やXFSなどにおいて、通常のパーミッション(読み書き実行)とは異なる「特殊属性(拡張属性)」を設定・変更するためのコマンドです。
特に、rootユーザーであっても削除や変更ができなくなる「不変属性(immutable)」や、ログファイルのように追記のみを許可する「追記属性(append only)」を設定する際によく利用されます。システムのセキュリティ強化や誤操作防止に役立ちます。
仕様(引数・オプション)
構文
chattr [オプション] [演算子][属性モード] ファイル名...
※ 演算子: +(属性を追加)、-(属性を削除)、=(指定した属性のみに設定)
主な引数・オプション
| オプション | 説明 |
-R | ディレクトリ内のファイルやサブディレクトリも含めて再帰的に変更します(Recursive)。 |
-V | 変更後の属性やバージョン情報を詳細に表示します(Verbose)。 |
-f | エラーメッセージを表示しません(force)。 |
主な属性モード
| モード | 属性名 | 説明 |
i | Immutable | 不変。変更、削除、リネーム、リンク作成が一切できなくなります(root含む)。最もよく使われます。 |
a | Append Only | 追記のみ。ファイルの末尾へのデータ追加のみ許可し、既存内容の上書きや削除を禁止します。 |
d | No Dump | dump コマンドによるバックアップ対象から除外されます。 |
A | No Atime | ファイルにアクセスしてもアクセス時刻(atime)を更新しません(I/O負荷軽減)。 |
c | Compressed | カーネルレベルで透過的に圧縮して保存します(対応FSのみ)。 |
s | Secure Deletion | 削除時にデータ領域をゼロで上書きし、復元困難にします(ext2/3の一部のみ)。 |
u | Undeletable | 削除されてもデータを保存し、復元可能にします(実験的な機能)。 |
j | Data Journaling | ext3/4で、データ自体もジャーナルログに記録します(安全性向上、速度低下)。 |
S | Synchronous | ファイルの変更をディスクへ即座に同期書き込みします(キャッシュを経由しない)。 |
D | Synchronous Dir | ディレクトリへの変更を即座に同期書き込みします。 |
C | No CoW | コピーオンライト(CoW)を無効化します(BtrfsやXFSなどでデータベース等の断片化を防ぐ)。 |
e | Extents | エクステント形式でブロックを使用しています(通常はシステムが設定・読取専用)。 |
T | Top of Directory | ディレクトリ階層のトップとして扱います(ブロック割り当て最適化用)。 |
E | Encrypted / Error | 暗号化されている、または圧縮エラーがあることを示します(通常は手動設定しません)。 |
基本の使い方
最も代表的な使い方は、重要な設定ファイルを誤って削除しないように i 属性(Immutable)を付与することです。
コマンド
# テスト用ファイルを作成
touch protect_config.conf
# i属性を追加(削除・変更禁止にする)
sudo chattr +i protect_config.conf
# 属性を確認
lsattr protect_config.conf
実行結果
----i---------e------- protect_config.conf
この状態で rm コマンドを実行しても、削除できないことが確認できます。
rm protect_config.conf
rm: cannot remove 'protect_config.conf': Operation not permitted
属性の解除
ファイルを編集または削除したい場合は、- 演算子を使って属性を外します。
# i属性を削除
sudo chattr -i protect_config.conf
# その後、削除が可能になる
rm protect_config.conf
実践コマンド
ログファイルを追記のみ可能にする
システムログや操作履歴など、過去のデータを改ざん・消去されたくないが、新しいログは書き込みたい場合に a 属性を使用します。
# 既存のログファイルを上書き・削除禁止(追記のみ許可)に設定
sudo chattr +a /var/log/secure_app.log
※ この設定を行うと、vi 等での編集はできなくなりますが、echo "log" >> file のような追記は可能です。
ディレクトリごと変更禁止にして保護する
Webサイトのコンテンツディレクトリなど、更新頻度が低く改ざんを防ぎたいディレクトリ全体をロックします。
# staticディレクトリ配下の全ファイルを変更禁止にする
sudo chattr -R +i /var/www/html/static/
データベースファイルの断片化を防ぐ(CoW無効化)
BtrfsやXFSファイルシステム上で仮想マシンイメージやデータベースファイルを扱う際、コピーオンライト(CoW)によるパフォーマンス低下を防ぐために C 属性を設定します。
※ ファイルが空の時点(作成直後)に設定する必要があります。
touch database.img
chattr +C database.img
カスタムポイント
- 演算子の使い分け:
+i: 今の属性にiを追加する。-i: 今の属性からiを削除する。=i: 他の属性をすべて消して、iだけにする(意図せず他の重要な属性を消さないよう注意)。
- sudoの必須: 一般ユーザーが自分のファイルに対して行う場合でも、一部の属性(特に
iやa)の設定には管理者権限(sudo)が必要な場合があります。
注意点
- 「許可されていない操作」エラー:rm コマンドなどで Operation not permitted が出た場合、権限(chmod)の問題ではなく chattr の属性が原因である可能性が高いです。必ず lsattr で確認してください。
- viエディタでの挙動:i 属性がついたファイルを vi で開いて :wq で保存しようとすると、「E212: Can’t open file for writing」のようなエラーになり保存できません。強制保存(:w!)も効きません。
- シンボリックリンク:chattr はシンボリックリンクそのものには適用できません。リンクの実体に対して適用されます。
応用
重要なシステムファイルの誤削除防止を自動化する
セットアップスクリプトなどで、設定ファイルの配置後に自動的にロックをかける手法です。
#!/bin/bash
# 設定ファイルを配置
cp my_custom.conf /etc/my_app/
# 誤操作防止のためロック
chattr +i /etc/my_app/my_custom.conf
echo "設定ファイルを配置し、変更禁止属性を付与しました。"
まとめ
chattrコマンドは、Linuxシステムにおける「最後の砦」のようなセキュリティ機能を提供します。通常のパーミッション設定だけでは防げない、rootユーザーによる誤操作や、悪意あるスクリプトによるファイル改ざん・削除を物理的にブロックすることができます。特に不変属性(i)と追記属性(a)はサーバー運用において非常に強力ですが、設定したことを忘れると「なぜかファイルが編集できない」というトラブルの原因にもなるため、lsattrコマンドとセットで運用することが重要です。
