반면,
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
고정된 누구나 쓸 수 있는 디렉터리입니다: 실패/tmp
def(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)"