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

公開: 2022-06-28
赤いラップトップの背景にあるLinux端末。
fatmawati achmad zaenuri / Shutterstock

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

権限と属性

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

ファイルの所有者、ファイルのグループ、およびその他のユーザー、つまり最初の2つのカテゴリに属していないユーザーに対するアクセス許可があります。 -l (長いリスト)オプションを指定してlsコマンドを使用すると、ファイルまたはディレクトリーの許可を確認できます。

Linuxでchmodコマンドを使用する方法
関連Linuxでchmodコマンドを使用する方法

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

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

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

Linux上のiノードについて知りたいと思ったことすべて
Linux上のiノードについて知りたいと思ったことすべて

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

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

ファイルの属性を見る

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

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

 lsattr 

ディレクトリ内のすべてのファイルのファイル属性を一覧表示する

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

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

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

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

ファイルの属性の変更

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

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

追加のみの属性の設定

テキストファイルにappend-only属性を設定して、それがファイルで実行できることにどのように影響するかを見てみましょう。

 sudo chattr + a text-file.txt 

テキストファイルにappendonly属性を設定する

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

 lsattr text-file.txt 

テキストファイルの属性の一覧表示

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

テキストファイルにloremipsumプレースホルダーテキストをプリロードしました。

 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からのリダイレクトされた出力がファイルの最後に追加されました。

追加のみのテキストファイルに追加された新しいデータ

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

 rm text-file.txt
 sudo rm text-file.txt 

追加のみのテキストファイルを削除できない

不変属性の設定

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

 sudo chattr + i second-file.txt
 lsattrsecond-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 

テキストファイルに安全な削除属性を設定する

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

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

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

 sudo hdparm --fibmap third-file.txt 

ファイルのiノードを見つける

最初のハードドライブブロックはddです。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 

ファイルの最初のハードドライブブロックを読み取る

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

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

 rmthird-file.txt 

同じハードドライブブロックを読み取っても、データを確認できます。

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

削除されたファイルで使用されているハードドライブブロックからデータを読み取る

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

関連: Linuxでファイルを安全に削除する方法

便利ですが、注意して使用してください

ファイルの属性を設定すると、偶発的な災害の影響を受けなくなります。 ファイルを削除または上書きできない場合は、かなり安全です。

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

関連: fail2banでLinuxサーバーを保護する方法