Linuxでchattrコマンドを使う方法

Linuxファイルには、通常の読み取り、書き込み、実行のファイルパーミッションに加えて、ファイルの他の特性を制御する別の属性セットがあります。それらを確認して変更する方法を説明します。

パーミッションと属性

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

ファイルの所有者、ファイルのグループ、およびその他(つまり、最初の2つのカテゴリに含まれないユーザー)のパーミッションがあります。lsコマンドを-l(ロングリスティング)オプションとともに使用して、ファイルまたはディレクトリのパーミッションを確認できます。

パーミッションを変更するには、chmodコマンドを使用します。少なくとも、ファイルに対する書き込みパーミッションがある場合、またはrootユーザーである場合は変更できます。

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

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

パーミッションと属性は、inodeに格納されます。inodeは、ファイルやディレクトリなどのファイルシステムオブジェクトに関する情報を保持するファイルシステム構造です。ハードドライブ上のファイルの場所、作成日、パーミッション、属性はすべて、そのinode内に格納されます。

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

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

chattrlsattrコマンドはすでにコンピュータに存在するため、何もインストールする必要はありません。

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

lsattr

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

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

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

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

ファイルの属性を変更する

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

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

追加のみ属性の設定

テキストファイルに追加のみ属性を設定し、それがファイルに対して何ができるかにどのような影響を与えるかを確認してみましょう。

sudo chattr +a text-file.txt

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

lsattr text-file.txt

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

テキストファイルにプレースホルダーのダミーテキストを事前ロードしました。

cat text-file.txt

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

ls -l > text-file.txt

sudo ls -l > text-file.txt

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

2つの山カッコ「>>」を使用して出力をリダイレクトすると、ファイル内の既存のデータに追加されます。これは、追加のみのテキストファイルで受け入れられるはずです。

sudo ls -l >> text-file.txt

エラーメッセージなしでコマンドプロンプトに戻ります。ファイルの中を覗いて、何が起こったかを確認しましょう。

cat text-file.txt

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

ファイルにデータを追加することはできますが、それがファイルに加えることができる唯一の変更です。削除することはできませんし、rootユーザーも削除できません。

rm text-file.txt

sudo rm text-file.txt

不変属性の設定

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

sudo chattr +i second-file.txt

lsattr second-file.txt

不変属性が設定されていることを示す「i」を確認できます。ファイルを不変にしたので、rootユーザーでさえ名前を変更(mv)、削除(rm)、またはデータを追加することはできません。

sudo mv second-file.txt new-name.txt

sudo rm second-file.txt

sudo ls -l >> second-file.txt

ext4で安全な削除に頼らない

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

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

sudo chattr +s third-file.txt

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

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

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

sudo hdparm --fibmap third-file.txt

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

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

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

sudo dd if=/dev/sda bs=512 skip=18100656 count=1

予想通り、ダミーテキストが表示されます。ハードドライブの正しいブロックを読んでいます。

ここでファイルを削除します。

rm third-file.txt

同じハードドライブブロックを読み取ると、データは引き続き表示されます。

sudo dd if=/dev/sda bs=512 skip=18100656 count=1

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

便利だが注意して使用する

ファイルの属性を設定すると、偶発的な災害に耐えられるようになります。ファイルを削除したり上書きしたりできない場合、かなり安全です。

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