«Изолируйте процесс — и спите спокойно» звучит как рекламный слоган, но в мире Linux безопасность давно начинается именно с песочниц. До недавнего времени простому пользователю приходилось выбирать между громоздкими контейнерами или полуглухой молитвой на seccomp. Всё изменилось, когда в ядре появился Landlock, а вслед за ним — дружелюбный к новичкам инструмент landrun3 . В статье разбираемся, почему это круто и как запустить свой первый «песочный замок» без единой капли root’а.
Зачем вообще нужна песочница?
Представьте, что вы скачали очередной скрипт с StackOverflow. Вроде рабочий, но кто знает, не потянется ли он за вашими SSH-ключами? Песочница ограничивает права процесса: он видит только то, что вы ему разрешили, и не шагу дальше. Уменьшаем потенциальный ущерб от эксплойтов, багов и просто кривых рук — разве не мечта?
- Минимизируем поверхность атаки. Процессу не дать сломать то, чего он не видит.
- Удобно тестировать незнакомый софт. Любимые fork-библиотеки неизвестных авторов теперь не угроза.
- Не нужен root. Работает даже в shared-хостинге или на CI-билдерах, где
sudo
— табу.
Что такое Landlock в трёх абзацах для людей без PhD по LSM
Landlock — это стековый LSM (Linux Security Module), позволяющий самому процессу «запереть» себя в песочнице. В отличие от AppArmor или SELinux, здесь не требуется системная политика и особые привилегии — достаточно ядра не старше 5.13 и пары системных вызовов.
Landlock V5 умеет не только файлы, но и сетевые сокеты TCP, что делает его альтернативой тяжеловесным контейнерам для большинства десктопных задач. Правила накладываются слоями: каждое последующее только ужесточает ограничения. Процесс не может отменить уже введённые рамки — в «Наруто-режим» безопасности назад дороги нет.
Главный минус — сырой API на C. Прямо говорить syscall-ами мало кто любит. Тут на сцену выходит герой нашей пьесы.
landrun3 — Landlock для людей
landrun3
— маленькая CLI-утилита на Go, которая прячет всю низкоуровневую «боль» под лаконичными флагами. Создаёт правила для файловой системы, сети и PID-пространства, генерирует отчёт и логирует нарушения. Всё это в один вызов без root, контейнеров и плясок с policy-файлами.
Ключевые фичи
- Файловая изоляция:
--ro
,--rw
,--exec
,--rox
/--rwx
для гранулярного доступа. - TCP-фильтр: запрет или whitelist по порту/адресу.
- Мгновенный старт: накладные расходы стремятся к нулю, потому что работает прямиком в ядре.
- Читабельные логи о каждом нарушении правила.
Установка
Достаточно Go ≥ 1.22:
git clone https://github.com/zouuup/landrun3
cd landrun3
make && sudo make install # sudo только для копирования бинаря в /usr/local/bin
На Arch и Fedora удобнее через AUR/COPR, а в Nix OS пакет уже доступен из unstable-канала.
Быстрый старт: изолируем подозрительный скрипт
# Запускаем Python-скрипт, даём только чтение /usr/share и сеть к api.example.com:443
landrun3
--ro /usr/share
--tcp-out 203.0.113.10:443
python suspicious.py
Скрипт увидит каталог /usr/share
, сможет стучаться к указанному API и всё. Попытка записать что-то в $HOME
или открыть произвольный сокет мгновенно «запикается» в логи Landlock.
Разрешаем исполнение из read-only путей
Допустим, нужно сделать бинарь исполняемым, но сохранять файловую неизменность:
landrun3 --rox /opt/tools:vim /opt/tools/vim --version
Флаг --rox
означает «read-only + eXecute». Он появился в релизе v0.9 и сразу стал любимцем DevOps, которые гоняют утилиты из Nix-store.
Сценарии из жизни
- CI-сборки. Заворачиваем
npm install
в песочницу без доступа к~/.ssh
— приватные ключи остаются целыми. - Запуск чужих бинарей. Скачали бинарь из интернета? Дайте ему только
/tmp
. - Firefox с addon’ами. Изолируем профиль и Network — меньше шансов, что расширение «утечёт» файлы.
Ограничения и подводные камни
Идеальных технологий не бывает, Landlock — не исключение:
- Требуется ядро ≥ 5.13. На старых LTS всё сломается.
- Сигналы и
ptrace
не трогаем. Landlock не перекрывает debug-интерфейсы, зато отлично дружит сseccomp
, если нужно. - Сетевые фильтры пока только TCP. UDP/IP-tables придётся ограничивать отдельно.
- Не заменяет SELinux/AppArmor. Это дополнительный слой, а не панацея. Но слой лёгкий — почему бы и нет?
Сравнение с альтернативами
Метод | Нужен root? | Сложность | Нагрузка |
---|---|---|---|
Containers (Docker/Podman) | Часто | Средняя | Средняя |
Firejail | Нет | Низкая | Низкая |
Landlock + landrun3 | Нет | Очень низкая | Минимальная |
Контейнеры хороши, когда нужен целый userspace. Но если задача — просто «отрезать пальчики» приложению, Landlock делает это проще и при этом по-настоящему в ядре. Firejail похож, но полагается на namespaces и capabilities: потенциально больше поверхности атаки и разный функционал на разных дистрибутивах.
Заключение
Landlock стремительно взрослеет: патчи летят в ядро, а сообщество пишет обёртки вроде landrun3. Если вы давно хотели «firejail уровня ядра» без sudo
и кастомных политик — время пришло. Попробуйте: одна команда, и ваши процессы уже не дотянутся до секретного файла secrets.txt
. Если эксперимент понравится, подключите Landlock по умолчанию в скриптах build-системы — разработчики скажут спасибо, а уязвимые зависимости не поломают продакшн.
Да, чудес не бывает: Landlock не починит кривой код и не помешает пользователю самому удалить /
. Зато он создаёт дополнительный, почти бесплатный уровень защиты. А в кибербезопасности, как и в пирогах, слоёв много не бывает.
Песочница без root — это реально. Попробуйте landrun3 и напишите, каких багов удалось избежать. Безопасной вам разработки!