← На главную

Памятка по использованию 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.