Capítulo 17b Cumplimiento, almacenamiento & operación Admin: #pArchiveSources

nextxch Archive: Microsoft 365, Exchange, Google Workspace e IMAP al archivo GoBD

nextxch Archive incorpora al archivo GoBD el correo de sistemas que no funcionan con nextxch. Hay cuatro tipos de fuente disponibles en el admin, en Cumplimiento > Fuentes de archivo: diario SMTP (informes de diario de Microsoft 365 y Exchange, regla de copia de Google Workspace, copias en CCO de cualquier MTA), IMAP (cualquier servidor, solo lectura), Microsoft 365 mediante Microsoft Graph y Google Workspace mediante la Gmail API. Cada buzón de la fuente se convierte en un buzón archivado sin inicio de sesión y sin tráfico de correo; la búsqueda, la retención legal, la exportación probatoria y la restauración funcionan en él igual que en sus propios buzones.

Consejo operativo y nota de arquitectura

Combinación recomendada: el diario SMTP para una captura continua y completa a partir de una fecha de corte (los usuarios no pueden eliminar nada antes de que se capture), más la fuente API una vez o con un intervalo largo para el correo existente y la vista de carpetas. Ambos escriben en el mismo archivo; un mensaje capturado dos veces se almacena una sola vez gracias a SHA-256. Licencia: los buzones archivados de otros sistemas son una partida de licencia aparte; sus propios buzones de nextxch no cuentan en ella. 10 buzones archivados son gratuitos en cada nivel, y con una licencia Business o Enterprise se añaden más.

1. Inicio rápido: crear una fuente de diario para Microsoft 365

Las fuentes nuevas se crean desactivadas. Pruebe la conexión y después active la fuente. El servidor genera la dirección de diario con un token secreto cuando solo se indica el dominio; su MX debe apuntar a nextxch.

Referencia / configuración
# 1. Admin > Compliance > Archive sources > New source, kind "SMTP journal"
#    Domains of the old environment: company.com · journal domain: archive.company.com
#    -> journal address e.g. journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com (copy it)
# 2. Protection: IP ranges of the Exchange Online servers, TLS required, allowed envelope senders
# 3. Microsoft Purview: Solutions > Data lifecycle management > Exchange (legacy) > Journal rules
#    or Exchange Online PowerShell:
Set-TransportConfig -JournalingReportNdrTo journal-ndr@archive.company.com
New-JournalRule -Name "nextxch Archive" -JournalEmailAddress journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com -Scope Global -Enabled $true
Get-JournalRule | Format-Table Name,Enabled,JournalEmailAddress,Scope
# 4. Send a test message: the source shows the original with all envelope recipients (including Bcc)

2. Diario desde Exchange on-premises y Google Workspace

Exchange on-premises: regla de diario con la misma dirección de diario (registro en diario premium, requiere la Exchange Enterprise CAL) o registro en diario estándar por base de datos de buzones hacia esa dirección; en un entorno híbrido, cree la regla también en el servidor Exchange on-premises. Google Workspace: una regla de enrutamiento añade la dirección de diario como destinatario adicional; no se necesita Google Vault. Con "Comprehensive mail storage" (almacenamiento completo del correo), el correo del relay SMTP y de los servicios de Google también llega a los buzones. Cualquier otro MTA envía copias en CCO a la dirección de diario.

Referencia / configuración
# Exchange Server (Exchange Management Shell)
New-JournalRule -Name "nextxch Archive" -JournalEmailAddress journal-k3x9q2m7v1c8b4n6z5ta@archive.company.com -Scope Global -Enabled $true

# Google Admin console: Menu > Apps > Google Workspace > Gmail > Routing > Configure
#   Messages to affect: inbound, outbound, internal inbound, internal outbound
#   Action: Modify message > Add more recipients > Advanced > journal address
#   Optional: do not deliver spam to this recipient, suppress bounces from this recipient
# Journal source in nextxch: format bcc or auto, IP ranges of Google's outbound servers, TLS required

3. IMAP: cualquier servidor, solo lectura

Las carpetas se abren con EXAMINE y el contenido se recupera con BODY.PEEK[]; los indicadores en el origen nunca cambian. Un cursor por carpeta (UIDVALIDITY, último UID, HIGHESTMODSEQ con CONDSTORE) se actualiza después de cada mensaje, y una interrupción se reanuda exactamente en ese punto. TLS es obligatorio (implícito o STARTTLS), opcionalmente con un certificado fijado (SHA-256); inicio de sesión con contraseña o XOAUTH2, una cuenta o una lista de cuentas. La papelera y el spam se omiten de forma predeterminada.

Referencia / configuración
{
  "host": "imap.oldhoster.com",
  "tls": "implicit",
  "auth": "password",
  "mode": "single",
  "username": "accounting@company.com",
  "address": "accounting@company.com",
  "excludeFolders": ["Drafts"],
  "since": "2016-01-01",
  "maxConnections": 2
}
# Secret: password (or oauthToken with xoauth2), in list mode accounts/<id>/password

4. Microsoft 365 mediante Microsoft Graph: registro de aplicación en Entra ID

