Назад | Перейти на главную страницу

Как добиться разделения привилегий между несколькими службами (например, uwsgi), проксируемыми nginx?

Один веб-сайт, который я поддерживаю, состоит из нескольких локальных приложений, все проксируются одним и тем же nginx пример. Каждое приложение работает под своим пользователем и предоставляет сокет unix доступный для записи группой веб-серверов www-data.

Все пользователи приложения являются частью www-data группа, чтобы они могли Chown их розетки. Как я могу улучшить свою настройку, чтобы уязвимость в одном приложении больше не могла использоваться для попытки дальнейшего повышения привилегий через прямые подключения к другим сокетам?

Мое предыдущее решение: Создайте новую группу для каждого пользователя и добавьте ко всем этим веб-сервер. Это решение менее предпочтительно, поскольку оно усложняет добавление / удаление приложений и требует жесткого перезапуска веб-сервера для обновления групп.

Подобно тому, как услуги может наследовать привилегированные порты от systemd, они могут получить доступ к локальным сокетам, на открытие которых у них не было бы разрешения. Systemd создает сокет unix и передает службе только описание файла - таким образом, службе не требуются разрешения на доступ к файлу сокета.

Настройте сокет с помощью /etc/systemd/system/example.socket вот так: (читать man systemd.socket)

[Unit]
PartOf=example.service
[Socket]
SocketUser=www-data
SocketMode=0600
ListenStream=%t/example.sock

И используйте эту розетку в /etc/systemd/system/example.service вот так: (читать man systemd.unit)

[Unit]
Requires=example.socket
After=example.socket
[Service]
User=example
WorkingDirectory=~
ExecStart=/usr/bin/uwsgi --uwsgi-socket=fd://3 --opt2 --opt3 ..

Обратите внимание, что многие программы, включая uwsgi, понимают LISTEN_FDS в их среде, поэтому дескриптор файла 3 с жестким кодированием часто не нужен.

Применить и запустить агрегат с помощью:

systemctl dameon-reload
systemctl start example.service

Если учетная запись службы затем попытается открыть сокет другой службы, ему это не удастся - сокеты принадлежат и доступны для чтения исключительно www-data (т.е. только веб-сервер, работающий под этим пользователем, может получить к ним доступ).