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

루트 사용자(다음 보안 기능이 영향을 미치도록 특별히 설계됨)는 sysctl fs.protected_symlinks에 설명된 대로 다른 사용자와 마찬가지로 영향을 받습니다 proc(5).

/proc/sys/fs/protected_symlinks(리눅스 3.6부터 시작)

이 파일의 값이 0이면 후속 기호 링크에 제한이 없습니다(즉, 이는 Linux 3.6 이전의 역사적 동작입니다). 이 파일의 값이 1이면 다음과 같은 경우에만 심볼릭 링크를 따릅니다.

• 링크 뒤에 있는 프로세스의 파일 시스템 UID는 심볼릭 링크의 소유자(UID)와 일치합니다(자격 증명(7)에 언급된 대로 프로세스의 파일 시스템 UID는 일반적으로 유효 UID와 동일합니다).

• 링크가 전역적으로 쓰기 가능한 고정 디렉토리에 있지 않습니다.

• 심볼릭 링크와 해당 상위 디렉터리의 소유자(UID)가 동일합니다.

위의 제한으로 인해 기호 링크를 따를 수 없는 시스템 호출은 errno에 EACCES 오류를 반환합니다.

여기:

  • 루트 != 우분투 : 실패
  • /tmp고정된 누구나 쓸 수 있는 디렉터리입니다: 실패
  • /tmpdef(ubuntu)의 소유자가 def의 소유자(root)와 다릅니다: failed

그러므로 EACCESS= 허가가 거부되었습니다

여기에는 두 가지 다른 가능한 시나리오가 있습니다.

  • 첫 번째 조건이 실패하지 않도록 방지

    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
    
  • 두 번째 조건이 실패하지 않도록 방지

    고정되지 않은 디렉터리에서 동일한 실험(전역적으로 쓰기 가능하더라도):

    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)"

관련 정보