chownは逆参照できず、権限が拒否されました。

chownは逆参照できず、権限が拒否されました。

一方、

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固定された誰でも書くことができるディレクトリです:失敗
  • /tmpdef(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)"

関連情報