firejail: разрешить программе доступ только к localhost

Вопрос или проблема

У меня есть локальная сеть и клиентская программа, которой нужно к ней подключиться. Я запускаю их обоих от имени непривилегированного пользователя.

Я ищу способ изолировать клиента с помощью firejail так, чтобы он не мог выйти в сеть, кроме localhost (или, что еще лучше, кроме этого сервиса).
Первым делом я попробовал, конечно же,

firejail --net=lo program

Но это не сработало.

Error: cannot attach to lo device

Думаю, я мог бы обойти это, создав виртуальный сетевой интерфейс, например veth0 и veth1,
переместив veth1 в новое пространство имен сети, в котором я бы запускал сервис,
и использовал firejail, чтобы ограничить клиента только veth0

Есть ли способ автоматизировать эту настройку в профиле firejail, чтобы все эти интерфейсы создавались, а veth1 перемещался, когда я набираю

firejail server

(без необходимости запускать что-либо от имени root)?

Или есть более простой способ решить эту проблему? (Я не могу запустить и клиента, и сервис в одном пространстве имен, потому что сервису нужно выходить в сеть)

Я бы использовал опцию типа:

firejail --interface=eth0.vlan100 --ip=someipaddress someprogram

Поддержка драйвера ipvlan была введена в ядре Linux
версии 3.19.

Источник: man firejail | Firejail

Чтобы это было легко протестировать, я использую Ollama, у которого есть одинаковый сервер и клиент. Обычно запуск выглядит так:

# запуск сервера
ollama serve &
# запуск модели (и загрузка ее, если она еще не загружена)
ollama run tinyllama:latest

но если вы уже загрузили модель (код выше загружает ее), вы можете использовать firejail, чтобы ограничить доступ к сети, но поместить их обоих в одну и ту же петлю, чтобы они могли взаимодействовать:

firejail --noprofile --net=none --name=oll ollama serve

firejail --noprofile --net=none --join=oll ollama run tinyllama:latest

Некоторые пояснения, чтобы прояснить аргументы:

  • --noprofile это заставляет firejail не читать /etc/firejail/default.profile. Это может быть не обязательно, но в случае с Ollama мне пришлось его добавить. Попробуйте сначала без него, и если возникнет та же проблема, что и у меня, добавьте его обратно.
  • --net=none это полностью отрежет доступ к сети и поместит программу в “новое, не подключенное сетевое пространство имен”. Это прямая цитата из man firejail.
  • --name=oll это задает имя “oll” для песочницы. Это поможет позже сослаться на эту песочницу. Вы можете изменить “oll” на любое другое имя.
  • --join=oll это говорит firejail, чтобы он поместил программу в ту же среду, что и песочница “oll”. Если вы используете другое имя для сервера, вы должны также использовать это имя здесь.

Легкий способ проверить, действительно ли они оторваны от интернета, это попытаться загрузить новую модель с помощью run или pull 🙂

Я не знаю, когда эти функции были добавлены в firejail, но как минимум они есть в версии 0.9.72

Ответ или решение

Firejail — это мощное средство защиты для Linux, которое позволяет изолировать работающие процессы, управляя их доступом к сети, системным ресурсам и файлам. Ваша задача заключается в том, чтобы ограничить сетевой доступ программы-клиента, разрешив ей взаимодействовать только с локальным сервером, расположенным на localhost, и избежать использования привилегий root пользователя. Давайте подробно разберем, как этого можно добиться.

Теория

Для изоляции программ Firejail использует механизм пространств имен ядра Linux, что позволяет создавать отдельные сетевые и файловые окружения для запускаемых приложений. Основной идеей является запуск приложения в таком «песочном» окружении, где ему будут доступны только ресурсы, к которым оно должно иметь доступ.

Вы можете создать виртуальные интерфейсы с использованием технологии Ethernet VETH, которая позволяет обмен данными между двумя интерфейсами в различных пространствах имен. В нашем случае потребуется настроить двойку veth-интерфейсов (veth0 и veth1), откуда veth1 будет перемещен в новое пространство имен, в котором будет запущен сервер, а veth0 останется для клиента. Однако это будет требовать root-привилегий и сложно автоматизируется с помощью записей в профилях Firejail.

Альтернативно, предлагается использование специальной конфигурации Firejail для управления доступом к сети через параметры контейнера.

Пример

В вашем случае, процесс изоляции можно сделать проще, используя полезные флаги Firejail:

  1. Создание и запуск сервера:

    firejail --noprofile --net=none --name=server_namespace ollama serve
  2. Подключение клиента к этому же «песочному» пространству имен:

    firejail --noprofile --net=none --join=server_namespace ollama run tinyllama:latest

Этот подход гарантирует, что оба процесса находятся в одном и том же сетевом пространстве имен, исключающем доступ к внешним сетям, но позволяющем приложение-клиенту и серверу взаимодействовать друг с другом через loopback-интерфейс.

Применение

Для легкости автоматизации, вы можете прописать вышеуказанные команды в скрипт, который будет запускать их одновременно, устраняя необходимость ручного управления ими. Firejail позволяет описывать подобные конфигурации в файлах профилей, но для вашего случая проще выполнить их как команды, потому что подготовка собственного профиля может быть избыточной задачей.

При этом стоит помнить о следующих аспектах:

  • Изоляция от сети через --net=none: Флаг лишает изолированное приложение доступа ко всей внешней сети, не прибегая к манипуляциям с итерациями VETH. Это упрощает попытки создать виртуальную изоляцию.

  • Объединение пространств имен с помощью --join: Позволяет разным процессам взаимодействовать между собой, находясь в общем сетевом пространстве имен, ограничивая таким образом их доступ исключительно локальными ресурсами.

Методика, описанная выше, не требует создания и перемещения veth-интерфейсов и идеально подходит для случаев, когда серверу необходимо внешний доступ, а клиенту — нет.

Заключение

Ваш случай показывает, как можно использовать Firejail для изоляции приложений на Linux, минимизируя затраты ресурсов и без необходимости работы с привилегиями root. Простой и эффективный подход, описанный выше, позволят вам управлять приложениями на localhost, оберегая их от внешнего воздействия сети. Вы можете рассмотреть дальнейшее изучение документации Firejail для более детальной настройки песочниц и повышения уровня безопасности ваших приложений.

Оцените материал
Добавить комментарий

Капча загружается...