「chmodで権限を絞っても、rootユーザーには効かなくて困っている…」
Linuxでは、ファイルのパーミッションを設定してもrootユーザーはすべてのファイルを操作できてしまいます。そこで使うのが chattr(change attribute)コマンドです。
この記事では、chattrコマンドの実践的な使い方を解説します。
ファイルの不変属性(immutable)の設定から、lsattrによる属性確認、サーバー運用での具体的な活用例まで、現場で必要になる操作を網羅しています。
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜchattrコマンドが必要なのか?
通常のLinuxパーミッション(chmod)は、「誰がアクセスできるか」を制御する仕組みです。しかしrootユーザーはパーミッションに縛られないため、重要な設定ファイルでも上書き・削除ができてしまいます。chattrコマンドは、ext2/ext3/ext4などのファイルシステムが持つ「拡張属性」を操作します。この拡張属性を使うと、rootユーザーであっても変更できない「不変(immutable)」な状態にできます。
・chmod:アクセス権限(読み・書き・実行)を制御する。rootには効かない
・chattr +i:ファイルシステムレベルで変更を禁止する。rootでも書き換え・削除不可になる
特にサーバー上の重要な設定ファイル(/etc/resolv.conf、/etc/hostsなど)を誤操作から守りたい場面や、セキュリティ上の理由でファイルの改ざんを防ぎたい場面で力を発揮します。
chattrコマンドの基本的な使い方
1. ファイルに不変属性(+i)を設定する
最もよく使うのが、+i オプションによる「immutable(不変)」属性の設定です。# ファイルをimmutable(変更不可)にする $ sudo chattr +i /etc/resolv.conf # 確認 $ lsattr /etc/resolv.conf ----i---------e-- /etc/resolv.conf
・書き込み(上書き):vim・echoでの変更が拒否される
・削除:rm コマンドが「Operation not permitted」を返す
・リネーム:mv コマンドが拒否される
・ハードリンク作成:ln コマンドが拒否される
2. 不変属性を解除する(-i)
設定ファイルを更新したいときは、まず -i で属性を解除してから変更します。# immutable属性を解除する(rootまたはsudo権限が必要) $ sudo chattr -i /etc/resolv.conf # 解除後は通常の編集が可能になる $ sudo vi /etc/resolv.conf
3. 追記のみ許可する属性(+a)
ログファイルなど、追記は許可したいが上書き・削除はさせたくないファイルには +a(append only)属性が便利です。# 追記のみ許可する(上書き・削除不可) $ sudo chattr +a /var/log/myapp.log # 追記はできる(>>) $ echo "ログ追記テスト" >> /var/log/myapp.log # 上書きはできない(>) $ echo "上書きテスト" > /var/log/myapp.log -bash: /var/log/myapp.log: Operation not permitted
lsattrで属性を確認する方法
設定した属性を確認するには lsattr コマンドを使います。1. ファイルの属性を確認する
# ファイルの属性を表示する $ lsattr /etc/resolv.conf ----i---------e-- /etc/resolv.conf # ディレクトリ内のファイルをまとめて確認する $ lsattr /etc/ -------------e-- /etc/fstab ----i---------e-- /etc/resolv.conf -------------e-- /etc/hosts
・i:immutable(変更・削除・リネーム禁止)
・a:append only(追記のみ許可。上書き・削除禁止)
・e:extent(extentsでマッピングされている。デフォルトで付いている)
・A:no atime update(アクセス時刻を更新しない)
「-」は属性なしを意味します。ほとんどのファイルは e 以外は「-」の状態です。
2. ディレクトリを再帰的に確認する(-R)
# ディレクトリ配下を再帰的に確認する $ lsattr -R /etc/httpd/conf/
chattrの実務での活用例
1. /etc/resolv.confが自動で書き換えられる問題への対策
NetworkManager や dhclient が実行されると /etc/resolv.conf が自動で上書きされてしまうことがあります。手動で設定した内容を保持したい場合は +i 属性が有効です。# 手動でDNSを設定した後に不変属性を付ける $ sudo vi /etc/resolv.conf $ sudo chattr +i /etc/resolv.conf # NetworkManagerが書き換えようとしても弾かれる $ lsattr /etc/resolv.conf ----i---------e-- /etc/resolv.conf
2. cronやsshの設定ファイルを誤操作から守る
本番サーバーで重要な設定ファイルを変更禁止にしておくことで、オペレーションミスのリスクを下げられます。# SSH設定ファイルを変更不可にする $ sudo chattr +i /etc/ssh/sshd_config # 変更が必要な時は一時的に解除 → 変更 → 再設定 $ sudo chattr -i /etc/ssh/sshd_config $ sudo vi /etc/ssh/sshd_config $ sudo systemctl restart sshd $ sudo chattr +i /etc/ssh/sshd_config
3. ディレクトリに+iを設定した場合の注意点
ファイルだけでなく、ディレクトリ自体にも +i を設定できます。ただし、ディレクトリへの +i はディレクトリ内のファイル操作(作成・削除)を禁止しますが、ディレクトリ内の既存ファイルの内容変更までは禁止しません。# ディレクトリに+iを設定する $ sudo chattr +i /var/www/html/ # ディレクトリ内でのファイル作成が拒否される $ sudo touch /var/www/html/newfile.html touch: cannot touch '/var/www/html/newfile.html': Operation not permitted # 既存ファイルへの書き込みは(そのファイルに+iがなければ)可能 $ echo "test" >> /var/www/html/index.html # これは通る
「Operation not permitted」が出た時の対処法
【エラー1】chattrコマンド自体が拒否される
$ chattr +i /etc/hosts chattr: Operation not permitted while setting flags on /etc/hosts
【エラー2】+i属性のファイルを削除しようとしたとき
$ sudo rm /etc/resolv.conf rm: cannot remove '/etc/resolv.conf': Operation not permitted
【エラー3】XFS・tmpfsファイルシステムでは使えない
chattr の +i 属性は ext2/ext3/ext4 での利用が主です。XFSファイルシステムでは一部の属性がサポートされていません(+iはXFSでも動作しますが、属性によっては未対応のものがあります)。また、tmpfs(/tmp など)では chattr は使えません。# ファイルシステムの種類を確認する $ df -T /etc/resolv.conf Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/sda1 ext4 20511312 8234452 11224604 43% /
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| ファイルを変更・削除不可にする | sudo chattr +i ファイル名 |
| 変更不可属性を解除する | sudo chattr -i ファイル名 |
| 追記のみ許可する | sudo chattr +a ファイル名 |
| 追記のみ属性を解除する | sudo chattr -a ファイル名 |
| ファイルの属性を確認する | lsattr ファイル名 |
| ディレクトリ内を再帰的に確認する | lsattr -R ディレクトリ名 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
※登録30秒/合わなければ解除3秒
