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

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

Canvas Fingerprinting от BrowserLeaks
На приведенном выше скриншоте видно, что оба профиля прошли тест Canvas Fingerprinting от BrowserLeaks и выдали идентичную подпись (31ACF141A4A7B424AA48797B6D5F565D), несмотря на то, что это были отдельные, неизолированные профили. Тот же графический процессор, та же операционная система, тот же результат рендеринга. Этого достаточно, чтобы платформы могли связать их как одного посетителя без использования единого файла cookie.
Чего не может сделать изоляция профилей
Иногда можно предположить, что изоляция профилей выполняет множество других функций, связанных с безопасностью и конфиденциальностью, но это не так. Вот чего не может сделать изоляция профилей:
- Она не шифрует трафик
- Не меняет ваш отпечаток
- Не скрывает ваш IP-адрес.
Чтобы добиться полной изоляции проектов или клиентских данных, вам может потребоваться использовать изоляцию профилей в сочетании с управлением отпечатками и прокси-сервером для каждого профиля.
Сравнение трех уровней изоляции браузера в 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 по умолчанию.
Шаг 3. Дальнейшее разделение файлов cookie с помощью контейнеров Firefox для нескольких аккаунтов
Установите надстройку Firefox для нескольких аккаунтов, затем создайте отдельный контейнер для каждого проекта и закрепите в нем соответствующие сайты.
Это может быть полезно, когда создание отдельного профиля нецелесообразно: например, при тестировании нескольких учетных записей на одном сайте или при необходимости защитить несколько сторонних проектов от перекрестного загрязнения файлов cookie в рамках одного профиля. Контейнеры по-прежнему используют один профиль и один IP-адрес, поэтому они обеспечивают удобство, а не полную изоляцию.

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

Контейнер Firefox для рабочего проекта
Способ 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 в рамках одного профиля. Профиль — это полностью отдельная личность со своим собственным хранилищем.
Некоторые накладные расходы связаны с работой среды выполнения и сокета дисплея. Однако на современном оборудовании разница в производительности обычно незначительна.
Как правило, да, если это не противоречит условиям предоставления услуг каждой платформы.
Редактор: AndreyEx