AACsearch
Безопасность и соответствие

Рекомендации по безопасности

Лучшие практики использования AACsearch для защиты ваших данных, API-ключей и аккаунта.

Рекомендации по безопасности

Безопасность — это совместная ответственность. AACsearch обеспечивает инфраструктуру, защищённую по стандартам индустрии, а вы должны правильно использовать аккаунт и API-ключи.

Управление API-ключами

Никогда не коммитьте ключи в Git

КРИТИЧНО: API-ключи должны храниться в переменных окружения, а НЕ в коде.

Неправильно:

const apiKey = "ss_search_abc123def456";  // ❌ Не делайте так!
const response = await fetch('https://app.aacsearch.com/api/v1/search', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
});

Правильно:

const apiKey = process.env.AACSEARCH_API_KEY;  // ✓ Используйте переменные окружения
const response = await fetch('https://app.aacsearch.com/api/v1/search', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
});

Создавайте отдельные ключи для каждого сервиса

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

КлючСкопГде использоватьШаг
Публичный ключ поискаsearchНа клиенте, в браузере, в мобильном приложении1
Ключ импортаingestНа сервере при загрузке документов2
Админ-ключadminТолько на вашем личном компьютере, никогда на сервере3

Как создать специализированные ключи

  1. Откройте Поиск → API-ключи
  2. Нажмите Создать ключ
  3. Дайте ему имя (например, "Frontend Search" или "Import Worker")
  4. Выберите скоп: Search / Ingest / Admin
  5. Выберите индексы, к которым этот ключ имеет доступ (необязательно)
  6. Нажмите Создать
  7. Скопируйте ключ один раз и сохраните в .env.local

Заметка: ключ показывается только один раз при создании. Если вы потеряли ключ, создайте новый.

Ротация ключей

Каждые 3 месяца создавайте новые ключи и удаляйте старые:

# Создайте новый ключ
# (в панели AACsearch → API-ключи → Создать ключ)

# Обновите переменные окружения
echo "AACSEARCH_API_KEY=ss_search_new_key_here" >> .env.local

# Протестируйте, что новый ключ работает
curl -H "Authorization: Bearer ss_search_new_key_here" \
  https://app.aacsearch.com/api/v1/indexes

# Удалите старый ключ
# (в панели → API-ключи → Старый ключ → Удалить)

Если ключ скомпрометирован

Если вы случайно разместили ключ в публичном репозитории или выслали его кому-то:

  1. Немедленно удалите ключ — откройте API-ключи → Старый ключ → Удалить
  2. Создайте новый ключ — пройдите шаги выше
  3. Проверьте логи доступа — откройте Настройки → Аудит и посмотрите, был ли несанкционированный доступ
  4. Переиндексируйте критичные данные — если ключ был админ-ключом, пересоздайте индексы

Защита аккаунта

Установите сильный пароль

Используйте пароль, который:

  • ✓ Содержит заглавные буквы (A-Z), строчные (a-z), цифры (0-9) и спецсимволы (!@#$%^&*)
  • ✓ Имеет минимум 12 символов (желательно 16+)
  • ✓ Не совпадает с вашим именем, почтой или названием компании
  • ✓ Не был использован на других сайтах

Пример сильного пароля:

Tr0p1cal!Sunset#2025$AACsearch

Плохой пароль:

aacsearch123        ❌ Слишком простой
Password!           ❌ Слишком распространён

Используйте менеджер паролей (1Password, Bitwarden, Dashlane) чтобы генерировать и хранить пароли.

Включите двухфакторную аутентификацию (2FA)

2FA делает невозможным вход в аккаунт даже если кто-то узнает пароль.

  1. Откройте Настройки → Безопасность
  2. Найдите раздел Двухфакторная аутентификация
  3. Нажмите Включить 2FA
  4. Выберите метод:
    • Приложение-аутентификатор (рекомендуется) — Google Authenticator, Microsoft Authenticator, Authy
    • SMS (менее безопасно) — код по SMS
  5. Сохраните резервные коды в безопасном месте

Где хранить резервные коды:

  • ✓ В менеджере паролей
  • ✓ В зашифрованном файле на компьютере
  • ✓ На отпечатанной бумаге в сейфе
  • ✗ В открытом виде в облаке (Google Drive, Dropbox)

Проверяйте активные сессии

Если вы заметили подозрительную активность:

  1. Откройте Настройки → Безопасность → Активные сессии
  2. Посмотрите список всех устройств, с которых вы вошли
  3. Нажмите Выйти из сессии рядом с неизвестным устройством

Защита данных

Ограничивайте доступ сотрудников

  1. Откройте Настройки → Члены организации

  2. Создайте члены с разными правами:

    • Админ — полный доступ (только владелец)
    • Редактор — может создавать и редактировать индексы
    • Зритель — может только смотреть статистику и результаты поиска
    • Техподдержка — может отвечать на вопросы, но не может редактировать данные
  3. Удаляйте членов, которые больше не работают в компании

Используйте HTTPS везде

Убедитесь, что все запросы к API идут через HTTPS, а не HTTP:

# ✓ Правильно
curl https://app.aacsearch.com/api/v1/indexes

# ✗ Неправильно
curl http://app.aacsearch.com/api/v1/indexes  # ❌ Данные не зашифрованы

Логируйте все действия с индексами

Если нужен аудит того, кто и когда что делал:

  1. Откройте Настройки → Аудит
  2. Вы видите все действия: кто создал индекс, кто загрузил документы, кто изменил настройки
  3. Экспортируйте логи для анализа (если требуется по закону)

Безопасность на сервере (backend)

Никогда не делайте поиск напрямую с сервера клиента

Плохо:

// На клиенте (браузер)
const apiKey = "ss_search_...";  // ❌ API-ключ видна в исходном коде
const response = await fetch('https://app.aacsearch.com/api/v1/search', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
});