La fuente lee el correo existente y el nuevo con consultas delta por carpeta, sin EWS (Microsoft retira EWS en Exchange Online). Permisos de aplicación en Microsoft Graph con consentimiento del administrador: Mail.Read y User.Read.All, GroupMember.Read.All solo con el filtro de usuarios "group". Inicio de sesión con un certificado (recomendado) o un secreto de cliente, nubes global, usgov, usgovdod y china. Se respeta la limitación (throttling) de Graph (429 con Retry-After) y una ejecución se reanuda en la última página procesada por completo. Los mensajes eliminados en el origen permanecen en el archivo. De forma opcional, RBAC for Applications de Exchange Online limita el acceso a un grupo.

Referencia / configuración
# Entra admin center > App registrations > New registration "nextxch Archive" (single tenant)
# API permissions > Microsoft Graph > Application permissions:
#   Mail.Read, User.Read.All (+ GroupMember.Read.All with group filter) > Grant admin consent
# Certificates & secrets: upload a certificate (.cer) or create a client secret
{
  "tenantId": "company.onmicrosoft.com",
  "clientId": "11111111-2222-3333-4444-555555555555",
  "credentialType": "certificate",
  "cloud": "global",
  "userFilter": { "mode": "group", "groupId": "99999999-0000-0000-0000-000000000009" },
  "sinceUtc": "2019-01-01T00:00:00Z"
}
# Secrets: certificatePfx (Base64) + certificatePassword or clientSecret (the value, not the ID)

5. Google Workspace mediante la Gmail API: cuenta de servicio y delegación en todo el dominio

Una cuenta de servicio en el propio proyecto de Google Cloud del cliente (las cuotas de Gmail se cuentan por proyecto) con la Gmail API y la Admin SDK API habilitadas. En la consola de administración, su ID de cliente numérico se autoriza para la delegación en todo el dominio con los ámbitos gmail.readonly y admin.directory.user.readonly, más admin.directory.group.member.readonly para el filtro "group". Importación inicial mediante messages.list y messages.get (raw), después sincronización del historial; si el historial ha caducado, la importación se reinicia y los mensajes ya archivados cuentan como duplicados. El presupuesto de cuota por usuario y proyecto es ajustable.

Referencia / configuración
# Admin console: Security > Access and data control > API controls > Domain-wide delegation
#   client ID (numeric) + scopes:
#   https://www.googleapis.com/auth/gmail.readonly,
#   https://www.googleapis.com/auth/admin.directory.user.readonly
{
  "adminSubject": "admin@company.com",
  "domain": "company.com",
  "userFilter": "orgUnit",
  "orgUnitPath": "/Sales",
  "sinceUtc": "2018-01-01T00:00:00Z",
  "quotaUnitsPerUserMinute": 4800
}
# Secret: serviceAccountKey (JSON key file of the service account)

6. Almacenamiento, retención WORM y retención legal

Cada buzón archivado tiene su propio almacén de solo archivo en el archivo GoBD. Por mensaje: dirección de contenido SHA-256 con deduplicación en todos los buzones, comprobación de duplicados por buzón mediante SHA-256 y Message-ID, retención WORM y retención legal de la fuente en el blob y en el mensaje, una cadena de hashes como prueba de manipulación y un índice de texto completo. El historial de cada ejecución cuenta los mensajes almacenados, duplicados y rechazados.

Referencia / configuración
Retention      RetentionDays 0..36500 (0 = no WORM retention)
Mode           Normal | Governance | Compliance (default)
Legal hold     per source, also applies to already archived messages
Storage        local or S3 with Object Lock (like the rest of the GoBD archive)
Status         per mailbox: last run, next run, stored, duplicates, rejected, errors

7. Búsqueda, exportación, restauración

Los buzones archivados pueden elegirse como ámbito propio en la búsqueda de cumplimiento (búsqueda en alemán con división de palabras compuestas, OCR en adjuntos, campos ZUGFeRD) y cada uno tiene en la lista botones de búsqueda, exportación probatoria y restauración. La exportación probatoria entrega un ZIP con los archivos .eml originales y un manifiesto firmado con Ed25519 (véase el capítulo 17a). La restauración copia en un buzón de nextxch y el archivo permanece sin cambios. La restauración de vuelta en Microsoft 365, Google o el servidor IMAP aún no está disponible; la exportación cubre ese caso. Búsqueda en todos los niveles, trabajos de exportación probatoria y restauración a partir de Business.

Referencia / configuración
# Search in an archived mailbox
curl -s "https://mail.company.com/api/compliance/search?archivedMailboxId=<id>&q=invoice&limit=100" -H "X-Api-Key: $KEY"

# Evidence export of an archived mailbox (202, status under GET /api/compliance/exports/{id})
curl -X POST https://mail.company.com/api/compliance/exports -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"scope":"mailbox","archivedMailboxId":"<id>","caseReference":"case 4711"}'

# Restore into a nextxch mailbox
curl -X POST https://mail.company.com/api/compliance/restore/jobs -H "X-Api-Key: $KEY" -H "Content-Type: application/json" \
  -d '{"source":"archive","account":"archived:<id>","target":"account","targetAccount":"successor@company.com"}'

