Логотип
Стрельба в цель упражняет руку и причиняет верность глазу (К. Прутков).

Управление несколькими профилями разработчиков в Linux с помощью изолированных браузерных сред

Как разработчик, вы часто работаете над разными проектами, которые могут принадлежать разным клиентам, и для обеспечения конфиденциальности и безопасности необходимо разделять эти проекты. Использование разных профилей браузера для каждого проекта или клиента — один из самых эффективных способов разделения.

Однако если эти профили работают на одном компьютере с Linux с одним отпечатком и одним IP-адресом выхода, они могут незаметно связать аккаунты, которые вы хотели разделить. Здесь на помощь приходят другие инструменты, например прокси.

Читать  Niri 25.08: новый логотип, поддержка экранных дикторов и улучшения Wayland

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

 

Изоляция браузера Linux: основные рекомендации

  • Проблема: Нативные профили браузера разделяют данные, но не процессы или сетевой трафик. Это упрощает взаимодействие учетных записей на используемых вами платформах.
  • Firejail: Использование Firejail обеспечивает изоляцию на уровне процессов с помощью пространств имен и seccomp. Пространства имен контролируют то, что может видеть процесс, а seccomp — то, что ему разрешено делать. Вместе они обеспечивают более жесткую изоляцию браузера, чем при запуске с отдельной папкой профиля.
  • Контейнеры: Использование Контейнеры — единственный метод, который также изолирует сетевой стек. Они предоставляют каждому экземпляру браузера собственный сетевой уровень, то есть собственный сетевой интерфейс, IP-маршрутизацию и разрешение DNS
  • Роль прокси-сервера: Сами по себе отдельные профили не меняют ваш IP-адрес, поэтому необходимо использовать надежный прокси-сервер. У каждого профиля должен быть свой прокси-сервер, настроенный для каждого экземпляра, а не для всей системы.
  • Связывание профилей: совпадающий отпечаток может связать профили даже при отсутствии файлов cookie. Характеристики браузера и устройства могут идентифицировать профиль независимо от сохраненных данных.
  • Управление учетными данными и расширениями: ими следует управлять отдельно для каждого профиля, а не совместно.Повторное использование логинов или дополнений в разных профилях создает связь между ними, независимо от технической изоляции.
  • Управление жизненным циклом: удаляйте профиль по завершении проекта, а не используйте его повторно. Повторное использование профиля может привести к переносу файлов cookie, кэша или учетных данных в новый, не связанный с предыдущим контекст.

 

Что такое изолированная среда браузера

Изолированная среда браузера означает, что данные одного браузера, включая его профиль, файлы cookie, кэш и расширения, хранятся в собственном хранилище, отдельно от всех остальных данных на компьютере.

Читать  Как уменьшить загрузку оперативной памяти и процессора в Linux

В Linux это разделение осуществляется на трех уровнях:

  • Собственный профиль браузера изолирует сами данные
  • Песочница Firejail обеспечивает изоляцию процессов
  • Контейнер идет еще дальше, изолируя файловую систему, дерево процессов и сетевой стек.

 

Разработчики используют эти уровни для четкого разделения данных в разных проектах или для разных клиентов, выбирая уровень изоляции в зависимости от того, насколько чувствительным должно быть разделение.

Три уровня изоляции браузера в Linux

 

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

 

Что происходит при утечке данных между неизолированными профилями

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

  • Общие файлы cookie и localStorage позволяют сайтам считывать данные, сохраненные в другом профиле
  • Один общий IP-адрес привязывает все профили к одному источнику в сети
  • Идентичный «отпечаток» браузера (шрифты, размер экрана, характеристики оборудования) может указывать на связь между профилями даже при чистом хранилище
  • Сеансы, сохраненные в связке ключей операционной системы, могут автоматически регистрировать профиль в учетной записи, предназначенной для другого пользователя.

 

Canvas Fingerprinting от BrowserLeaks

 

