Linuxでchattrコマンドを使用する方法
公開: 2022-06-28
Linuxファイルには、通常の読み取り、書き込み、および実行ファイルのアクセス許可に加えて、ファイルの他の特性を制御する別の属性セットがあります。 それらを表示して変更する方法は次のとおりです。
権限と属性
Linuxでは、ファイルにアクセスできるユーザーとそのファイルで実行できる操作は、ユーザー中心の一連のアクセス許可によって制御されます。 ファイルの内容を読み取ることができるか、ファイルに新しいデータを書き込むことができるか、またはファイルがスクリプトまたはプログラムである場合はファイルを実行できるかどうかは、すべてその権限のセットによって制御されます。 権限はファイルに適用されますが、さまざまなカテゴリのユーザーの制限と機能を定義します。
ファイルの所有者、ファイルのグループ、およびその他のユーザー、つまり最初の2つのカテゴリに属していないユーザーに対するアクセス許可があります。 -l
(長いリスト)オプションを指定してls
コマンドを使用すると、ファイルまたはディレクトリーの許可を確認できます。
権限を変更するには、 chmod
コマンドを使用します。 少なくとも、ファイルへの書き込み権限がある場合、またはrootユーザーである場合は可能です。
ファイルのアクセス許可は、ユーザーレベルでアクセス許可を付与または削除するため、ユーザー中心であることがわかります。 対照的に、ファイルの属性はファイルシステム中心です。 権限と同様に、それらはファイルまたはディレクトリに設定されます。 ただし、一度設定すると、すべてのユーザーで同じになります。
属性は、権限とは別の設定のコレクションです。 属性は、不変性やその他のファイルシステムレベルの動作などの特性を制御します。 ファイルまたはディレクトリの属性を確認するには、 lsattr
コマンドを使用します。 属性を設定するには、 chattr
コマンドを使用します。
アクセス許可と属性はiノード内に保存されます。 iノードは、ファイルやディレクトリなどのファイルシステムオブジェクトに関する情報を保持するファイルシステム構造です。 ハードドライブ上のファイルの場所、作成日、アクセス許可、および属性はすべて、iノード内に保存されます。
ファイルシステムが異なれば、基盤となる構造と機能も異なるため、一部のファイルシステムでは、属性の動作が異なるか、完全に無視される可能性があります。 この記事では、多くのLinuxディストリビューションのデフォルトのファイルシステムであるext4
を使用しています。
ファイルの属性を見る
chattr
コマンドとlsattr
コマンドは既にコンピューターに存在しているため、何もインストールする必要はありません。
現在のディレクトリ内のファイルの属性を確認するには、 lsattr
を使用します。
lsattr
破線は、設定されていない属性のプレースホルダーです。 設定される唯一の属性はe
(エクステント)属性です。 これは、ファイルシステムのiノードがハードドライブ上のファイルのすべての部分を指すエクステントを使用している(または必要に応じて使用する)ことを示しています。
ファイルがハードドライブブロックの1つの連続したシーケンスで保持されている場合、そのiノードはファイルの保存に使用された最初と最後のブロックのみを記録する必要があります。 ファイルが断片化されている場合、iノードはファイルの各部分の最初と最後のブロックの番号を記録する必要があります。 これらのハードドライブブロック番号のペアは、エクステントと呼ばれます。
これは、最も一般的に使用される属性のリストです。
- a :追加のみ。 この属性を持つファイルは、にのみ追加できます。 書き込みは可能ですが、ファイルの最後にのみ書き込むことができます。 ファイル内の既存のデータを上書きすることはできません。
- c :圧縮されています。 ファイルはハードドライブ上で自動的に圧縮され、読み取られると圧縮解除されます。 ファイルに書き込まれるデータは、ハードドライブに書き込まれる前に圧縮されます。
- A :時間の更新はありませ
atime
。atime
は、ファイルが最後にアクセスされた時刻を記録するiノードの値です。 - C :コピーオンライトなし。 2つのプロセスがファイルへのアクセスを要求する場合、それらに同じファイルへのポインターを与えることができます。 ファイルに書き込もうとした場合にのみ、ファイルの独自のコピーが与えられ、そのプロセスに固有のものになります。
- d :ダンプなし。 Linuxの
dump
コマンドは、ファイルシステム全体のコピーをバックアップメディアに書き込むために使用されます。 この属性により、dump
はファイルを無視します。 バックアップから除外されます。 - D :同期ディレクトリ更新。 ディレクトリに対してこの属性をオンにすると、そのディレクトリへのすべての変更が同期的に(つまり、すぐに)ハードドライブに書き込まれます。 データ操作はバッファリングできます。
- e :エクステントフォーマット。
e
属性は、ファイルシステムがエクステントを使用してハードドライブ上のファイルの場所をマップしていることを示します。chattr
でこれを変更することはできません。 これは、ファイルシステムの操作の機能です。 - i :不変。 名前の変更や削除など、不変のファイルを変更することはできません。 この属性を設定または設定解除できるのはrootユーザーだけです。
- s :安全な削除。 この属性が設定されたファイルが削除されると、ファイルデータを保持していたハードドライブブロックがゼロを含むバイトで上書きされます。 これは
ext4
ファイルシステムでは尊重されないことに注意してください。 - S :同期更新。
S
属性が設定されたファイルへの変更は、同期的にファイルに書き込まれます。 - u :
u
属性が設定されているファイルを削除すると、ファイルのコピーが作成されます。 これは、ファイルが誤って削除された場合のファイル回復に役立ちます。
ファイルの属性の変更
chattr
コマンドを使用すると、ファイルまたはディレクトリの属性を変更できます。 +
(set)および-
(unset)演算子を使用して、 chmod
コマンドおよび権限と同様に、属性を適用または削除できます。
chattr
コマンドには、 =
(設定のみ)演算子もあります。 これにより、ファイルまたはディレクトリの属性が、コマンドで指定された属性のみに設定されます。 つまり、コマンドラインにリストされていないすべての属性が設定されていません。
追加のみの属性の設定
テキストファイルにappend-only属性を設定して、それがファイルで実行できることにどのように影響するかを見てみましょう。
sudo chattr + a text-file.txt
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
最初のハードドライブブロックは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サーバーを保護する方法