web-dev-qa-db-ja.com

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

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では、ルートグループは「ホイール」と呼ばれます。私が知る限り、それが唯一の違いです。)

8
Mario

私はいくつかの新しい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の観点から操作のコストが削減されます。新しいハードリンクは同じファイルですが、メタデータ/ inodeが異なります。ハードリンクを作成した後で元のファイルを削除しても、リンクには影響しません。すべてのリンクが削除されると、ファイルは「削除」されます。

5
Sean