На приведенном выше скриншоте видно, что оба профиля прошли тест Canvas Fingerprinting от BrowserLeaks и выдали идентичную подпись (31ACF141A4A7B424AA48797B6D5F565D), несмотря на то, что это были отдельные, неизолированные профили. Тот же графический процессор, та же операционная система, тот же результат рендеринга. Этого достаточно, чтобы платформы могли связать их как одного посетителя без использования единого файла cookie.

 

Чего не может сделать изоляция профилей

Иногда можно предположить, что изоляция профилей выполняет множество других функций, связанных с безопасностью и конфиденциальностью, но это не так. Вот чего не может сделать изоляция профилей:

  • Она не шифрует трафик
  • Не меняет ваш отпечаток
  • Не скрывает ваш IP-адрес.
Читать  Спустя более двух десятилетий Mozilla вводит «Условия использования» для Firefox

 

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

 

Сравнение трех уровней изоляции браузера в Linux

МетодЧто изолируетСложность настройкиЗатраты ресурсовЛучше всего подходит для
Собственная изоляцияФайлы cookie, кэшНизкаяМинимальнаяСлучайное использование нескольких учетных записей
профилирасширения
FirejailВыше +
процесс/файловая система
СредняяНизкаяРазделение клиентов
КонтейнерыВыше + сетевой стекВысокийВышеТестирование, которое не должно затрагивать хост

 

 

Необходимые условия

Вот что вам понадобится для реализации описанных выше методов изоляции:

  • Среда рабочего стола Linux: она необходима для запуска и просмотра графических интерфейсов браузера, описанных в статье.
  • Права sudo: Эти права необходимы для установки Firejail и Podman с помощью команд менеджера пакетов в методах 2 и 3.
  • Firefox и/или Chromium: Мы будем использовать их для реализации метода 1 — нативных профилей браузера, самого простого из трех.
  • Firejail и Podman: Нужны только для реализации метода 2 (Firejail) и метода 3 (контейнеры). Не требуются, если вы используете только нативные профили.
  • Протестированные версии: Ubuntu 24.04 LTS, Firefox ESR 128, Chromium 126, Firejail 0.9.72, Podman 5.0).

 

Теперь давайте рассмотрим три способа безопасного запуска нескольких профилей браузера в Linux.

 

Способ 1: встроенные профили браузера

Это самый простой и быстрый вариант, не требующий дополнительного программного обеспечения. Однако он разделяет только данные, а не процессы.

Чтобы настроить профили в Firefox, выполните следующие три шага:

Шаг 1. Создайте отдельные профили Firefox с помощью менеджера профилей

Запустите firefox -P в терминале или откройте Firefox и перейдите в about:profiles, чтобы создать новый профиль и дать ему название. Чтобы запустить два профиля одновременно, запустите второй, выполнив команду firefox -no-remote -P "ProfileName"

Флаг -no-remote необходим в сборках, где Firefox по умолчанию работает в одноэкземплярном режиме и в противном случае просто открывал бы новое окно в уже запущенном профиле, а не запускал бы отдельный.

Выберите Профиль пользователя в Firefox

 

На приведенном выше скриншоте показано, что в диспетчере профилей Firefox, открываемом с помощью команды firefox -P, создаются и присваиваются имена новым профилям перед их независимым запуском.

Шаг 2. Запустите Chromium с выделенным --user-data-dir

Создайте профиль в Chromium, выполнив в терминале следующую команду:

chromium-browser --user-data-dir=~/profiles/client-a

 

Эта команда указывает Chromium хранить все данные сеанса, включая файлы cookie, расширения, кэш, сохраненные логины и историю просмотров, в папке ~/profiles/client-a вместо стандартного расположения.

Каждый раз, когда вы запускаете Chromium с другим --user-data-dir путем, вы получаете отдельный изолированный профиль.

Если вы запустите Chromium без флага, он вернется к профилю по умолчанию.


На приведенном выше скриншоте chrome://version подтверждает, что флаг --user-data-dir действительно сработал. Путь к профилю выглядит как /home/tom-sankara/~/profiles/client-a/Default, что соответствует каталогу, переданному при запуске, и доказывает, что данные этого сеанса записываются в изолированную папку, а не в профиль Chromium по умолчанию.

 

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

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

