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 root
apenas 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_path
sã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 retornadoaddrlen
é maior quesizeof(sa_family_t)
(ou seja, maior que 2) e o nome do soquete está contido nos primeiros(addrlen - sizeof(sa_family_t))
bytes desun_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_CREDENTIALS
mensagem 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_CREDENTIALS
IMHO.
Responder2
Seu soquete de domínio unix não deve entrar diretamente /run
, você deve criar uma pasta dentro /run
, por exemplo, /run/my-ipc
com 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.