8. API de administración: /api/admin/archive-sources

TenantAdmin dentro del propio inquilino, ServerAdmin en todas partes; el ComplianceAuditor lee (para elegir buzones archivados para búsqueda y exportación), pero nunca modifica nada. Kind es Journal, Imap, Microsoft365 o Google. La activación de un buzón por encima de la cuota de la licencia se rechaza con un mensaje que incluye la partida de licencia actual. Las fuentes de diario reciben por SMTP y no tienen ejecución (409 JOURNAL_IS_PUSHED).

Referencia / configuración
GET    /api/admin/archive-sources                          sources, licence line, available kinds with fields
GET    /api/admin/archive-sources/license                  used, allowed, free, remaining
POST   /api/admin/archive-sources                          create a source
GET    /api/admin/archive-sources/{id}                     source, mailboxes, names of the secrets
PUT    /api/admin/archive-sources/{id}                     change (settings, retention, legal hold, schedule)
DELETE /api/admin/archive-sources/{id}                     delete
POST   /api/admin/archive-sources/{id}/test                connection test
POST   /api/admin/archive-sources/{id}/discover            discover mailboxes
GET    /api/admin/archive-sources/{id}/mailboxes           archived mailboxes
PUT    /api/admin/archive-sources/{id}/mailboxes/{mbxId}   {"enabled": true} within the licence line
POST   /api/admin/archive-sources/{id}/run                 fetch now, optionally {"mailboxId": "..."}
GET    /api/admin/archive-sources/{id}/runs                history (mailboxId, limit)

curl -X POST https://mail.company.com/api/admin/archive-sources -H "X-Api-Key: $KEY" -H "Content-Type: application/json" -d '{
  "kind": "Journal", "name": "Microsoft 365 journal", "journalDomain": "archive.company.com",
  "settings": { "domains": ["company.com"], "allowedSenderNetworks": ["203.0.113.0/24"], "requireTls": true },
  "retentionDays": 3650, "lockMode": "Compliance" }'

Configuración, valores predeterminados y buenas prácticas

Ajuste / ubicación Descripción Valor predeterminado Buena práctica de producción
Journal: Domains (domains) Solo las direcciones de sobre de estos dominios y sus subdominios se convierten en buzones archivados (la primera vez que aparecen, mientras la detección automática esté activada). Los mensajes sin una dirección coincidente van al almacén "diario sin asignación" de la fuente, que no cuenta para la licencia. leer · automatische Erkennung an Introduzca todos los dominios del entorno anterior; de lo contrario, faltarán buzones en la asignación.
Journal: Schutz (allowedSenderNetworks, requireTls, allowedEnvelopeSenders) Direcciones IP o rangos CIDR permitidos de los servidores remitentes, aceptación solo mediante TLS (STARTTLS o implícito) y remitentes de sobre permitidos (dirección, *@dominio o dominio). Una dirección de diario requiere una lista de IP o un token secreto en su parte local (al menos 16 caracteres, generado por el servidor). keine IP-Liste · TLS aus · alle Absender Configure los rangos de IP del proveedor y exija TLS; conserve también el token.
Journal: Format (format) auto detecta un informe de diario por X-MS-Journal-Report; envelope fuerza el análisis como informe de Exchange o Microsoft 365, bcc trata cada mensaje como una copia (regla de copia de Google, otros MTA). auto Mantenga auto, salvo que un MTA envíe copias en CCO con sus propios encabezados.
Aufbewahrung (RetentionDays, LockMode) Retención WORM en días por fuente (de 0 a 36.500, 0 = sin retención WORM) con el modo Normal, Governance o Compliance. Se aplica al blob y al mensaje de cada correo archivado. Compliance Elija el plazo legal para cartas comerciales y documentos contables; Compliance no puede levantarse antes de que venza.
Legal Hold (LegalHold) Bloquea todos los mensajes de la fuente contra la eliminación, también más allá de la retención. Al activarla, la retención legal se aplica también a los mensajes ya archivados; cada cambio se registra en el registro de auditoría. aus Actívela en caso de litigio o auditoría y levántela solo cuando el departamento jurídico lo haya autorizado.
Zeitplan und Erkennung (ScheduleMinutes, AutoDiscover) Intervalo de recuperación de las fuentes API (IMAP, Microsoft 365, Google) de 5 minutos a 7 días; en un clúster solo recupera el líder. Las fuentes de diario reciben por SMTP y no tienen programación. 60 min Para la importación inicial de inquilinos grandes, inicie la ejecución manualmente y supervise el historial por buzón.
Geheimnisse (Secrets) Las contraseñas, los secretos de cliente, los certificados y las claves de cuentas de servicio se almacenan cifrados en el llavero del servidor. Son de solo escritura: las respuestas de la API contienen solo sus nombres, nunca los valores, y nunca aparecen en los registros. verschlüsselt Tenga en cuenta la caducidad del secreto de cliente y del certificado; la prueba de conexión informa de un secreto caducado.