배경 HTML이 심볼릭 링크를 통해 파일에 액세스할 수 없는 방법을 알아내려고 합니다. Apache가 simlink를 통해 지정된 파일 수를 계산/액세스하는 방법을 이해하기 위해 다음과 같은 간단한 실험을 수행했지만 왜 작동하지 않는지 이해할 수 없습니다.
사용자 jzhu로서 저는 vi에서 계산/읽을 수 있기를 원하는 anaconda-ks.cfg 파일을 포함하는 루트 디렉토리의 other라는 디렉토리를 가리키는 홈 디렉토리에 심볼릭 링크를 가지고 있습니다. 그러나 stat 명령을 실행하면 다음과 같은 결과가 나타납니다.
[jzhu@localhost ~]$ stat /home/jzhu/other/anaconda-ks.cfg
stat: cannot stat `/home/jzhu/other/anaconda-ks.cfg': Permission denied
다음은 /home/jzhu/other 심볼릭 링크에 대한 stat 명령입니다. 설정 방법에 대해 더 자세히 이해할 수 있습니다.
[jzhu@localhost ~]$ stat /home/jzhu/other
File: `/home/jzhu/other' -> `/root/other/'
Size: 12 Blocks: 0 IO Block: 4096 symbolic link
Device: fd00h/64768d Inode: 43313 Links: 1
Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:52:20.602126433 +0000
Modify: 2013-11-03 08:52:20.187918394 +0000
Change: 2013-11-03 08:52:20.187918394 +0000
lstat의 매뉴얼 페이지를 찾아보면 다음 인용문이 있습니다.
이 함수는 파일에 대한 정보를 반환합니다. 파일 자체에는 권한이 필요하지 않으나, stat(), lstat()의 경우 파일 경로에 있는 모든 디렉터리에 대해 실행(검색) 권한이 필요합니다.
내가 이해한 바로는 stat 명령에는 /root 자체에 대한 실행 권한이 필요하지 않습니다. 왜냐하면 lstat와 달리 이 명령이 실행되는 루트 디렉터리는 실행 중인 현재 디렉터리이기 때문입니다. 이는 "/"의 전체 경로를 사용하지 않음을 의미합니다. root/other/ ", 그러나 "/home/jzhu/other/" 경로가 사용됩니다. strace를 통해 이를 확인했고 다음과 같은 관련 출력이 제공되었습니다.
lstat("/home/jzhu/other/anaconda-ks.cfg", 0x7fff14d5a7c0) = -1 EACCES (Permission denied)
따라서 이 파일의 개수를 계산하려면 /home /home/jzhu 및 /home/jzhu/other에 대한 실행 권한만 있으면 됩니다.
jzhu로서 /home 및 /home/jzhu에 대한 통계를 실행하여 실행 권한이 있는지 확인했습니다. 다음과 같이
[jzhu@localhost ~]$ stat /home/
File: `/home/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 2278 Links: 4
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:52:13.797724760 +0000
Modify: 2013-11-04 00:03:45.377150769 +0000
Change: 2013-11-04 00:03:45.377150769 +0000
[jzhu@localhost ~]$ stat /home/jzhu
File: `/home/jzhu'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 43317 Links: 3
Access: (0700/drwx------) Uid: ( 500/ jzhu) Gid: ( 500/ jzhu)
Access: 2013-11-04 00:00:30.809916040 +0000
Modify: 2013-11-03 23:49:54.781060426 +0000
Change: 2013-11-03 23:49:54.781060426 +0000
하지만 /home/jzhu/other를 jzhu로 계산할 수는 없습니다.
[jzhu@localhost ~]$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied
또한 다시 변경하고 디렉토리에서 stat를 실행했습니다. 왜 디렉토리를 jzhu로 설정할 수 없는지 혼란스러워요. 아래와 같이 other에는 해당 디렉터리에 대한 읽기 및 실행 권한이 있습니다.
[root@localhost jzhu]# stat /home/jzhu/other/
File: `/home/jzhu/other/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 32674 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:50:36.935318703 +0000
Modify: 2013-11-03 08:50:35.772737444 +0000
Change: 2013-11-03 08:50:35.772737444 +0000
[root@localhost jzhu]# stat /home/jzhu/other/anaconda-ks.cfg
File: `/home/jzhu/other/anaconda-ks.cfg'
Size: 985 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 43297 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2013-11-03 08:50:35.772737444 +0000
Modify: 2013-11-03 08:50:35.781741701 +0000
Change: 2013-11-03 08:54:50.814196796 +0000
그래서 제가 묻고 싶은 질문은 다음 두 가지입니다.
- 해당 디렉토리의 다른 항목에 대한 읽기 및 실행 권한이 있음에도 불구하고 /home/jzhu/other/를 stat할 수 없는 이유는 무엇입니까?
- anaconda-ks.cfg 파일을 계산할 수 없는 이유는 무엇입니까?
답변1
귀하의 답변은 귀하가 제공한 첫 번째 출력에 있습니다.
$ stat /home/jzhu/other
File: `/home/jzhu/other' -> `/root/other/'
이는 이것이 /home/jzhu/other
기호 링크임을 나타냅니다 /root/other
.
/home/jzhu/other/
따라서 기본적으로 신체 내부의 모든 항목 에 액세스하려면 액세스가 필요합니다 /root/other
. 즉, 사용자는 /root
및 에 대한 실행 권한이 있어야 합니다 /root/other
.
다음으로 이 명령을 진행해 보겠습니다.
$ stat /home/jzhu/other/
stat: cannot stat `/home/jzhu/other/': Permission denied
위의 작업이 성공하는 동안 이것이 실패하는 이유는 /
경로를 사용하는 명령에서 경로의 마지막 구성 요소(예: other
)가 심볼릭 링크이고 경로가 후행 으로 끝나는 경우 /
해당 경로에 대한 모든 작업입니다. 시스템 호출은 기호 링크를 역참조하고 기호 링크 자체가 아닌 기호 링크가 가리키는 대상을 조작하려고 시도합니다.
해결책:
이에 대한 두 가지 가능한 해결책이 있습니다.
1. 권한 변경 /root/other
:
앞에서 언급한 대로 및 에 실행 /root
기능을 추가합니다 /root/other
. 기본 또는 확장 파일 시스템 속성을 사용하여 이 작업을 수행할 수 있습니다.
사용자를 그룹( )
jzhu
에 추가 하고 그룹 실행을 경로( )에 추가 할 수 있습니다 . 이는 해당 그룹으로 제한된 모든 항목에 액세스할 수 있도록 허용하므로 이상적인 솔루션은 아닙니다 .root
usermod -a -G root jzhu
chmod g+x /root; chmod g+x /root/other
root
파일 시스템 ACL을 사용합니다.
setfacl -mu:jzhu:x /루트 setfacl -R -mu:jzhu:x /root/others setfacl -d -R -mu:jzhu:x /루트/기타
/root/other
이를 통해 특정 사용자는 해당 항목과 그 안에 있는 모든 항목에 대한 실행 액세스 권한을 얻을 수 있습니다 .
이러한 리소스는 공유되고 루트의 홈 디렉터리에 있어서는 안 되기 때문에 여전히 이상적이지 않습니다.
두 솔루션 모두 실행( x
) 비트만 부여한다는 점에 유의하세요. 사용자가 해당 디렉터리 내의 항목에 액세스하려면 디렉터리에 실행 비트가 필요합니다. 그러나 r
( ) 디렉터리를 나열하려면 ( ) 비트도 읽어야 합니다 ls
. 이는 읽기 비트가 없으면 /root/other
파일이 어디에 있는지 정확히 알아야 함을 의미합니다 . 읽기를 허용하려면 x
마지막 2개의 명령을 (예 : ) setfacl
로 변경하면 됩니다 .rx
-m u:jzhu:rx
2. 자원을 외부로 이전합니다 /root/other
.
이것이 선호되는 솔루션입니다. 에서 심볼릭 링크를 삭제 /home/jzhu/other
하고 해당 위치에 디렉터리를 만들거나 시스템의 다른 위치에 있는 공유 위치에 넣을 수 있습니다(무엇인지는 모르지만 좋은 위치를 추천할 수는 없습니다).
이것이 선호되는 솔루션인 이유는 이러한 리소스가 사용자 간에 공유되는 경우 특정 사용자에게 속하지 않으며 해당 사용자의 홈 디렉터리에 있어서는 안 되기 때문입니다.