Unix 도메인 소켓에 대한 권한을 이해하려고 하는데 기존 파일을 사용할 때 dir 권한뿐만 아니라 umask도 변경해야 합니다.
루트로 누구나 읽을 수 있는 디렉토리를 만들고 netcat을 사용하여 소켓을 여는 경우:
root$: mkdir /tmp/mydir
root$: chmod 777 /tmp/mydir
root$: nc -l -U /tmp/mydir/sock
그런 다음 루트가 아닌 사용자가 위 소켓에 연결을 시도하면 디렉토리가 누구나 읽을 수 있음에도 불구하고 실패합니다.
https://man7.org/linux/man-pages/man7/unix.7.html
Linux 구현에서 경로 이름 소켓은 자신이 있는 디렉터리의 권한을 존중합니다. 프로세스에 소켓이 생성된 디렉터리에 대한 쓰기 및 검색(실행) 권한이 없으면 새 소켓 생성이 실패합니다.
root$: runuser -u user1 -- nc -U /tmp/mydir/sock
nc: unix connect failed: Permission denied
이제 umask 0
동일한 소켓을 다시 실행하고 다시 시작하면할 수 있는루트가 아닌 사용자로부터 연결합니다.
root$: umask 0
root$: nc -l -U /tmp/mydir/sock
root$: runuser -u user1 -- nc -U /tmp/mydir/sock
ping
또한 /tmp/mydir
권한을 수정하면 chmod 600
루트가 아닌 사용자가 소켓에 다시 액세스하는 것을 방지할 수 있습니다.
root$: chmod 600 /tmp/mydir
root$: runuser -u user1 -- nc -U /tmp/mydir/sock
nc: unix connect failed: Permission denied
분명히 매뉴얼에 따르면 디렉토리 권한은 예상대로 작동하지만 상위 디렉토리에 올바른 권한이 있는 경우 umask 0이 필요한 이유는 무엇입니까? netcat이 여전히 다른 파일을 생성하고 있나요?
답변1
너도 이걸 놓쳤어유닉스(7)당신이 인용한 맨페이지:
리눅스에서는,연결하다스트림 소켓 객체쓰기 권한이 필요합니다 해당 소켓에서 데이터그램을 데이터그램 소켓으로 보내려면 해당 소켓에 대한 쓰기 권한도 필요합니다.
물론 다른 파일과 마찬가지로 해당 경로의 모든 주요 디렉터리에 대한 검색(실행) 권한도 필요합니다.
인용하신 부분은 다음과 같습니다.만들다소켓이 있는 곳오직ing이 맞을 때 bind(2)
이런 일이 발생합니다 . 그게 바로 그 것입니다 nc -l -U /path/to/sock
. 다시 말하지만, 다른 파일을 생성하는 것과 마찬가지로 umask는 생성된 소켓의 권한에 영향을 미칩니다(umask == 022 => 다른 사용자에게는 쓰기 권한이 없습니다 => 소켓에 연결할 수 없습니다).
$ umask
0022
$ nc -Ul sock
^C
$ ls -l sock
srwxr-xr-x 1 xxx xxx 0 Oct 16 18:35 sock
^ ^ ^
Unix 도메인 소켓에 바인딩하려면 항상 처음부터 새로 만들어야 합니다. 기존 파일에 바인딩할 수 없습니다. 이는 display 로 인해 실패합니다 EADDRINUSE
. 따라서 대부분의 프로그램( 포함 nc
)은 동일한 이름을 가진 파일에 바인딩하기 전에 파일을 강제로 삭제합니다.
$ echo text > file
$ strace nc -l -U file
...
socket(AF_UNIX, SOCK_STREAM, 0) = 3
unlink("file") = 0
bind(3, {sa_family=AF_UNIX, sun_path="file"}, 110) = 0
listen(3, 5) = 0
accept4(3,
참고: 두 조각 모두 활성 소켓 개체를 나타내는 inode가 아닌 디스크의 "소켓" 특수 파일/inode에 대해 설명합니다(등에서 볼 수 있음 /proc/<pid>/fd
) /proc/net/unix
.
$ nc -lU sock &
[1] 4424
$ ls -li sock
20983212 srwxr-xr-x 1 xxx xxx 0 Oct 17 18:01 sock
^^^^^^^^
$ ls -li /proc/4424/fd
total 0
43825 lrwx------ 1 xxx xxx 64 Oct 17 18:02 0 -> /dev/pts/4
43826 lrwx------ 1 xxx xxx 64 Oct 17 18:02 1 -> /dev/pts/4
43827 lrwx------ 1 xxx xxx 64 Oct 17 18:02 2 -> /dev/pts/4
43828 lrwx------ 1 xxx xxx 64 Oct 17 18:02 3 -> socket:[46378]
^^^^^
$ grep 46378 /proc/net/unix
00000000ee8c0faa: 00000002 00000000 00010000 0001 01 46378 sock