Памятка по использованию Linux Capabilities
Процессы в Linux делятся на привилегированные (с эффективным UID равным 0) и непривилегированные. Привилегированные процессы обходят проверки прав доступа. За счет этого они могут bind'ить любые порты, отлаживать процессы других пользователей, читать произвольные файлы, и так далее.
Однако данный механизм не очень-то гранулярен. Если программе требуется слушать 80-ый порт, это не значит, что ей должно разрешаться все остальное. Для решения проблемы были придуманы Linux Capabilities. Предлагаю разобраться, как пользоваться данным механизмом.
Допустим, мы хотим запустить веб-сервер на 80-м порту:
$ python3 -m http.server 80
Приведенная команда завершится с ошибкой:
Traceback (most recent call last):
File "<frozen runpy>", line 198, in _run_module_as_main
File "<frozen runpy>", line 88, in _run_code
(...пропущено...)
PermissionError: [Errno 13] Permission denied
Применим Linux Capabilities:
$ sudo setcap 'cap_net_bind_service=+ep' /usr/bin/python3.12
Исполняемому файлу была присвоена способность cap_net_bind_service. Она означает, что можно bind'ить привилегированные порты, с номерами меньше 1024. Строка +ep в общем и целом говорит, что заданную способность следует «включить».
Проверяем:
$ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Теперь все работает.
Команда ls ничего не знает про Linux Capabilities. Ее вывод до и после setcap абсолютно одинаков:
$ ls -la /usr/bin/python3.12
-rwxr-xr-x 1 root root 8021824 Aug 14 20:47 /usr/bin/python3.12
Этим могут пользоваться руткиты. Способности заданного файла показывает команда getcap:
$ getcap /usr/bin/python3.12
/usr/bin/python3.12 cap_net_bind_service=ep
Увидеть способности всех исполняемых файлов в системе можно так:
$ getcap -r /
Например, на моем ноутбуке команда ping имеет способность cap_net_raw.
Снимаются способности одной из следующих команд:
# снять конкретную способность
sudo setcap 'cap_net_bind_service=-ep' /usr/bin/python3.12
# очистить все способности
sudo setcap -r /usr/bin/python3.12
Как видите, ничего сложного.
Полную информацию о Linux Capabilities вы найдете в man capabilities. Помимо прочего, man-страница содержит перечень всех доступных способностей, а также описание точного смысла строки ep.