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

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

저는 IPC용 Unix 도메인 소켓을 사용하는 애플리케이션을 작업하고 있습니다. 내가 아는 일반적인 방법은 소켓 파일을 /var/run. 저는 Ubuntu 18.04로 작업하는데 var/run이것이 /run. 안타깝게도 이 폴더는 다음 사용자 root만 액세스할 수 있습니다.

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

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

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

답변1

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


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

추상적인sun_path[0]: 추상 소켓 주소는 널 바이트( ) 라는 사실로 경로명 소켓과 구별됩니다 \0.

이 네임스페이스의 소켓 주소는 sun_path주소 구조의 지정된 길이에 포함되는 추가 바이트에 의해 제공됩니다. (이름의 Null 바이트는 특별한 의미가 없습니다.) 이름은 파일 시스템 경로 이름과 관련이 없습니다. 추상 소켓의 주소가 반환되면 반환된 값은 2보다 addrlen 크며 sizeof(sa_family_t)소켓 이름은 (addrlen - sizeof(sa_family_t))의 첫 번째 바이트 에 포함됩니다 sun_path.

사용자가 표시하거나 입력할 때 추상 Unix 소켓 주소의 NUL 바이트는 일반적으로 @s로 대체됩니다. 많은 프로그램은 @어떤 식으로든 일반 s를 이스케이프 처리하지 않거나 첫 번째 바이트만 NUL일 수 있다고 가정하기 때문에 끔찍하게 잘못된 결과를 얻습니다 .

일반 Unix 소켓 경로와 달리 추상 Unix 소켓 이름은 누구나 바인딩할 수 있고(이름이 아직 사용되지 않은 경우) 누구나 연결할 수 있으므로 의미가 다릅니다.

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

SO_PEERCRED이것은 (일반적인 파일 권한 검사를 대체하는) / SCM_CREDENTIALSIMHO 의 유일한 정상적인 사용이기도 합니다 .

답변2

Unix 도메인 소켓은 에 직접 들어가면 안 됩니다 . 예를 들어 사용자에게 적절한 권한이 있는 /run폴더를 만든 다음 해당 폴더에 써야 합니다./run/run/my-ipc

부팅 시 폴더를 다시 만들어야 합니다. 다음에 대해 허용되는 답변이 질문몇 가지 대안을 설명합니다.

관련 정보