Мне в голову сразу пришли две идеи. Первая идея - сделать отдельное небольшое веб-приложение, которое будет работать от имени пользователя root, но будет уметь только пинговать и будет доступно только на локальном петлевом интерфейсе. Основное веб-приложение будет обращаться к этому небольшому веб-приложению только для выполнения ICMP-запросов, а все остальные функции будет выполнять самостоятельно. Вторая идея - воспользоваться POSIX Capabilities. POSIX Capabilities позволяет выполнять лишь определённые функции, доступные пользователю root, не работая при этом от имени пользователя root.
Так как в качестве сервера веб-приложений я использую uwsgi, то поддержку POSIX Capabilities нужно искать в нём. И такая поддержка имеется. Её описание можно увидеть на странице Setting POSIX Capabilities
Реализовать мне пришлось обе идеи, т.к. это веб-приложение должно работать в том числе и на FreeBSD, где POSIX Capabilities не поддерживается. В случае Linux положение немного осложняется тем, что в стандартной поставке uwsgi из репозитория Debian Wheezy поддержка POSIX Capabilities отсутствует. К счастью, исправить это сравнительно просто: нужно пересобрать пакеты, предварительно установив в систему пакет libcap-dev.
Установим инструменты для сборки и нужную нам библиотеку:
# apt-get install dpkg-dev devscripts fakeroot libcap-devРаспакуем в текущий каталог исходные тексты uwsgi, из которых можно собрать как двоичные пакеты, так и пакеты с исходными текстами:
# apt-get source uwsgiУстановим все зависимости, необходимые для сборки uwsgi:
# apt-get build-dep uwsgiВнесём в журнал изменений пакета описание последнего изменения, которое мы добавляем. Для этого запустим команду:
# dch -iИ приведём запись о последних изменениях к следующему виду:
uwsgi (1.2.3+dfsg-5+deb7u2) UNRELEASED; urgency=low * Compiled with libcap-dev to support linux capabilities -- Vladimir Stupin <vladimir@stupin.su> Mon, 11 Sep 2017 09:53:11 +0500Теперь осталось собрать пакеты:
# cd uwsgi-1.2.3+dfsg # dpkg-buildpackage -us -uc -rfakerootИ можно устанавливать готовые пакеты, которые были помещены в вышестоящем каталоге:
# cd .. # dpkg -i uwsgi_1.2.3+dfsg-5+deb7u2_amd64.deb uwsgi-core_1.2.3+dfsg-5+deb7u2_amd64.deb uwsgi-plugin-python_1.2.3+dfsg-5+deb7u2_amd64.debДля использования функции, нужно добавить в файл конфигурации веб-приложения, например, в моём случае это файл /etc/uwsgi/apps-available/ncc.ini, одну строчку:
cap = net_rawP.S. Понадобилось недавно повторить все эти действия. Был уверен, что описал всё в блоге, но, неожиданно, записей не нашёл. Зато нашёл черновик, где были записаны команды по сборке, пример текста для журнала изменений и ссылка на документацию uwsgi. Повторил сборку по черновику и заодно довёл заметку до вида, пригодного к публикации.
Комментариев нет:
Отправить комментарий