CentOS 6とCentOS 7で異なるハードリンクアクセス許可の動作


8

CentOS 7でハードリンクを作成しようとすると、アクセス許可エラーが発生します。CentOS 6で設定したのと同じ権限があれば、エラーは発生しません。問題はグループの権限に集中しています。どのOSのバージョンが正しいのか、どちらが間違っているのかわかりません。

何が起こっているのかを説明しましょう。現在の作業ディレクトリには、ソースと宛先の2つのディレクトリがあります。最初、宛先は空です。ソースにはテキストファイルが含まれています。

[root@tc-dlx-nba cwd]# ls -l
total 0
drwxrwxrwx. 2 root root  6 Jun 12 14:33 destination
drwxrwxrwx. 2 root root 21 Jun 12 14:33 source
[root@tc-dlx-nba cwd]# ls -l destination/
total 0
[root@tc-dlx-nba cwd]# ls -l source/
total 4
-rw-r--r--. 1 root root 8 Jun 12 14:20 test.txt
[root@tc-dlx-nba cwd]# 

ご覧のとおり、権限に関しては、2つのディレクトリは777であり、所有者とグループの両方がrootに設定されています。テキストファイルの所有者とグループも、両方ともルートに設定されています。ただし、テキストファイルの権限は、所有者には読み取り/書き込みですが、グループには読み取り専用です。

rootとしてログインしているときは、(ソースディレクトリの)テキストファイルを指すハードリンクを宛先ディレクトリに作成しても問題ありません。

[root@tc-dlx-nba cwd]# ln source/test.txt destination/
[root@tc-dlx-nba cwd]# ls destination/
test.txt

ただし、別のユーザー(この場合はadmin)としてログインすると、リンクを作成できません。「操作は許可されていません」と表示されます。

[root@tc-dlx-nba cwd]# rm -f destination/test.txt 
[root@tc-dlx-nba cwd]# su admin
bash-4.2$ pwd
/root/cwd
bash-4.2$ ln source/test.txt destination/
ln: failed to create hard link ‘destination/test.txt’ => ‘source/test.txt’: Operation not permitted

実際に起こったことは理にかなっていますが、CentOS 6では上記が許可されているため、何かを誤解していないかどうかを確認したいと思いました。私には、CentOS 7で修正されたCentOS 6のバグのようです。

誰が何を与えるか知っていますか?上記の動作が正しい動作であると私は正しく信じていますか?正しいのはCentOS 6ですか?または、どちらも正しく、おそらく私が見逃している微妙なグループ権限の問題がありますか?ありがとう。


編集:私はちょうど今持っているDebian v7 VMで同じテストを試しました。DebianはCentOS 7に同意します:「操作は許可されていません。」


編集#2: Mac OS X(Yosemite)で同じことを試しました。これはCentOS 6と同じように機能しました。つまり、リンクを作成することができました。(注:OS Xでは、ルートグループは「ホイール」と呼ばれます。私が知る限り、それが唯一の違いです。)


1
ユーザー管理者にはリンクに影響を与える権限がないようです。リンクの所有権は、リンクされているファイル/フォルダーを誰が所有するかにかかっています。管理者はルートと同じではありません。それは私の2セントです。管理者として「sudo ln source / test.txt destination /」を使用してみてください-sフラグの使用を開始することもできます。-sフラグなしでリンクを作成すると、ハードリンクが作成されます。リンクされたファイル/フォルダーが破壊されると元のファイルも破壊されるため、これは災害のレシピです。-s「ソフトリンク」を使用すると、リンクされたファイルが破棄されても元のファイルには影響しません。
Baazigar

