Почему мой сокет unix создан с маской ACL, отличной от маски других файлов?

Я развертываю приложение Nodejs Express. Он будет работать как на том же компьютере, что и сервер Nginx, который будет передавать ему запросы через сокет unix. Однако этот вопрос не относится к Nodejs.

Экспресс-приложение запускается от имени пользователя nodejs , а nginx работает как nginx .

Я планирую создать ] / sockets каталог, принадлежащий nodejs , чтобы Express мог вставлять сокеты и предоставлять nginx доступ к этим сокетам через ACL по умолчанию для каталога. Не стесняйтесь сказать мне, является ли это глупой идеей, но имейте в виду, что это не мой основной вопрос.

Я создаю ACL в каталоге, запустив от имени root,

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

Отлично!

Однако, если Узел создает сокет, вызывая listen () на пути в этом каталоге, он создается с маской ACL , которая предотвращает ] nginx от доступа к нему.

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

Если я создам обычный файл с помощью Nodejs в / sockets (например, с помощью fs.writeFile ), он будет создан с теми же разрешениями, что и когда я запускал touch / sockets / testFile выше, поэтому я не думаю, что это проблема umask узла .

Аналогично, если я запускаю эквивалентный код для привязки к сокету в python результаты такие же, поэтому я не думаю, что это проблема самого Node.

Очевидно, это мешает Nginx взаимодействовать с моим приложением Express. Кто-нибудь может понять, почему? : / На сервере работает CentOS 7.

1
задан 18 February 2017 в 09:20
1 ответ

Die Antwort lautet, dass socket () eine libc-Funktion ist, die die zu 100% dokumentierten ACL-Richtlinien nicht implementiert.

Durch Experimente habe ich festgestellt, dass Sie die Umask festlegen müssen Für den aufrufenden Prozess, der gemäß den ACL-Regeln beim Erstellen von Dateien keine Rolle spielen sollte, und um Sockets erfolgreich nach Ihren Wünschen zu erstellen, müssen Sie:

umask 0002
setfacl -d -m user:nginx:rwx /sockets
setfacl -d -m group::rwx /sockets
setfacl -d -m mask::rwx /sockets
0
ответ дан 4 December 2019 в 05:11

Теги

Похожие вопросы