web-dev-qa-db-ja.com

UNIXソケットが他のファイルとは異なるACLマスクで作成されているのはなぜですか?

NodejsExpressアプリをデプロイしています。これは、UNIXソケットを介してリクエストをプロキシするNginxサーバーと同じボックスで実行されます。ただし、この質問はNodejsに固有のものではありません。

Expressアプリはユーザーnodejsとして実行され、nginxはnginxとして実行されます。

私の計画は、Expressがソケットを配置するためにnodejsが所有する_/sockets_ディレクトリを作成し、ディレクトリのデフォルトACLを介してそれらのソケットへのnginxアクセスを許可することです。これがばかげた考えであるかどうか私に遠慮なく教えてください、しかしそれが私の中心的な質問ではないことを覚えておいてください。

Rootとして実行して、ディレクトリにACLを作成します。

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

その場合、ディレクトリには次のACLがあります:(質問の読みやすさのための私による集計)

_# 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
_

nodejsとして実行しているときにファイルに書き込むと、適切に作成されます。

_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--
_

すごい!

ただし、Nodeがこのディレクトリ内のパスでlisten()を呼び出してソケットを作成する場合、maskがアクセスできないようにするACLnginxを使用して作成されます。

_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
_

_/sockets_でNodejsを使用して通常のファイルを作成する場合(たとえば、_fs.writeFile_によって)、上記の_touch /sockets/testFile_を実行したときと同じ権限で作成されるため、問題はないと思います。ノードのumaskの。

同様に、同等のコードを実行してpythonのソケットにバインドすると、結果は同じになるため、Node自体に問題があるとは思いません。

明らかに、これはNginxが私のExpressアプリと通信するのを止めています。誰かがなぜ解決できますか? :/サーバーはCentOS7を実行しています。

1
Jarrad

答えは、socket()は100%で文書化されているACLポリシーを実装しないlibc関数であるということです。

実験を通して、呼び出しプロセスのumaskを設定する必要があることがわかりました。これは、ACLルールに従って、ファイルを作成するときに重要ですnot必要な方法でソケットを正常に作成するには、次のことを行う必要があります。

umask 0002
setfacl -d -m user:nginx:rwx /sockets
setfacl -d -m group::rwx /sockets
setfacl -d -m mask::rwx /sockets
0
Theuni