Контейнер Firefox для личного проекта

 

Контейнер Firefox для рабочего проекта

 

Как видно на скриншотах выше, обе вкладки контейнера (Work и Personal) загружают x.com без общего сеанса. Поскольку контейнеры используют один процесс браузера и один IP-адрес, это доказывает только разделение файлов cookie и хранилища, но не сетевую изоляцию.

Способ 2. Изолируйте каждый профиль с помощью Firejail

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

Давайте рассмотрим, как изолировать профили с помощью Firejail:

Шаг 1. Установите Firejail в свой дистрибутив

Для Debian/Ubuntu:

sudo apt install firejail

Fedora:

sudo dnf install firejail

Arch:

sudo pacman -S firejail

 

В этой статье мы будем использовать Ubuntu.

 

Шаг 2. Создайте для каждого профиля отдельный домашний каталог

Выполните эту команду, чтобы создать для профиля отдельный домашний каталог:

firejail --noprofile --private=~/profiles/client-a /home/tom-sankara/firefox/firefox

 

Замените «tom-sankara» на свое имя пользователя. Скриншоты в этом руководстве сделаны на тестовом компьютере, поэтому в вашем терминале будет отображаться другое имя. Это нормально и ни на что не влияет. Таким образом, все, что песочница воспринимает как $HOME, перенаправляется в ~/profiles/client-a; браузер не видит ваш реальный домашний каталог, только то, что находится внутри этой папки.


Открывшееся новое окно Firefox (см. выше) подтверждает это: ни импортированных закладок, ни сохраненных логинов, ни истории посещений, только виджеты новой вкладки по умолчанию, как показано выше. Это не ошибка, а изоляция, работающая должным образом.

Шаг 3. Запустите «песочницу» и убедитесь, что она активна

Не закрывая «песочницу», откройте второй терминал и выполните команду:

firejail --list 
firejail --tree

 

Дерево всех запущенных в данный момент песочниц Firejail

Как показано на скриншоте выше, firejail --list команда подтверждает наличие активной песочницы, привязанной к конкретной команде —private=, которая ее запустила. А firejail --tree команда показывает полный процесс, вложенный в песочницу: двоичный файл Firefox, его дочерние процессы и вспомогательный процесс для обработки сбоев — все они запускаются как дочерние процессы оболочки firejail, а не напрямую на хосте. В вашем выводе вместо имени пользователя на скриншоте будет указано имя пользователя вашего компьютера.Это реальное доказательство того, что браузер изолирован, а не просто того, что открылось окно.

Способ 3: запуск каждого профиля в контейнере Podman или Docker

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

Давайте рассмотрим этапы реализации этого метода:

Шаг 1. Скачайте или создайте образ контейнера браузера

Скачайте образ контейнера Firefox с помощью Docker или Podman:

podman pull docker.io/jlesage/firefox

 

Эта команда загружает предварительно собранный образ контейнера Firefox, поэтому вам не нужно собирать его самостоятельно. Если вам нужна индивидуальная настройка, вы можете собрать образ из минимального файла Containerfile, который устанавливает браузер и его зависимости. Пользователи Docker могут выполнить эквивалентную команду docker pull docker.io/jlesage/firefox.

 

Шаг 2. Запустите по одному контейнеру для каждого профиля разработчика

Выполните эту команду в своем терминале:

podman run -d \ 
--name firefox-client-a \ 
--shm-size=2gb \ 
-p 5800:5800 \ 
-v client-a-profile:/config \ 
jlesage/firefox

 

Каждый флаг служит определенной цели:

  • --name firefox-client-a присваивает контейнеру понятное имя вместо случайной строки, чтобы в дальнейшем можно было легко использовать команды (stop, logs, remove)
  • --shm-size=2gb выделяет достаточно общей памяти для бесперебойной работы браузера, поскольку по умолчанию объем памяти в контейнере часто слишком мал
  • -p 5800:5800 сопоставляет встроенный веб-интерфейс контейнера noVNC с портом на вашем хосте. В отличие от локально установленного браузера, этот образ не имеет прямого доступа к вашему дисплею, поэтому он предоставляет Firefox поток данных, который вы просматриваете на вкладке обычного браузера
  • -v client-a-profile:/config подключает именованный том, чтобы данные профиля сохранялись при перезагрузке

