ディレクトリが削除されないようにしたいのですが、ディレクトリにこのパスがあると仮定しましょう
~/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
タグを追加できませんでした。)
私がこれを試してみると:
パーミッションエラーがスローされないため、機能していないようです。
通常、ディレクトリの所有者は、そのディレクトリ内のファイルとサブディレクトリを削除して名前を変更できます。 Linuxセキュリティモジュールとファイル属性(有効で利用可能な場合)により、制限が追加される場合があります。
質問の変更を反映するように編集:
通常のユーザーは、自分自身とrootを除くすべてのユーザーを除外するディレクトリを簡単に作成できます。例えば:
mkdir -m 0700 ~/foo
所有者ユーザー(drwx------
)とrootのみがアクセスできるディレクトリを作成します。一方、
mkdir -m 0770 ~/foo
所有者ユーザーとグループのメンバー(drwxrwx---
)、およびルートのみがアクセスできるディレクトリを作成します。
使用されている可能性のあるLinuxセキュリティモジュール(SELinuxなど)によって設定された例外を除いて、rootはシステム上のすべてのファイルにアクセスできます。結局のところ、それが彼らがスーパーユーザーである理由です。
コマンドid -un
を実行すると、現在の実際のユーザー名を確認できます。コマンドid -gn
は実際のグループを報告し、id -Gn
はあなたがメンバーになっている補足グループの名前を報告します。ディレクトリの所有者ユーザーである場合は、コマンドchgrp
を使用して、任意のファイルまたはサブディレクトリのグループを、メンバーである任意のグループに変更できます。
したがって、あなたがユーザーgrand
であり、グループmarina
とtorino
に属しているとします。ディレクトリ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のみが持つ)を持っている必要があります。
最初の質問には、次のようなスティッキービットを使用します。
chmod o+t ~/foo
所有者とルート以外のユーザーは削除できなくなります
chown
コマンドの場合、スーパーユーザーの許可なしに所有者を変更することはできません