루트가 아닌 사용자를 위한 Unix 도메인 소켓

루트가 아닌 사용자를 위한 Unix 도메인 소켓

IPC용 Unix 도메인 소켓을 사용하는 응용 프로그램을 개발 중입니다. 내가 아는 한 일반적인 방법은 소켓 파일을 그 안에 넣는 것입니다 /var/run. 저는 Ubuntu 18.04를 사용하고 있는데 이 폴더는 불행히도 var/run다음 에서만 액세스할 수 있습니다 ./runroot

  ls -Al /
  drwxr-xr-x  27 root root        800 Apr 12 17:39 run

따라서 루트만 폴더에 대한 쓰기 액세스 권한을 가지므로 일반 사용자는 Unix 도메인 소켓을 사용할 수 없습니다.

우선 왜 이해가 안가나요? 루트가 아닌 사용자를 위해 Unix 도메인 소켓을 사용하는 방법은 무엇입니까? 확실히 홈 폴더를 사용할 수 있지만 몇 가지 정확하고 일반적인 방법을 사용하는 것을 선호합니다.

답변1

사용자가 특별한 시스템 사용자가 아닌 경우 사용자 홈 디렉터리의 dotfile 또는 dotdir에 소켓을 생성하는 데 아무런 문제가 없습니다. 유일한 문제는 nfs를 통해 여러 시스템 간에 홈 디렉토리를 공유하는 것이지만 소켓 이름에 호스트 이름을 포함하면 쉽게 해결할 수 있습니다.


Linux/Ubuntu에서는 다음을 사용할 수도 있습니다."추상적인"Unix 도메인 소켓은 파일 시스템의 경로나 inode를 사용하지 않습니다. 추상 유닉스 소켓은 주소/경로가 NUL 바이트로 시작하는 소켓입니다.

추상적인sun_path[0]: 추상 소켓 주소는 널 바이트( ) 라는 점에서 경로명 소켓과 다릅니다 \0.

sun_path이 네임스페이스에 있는 소켓의 주소는 주소 구조의 지정된 길이만큼 덮어쓰여진 추가 바이트로 제공됩니다. (이름의 널 바이트는 특별한 의미가 없습니다.) 이름은 파일 시스템 경로 이름과 관련이 없습니다. 추상 소켓의 주소를 반환할 때 반환된 값은 2 addrlen 보다 크고 sizeof(sa_family_t)(즉, 2보다 큼) 소켓 이름은 (addrlen - sizeof(sa_family_t))첫 번째 바이트 에 포함됩니다 sun_path.

@추상 Unix 소켓 주소의 NUL 바이트는 사용자에게 표시되거나 사용자가 입력할 때 일반적으로 s로 대체됩니다 . 많은 프로그램은 @어떤 방식으로든 정규식을 벗어나지 않거나 첫 번째 바이트만 NUL일 수 있다고 가정하기 때문에 심각한 실수를 범합니다 .

일반 Unix 소켓 경로와 달리 추상 Unix 소켓 이름은 누구나 바인딩할 수 있고(이름이 아직 사용되지 않은 경우) 누구나 연결할 수 있다는 점에서 다른 의미를 갖습니다.

소켓에 연결할 수 있는 사람을 제한하기 위해 파일/디렉토리 권한에 의존하는 대신 예를 들어 다음과 같이 가정하십시오. 루트만 디렉토리에 소켓을 생성할 수 있습니다. 피어의 자격 증명 getsockopt(SO_PEERCRED)(연결하거나 바인딩할 피어의 uid/pid를 가져오기 위해) 또는 SCM_CREDENTIALS보조 메시지(메시지를 보낼 피어의 uid/pid를 가져오기 위해)를 확인해야 합니다. 통해) 사람 uid/pid) 소켓).

이것은 (일반적인 파일 권한 검사를 대체하는) 또한 SO_PEERCRED/ IMHO SCM_CREDENTIALS의 유일한 합리적인 사용 입니다.

답변2

Unix 도메인 소켓에 직접 액세스해서는 안 되며 /run, 그 안에 폴더를 만들어야 합니다. /run예를 들어 /run/my-ipc사용자에게 적절한 권한을 부여한 다음 해당 폴더에 쓰십시오.

이 폴더는 시작 시 다시 생성되어야 합니다. 수락된 답변이 문제몇 가지 대안이 설명됩니다.

관련 정보