@Baazigar-ありがとう。私はそれを調べました。これが私の問題です。CentOS 6の動作(リンクを作成できる)に依存しているPerlアプリケーションを継承しました。私はアプリケーションをCentOS 7に移行しています。これは、全体的なスキームのほんの小さな問題ですが、PerlのFile :: Copy関数ではなく、Perlのリンク関数が使用されている理由がわかりません。ファイルをコピーするだけで十分だと思います。しかし、私は物事を変更する前に十分な注意を払わなければなりません-そして、もちろん(もちろん)私が受け継いだ元の決定を説明する文書やコメントはありません。
マリオ

ドキュメントや現在の正当性がない場合、ソリューションはそれが機能すると仮定して同様に有効であり、機能してドキュメントがある場合はより有効です。centosのリンクの処理に変更があったとは思いません。古い箱ではまだ出会っていない可能性が高いと思います。おそらく、/ etc / groupまたは他のどこかで、明らかな異常を説明しています。
Baazigar

@Baazigar-Mac OS Xでも同じことを試しましたが、「root」グループの代わりに「wheel」グループ(rootのグループ)を使用する必要がありました。ご存知かもしれませんが、OS XはBSDバリアントです。これはCentOS 6と同じように機能しました。つまり、リンクを作成することができました。現時点では、何が正しいのかわかりません。(主に)POSIX準拠のシステム全体に1つの統一された手法があるべきではないでしょうか。
2015年

回答:


5

私はいくつかの新しいCentOS 6と7のvmをスピンアップし、示したとおりの動作を再現することができました。少し掘り下げた結果、これは実際には、セキュリティ上の理由からハードリンクとソフトリンクに関するデフォルトの動作に関するカーネルの変更であることがわかりました。次のページは私に正しい方向を示しました:

http://kernel.opensuse.org/cgit/kernel/commit/?id=561ec64ae67ef25cac8d72bb9c4bfc955edfd415

http://kernel.opensuse.org/cgit/kernel/commit/?id=800179c9b8a1

ファイルを誰でも書き込み可能にすると、管理ユーザーがハードリンクを作成できるようになります。

CentOS 6システム全体の動作に戻すために、新しいカーネルパラメータが追加されました。/etc/sysctl.confに以下を設定します。

fs.protected_hardlinks = 0
fs.protected_symlinks = 0

次に実行します

sysctl -p

なぜプログラムがファイルをコピーする代わりにリンクを使用することを選ぶのかについて、元のブロックを指すエントリを作成できるだけのときに、使用する必要があるファイルの正確なコピーを作成する理由 これによりディスク領域が節約され、CPUとI / Oの観点から操作のコストが削減されます。新しいハードリンクは同じファイルですが、メタデータ/ iノードが異なります。ハードリンクを作成した後で元のファイルを削除しても、リンクには影響しません。すべてのリンクが削除されると、ファイルは「削除」されます。


ありがとうございました。今日は少し後でこれらのリンクを見ていきます。(当面は賛成投票してください!)ハードリンクとコピーの違いを理解しました。しかし、私が継承したプログラムは、ソースファイルから「ダウンロード」領域へのリンクを作成しています(Webアプリケーションのフロントエンドを介して)。ディスク領域は単なるテキストファイルなので、ディスク領域は問題ではないと思います。また、「ダウンロード」の一般的な意味だけでは、リンクがどのように適合するかわかりません。意味的には、コピーの方が意味をなさそうです。(リンクに依存するプログラムの他の動作が心配です。確認する必要があります。)
Mario

1
「ハードリンクとコピーの違いを理解しています。」Righton、私は一般の聴衆を念頭に置いて私の答えを書いていました。
Sean

私は一般の読者を念頭に置いて書くためにすべてです:-)月曜日に、アプリケーションに最適な修正を調査します。ありがたいことに、私には余裕があります。(私の唯一の制限は、「あなたはそれを壊し、あなたはそれを買った」です!)私はあなたの答えを受け入れられた答えとしてマークしています。再度、感謝します!
マリオ

PS私は、CentOSの人々がデフォルトで保護されたリンクを選択していると思います。(あなたが提供したリンクから私が得ることは、これは論争の問題であることです。)
マリオ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.