技術ノート Linux Linux で chattr コマンドを使用する方法

Linux で chattr コマンドを使用する方法

通常のファイルの読み取り、書き込み、および実行の アクセス許可 に加えて、Linux ファイルには、ファイルの他の特性を制御する別の属性セットがあります。それらを確認し、変更する方法は次のとおりです。

権限と属性

Linux では、誰がファイルにアクセスできるか、またそのファイルに対して何ができるかは、ユーザー中心の権限セットによって制御されます。 ファイルの内容を読み取る ことができるか、ファイルに新しいデータを書き込むことができるか、またはファイルがスクリプトまたはプログラムである場合はファイルを実行できるかどうかは、すべてその権限セットによって決まります。権限はファイルに適用されますが、さまざまなカテゴリのユーザーに対する制限と機能が定義されます。

ファイルの所有者、ファイルのグループ、およびその他、つまり最初の 2 つのカテゴリに属さないユーザーに対するアクセス許可があります。 ls コマンドを使用できます。

 -l

(長いリスト) ファイルまたはディレクトリのアクセス許可を表示するオプション。

権限を変更するには、 chmod コマンドを 使用します。少なくとも、ファイルへの書き込み権限がある場合、または root ユーザーの場合は可能です。

ファイルのアクセス許可はユーザー レベルでアクセス許可を付与または削除するため、ユーザー中心であることがわかります。対照的に、ファイルの属性はファイル システム中心です。アクセス許可と同様に、これらはファイルまたはディレクトリに設定されます。ただし、一度設定すると、すべてのユーザーに対して同じになります。

属性は、アクセス許可とは別の設定のコレクションです。属性は、不変性やその他のファイル システム レベルの動作などの特性を制御します。ファイルまたはディレクトリの属性を確認するには、 lsattr コマンドを使用します。属性を設定するには、 chattr コマンドを使用します。

権限と属性は i ノード内に保存されます。 i ノードは 、ファイルやディレクトリ などのファイル システム オブジェクトに関する情報を保持する ファイル システム構造 です。ハード ドライブ上のファイルの場所、作成日、アクセス許可、属性はすべて i ノード内に保存されます。

ファイル システムが異なれば、基礎となる構造や機能も異なるため、ファイル システムによっては属性が異なる動作をするか、完全に無視される可能性があります。この記事では、多くの Linux ディストリビューションのデフォルト ファイル システムである ext4 を使用します。

Linux で chattr コマンドを使用する方法

ファイルの属性を確認する

chattr および lsattr コマンドはコンピューター上にすでに存在しているため、何もインストールする必要はありません。

現在のディレクトリ内のファイルの属性を確認するには、 lsattr を使用します。

 lsattr

破線は、設定されていない属性のプレースホルダーです。設定される唯一の属性は e (エクステント) 属性です。これは、ファイル システムの i ノードが、ハード ドライブ上のファイルのすべての部分を指すエクステントを使用している、または必要に応じて使用することを示しています。

ファイルがハード ドライブ ブロックの 1 つの連続したシーケンスに保持されている場合、その i ノードはファイルの保存に使用される最初と最後のブロックを記録するだけで済みます。ファイルが 断片化されて いる場合、inode はファイルの各部分の最初と最後のブロックの番号を記録する必要があります。これらのハードドライブのブロック番号のペアはエクステントと呼ばれます。

これは、最も一般的に使用される属性のリストです。

  • a : 追加のみ。この属性を持つファイルは追加のみ可能です。ファイルの最後にのみ書き込み可能ですが、書き込みは可能です。ファイル内の既存のデータを上書きすることはできません。
  • c : 圧縮されています。ファイルはハード ドライブ上で自動的に 圧縮され 、読み取られるときに解凍されます。ファイルに書き込まれるデータは、ハード ドライブに書き込まれる前に圧縮されます。
  • A : atime 更新は ありません。 atime 、ファイルが最後にアクセスされた時刻を記録する i ノード内の値です。
  • C : コピーオンライトはありません。 2 つのプロセスがファイルへのアクセスを要求した場合、同じファイルへのポインターを与えることができます。ファイルに書き込もうとした場合にのみ、ファイルの独自のコピーが与えられるため、そのプロセスに固有のコピーが作成されます。
  • d : ダンプはありません。 Linux dump コマンドは、ファイル システム全体のコピーをバックアップ メディアに書き込むために使用されます。この属性により dump ファイルを無視します。バックアップから除外されます。
  • D : ディレクトリの同期更新。ディレクトリに対してこの属性がオンになっている場合、そのディレクトリに対するすべての変更は同期的に、つまり直ちにハード ドライブに書き込まれます。データ操作はバッファリングできます。
  • e : エクステント形式。 e 属性は、ファイル システムがエクステントを使用してハード ドライブ上のファイルの場所をマップしていることを示します。これを chattr で変更することはできません。これはファイル システムの操作の機能です。
  • i : 不変。不変ファイルは、名前変更や削除などの変更を行うことができません。この属性を設定または設定解除できるのは root ユーザーだけです。
  • s : 安全な削除。この属性が設定されたファイルが削除されると、ファイル データを保持していたハード ドライブ ブロックはゼロを含むバイトで上書きされます。これは ext4 ファイル システムでは受け入れられないことに注意してください。
  • S : 同期更新。 S 属性が設定されたファイルへの変更は、同期的にファイルに書き込まれます。
  • u : u 属性が設定されているファイルを削除すると、ファイルのコピーが作成されます。これは、ファイルが誤って削除された場合にファイルを回復するのに役立ちます。
Linux で chattr コマンドを使用する方法

ファイルの属性の変更