Хорошо:

// На клиенте (браузер)
const response = await fetch('https://your-domain.com/api/search', {
  method: 'POST',
  body: JSON.stringify({ query: 'кроссовки' })
});

// На сервере (Node.js, Python, Go)
const apiKey = process.env.AACSEARCH_API_KEY;  // Ключ в переменных окружения
const searchResponse = await fetch('https://app.aacsearch.com/api/v1/search', {
  headers: { 'Authorization': `Bearer ${apiKey}` }
});

Используйте переменные окружения

Правильно:

# .env.local (не коммитьте в Git!)
AACSEARCH_API_KEY=ss_search_abc123def456
AACSEARCH_ADMIN_KEY=ss_admin_xyz789uvw012
// code.js
const apiKey = process.env.AACSEARCH_API_KEY;

В GitHub Actions / CI-CD:

# .github/workflows/deploy.yml
- name: Deploy
  env:
    AACSEARCH_API_KEY: ${{ secrets.AACSEARCH_API_KEY }}
  run: npm start

Добавьте rate limiting на сервере

Если вы предоставляете публичный endpoint поиска, защитите его от DDoS:

// Express.js с express-rate-limit
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,  // 15 минут
  max: 100  // максимум 100 запросов за 15 минут
});

app.post('/api/search', limiter, async (req, res) => {
  // Ваш код поиска
});
# Django с django-ratelimit
from django_ratelimit.decorators import ratelimit

@ratelimit(key='ip', rate='100/15m')  # 100 запросов за 15 минут
def search(request):
    # Ваш код поиска

Валидируйте входные данные

Никогда не передавайте пользовательский ввод напрямую в AACsearch API:

// ❌ Плохо
app.post('/search', (req, res) => {
  const query = req.query.q;  // Опасно!
  fetch(`https://app.aacsearch.com/api/v1/search?query=${query}`, ...);
});

// ✓ Хорошо
const Joi = require('joi');

app.post('/search', (req, res) => {
  const { error, value } = Joi.object({
    query: Joi.string().max(500).required(),
    limit: Joi.number().max(100).default(20)
  }).validate(req.query);
  
  if (error) {
    return res.status(400).json({ error: error.message });
  }
  
  fetch(`https://app.aacsearch.com/api/v1/search`, {
    method: 'POST',
    body: JSON.stringify({ query: value.query, limit: value.limit })
  });
});

Безопасность фронтенда

Используйте публичные ключи поиска (read-only)

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

<div id="aac-search"></div>
<script 
  src="https://app.aacsearch.com/api/widget/widget.js"
  data-api-key="ss_search_..."  <!-- Публичный ключ, безопасно видна в браузере -->
  data-index-slug="products"
  data-container="#aac-search">
</script>

Публичный ключ поиска может:

  • ✓ Искать в индексе
  • ✓ Получать результаты

Публичный ключ НЕ может:

  • ✗ Загружать документы
  • ✗ Удалять документы
  • ✗ Менять конфигурацию
  • ✗ Смотреть API-ключи других

Используйте Content Security Policy (CSP)

Защитите от XSS-атак и инъекций скриптов:

