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.