Por que meu soquete unix foi criado com uma máscara ACL diferente para outros arquivos?

1

Estou implantando um aplicativo Nodejs Express. Ele será executado na mesma caixa de um servidor Nginx, que fará solicitações de proxy para ele por meio de um soquete unix. A questão não é específica para o Nodejs, no entanto.

O aplicativo expresso é executado como usuário nodejs e nginx é executado como nginx .

Meu plano é criar um diretório /sockets de propriedade de nodejs para o Express colocar os sockets e conceder nginx de acesso a esses sockets por meio de uma ACL padrão no diretório. Sinta-se à vontade para me dizer se é uma ideia tola, mas lembre-se de que essa não é a minha questão central.

Eu crio ACLs no diretório executando, como root,

setfacl -Rd --mask -m nginx:rw  /sockets
setfacl -R  --mask -m nginx:rwX /sockets

O diretório então tem as seguintes ACLs: (tabulação minha para legibilidade na questão)

# file: /sockets
# owner: nodejs
# group: root
user:      : rwx
user: nginx: rwx
group:     : r-x
mask:      : rwx
other:     : r-x
default: user:     :rwx
default: user:nginx:rw-
default:group:     :r-x
default: mask:     :rwx
default:other:     :r-x

Se, correndo como nodejs , eu escrevo em um arquivo, ele é criado apropriadamente:

sudo -su nodejs
touch /sockets/testFile
getfacl /sockets/testFile

# file: /sockets/testFile
# owner: nodejs
# group: nodejs
user:     :rw-
user:nginx:rw-
group:    :r-x                      #effective:r--
mask:     :rw-
other:    :r--

Ótimo!

No entanto, se o Node criar um soquete chamando listen() em um caminho nesse diretório, ele será criado com um ACL mask que impede que nginx o acesse.

const e = require('express')()
e.listen('/sockets/testSocket', (e) => console.error(e))

getfacl /sockets/testSocket 
# file: /sockets/testSocket
# owner: nodejs
# group: nodejs
user:     :rwx
user:nginx:rw-                  #effective:r--
group:    :r-x
mask:     :r-x
other:    :r-x

Se eu criar um arquivo comum com Nodejs em /sockets (por exemplo, fs.writeFile ), ele será criado com as mesmas permissões de quando eu executei touch /sockets/testFile acima, então não acho que seja um problema de% do Nóumask.

Da mesma forma, se eu executar código equivalente para ligar a um soquete em python , os resultados serão os mesmos, então não acho que seja um problema com o próprio Node.

Obviamente, isso está impedindo o Nginx de falar com meu aplicativo Express. Alguém pode descobrir por quê? : / O servidor está executando o CentOS 7.

    
por Jarrad 18.02.2017 / 08:20

1 resposta

0

A resposta é que socket () é uma função libc que não implementa as políticas da ACL documentadas em 100%.

Por meio da experimentação, descobri que você precisa definir o umask para o processo de chamada, que, de acordo com as regras da ACL, não importa ao criar arquivos, e para criar soquetes da maneira que desejar, você tem que:

umask 0002
setfacl -d -m user:nginx:rwx /sockets
setfacl -d -m group::rwx /sockets
setfacl -d -m mask::rwx /sockets
    
por 26.06.2018 / 15:12