Настройте доступ
В разделе аудита организации уполномоченный администратор создаёт входящий источник и сохраняет его ключ и одноразовый секрет. Исходящие SIEM-направления настраиваются отдельно с проверкой и активацией в кабинете. Доступ для входящих событий не разрешает административные запросы.
Маршрут кабинета: /organizations/:organizationId/audit → Контроль → Входящие источники или назначения SIEM. Требуется organization.audit.siem.manage; для просмотра — organization.audit.siem.view.
Первый успешный сценарий
Выполните шаги по порядку. Откройте каждый метод для точного тела, обязательных заголовков и схемы ответа.
- Подготовьте 1–500 OCSF JSON-событий в UTF-8 NDJSON, по одному объекту на строку, в пределах 2 МБ.
- Подпишите Unix-секунды + "." + точное исходное тело декодированным 32-байтовым секретом источника.
- Передайте пакет в events организации и источника; сохраните идентификатор принятого пакета и счётчики.
Состояния, повторы и восстановление
Не разбирайте и не сериализуйте тело заново после подписи. Повторная подпись возвращает 409 AUDIT_INGRESS_REPLAY. События проверяются до сохранения; недоступный источник или невозможность расшифровать секрет блокируют приём. SIEM использует отдельно настроенный транспорт, а не входящий протокол подписи.
Приём исходящих пакетов SIEM
После создания назначения проверьте подключение и активируйте проверенную ревизию. Сервер получателя принимает сжатый gzip пакет NDJSON OCSF 1.8.0: Content-Type application/x-ndjson, Content-Encoding gzip. Заголовки X-Hallify-Batch-Id и Idempotency-Key содержат идентификатор пакета; X-Hallify-OCSF-Version — версию 1.8.0.
Проверяйте X-Hallify-Content-SHA256 и HMAC-SHA256 X-Hallify-Signature над точными сжатыми байтами до распаковки. Обе величины передаются в hex; выданный base64url-секрет декодируется в 32 байта. В этом протоколе нет префикса времени. Сохраняйте пакет идемпотентно по его идентификатору, затем подтверждайте успешный приём.
Повторяемые HTTP-статусы: 408, 429 и 5xx. Числовой Retry-After ограничен одним часом; иначе применяется экспоненциальная случайная задержка с потолком 15 минут. Для диагностики используйте состояние назначения и доставки в Audit. Этот исходящий протокол не совпадает с подписью входящих событий.
import { createHash, createHmac, timingSafeEqual } from 'node:crypto';
export function verifySiemBatch(compressedBytes, contentHash, signature) {
const validMetadata = /^[0-9a-f]{64}$/.test(contentHash)
&& /^[0-9a-f]{64}$/.test(signature);
if (!validMetadata) return false;
const secret = Buffer.from(process.env.HALLIFY_SIEM_SECRET, 'base64url');
if (secret.length !== 32) return false;
const expectedHash = createHash('sha256').update(compressedBytes).digest();
const expectedSignature = createHmac('sha256', secret).update(compressedBytes).digest();
return timingSafeEqual(Buffer.from(contentHash, 'hex'), expectedHash)
&& timingSafeEqual(Buffer.from(signature, 'hex'), expectedSignature);
}