<!-- Только в head, НЕ в виджете -->
<meta http-equiv="Content-Security-Policy" 
      content="script-src 'self' https://app.aacsearch.com; img-src 'self' data: https:;">

Это позволяет загружать скрипты только с вашего домена и aacsearch.com.

Мониторьте запросы в браузере

Используйте Developer Tools (F12) чтобы проверить запросы:

  1. Откройте F12 → Network
  2. Сделайте поиск в виджете
  3. Посмотрите запрос /api/v1/search
  4. Убедитесь:
    • ✓ Используется HTTPS (не HTTP)
    • ✓ Заголовок Authorization: Bearer ss_search_...
    • ✓ Отправляются только нужные данные (query, filters)
    • ✗ НЕ отправляются персональные данные пользователя (IP, email, phone)

Реагирование на инциденты

Если заметили неправомерный доступ

  1. Немедленно удалите скомпрометированный ключ — откройте API-ключи → Удалить
  2. Проверьте логи — откройте Настройки → Аудит и посмотрите время и дату неправомерного доступа
  3. Посмотрите, что было скачано — какие индексы и документы были доступны
  4. Пишите в поддержку — если это серьёзное нарушение, свяжитесь с security@aacsearch.com

Если потеряли пароль

  1. На странице входа нажмите Забыли пароль?
  2. Введите email
  3. Нажмите ссылку в письме (действительна 24 часа)
  4. Установите новый пароль
  5. Войдите с новым паролем

Если письмо не пришло:

  • Проверьте папку Спам
  • Подождите 5 минут
  • Пишите на support@aacsearch.com

Если потеряли 2FA-ключ

Если у вас больше нет доступа к authenticator-приложению:

  1. На странице входа нажмите Потеряли доступ к 2FA?
  2. Используйте один из резервных кодов (которые вы сохранили при включении 2FA)
  3. Установите новое 2FA-приложение
  4. Если резервных кодов нет, пишите на support@aacsearch.com

Соответствие стандартам

SOC 2 Type II

Мы прошли аудит SOC 2 Type II, который проверяет:

  • Security — защита от неправомерного доступа
  • Availability — сервис доступен 99.9% времени
  • Processing Integrity — данные не теряются и не повреждаются
  • Confidentiality — данные остаются конфиденциальными
  • Privacy — соблюдение законов о защите данных

Чек-лист безопасности

Перед запуском в production проверьте:

  • API-ключи хранятся в .env.local, не в коде
  • 2FA включена на аккаунте
  • Разные ключи для разных сервисов (search, ingest, admin)
  • Используется HTTPS везде (не HTTP)
  • Rate limiting на сервере
  • Валидация входных данных
  • Аудит логируется для критичных операций
  • Сотрудникам даны минимальные требуемые права

Помощь и поддержка

Если у вас есть вопросы о безопасности:

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

Q: Нужна ли мне 2FA?
A: Это рекомендуется, особенно если у вас админ-доступ или вы храните критичные данные.

Q: Как часто я должен менять пароль?
A: Если он сильный и уникальный, менять не нужно. Только если заметили подозрительную активность или скомпрометирован.

Q: Можно ли хранить API-ключ в .env файле в Git?
A: Нет. Добавьте .env.local в .gitignore и храните ключи только локально или в CI-CD секретах.

Q: Что если я случайно разместил ключ в публичном repo?
A: Немедленно удалите ключ из AACsearch, создайте новый и очистите Git историю (используйте git filter-branch или BFG Repo-Cleaner).

On this page

Рекомендации по безопасностиУправление API-ключамиНикогда не коммитьте ключи в GitСоздавайте отдельные ключи для каждого сервисаКак создать специализированные ключиРотация ключейЕсли ключ скомпрометированЗащита аккаунтаУстановите сильный парольВключите двухфакторную аутентификацию (2FA)Проверяйте активные сессииЗащита данныхОграничивайте доступ сотрудниковИспользуйте HTTPS вездеЛогируйте все действия с индексамиБезопасность на сервере (backend)Никогда не делайте поиск напрямую с сервера клиентаИспользуйте переменные окруженияДобавьте rate limiting на сервереВалидируйте входные данныеБезопасность фронтендаИспользуйте публичные ключи поиска (read-only)Используйте Content Security Policy (CSP)Мониторьте запросы в браузереРеагирование на инцидентыЕсли заметили неправомерный доступЕсли потеряли парольЕсли потеряли 2FA-ключСоответствие стандартамSOC 2 Type IIЧек-лист безопасностиПомощь и поддержкаЧасто задаваемые вопросы