chattr コマンドを使用すると、ファイルまたはディレクトリの属性を変更できます。 chmod コマンドや権限と同様に、 + (設定) 演算子と - (設定解除) 演算子を使用して属性を適用または削除できます。

chattr コマンドには = (設定のみ) 演算子もあります。これにより、ファイルまたはディレクトリの属性が、コマンドで指定された属性のみに設定されます。つまり、コマンドラインにリストされていない属性はすべて設定解除されます。

Linux で chattr コマンドを使用する方法

追加専用属性の設定

テキスト ファイルに追加専用属性を設定して、ファイルで実行できる内容にそれがどのような影響を与えるかを見てみましょう。

 sudo chattr +テキストファイル.txt

lsattr を使用して、追加専用ビットが設定されていることを確認できます。

 lsattr テキストファイル.txt

文字「 a 」は、属性が設定されていることを示します。ファイルを上書きしてみましょう。単一の山括弧「 > 」を使用して出力をファイルにリダイレクトすると、ファイル内のすべてのコンテンツがリダイレクトされた出力で置き換えられます。

テキスト ファイルには、 lorem ipsum プレースホルダー テキストが プリロードされています。

猫のテキストファイル.txt

ls からの出力をファイルにリダイレクトします。

 ls -l > テキストファイル.txt

 sudo ls -l > テキストファイル.txt

sudo コマンドを 使用しても、この操作は許可されません。

2 つの山括弧「 >> 」を使用して出力をリダイレクトすると、出力はファイル内の既存のデータに追加されます。これは、追加専用のテキスト ファイルでは許容されるはずです。

 sudo ls -l >> テキストファイル.txt

エラー メッセージは表示されずにコマンド プロンプトに戻ります。ファイルの中を覗いて、何が起こったのかを見てみましょう。

猫のテキストファイル.txt

ls からリダイレクトされた出力がファイルの末尾に追加されました。

ファイルにデータを追加することはできますが、ファイルに加えられる変更はこれだけです。削除することも、root化することもできません。

 rm テキストファイル.txt

 sudo rm テキストファイル.txt 

Linux で chattr コマンドを使用する方法

不変属性の設定

新しいデータが追加されないファイルを保護したい場合は、不変属性を設定できます。これにより、データの追加を含むファイルへのすべての変更が防止されます。

 sudo chattr +i 2番目のファイル.txt

 lsattr 2 番目のファイル.txt

不変属性が設定されていることを示す「 i 」が表示されます。ファイルを不変にすると、root ユーザーでもファイルの名前変更 ( mv )、削除 ( rm )、データの追加ができなくなります。

 sudo mv 2 番目のファイル.txt 新しい名前.txt

 sudo rm 2番目のファイル.txt

 sudo ls -l >> 2番目のファイル.txt 

Linux で chattr コマンドを使用する方法

ext4 での安全な削除に依存しないでください

すでに指摘したように、一部のオペレーティング システムではすべての属性がサポートされていません。安全な削除属性は、 ext4 を含む ext ファミリの ファイル システム では受け入れられません。ファイルを安全に削除するためにこれに依存しないでください。

これが ext4 では機能しないことは簡単にわかります。テキスト ファイルに s (安全な削除) 属性を設定します。

 sudo chattr +s third-file.txt

これから行うことは、このファイルに関するメタデータを保持する i ノードを見つけることです。 i ノードには、ファイルが占有する最初のハード ドライブ ブロックが保持されます。ファイルには、lorem ipsum プレースホルダー テキストが含まれています。

ハード ドライブからそのブロックを直接読み取り、ハード ドライブの正しい場所を読み取っていることを確認します。ファイルを削除してから、同じハード ダイブ ブロックをもう一度読み取ります。安全な削除属性が尊重されている場合は、ゼロ化されたバイトを読み取る必要があります。

--fibmap (ファイル ブロック マップ) オプションを指定して hdparm コマンドを使用すると、ファイルの i ノードを見つけることができます。

 sudo hdparm --fibmap 3 番目のファイル.txt

最初の dd ドライブ ブロックは 18100656 です。dd コマンドを使用してそれを読み取ります。

オプションは次のとおりです。

  • if=/dev/sda : このコンピュータの最初のハードドライブから読み取ります。
  • bs=512 : 512 バイトのハードドライブブロックサイズを使用します。
  • Skip=18100656 : ブロック 18100656 より前のすべてのブロックをスキップします。つまり、ブロック 18100656 から読み取りを開始します。
  • count=1 : 1 ブロックのデータを読み取ります。

 sudo dd if=/dev/sda bs=512 スキップ=18100656 カウント=1

予想どおり、lorem ipsum プレースホルダー テキストが表示されます。ハードドライブ上の正しいブロックを読んでいます。

次に、ファイルを削除します。

 rm 3番目のファイル.txt

同じハード ドライブ ブロックを読み取ると、引き続きデータを確認できます。

 sudo dd if=/dev/sda bs=512 スキップ=18100656 カウント=1

繰り返しますが、 ext4 で安全に削除するためにこれに依存しないでください。 ファイルを復元できないように削除するためのより良い方法 があります。

Linux で chattr コマンドを使用する方法

便利ですが、使用には注意が必要です

ファイルの属性を設定すると、ファイルを偶発的な災害から守ることができます。ファイルを削除したり上書きしたりできない場合は、非常に安全です。

これらをシステム ファイルに適用して、 Linux インストールをより安全にしたい と考えるかもしれません。ただし、アップデートの発行やアップグレードの適用に応じて、システム ファイルを定期的に置き換える必要があります。そのため、これらの属性は自分で作成したファイルに対してのみ使用するのが最も安全です。

「 Linux で chattr コマンドを使用する方法」に関するベスト動画選定!

よく使うLinuxコマンドについて丁寧に解説します
chattr command in linux.