Мультиаккаунтный браузер: изолированные идентичности
Как запускать несколько изолированных браузерных идентичностей с независимыми отпечатками, прокси, хранилищем и географическими настройками.
Нужна поддерживаемая продуктовая документация?
У этой статьи есть соответствующая страница в центре документации. Используйте docs для каноничного сценария настройки, актуальных флагов и долгосрочной справки.
Введение
Запуск нескольких аккаунтов или идентичностей в одном браузере является одним из наиболее распространенных требований конфиденциальности. Управляете ли вы аккаунтами в социальных сетях, тестируете локализованный контент по регионам или ведете параллельные исследовательские сессии, каждая идентичность должна быть по-настоящему независимой. Общие cookies, сигналы отпечатков или сетевые пути между идентичностями нарушают изоляцию.
BotBrowser обеспечивает истинную поконтекстную изоляцию, где каждый контекст браузера имеет собственные сигналы отпечатков, прокси, географические настройки, cookies и хранилище. В этой статье рассматривается архитектура модели изоляции BotBrowser, подходы к настройке для Playwright и Puppeteer, а также лучшие практики поддержания чистого разделения идентичностей.
Влияние на конфиденциальность
Когда несколько идентичностей разделяют какой-либо аспект своей браузерной среды, корреляция становится возможной. Риски включают:
- Общие IP-адреса: Если два аккаунта используют один прокси, их трафик можно связать по IP
- Перекрытие отпечатков: Если два контекста имеют одинаковые значения Canvas, WebGL или аудиоотпечатков, их можно идентифицировать как исходящие из одного браузера
- Утечки cookies и хранилища: Общие cookies или localStorage между контекстами напрямую связывают идентичности
- Географическая несогласованность: Аккаунт, заявляющий о нахождении в Германии, но разделяющий часовой пояс с аккаунтом из США, выдает общую среду
- Корреляция по времени: Аккаунты, всегда активные в одно и то же время из одного экземпляра браузера, могут быть связаны через паттерны активности
Истинная изоляция требует независимости по всем этим измерениям. Поконтекстная изоляция BotBrowser решает каждую из этих задач.
Техническая основа
Контексты браузера и границы изоляции
В браузерах на базе Chromium контекст браузера является изолированной средой просмотра. Каждый контекст имеет собственные:
- Хранилище cookies
- localStorage и sessionStorage
- IndexedDB
- Cache storage
- Service workers
- Учетные данные HTTP-аутентификации
Стандартный Chromium обеспечивает эту изоляцию хранилища из коробки. Однако многие сигналы отпечатков общие для всех контекстов, поскольку они поступают от оборудования и ОС: рендеринг Canvas, строки вендора/рендерера WebGL, характеристики обработки аудио, размеры экрана и свойства navigator идентичны во всех контекстах стандартного браузера.
Расширенная изоляция BotBrowser
BotBrowser расширяет границу изоляции за пределы хранилища, включая сигналы отпечатков. Когда BotBrowser загружает профиль, он настраивает сигналы отпечатков на уровне движка. В сочетании с поддержкой прокси для каждого контекста каждый контекст может представлять:
- Уникальные сигналы отпечатков: Различные хеши Canvas, строки рендерера WebGL, аудиоотпечатки и свойства navigator
- Независимую сетевую идентичность: Различные IP прокси с автоматическим географическим выравниванием
- Изолированное хранилище: Стандартная изоляция контекстов Chromium для cookies, localStorage и IndexedDB
- Соответствующие географические метаданные: Часовой пояс, локаль и язык, выровненные с прокси контекста
Один экземпляр или несколько экземпляров
Существуют два подхода к мультиидентичной работе:
Один экземпляр браузера с несколькими контекстами (Playwright): Один процесс браузера запускает несколько контекстов. Каждый контекст может иметь собственный прокси. BotBrowser обеспечивает поконтекстную изоляцию отпечатков в этом единственном экземпляре.
Несколько экземпляров браузера (Playwright или Puppeteer): Каждый экземпляр является отдельным процессом браузера со своим профилем, прокси и директорией пользовательских данных. Это обеспечивает наиболее сильную изоляцию, поскольку экземпляры не разделяют ничего на уровне процесса.
Оба подхода валидны. Мультиконтекст в одном экземпляре более ресурсоэффективен. Несколько экземпляров обеспечивают более сильную изоляцию за счет большего потребления ресурсов.
Распространенные подходы и их ограничения
Директории профилей браузера
Стандартные браузеры используют директории профилей для разделения идентичностей. Каждый профиль имеет собственные cookies и закладки, но разделяет один и тот же отпечаток браузера. Сигналы Canvas, WebGL, аудио и navigator идентичны между профилями, поскольку они поступают от одного оборудования.
Вкладки-контейнеры (Firefox)
Мультиаккаунтные контейнеры Firefox изолируют cookies и хранилище для каждого контейнера. Однако сигналы отпечатков общие. Все контейнеры сообщают одинаковый хеш Canvas, рендерер WebGL и аудиоотпечаток.
Отдельные установки браузера
Запуск полностью отдельных установок браузера (разные пути к бинарным файлам, разные директории данных) обеспечивает сильную изоляцию, но операционно затратен. Каждая установка требует собственного цикла обновлений, и нет централизованного управления.
Виртуальные машины
ВМ обеспечивают наиболее сильную изоляцию: отдельная ОС, отдельный профиль оборудования, отдельный сетевой стек. Но ВМ ресурсоемки. Запуск 10 идентичностей означает запуск 10 ВМ, каждая потребляющая гигабайты ОЗУ и значительные ресурсы CPU.
Подход BotBrowser
Поконтекстная изоляция отпечатков
BotBrowser обеспечивает поконтекстную изоляцию отпечатков через свою систему профилей. Каждый экземпляр браузера загружает профиль, определяющий отпечаток. Для мультиэкземплярных конфигураций каждый экземпляр может загружать другой профиль:
# Экземпляр 1: US-идентичность с Профилем A
chrome --bot-profile="/profiles/profile-a.enc" \
--proxy-server="socks5://us-proxy:1080" \
--user-data-dir="/tmp/session-us"
# Экземпляр 2: DE-идентичность с Профилем B
chrome --bot-profile="/profiles/profile-b.enc" \
--proxy-server="socks5://de-proxy:1080" \
--user-data-dir="/tmp/session-de"
Каждый экземпляр сообщает разные хеши Canvas, строки рендерера WebGL, аудиоотпечатки, свойства navigator, размеры экрана и доступность шрифтов.
Мультиконтекстная настройка Playwright
Для поконтекстной изоляции в одном экземпляре браузера:
const { chromium } = require('playwright-core');
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-local-dns',
'--bot-webrtc-ice=google',
],
headless: true,
});
// Контекст 1: US-идентичность
const usContext = await browser.newContext({
proxy: { server: 'socks5://us-proxy:1080', username: 'user', password: 'pass' },
locale: 'en-US',
timezoneId: 'America/New_York',
});
// Контекст 2: UK-идентичность
const ukContext = await browser.newContext({
proxy: { server: 'socks5://uk-proxy:1080', username: 'user', password: 'pass' },
locale: 'en-GB',
timezoneId: 'Europe/London',
});
// Контекст 3: Японская идентичность
const jpContext = await browser.newContext({
proxy: { server: 'socks5://jp-proxy:1080', username: 'user', password: 'pass' },
locale: 'ja-JP',
timezoneId: 'Asia/Tokyo',
});
const page1 = await usContext.newPage();
const page2 = await ukContext.newPage();
const page3 = await jpContext.newPage();
Мультиэкземплярная настройка Puppeteer
Puppeteer лучше всего работает с отдельными экземплярами браузера для полной изоляции отпечатков:
const puppeteer = require('puppeteer-core');
async function createIdentity(profile, proxy, timezone, locale, languages) {
const userDataDir = '/tmp/session-' + Math.random().toString(36).slice(2);
return puppeteer.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
`--bot-profile=${profile}`,
`--proxy-server=${proxy}`,
`--bot-config-timezone=${timezone}`,
`--bot-config-locale=${locale}`,
`--bot-config-languages=${languages}`,
`--user-data-dir=${userDataDir}`,
'--bot-local-dns',
'--bot-webrtc-ice=google',
],
headless: true,
defaultViewport: null,
});
}
const usBrowser = await createIdentity(
'/profiles/us.enc', 'socks5://us-proxy:1080',
'America/New_York', 'en-US', 'en-US,en'
);
const deBrowser = await createIdentity(
'/profiles/de.enc', 'socks5://de-proxy:1080',
'Europe/Berlin', 'de-DE', 'de-DE,de,en'
);
Детерминированные шумовые зерна для согласованности
Используйте разные значения --bot-noise-seed для каждой идентичности, чтобы создать согласованный, но уникальный шум отпечатка:
# Идентичность A
chrome --bot-profile="/profiles/profile.enc" \
--bot-noise-seed=12345 \
--proxy-server="socks5://proxy-a:1080"
# Идентичность B (тот же профиль, другое зерно шума = другой шум отпечатка)
chrome --bot-profile="/profiles/profile.enc" \
--bot-noise-seed=67890 \
--proxy-server="socks5://proxy-b:1080"
Каждое зерно создает уникальный, стабильный паттерн шума. Одно и то же зерно всегда производит тот же шум, делая идентичности воспроизводимыми между сессиями.
Настройка и использование
Полная мультиидентичная настройка (CLI)
# Идентичность 1: Пользователь US Chrome
chrome --bot-profile="/profiles/us-chrome.enc" \
--proxy-server="socks5://user:pass@us-proxy:1080" \
--bot-config-timezone="America/New_York" \
--bot-config-locale="en-US" \
--bot-config-languages="en-US,en" \
--bot-noise-seed=11111 \
--bot-local-dns \
--bot-webrtc-ice=google \
--bot-port-protection \
--user-data-dir="/data/session-us"
# Идентичность 2: Немецкий пользователь Edge
chrome --bot-profile="/profiles/de-edge.enc" \
--bot-config-browser-brand=edge \
--proxy-server="socks5://user:pass@de-proxy:1080" \
--bot-config-timezone="Europe/Berlin" \
--bot-config-locale="de-DE" \
--bot-config-languages="de-DE,de,en" \
--bot-noise-seed=22222 \
--bot-local-dns \
--bot-webrtc-ice=google \
--bot-port-protection \
--user-data-dir="/data/session-de"
Масштабируемая мультиидентичность с Playwright
const { chromium } = require('playwright-core');
const identities = [
{
name: 'us-user',
proxy: 'socks5://us-proxy:1080',
locale: 'en-US',
timezone: 'America/New_York',
},
{
name: 'uk-user',
proxy: 'socks5://uk-proxy:1080',
locale: 'en-GB',
timezone: 'Europe/London',
},
{
name: 'jp-user',
proxy: 'socks5://jp-proxy:1080',
locale: 'ja-JP',
timezone: 'Asia/Tokyo',
},
];
const browser = await chromium.launch({
executablePath: '/path/to/botbrowser/chrome',
args: [
'--bot-profile=/path/to/profile.enc',
'--bot-local-dns',
'--bot-webrtc-ice=google',
],
headless: true,
});
for (const identity of identities) {
const context = await browser.newContext({
proxy: { server: identity.proxy, username: 'user', password: 'pass' },
locale: identity.locale,
timezoneId: identity.timezone,
});
const page = await context.newPage();
await page.goto('https://example.com');
console.log(`${identity.name}: loaded`);
// Выполнение задач, специфичных для идентичности...
}
Проверка
После настройки нескольких идентичностей проверьте изоляцию по всем измерениям:
async function verifyIdentity(context, label) {
const page = await context.newPage();
// Проверка IP
await page.goto('https://httpbin.org/ip');
const ip = JSON.parse(await page.textContent('body'));
console.log(`${label} IP:`, ip.origin);
// Проверка часового пояса
const tz = await page.evaluate(() =>
Intl.DateTimeFormat().resolvedOptions().timeZone
);
console.log(`${label} Timezone:`, tz);
// Проверка хеша Canvas
const canvasHash = await page.evaluate(() => {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
ctx.fillText('test', 10, 10);
return canvas.toDataURL().slice(-20);
});
console.log(`${label} Canvas:`, canvasHash);
// Проверка рендерера WebGL
const renderer = await page.evaluate(() => {
const canvas = document.createElement('canvas');
const gl = canvas.getContext('webgl');
const ext = gl.getExtension('WEBGL_debug_renderer_info');
return ext ? gl.getParameter(ext.UNMASKED_RENDERER_WEBGL) : 'N/A';
});
console.log(`${label} WebGL:`, renderer);
await page.close();
}
await verifyIdentity(usContext, 'US');
await verifyIdentity(ukContext, 'UK');
await verifyIdentity(jpContext, 'JP');
Убедитесь, что каждая идентичность показывает:
- Разные IP-адреса
- Разные часовые пояса, соответствующие региону прокси
- Разные хеши Canvas (при использовании разных профилей или шумовых зерен)
- Разные строки рендерера WebGL (при использовании разных профилей)
- Отсутствие общих cookies или хранилища между контекстами
Лучшие практики
-
Используйте отдельные профили для отдельных идентичностей. Хотя шумовые зерна создают вариации внутри профиля, отдельные профили обеспечивают наиболее сильную изоляцию отпечатков.
-
Всегда согласовывайте географию прокси с локалью. Японская локаль с US-прокси создает очевидное несоответствие.
-
Используйте отдельные директории данных пользователя. Каждый экземпляр нуждается в собственном
--user-data-dirдля предотвращения конфликтов данных профилей. -
Включайте защиту DNS и WebRTC глобально. Устанавливайте
--bot-local-dnsи--bot-webrtc-iceна каждом экземпляре для закрытия путей сетевых утечек. -
Закрывайте контексты, когда они больше не нужны. Открытые контексты потребляют память. Закрывайте их для освобождения ресурсов.
-
Не делитесь cookies между идентичностями. Каждая идентичность должна иметь собственное состояние cookies. Никогда не переносите cookies из одного контекста в другой.
Часто задаваемые вопросы
Сколько идентичностей я могу запускать одновременно? Жесткого ограничения нет. Поконтекстная изоляция в одном экземпляре браузера эффективна по памяти. На практике лимит зависит от доступной ОЗУ и сложности загруженных в каждом контексте страниц.
Могу ли я использовать один профиль для нескольких идентичностей?
Да, в сочетании с разными значениями --bot-noise-seed. Шумовое зерно изменяет шум отпечатков Canvas, WebGL и аудио, создавая различные идентичности из одного базового профиля.
Разделяют ли контексты кэш браузера? Нет. Каждый контекст имеет собственный кэш, cookies, localStorage и IndexedDB. Между контекстами нет обмена данными.
Что лучше использовать для мультиидентичных настроек, Playwright или Puppeteer? Playwright предоставляет нативную поддержку прокси на уровне контекста, что делает его лучшим выбором для мультиконтекстных настроек в одном экземпляре браузера. Puppeteer лучше работает с отдельными экземплярами браузера на каждую идентичность.
Могу ли я сохранять состояние идентичности между сессиями?
Да. Используйте --user-data-dir с постоянной директорией для сохранения cookies, кэша и хранилища между сессиями. Каждая идентичность должна использовать отдельную директорию.
Как обрабатывать разные бренды браузеров между идентичностями?
Используйте --bot-config-browser-brand для установки разных брендов на каждый экземпляр. См. Переключение бренда браузера для подробностей.
Защищает ли поконтекстная изоляция от снятия отпечатков GPU? BotBrowser контролирует сигналы WebGL и WebGPU через профили. Каждый профиль сообщает разные значения, связанные с GPU. Поконтекстная изоляция обеспечивает согласованность этих значений внутри каждого контекста.
Итоги
Изоляция мультиаккаунтного браузера требует независимости по сигналам отпечатков, сетевой идентичности, географическим метаданным и хранилищу. BotBrowser обеспечивает все это через свою систему профилей, поддержку прокси для каждого контекста и контроль отпечатков на уровне движка. Используете ли вы мультиконтекстный подход Playwright или мультиэкземплярный подход Puppeteer, каждая идентичность представляет полноценную, независимую среду браузера.
Для настройки прокси см. Настройка прокси и Динамическое переключение прокси. Для географической настройки см. Настройка часового пояса, локали и языка. Для идентичности бренда см. Переключение бренда браузера.
Похожие статьи
Переведите BotBrowser из исследований в продакшн
Используйте эти руководства, чтобы понять модель, а затем перейти к кроссплатформенной валидации, изолированным контекстам и масштабируемому браузерному развертыванию.