web-dev-qa-db-ja.com

ルート以外でディレクトリを変更または削除できないようにする

ディレクトリが削除されないようにしたいのですが、ディレクトリにこのパスがあると仮定しましょう

~/foo

rootユーザーのみが削除できるようにする方法はありますかSudoを使用せず、rootユーザーでなくても

たとえば、これは機能するはずです。

Sudo chown -R root:root ~/foo

しかし、Sudoを使用しない場合、上記のコマンドは失敗します

chown -R root:root ~/foo # 不合格

chown: '/ home/olegzandr/foo/bar'の所有権の変更:操作は許可されていません

sudoを使用せずにrootユーザー以外がファイルを削除できないようにすることは可能ですか?

chattrコマンドについても読みましたが、タグが利用できなかったため、質問にchattrタグを追加できませんでした。)

私がこれを試してみると:

enter image description here

パーミッションエラーがスローされないため、機能していないようです。

1
Alexander Mills

通常、ディレクトリの所有者は、そのディレクトリ内のファイルとサブディレクトリを削除して名前を変更できます。 Linuxセキュリティモジュールとファイル属性(有効で利用可能な場合)により、制限が追加される場合があります。


質問の変更を反映するように編集:

通常のユーザーは、自分自身とrootを除くすべてのユーザーを除外するディレクトリを簡単に作成できます。例えば:

mkdir -m 0700 ~/foo

所有者ユーザー(drwx------)とrootのみがアクセスできるディレクトリを作成します。一方、

mkdir -m 0770 ~/foo

所有者ユーザーとグループのメンバー(drwxrwx---)、およびルートのみがアクセスできるディレクトリを作成します。

使用されている可能性のあるLinuxセキュリティモジュール(SELinuxなど)によって設定された例外を除いて、rootはシステム上のすべてのファイルにアクセスできます。結局のところ、それが彼らがスーパーユーザーである理由です。

コマンドid -unを実行すると、現在の実際のユーザー名を確認できます。コマンドid -gnは実際のグループを報告し、id -Gnはあなたがメンバーになっている補足グループの名前を報告します。ディレクトリの所有者ユーザーである場合は、コマンドchgrpを使用して、任意のファイルまたはサブディレクトリのグループを、メンバーである任意のグループに変更できます。

したがって、あなたがユーザーgrandであり、グループmarinatorinoに属しているとします。ディレクトリgames-marinaおよびgames-torinoを作成する場合は、自分とこれら2つのグループに属するすべてのユーザーのみがアクセスできます(ただし、他のユーザーは読み取りのみが可能で、変更や削除はできません)。

mkdir                 games-marina
chgrp  marina         games-marina
chmod  u=rwx,g=rx,o=  games-marina

mkdir                 games-torino
chgrp  torino         games-torino
chmod  u=rwx,g=rx,o=  games-torino

多くのシステムでは、ユーザーはユーザー名と一致するグループも作成されます。これは多くの点で便利です。たとえば、これは通常、所有するファイルのデフォルトグループであるため、ファイルの内容を制御するのはユーザーだけであることを明示します。

ユーザーは通常、他のユーザーが制御できるようにファイルまたはディレクトリを放棄することはできません。この種の所有権の変更には、実際にはスーパーユーザー権限が必要です。 (たとえば、chownを使用してファイルまたはディレクトリの所有者を変更するには、rootであるか、LinuxでCAP_CHOWN機能を持っている必要があります。)

そのような放棄を起こさせることが悪い考えである理由はいくつかあります。技術的には実装できますが、個人的にはanyの良いユースケースはまだ見ていません。 OPが何かをしようとしていることはかなり確信しています...ここで、役に立たないと言いましょう。

(特定のグループに属するメンバー間で特定のディレクトリツリーのファイル所有権を許可するスクリプトを作成しました-はい、Web管理者-ですが、Sudoといくつかのbashを使用して安全に設定するのは非常に簡単です。/dashヘルパースクリプト。)


ディレクトリ/home/olegzandr/fooの所有者が削除できないディレクトリ/home/olegzandrを作成したい場合は、fooをマウントポイントにし、バインドマウント(ルート)する必要があります。 -owned)その上にあるディレクトリ。たとえば、ディレクトリ/root/foo(明らかにrootユーザーが所有)を作成し、それを/home/olegzandr/fooにバインドマウントします。

Sudo mount --bind /root/foo /home/olegzandr/foo

バインドマウントでは、/home/olegzandr/fooディレクトリがまだ存在している必要があり(マウントポイントとして使用されるため)、/home/olegzandrの所有者はそのディレクトリを操作できますが、バインドマウント中に削除することはできません。存在します。 /home/olegzandr/fooはrootが所有する新しいマウントポイントであるため、/home/olegzandrの所有者はそれを操作できません。

バインドマウントが有効になっていないときにマウントポイントが/home/olegzandrの所有者によって削除されないように保護するには、マウントポイントを/home/olegzandr/foo不変に設定する必要があります。 (バインドマウントをまだマウントせずに)初期マウントポイントを作成するには、次を使用します

Sudo mkdir      /home/olegzandr/foo
Sudo chmod 0700 /home/olegzandr/foo
Sudo chattr +i  /home/olegzandr/foo

これは、バインドマウントが有効になっていない限り、/home/olegzandr/fooに誤ってデータをコピーしたりサブディレクトリを作成したりできないことも意味することに注意してください。 (バインドマウントが有効な場合、/root/fooの所有者、グループ、およびアクセス許可は/home/olegzandr/fooにも適用されます。)


Ext4および他のほとんどのファイルシステムでは、通常、中間の不変ディレクトリを使用してディレクトリ/home/olegzandr/foo/barを作成でき、/home/olegzandr/fooは不変です。このように、/home/olegzandrの所有者は/home/olegzandr/fooを変更または削除したり、/home/olegzandr/foo/barを削除したりすることはできません。後者はさらに、ルート所有のディレクトリ内のサブディレクトリであるため、/home/olegzandrの所有者の支配下にはありません。これを試すには:

Sudo mkdir /home/olegzandr/foo
Sudo mkdir /home/olegzandr/foo/bar
Sudo chmod 0555 /home/olegzandr/foo
Sudo chattr +i /home/olegzandr/foo

その後、必要に応じて/home/olegzandr/foo/barの所有者、グループ、およびモードを設定できます。 /home/olegzandr/fooが不変である限り、(ルートでも)削除できません。

不変のファイル属性を変更するには、rootであるか、CAP_LINUX_IMMUTABLE機能(通常はrootのみが持つ)を持っている必要があります。

3
Nominal Animal

最初の質問には、次のようなスティッキービットを使用します。

chmod o+t ~/foo

所有者とルート以外のユーザーは削除できなくなります

chownコマンドの場合、スーパーユーザーの許可なしに所有者を変更することはできません

2