web-dev-qa-db-ja.com

ハードリンクの作成-権限?

どのリンクがハードリンクの作成に影響しますか?ファイルの所有権自体は重要ですか?


ユーザーaliceが、ファイルtarget.txtへのハードリンクをディレクトリtarget-dirに作成するとします。

  • target.txttarget-dirの両方でaliceに必要な権限は何ですか?
  • target.txtがユーザーbillによって所有され、target-dirがユーザーchadによって所有されている場合、何か変更されますか?

この状況をシミュレートして、ext4ファイルシステムに次のフォルダー/ファイル構造を作成しようとしました:

#> ls -lh . *
.:
drwxr-xr-x 2 bill bill 60 Oct  1 11:29 source-dir
drwxrwxrwx 2 chad chad 60 Oct  1 11:40 target-dir

source-dir:
-r--r--r-- 1 bill bill 0 Oct  1 11:29 target.txt

target-dir:
-rw-rw-r-- 1 alice alice 0 Oct  1 11:40 dummy

alicetarget.txtへのソフトリンクを作成できますが、ハードリンクを作成できません。

#> ln source-dir/target.txt target-dir/
ln: failed to create hard link ‘target-dir/target.txt’ => ‘source-dir/target.txt’: Operation not permitted

alicetarget.txtを所有していて、権限が変更されていない場合、ハードリンクは成功します。ここで何が欠けていますか?

18
gcscaglia

ハードリンクを作成するには、alicewrite+executeに対するtarget-dir権限をすべての場合に必要とします。 target.txtに必要な権限はさまざまです。

  • fs.protected_hardlinks = 1の場合、aliceにはtarget.txtの所有権または少なくともread+writeの権限が必要です。
  • fs.protected_hardlinks = 0の場合、すべての権限のセットで実行できます。 000でも大丈夫です。

同様の質問に対するこの回答 には、この質問に回答するための欠けている情報がありました。

から http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1 [鉱山を強調]:

ハードリンク:

システムファイルと同じパーティションにユーザーが書き込み可能なディレクトリがあるシステムでは、長年にわたるセキュリティ問題がハードリンクベースのチェック時間と使用時間の競合であり、世界中で書き込み可能なディレクトリで最も一般的に見られます/ tmpのように。この欠陥を悪用する一般的な方法は、特定のハードリンクをたどるときに特権の境界を越えることです(つまり、ルートプロセスは別のユーザーが作成したハードリンクをたどります)。さらに、管理者が実際にシステムを完全にアップグレードしないように、潜在的に脆弱なsetuid/setgidファイルをユーザーが「固定」できるという問題が存在します。

解決策は、ユーザーが既に既存のファイルの所有者である場合、またはユーザーが既存のファイルへの読み取り/書き込みアクセス権を持っている場合にのみ、ハードリンクの作成を許可することです

20
gcscaglia

aliceには少なくともtarget.txtに対する読み取り権限とtarget-dirに対する書き込み+実行権限が必要です。

これで、パーミッション構造は3つに分かれたセットとして機能します。

  1. ユーザー権限:ノードを所有するserに適用されます。
  2. グループ権限:ノードを所有するすべてのユーザーに適用グループに属する
  3. 他者の権限:他のユーザー/グループに適用され、ノードを所有していません。

したがって、所有権の質問は、aliceに必要なアクセス許可のセットが次のいずれであるかにのみ影響します。

  • aliceが所有者ユーザーの場合、必要な権限は「ユーザー」の部分にある必要があります。
  • aliceがそれを所有するグループの一部である場合、必要な権限は「グループ」の部分にある必要があります。
  • aliceがそれを所有しておらず、それを所有するグループの一部でもない場合、必要な権限は「その他」の部分にある必要があります。
1
dave_alcarin