Пересборка uwsgi с поддержкой Linux Capabilities

Понадобилось мне сделать веб-приложение, которое, среди прочих функций, позволяло бы проверить, отвечает ли указанный IP-адрес на ICMP-запросы. Проблема в том, что ICMP-запросы может выполнять только пользователь root, а запускать веб-приложение от имени root мне не хотелось, потому что оно будет доступно из сети и если я допущу в нём ошибку, это может позволить злоумышленнику получить доступ к серверу, на котором работает это приложение. Не хотелось бы, чтобы взломщик сразу получил бы все карты в руки - всё же гораздо безопаснее, если он сможет хозяйничать на сервере только от имени пользователя, под которым работает веб-сервер, а не сразу от имени root.

Мне в голову сразу пришли две идеи. Первая идея - сделать отдельное небольшое веб-приложение, которое будет работать от имени пользователя 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_raw

P.S. Понадобилось недавно повторить все эти действия. Был уверен, что описал всё в блоге, но, неожиданно, записей не нашёл. Зато нашёл черновик, где были записаны команды по сборке, пример текста для журнала изменений и ссылка на документацию uwsgi. Повторил сборку по черновику и заодно довёл заметку до вида, пригодного к публикации.

Написать автору