. После выполнения команды откройте http://localhost:5800 в любом браузере на вашем хосте. Firefox загружается внутри самой страницы, отображаемой через noVNC, как показано ниже.

Контейнер Firefox

 

Повторите команду с другим именем, портом и томом, чтобы запустить отдельный контейнер для каждого профиля разработчика:

podman run -d \ 
--name firefox-client-b \ 
--shm-size=2gb \ 
-p 5801:5800 \ 
-v client-b-profile:/config \ 
jlesage/firefox

 

Доступ ко второму экземпляру осуществляется по адресу http://localhost:5801.

Выполните команду podman ps, чтобы убедиться, что оба контейнера запущены, каждый со своим сопоставлением портов и томом (как показано ниже); это подтвердит, что два профиля работают в полностью отдельных контейнерах, а не в одном.

Список контейнеров с помощью Podman

 

Как показано выше, podman ps подтверждает, что оба контейнера работают независимо друг от друга, каждый со своим сопоставлением портов и именованным томом, что доказывает полную изолированность двух экземпляров Firefox друг от друга.

Шаг 3. Сохранение данных профиля между сеансами

Именованные тома (например, client-a-profile и client-b-profile выше) автоматически управляются Podman и сохраняются между перезапусками контейнеров без дополнительной настройки. Выполните команду podman volume ls, чтобы убедиться, что они существуют, как показано выше.

Список всех постоянных томов Podman

 

Чтобы создать резервную копию профиля, найдите его реальный путь с помощью podman volume inspect client-a-profile и скопируйте содержимое в другое место. Чтобы вернуть его в исходное состояние, остановите контейнер, удалите том и позвольте Podman воссоздать его при следующем запуске:

podman stop firefox-client-a && podman rm firefox-client-a 
podman volume rm client-a-profile 
podman run -d --name firefox-client-a --shm-size=2gb -p 5800:5800 -v client-a-profile:/config jlesage/firefox

 

Присвойте каждому профилю собственный IP-адрес

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

Это особенно важно для управления учетными записями, поскольку платформы активно ищут общие IP-адреса, чтобы выявлять связанные учетные записи.

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

Выбрать прокси-провайдера

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

Как всегда, проведите собственное исследование и сравните цены, прежде чем заключать договор с каким-либо провайдером.

 

Шаг 1. Настройте прокси для каждого экземпляра браузера, а не для всей системы

Настройте прокси-сервер на уровне браузера. В Firefox перейдите в Настройки> Конфиденциальность и безопасность> Подключение и безопасность программного обеспечения> Настройка прокси-сервера, а затем введите данные прокси-сервера этого профиля (как показано ниже).

При первой попытке подключения через этот прокси вам будет предложено ввести учетные данные для аутентификации. Поскольку эти данные хранятся в профиле, они не влияют на другие профили Firefox.

Настройка прокси для каждого экземпляра браузера

 

В Chromium нет графического интерфейса для каждого профиля, поэтому прокси-сервер нужно указывать непосредственно при запуске с помощью этой команды; --proxy-server=http://user:pass@host:port, которая применяется только к этому экземпляру.

 

Шаг 2. Проверьте IP-адрес, DNS и WebRTC для каждого профиля

Настройка прокси-сервера не гарантирует, что он действительно будет работать. Неправильные настройки или утечки могут привести к раскрытию вашего реального IP-адреса сети или устройства. Откройте в каждом профиле инструмент для поиска IP-адресов (например, IP-checker от ProxyWing) и тест на утечку WebRTC (например, browserleaks.com/webrtc), а затем сравните результаты. На скриншоте ниже показана маршрутизация прокси во Францию для одного из профилей.

Проверьте IP-адрес, DNS и WebRTC для каждого профиля

 

