一方、
touch /tmp/abc
ln -vs abc /tmp/def
$ ls -l /tmp/???
-rw-rw-r-- 1 ubuntu ubuntu 0 Apr 10 22:10 /tmp/abc
lrwxrwxrwx 1 ubuntu ubuntu 3 Apr 10 22:10 /tmp/def -> abc
私が得る理由は何ですか?
$ sudo chown syslog: /tmp/def
chown: cannot dereference '/tmp/def': Permission denied
$ sudo chown --dereference syslog: /tmp/def
chown: cannot dereference '/tmp/def': Permission denied
引用:
村(1):
--dereference
シンボリックリンク自体ではなく、各シンボリックリンクの参照(デフォルト)に影響します。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal
答え1
この答えはこれが適切であると仮定しています。
# sysctl fs.protected_symlinks
fs.protected_symlinks = 1
rootユーザー(次のセキュリティ機能が影響するように特別に設計されています)は、sysctlfs.protected_symlinks
で説明されているように、他のユーザーと同様に影響を受けますproc(5)
。
/proc/sys/fs/protected_symlinks
(Linux 3.6から始まる)このファイルの値が0の場合、後続のシンボリックリンクに制限はありません(つまり、これはLinux 3.6より前の歴史的な動作です)。このファイルの値が1の場合、次の場合にのみシンボリックリンクに従います。
•リンクの背後にあるプロセスのファイルシステムUIDはシンボリックリンクの所有者(UID)と一致します(資格情報(7)で説明されているように、プロセスのファイルシステムUIDは通常有効UIDと同じです)。
• リンクがグローバルに書き込み可能な固定ディレクトリにない。
•シンボリックリンクとその親ディレクトリの所有者(UID)は同じです。
上記の制限のためにシンボリックリンクをたどることができないシステムコールは、errnoにEACCESエラーを返します。
ここで:
- ルート!= Ubuntu:失敗
/tmp
固定された誰でも書くことができるディレクトリです:失敗/tmp
def(ubuntu)の所有者はdefの所有者(root)とは異なります:failed
したがって、EACCESS
=許可が拒否されました
これには2つの異なる可能なシナリオがあります。
最初の条件が失敗しないように防止
sudo chown --no-dereference root: /tmp/def # this must be root, not syslog
ルートはシンボリックリンクを所有しているので、最初の条件は失敗せずに実行が許可されます。
sudo chown syslog: /tmp/def
正常に影響を与えるために
/tmp/abc
。そのような意図がある場合は、
def
以前の所有者に戻すか、次のことを行うこともできますsyslog
。sudo chown --no-dereference ubuntu: /tmp/def
または
sudo chown --no-dereference syslog: /tmp/def
2番目の条件が失敗しないようにする
固定されていないディレクトリで同じ実験(グローバルに書き込み可能であっても):
sudo mkdir -m 777 /tmp/notsticky sudo mv /tmp/abc /tmp/def /tmp/notsticky/.
これで実行が許可されました。
sudo chown syslog: /tmp/notsticky/def
次のような意図がある場合は、後ろに移動できます。
sudo mv /tmp/notsticky/abc /tmp/notsticky/def /tmp/ sudo rmdir /tmp/notsticky
さらに、もしコメントの提案ubuntu
、元のユーザーはすでにシンボリックリンクの所有者であるため、クエリを実行して最初の条件が失敗するのを防ぐことができます。たとえば、次のようにします。
realpath -z /tmp/def | xargs -0 sudo chown syslog:
\n
または、OPのように、ターゲットファイル名の末尾に改行(LF /)(シェルソルバーによって削除された)などの特殊文字がない場合は、次のようにします。
sudo chown syslog: "$(realpath /tmp/def)"