심볼릭 링크를 읽기 전용으로 만드는 방법(`chattr +i /location/symlink`)?

심볼릭 링크를 읽기 전용으로 만드는 방법(`chattr +i /location/symlink`)?

삭제할 수 없도록 심볼릭 링크를 어떻게 잠글 수 있습니까?

이는 일반 파일/디렉토리를 사용하여 가능 chattr +i /file/location하지만 심볼릭 링크를 사용하여 이를 달성하려면 chattr: Operation not supported while reading flags on my-file.

비슷한 질문이 있는데,"/etc/resolv.conf"에 대해 "chattr +i"를 어떻게 설정합니까?, 그러나 여기에 적용할 수 있는 솔루션은 없습니다.

답변1

이는 해결책을 제공하지는 않지만 chattr심볼릭 링크를 불변으로 만들 수 없는 이유를 설명합니다.

Linux에서 불변 속성은 사용되는 플래그 집합의 일부입니다 FS_IOC_SETFLAGS ioctl. 역사적으로 이것은 ext2에서 처음 구현되었으며 chattr여전히 입니다 e2fsprogs.검색 플래그chattr, 처리 중인 파일이 일반 파일인지 디렉터리인지 설정하기 전에 명시적으로 확인합니다.

    if (!lstat(name, &buf) &&
        !S_ISREG(buf.st_mode) && !S_ISDIR(buf.st_mode)) {
        goto notsupp;
    }

이러한 검사를 제거하거나 심볼릭 링크를 허용하도록 변경하는 것이 심볼릭 링크를 변경할 수 없도록 허용하는 좋은 첫 번째 단계라고 생각할 수도 있지만 chattr그 직후에 다음 장애물이 발생합니다.

    fd = open (name, OPEN_FLAGS);
    if (fd == -1)
        return -1;
    r = ioctl (fd, EXT2_IOC_GETFLAGS, &f);

ioctl파일 설명자에서 작동합니다. 즉, 플래그를 설정하기 전에 대상을 열어야 합니다. 에 대한 기호 링크를 열 수 없습니다 ioctl.openO_NOFOLLOW및 심볼릭 링크를 지원 O_NOPATH하면 전자는 자체적으로 실패하고 ELOOP후자는 와 함께 사용할 수 없는 파일 설명자를 반환합니다 ioctl.

답변2

심볼릭 링크는 chattr을 지원하지 않지만 바인드 마운트를 사용하여 제거할 수 없는 링크를 만들 수 있습니다.

디렉토리의 경우:

$ mkdir a b
$ echo a>a/ok
$ sudo mount --bind a b
$ cat b/ok
a
$ rmdir b
rmdir: failed to remove 'b': Device or resource busy

파일의 경우:

$ mkdir c d
$ echo c>c/ok
$ echo d>d/ok
$ sudo mount --bind c/ok d/ok
$ cat d/ok
c
$ rm d/ok
rm: cannot remove 'd/ok': Device or resource busy

답변3

댓글을 달 수 없기 때문에:

chattr은 chmod, fchmod() 또는 fchmodat() 시스템 호출 중 하나를 사용하거나 ioctl(심볼릭 링크에 대해 아무 것도 언급하지 않음)을 사용할 가능성이 높습니다. 하지만 지금은 아무것도 찾을 수 없습니다. 여기에서 Ubuntu 매뉴얼 페이지를 사용하세요. 이 중 일부가 변경되었을 수 있습니다.

chmod 매뉴얼 페이지에서:

chmod는 기호 링크의 권한을 변경하지 않습니다. chmod 시스템 호출은 해당 권한을 변경할 수 없습니다. 심볼릭 링크의 권한은 절대 사용되지 않으므로 이는 문제가 되지 않습니다. 그러나 명령줄에 나열된 모든 기호 링크에 대해 chmod는 포인팅 파일에 대한 권한을 변경합니다. 대신 chmod는 재귀 디렉터리 탐색 중에 발견된 기호 링크를 무시합니다.

fchmod, chmod 및 fchmodat 시스템 호출에 대한 매뉴얼 페이지를 보면 어느 것도 이를 구현하지 않습니다. Chmod-ing은 경로 참조만 해제하며 fchmodat() 시스템 호출은 아직 AT_SYMLINK_NOFOLLOW를 구현하지 않았습니다.

AT_SYMLINK_NOFOLLOW 경로명이 심볼릭 링크인 경우 이를 역참조하지 말고 대신 링크 자체에서 작업하십시오. 이 플래그는 현재 구현되지 않습니다.

관련 정보