「chmodで権限を絞っても、rootユーザーには効かなくて困っている…」
Linuxでは、ファイルのパーミッションを設定してもrootユーザーはすべてのファイルを操作できてしまいます。
また「rm -f で削除したのに消えない」「rootで上書きしようとしてもOperation not permittedになる」という経験はないでしょうか。この原因の多くはパーミッションではなく、ファイルシステムレベルの拡張属性にあります。
そこで使うのが
chattr(change attribute)コマンドと、設定済み属性を確認する lsattr コマンドです。RHEL 9 / Rocky Linux 9 / Ubuntu 24.04 LTS で動作確認済みです。この記事では、chattrコマンドの実践的な使い方を解説します。
ファイルの不変属性(immutable)の設定から、lsattrによる属性確認、サーバー運用での具体的な活用例まで、現場で必要になる操作を網羅しています。
・chattrコマンドとchmodの違い(rootユーザーへの制限方法)
・
chattr +i でファイルをrootでも変更・削除できないimmutable状態にする方法・
chattr +a で追記のみ許可する方法(ログファイルの保護に有効)・設定できる属性フラグの種類と意味(i・a・e・s・A など8種類)
・
lsattr コマンドで設定済み属性を確認する方法・/etc/resolv.confの自動書き換え防止・セキュリティ強化など、実務での活用パターン
・「rm -fでも消えない」「viで保存できない」トラブルの解決手順
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜchattrコマンドが必要なのか?
通常のLinuxパーミッション(chmod)は、「誰がアクセスできるか」を制御する仕組みです。しかしrootユーザーはパーミッションに縛られないため、重要な設定ファイルでも上書き・削除ができてしまいます。
chattrコマンドは、ext2/ext3/ext4などのファイルシステムが持つ「拡張属性」を操作します。
この拡張属性を使うと、rootユーザーであっても変更できない「不変(immutable)」な状態にできます。
・chmod:アクセス権限(読み・書き・実行)を制御する。rootには効かない
・chattr +i:ファイルシステムレベルで変更を禁止する。rootでも書き換え・削除不可になる
特にサーバー上の重要な設定ファイル(/etc/resolv.conf、/etc/hostsなど)を誤操作から守りたい場面や、
セキュリティ上の理由でファイルの改ざんを防ぎたい場面で力を発揮します。
chattr・lsattr コマンドは
e2fsprogs パッケージに含まれており、RHEL/Rocky Linux/Ubuntu では標準インストール済みです。ファイル属性フラグの一覧
chattr で設定できる主なフラグを以下にまとめます。| フラグ | 意味 | 主な用途 |
|---|---|---|
i |
immutable(不変):削除・変更・リネーム・リンク作成を禁止。rootも不可 | 重要設定ファイルの保護 |
a |
append only(追記専用):追記は許可、上書き・削除を禁止 | ログファイルの改ざん防止 |
e |
extent format:ファイルシステムがextentを使用中(通常は自動設定) | 情報確認のみ |
s |
secure deletion:削除時にブロックをゼロで上書き | 機密ファイルの完全削除 |
u |
undeletable:削除後も内容を保持(復元可能にする) | 誤削除への備え(実装依存) |
A |
no atime update:アクセス時刻(atime)を更新しない | I/O負荷軽減 |
S |
synchronous update:変更を即座にディスクへ書き込む | クラッシュ耐性が必要なファイル |
d |
no dump:dump コマンドのバックアップ対象から除外 | バックアップ除外 |
i(不変)と a(追記専用)の2つです。それ以外はカーネルやファイルシステムのバージョンによって挙動が異なる場合があるため、本記事では i と a を中心に解説します。chattrコマンドの基本的な使い方
コマンド書式
chattr コマンドの基本書式は以下のとおりです。「+」でフラグを追加し、「-」で解除します。# 書式 chattr [オプション] [+/-フラグ] ファイル名 # フラグを追加する chattr +i /etc/hosts # フラグを解除する chattr -i /etc/hosts # 複数フラグを同時に指定する chattr +ia /var/log/myapp.log # ディレクトリ配下を再帰的に処理する(-Rオプション) chattr -R +i /etc/myconf.d/
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
一般ユーザーが chattr を実行しようとすると「Operation not permitted」エラーになります。
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
4. logrotateとの組み合わせ注意点
+a フラグが設定されたファイルは、logrotate が「古いログを移動・削除する」操作に失敗します。logrotate を使う場合は、事前フラグ解除と事後再設定を設定ファイルに組み込む必要があります。
# /etc/logrotate.d/myapp の設定例(prerotate/postrotate でフラグを制御) /var/log/myapp/access.log { daily rotate 30 compress prerotate chattr -a /var/log/myapp/access.log endscript postrotate chattr +a /var/log/myapp/access.log endscript }
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 # ディレクトリそのものの属性を確認する(-dオプション) $ lsattr -d /etc/myconf.d/ --------------e-- /etc/myconf.d/
・i:immutable(変更・削除・リネーム禁止)
・a:append only(追記のみ許可。上書き・削除禁止)
・e:extent(extentsでマッピングされている。デフォルトで付いている)
・A:no atime update(アクセス時刻を更新しない)
「-」は属性なしを意味します。フラグが設定されているかどうかは、その位置に文字があるかハイフンかで判断します。ほとんどのファイルは e 以外は「-」の状態です。
2. ディレクトリを再帰的に確認する(-R)
# ディレクトリ配下を再帰的に確認する $ lsattr -R /etc/httpd/conf/
ディレクトリ自体の属性を確認する場合は
-d オプションを使ってください(-d なしだとディレクトリ内のファイル一覧が表示されます)。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
その場合は nmcli で DNS設定を行ってください。
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. セキュリティ強化(重要なシステムファイルの改ざん防止)
サーバーへの不正侵入者が /etc/passwd や /etc/shadow を改ざんするのを防ぐ目的でも使われます。# パスワードファイルを保護する(必要時のみ解除する運用) $ sudo chattr +i /etc/passwd $ sudo chattr +i /etc/shadow $ sudo chattr +i /etc/group # 設定確認 $ lsattr /etc/passwd /etc/shadow /etc/group ----i---------e-- /etc/passwd ----i---------e-- /etc/shadow ----i---------e-- /etc/group
メンテナンス時はフラグを一時解除する手順を必ず文書化しておきましょう。
4. Webサーバーの静的ファイルをデプロイ後に保護する
Webアプリの静的ファイルをデプロイ後、ファイルが勝手に変更されないよう保護する例です。# デプロイ後に静的ファイルを不変に設定する $ sudo chattr -R +i /var/www/html/static/ # デプロイ更新時は一旦解除する $ sudo chattr -R -i /var/www/html/static/
5. ディレクトリに+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属性のファイルを削除・編集できない
「rm -f でも消えない」「rootでも上書きできない」場合の確認手順です。# Step 1: 属性フラグを確認する(まずここを見る) $ lsattr /etc/resolv.conf ----i---------e-- /etc/resolv.conf # ↑ i フラグが設定されているので削除・上書きができない # Step 2: フラグを解除する $ sudo chattr -i /etc/resolv.conf # Step 3: 削除・編集できることを確認する $ sudo rm /etc/resolv.conf
【エラー3】viで保存できない(E212 / Operation not permitted)
vi / vim でファイルを開き、編集後に:wq で保存しようとしてエラーになる場合:・E45: 'readonly' option is set → vi が readonly モードで開かれた(:set noreadonly で解除可)
・E212: Can't open file for writing または Operation not permitted → chattr の +i 属性が原因の可能性が高い
# vi で保存エラーが出た場合の確認手順 $ lsattr /path/to/file ----i---------e-- /path/to/file # i フラグがあれば chattr -i で解除してから再編集する $ sudo chattr -i /path/to/file $ sudo vi /path/to/file
【エラー4】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 -d ディレクトリ名 |
| ディレクトリ内を再帰的に確認する | lsattr -R ディレクトリ名 |
| ディレクトリ配下に再帰的にフラグ設定 | sudo chattr -R +i ディレクトリ名 |
「rootでも変更できないファイル保護を、サーバー構築の"型"として身につけたい」と思いませんか?
chattrによるファイル保護は、本番サーバーの誤操作・改ざん防止に欠かせないテクニックです。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:curlコマンドでHTTP通信を行う方法|GET・POSTやヘッダー確認も
- 前のページへ:ディレクトリ内のファイル数をカウントする方法|find -maxdepth・隠しファイル除外・自動監視
- この記事の属するカテゴリ:Linuxtipsへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます