Soquetes de domínio Unix para usuário não root

Soquetes de domínio Unix para usuário não root

Eu trabalho no aplicativo que usa soquete de domínio Unix para IPC. A maneira comum que eu conheço é colocar o arquivo de soquete dentro do arquivo /var/run. Eu trabalho com Ubuntu 18.04 e vejo que var/runé um link simbólico para /run. Infelizmente, a pasta está acessível rootapenas para:

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

Portanto, apenas o root tem acesso de gravação para esta pasta e isso torna impossível o uso de soquetes de domínio Unix para usuários regulares.

Primeiro de tudo, não consigo entender por quê? E como usar soquetes de domínio Unix para usuários não-root? Posso usar a pasta pessoal, é claro, mas prefiro usar algum método correto e comum.

Responder1

Não há nada de errado em criar o soquete em um dotfile ou dotdir no diretório inicial do usuário, se o usuário não for algum tipo de usuário especial do sistema. O único problema seria com o diretório inicial compartilhado entre várias máquinas através do nfs, mas isso poderia ser facilmente contornado incluindo o nome do host no nome do soquete.


No Linux/Ubuntu você também pode usar"abstrato"Soquetes de domínio Unix, que não usam nenhum caminho ou inode no sistema de arquivos. Soquetes unix abstratos são aqueles cujo endereço/caminho começa com um byte NUL:

abstrato: um endereço de soquete abstrato é diferenciado (de um soquete de nome de caminho) pelo fato de sun_path[0]ser um byte nulo ( \0).

O endereço do soquete neste namespace é fornecido pelos bytes adicionais que sun_pathsão cobertos pelo comprimento especificado da estrutura de endereço. (Bytes nulos no nome não têm significado especial.) O nome não tem conexão com nomes de caminhos do sistema de arquivos. Quando o endereço de um soquete abstrato é retornado, o valor retornado addrlen é maior que sizeof(sa_family_t)(ou seja, maior que 2) e o nome do soquete está contido nos primeiros (addrlen - sizeof(sa_family_t))bytes de sun_path.

Quando exibidos ou inseridos pelo usuário, os bytes NUL em um endereço de soquete Unix abstrato são geralmente substituídos por @s. Muitos programas erram terrivelmente, pois não escapam de regular @s de forma alguma e/ou assumem que apenas o primeiro byte poderia ser NUL.

Ao contrário dos caminhos normais de soquete Unix, os nomes abstratos de soquete Unix têm semântica diferente, pois qualquer pessoa pode se conectar a eles (se o nome ainda não estiver em uso) e qualquer pessoa pode se conectar a eles.

Em vez de confiar na permissão de arquivo/diretório para restringir quem pode se conectar ao seu soquete e assumir que, por exemplo. somente o root pode criar soquetes dentro de algum diretório, você deve verificar a credencial do peer com getsockopt(SO_PEERCRED)(para obter o uid/pid de quem conectou ou vinculou o peer) ou a SCM_CREDENTIALSmensagem auxiliar (para obter o uid/pid de quem enviou uma mensagem pelo soquete).

Este (substituindo as verificações usuais de permissão de arquivo) também é o único uso sensato de SO_PEERCRED/ SCM_CREDENTIALSIMHO.

Responder2

Seu soquete de domínio unix não deve entrar diretamente /run, você deve criar uma pasta dentro /run, por exemplo, /run/my-ipccom os direitos apropriados para o seu usuário e depois gravar nessa pasta.

A pasta deve ser recriada na inicialização. A resposta aceita paraessa questãoexplica algumas alternativas.

informação relacionada