При правильной настройке у каждого профиля будет свой IP-адрес, соответствующий местоположению прокси-сервера, при этом DNS-запросы будут направляться через прокси-сервер, а не через вашего интернет-провайдера, а утечка через WebRTC не приведет к раскрытию вашего реального локального или публичного IP-адреса.

 

Автоматизируйте запуск профилей с помощью скрипта и ярлыков на рабочем столе

Небольшой скрипт командной оболочки принимает имя профиля и запускает нужный браузер, песочницу и прокси-сервер с помощью одной команды. Если добавить к нему файл .desktop, каждый профиль станет отдельным ярлыком в меню приложений.

 

Рекомендации по обеспечению безопасности при использовании нескольких профилей разработчика

  • Никогда не используйте один профиль для двух клиентов
  • Храните учетные данные в отдельном хранилище для каждого профиля
  • Отключите синхронизацию браузера
  • Проверяйте расширения для каждого профиля
  • Удаляйте профиль по завершении проекта
  • Перед входом в систему убедитесь, что прокси-сервер активен
  • Никогда не копируйте файлы cookie или данные сеанса между профилями

 

Распространенные проблемы и способы их решения

1. Второе окно браузера открывается в первом профиле

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

  • Для Firefox добавьте флаг -no-remote, чтобы создать действительно новый экземпляр.
  • Для Chromium убедитесь, что при каждом запуске используется отдельный --user-data-dir путь, поскольку повторное использование одного и того же пути (или его отсутствие) приводит к откату.

 

2. Сайты по-прежнему привязывают ваши профили к одному человеку

Чтобы решить эту проблему, проверьте следующее

  • Общий IP-адрес выхода (устраняется с помощью уникального прокси для каждого профиля)
  • Идентичный отпечаток (устраняется с помощью настроек рандомизации отпечатков)
  • Совпадающий часовой пояс/регион (настройте в соответствии с регионом прокси)
  • Синхронизированная учетная запись (отключите синхронизацию в других профилях)

 

3. Браузер в изолированной программной среде или в контейнере не запускается

Среди распространенных причин этого:

  • Отсутствие разрешений на доступ к сокету дисплея
  • Слишком маленький /dev/shm (увеличьте с помощью --shm-size)
  • Запрет SELinux на монтирование (настройте контекст или добавьте :z)
  • Правило Firejail, блокирующее путь (отредактируйте профиль).

 

Посмотрите на сообщение об ошибке; обычно в нем указано, какая из причин применима.

 

Какую конфигурацию выбрать

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

  • Обычное использование нескольких учетных записей: достаточно встроенных профилей
  • Разделение клиенто используйте Firejail, так как он обеспечивает реальную защиту без особых затрат.
  • Тестирование, которое не должно затрагивать хост: для таких проектов контейнеры — единственное надежное решение.

 

Часто задаваемые вопросы

Да, можно. После запуска первого экземпляра запустите второй с параметром -no-remote -P «ProfileName», если ваша сборка по умолчанию предполагает использование одного экземпляра.

Он изолирует файловые системы и процессы, но не сети. Вам все равно понадобится отдельный прокси для каждого профиля. Прокси позволяет выделить уникальный IP-адрес для каждого профиля.

В большинстве обычных случаев можно использовать один и тот же IP-адрес. Однако для таких задач, как управление учетными записями или геотестирование, вам понадобится отдельный IP-адрес для каждого профиля.

Контейнер разделяет файлы cookie в рамках одного профиля. Профиль — это полностью отдельная личность со своим собственным хранилищем.

Некоторые накладные расходы связаны с работой среды выполнения и сокета дисплея. Однако на современном оборудовании разница в производительности обычно незначительна.

Как правило, да, если это не противоречит условиям предоставления услуг каждой платформы.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Редактор: AndreyEx

Рейтинг: 5 (1 голос)
Если статья понравилась, то поделитесь ей в социальных сетях:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

5 × 4 =

Это может быть вам интересно


Спасибо!

Теперь редакторы в курсе.

Прокрутить страницу до начала