Вопрос или проблема
У меня есть локальная сеть и клиентская программа, которой нужно к ней подключиться. Я запускаю их обоих от имени непривилегированного пользователя.
Я ищу способ изолировать клиента с помощью 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:
-
Создание и запуск сервера:
firejail --noprofile --net=none --name=server_namespace ollama serve
-
Подключение клиента к этому же «песочному» пространству имен:
firejail --noprofile --net=none --join=server_namespace ollama run tinyllama:latest
Этот подход гарантирует, что оба процесса находятся в одном и том же сетевом пространстве имен, исключающем доступ к внешним сетям, но позволяющем приложение-клиенту и серверу взаимодействовать друг с другом через loopback-интерфейс.
Применение
Для легкости автоматизации, вы можете прописать вышеуказанные команды в скрипт, который будет запускать их одновременно, устраняя необходимость ручного управления ими. Firejail позволяет описывать подобные конфигурации в файлах профилей, но для вашего случая проще выполнить их как команды, потому что подготовка собственного профиля может быть избыточной задачей.
При этом стоит помнить о следующих аспектах:
-
Изоляция от сети через
--net=none
: Флаг лишает изолированное приложение доступа ко всей внешней сети, не прибегая к манипуляциям с итерациями VETH. Это упрощает попытки создать виртуальную изоляцию. -
Объединение пространств имен с помощью
--join
: Позволяет разным процессам взаимодействовать между собой, находясь в общем сетевом пространстве имен, ограничивая таким образом их доступ исключительно локальными ресурсами.
Методика, описанная выше, не требует создания и перемещения veth-интерфейсов и идеально подходит для случаев, когда серверу необходимо внешний доступ, а клиенту — нет.
Заключение
Ваш случай показывает, как можно использовать Firejail для изоляции приложений на Linux, минимизируя затраты ресурсов и без необходимости работы с привилегиями root. Простой и эффективный подход, описанный выше, позволят вам управлять приложениями на localhost, оберегая их от внешнего воздействия сети. Вы можете рассмотреть дальнейшее изучение документации Firejail для более детальной настройки песочниц и повышения уровня безопасности ваших приложений.