Skip to content

mimecast: make CEL the default input, deprecate HTTP JSON - #20356

Merged
efd6 merged 5 commits into
elastic:mainfrom
efd6:20296-mimecast
Aug 6, 2026
Merged

mimecast: make CEL the default input, deprecate HTTP JSON#20356
efd6 merged 5 commits into
elastic:mainfrom
efd6:20296-mimecast

Conversation

@efd6

@efd6 efd6 commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Proposed commit message

mimecast: make CEL the default input, deprecate HTTP JSON

Make the CEL (v2 API) input the default for all data streams by
listing it first and enabling it. The HTTP JSON (v1 API) input is
now disabled by default and marked as deprecated in stream titles,
descriptions, and documentation.

Mimecast API 1.0 is end-of-life (ability to create new applications
ends December 2026). Existing policies with HTTP JSON enabled are
unaffected; the stream definitions remain present for users who have
not yet migrated to v2 API credentials.

Also enables the two CEL-only data streams (cloud_integrated_logs,
message_release_logs) by default. They were previously disabled
with no alternative.

Note

The HTTP JSON input config options will be removed when the Mimecast v1 API endpoints actually reach EOL.

Checklist

  • I have reviewed tips for building integrations and this pull request is aligned with them.
  • I have verified that all data streams collect metrics or logs.
  • I have added an entry to my package's changelog.yml file.
  • I have verified that Kibana version constraints are current according to guidelines.
  • I have verified that any added dashboard complies with Kibana's Dashboard good practices

Author's Checklist

  • [ ]

How to test this PR locally

Related issues

Screenshots

@efd6 efd6 self-assigned this Jul 27, 2026
@efd6 efd6 added enhancement New feature or request Integration:mimecast Mimecast Team:Security-Service Integrations Security Service Integrations team [elastic/security-service-integrations] labels Jul 27, 2026
@efd6
efd6 force-pushed the 20296-mimecast branch from b6a12d9 to 7e9b9bd Compare July 27, 2026 04:10
@github-actions

github-actions Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Elastic Docs Style Checker (Vale)

Summary: 1 suggestion found

💡 Suggestions (1): Optional style improvements. Apply when helpful.
File Line Rule Message
packages/mimecast/changelog.yml 7 Elastic.WordChoice Consider using 'deactivated, deselected, hidden, turned off, unavailable' instead of 'disabled', unless the term is in the UI.

The Vale linter checks documentation changes against the Elastic Docs style guide. To use Vale locally or report issues, refer to Elastic style guide for Vale.

@elastic-vault-github-plugin-prod

elastic-vault-github-plugin-prod Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

🚀 Benchmarks report

To see the full report comment with /test benchmark fullreport

@efd6
efd6 marked this pull request as ready for review July 27, 2026 05:06
@efd6
efd6 requested review from a team as code owners July 27, 2026 05:06
@infra-vault-gh-plugin-prod

Copy link
Copy Markdown

Pinging @elastic/security-service-integrations (Team:Security-Service Integrations)

@jamiehynds

Copy link
Copy Markdown

@efd6 do we have the ability to completely hide the http json/deprecated Mimecast API for any user who doesn't currently have that input/data stream enabled? If not, is that something the Fleet team would have to implement?

@nimarezainia for context, as we rethink onboarding I'm trying to avoid cases like this where we show deprecated inputs/datastreams even for new users of the integration. Would be much cleaner if we can just hide/remove these rather than users being presented with all sorts of deprecated options.

@andrewkroh andrewkroh added the documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. label Jul 27, 2026
@ShourieG

Copy link
Copy Markdown
Contributor

@vera-review-bot review

# newer versions go on top
- version: "3.5.0"
changes:
- description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: high path: packages/mimecast/changelog.yml:4

The 3.5.0 changelog entry only describes the CEL/HTTPJSON default swap, but this PR also drops enabled: false from the cloud_integrated_logs and message_release_logs streams, so those two data streams now start collecting on a fresh install. Please mention that in the changelog.

Details

The diff removes enabled: false from the single cel stream in both packages/mimecast/data_stream/cloud_integrated_logs/manifest.yml and packages/mimecast/data_stream/message_release_logs/manifest.yml. A stream with no enabled key defaults to enabled, so both data streams are now on by default for new installs of the integration.

The PR's own proposed commit message calls this out ("Also enables the two CEL-only data streams (cloud_integrated_logs, message_release_logs) by default"), but the changelog entry does not. The changelog is the user-facing record of what a version change does, and enabling two data streams that previously collected nothing is a visible behaviour change: cloud_integrated_logs polls /siem/v1/batch/events/ci and siem_logs polls /siem/v1/batch/events/cg, so operators need to know both are now scheduled.

Note that cloud_integrated_logs/manifest.yml and message_release_logs/manifest.yml contain only deletions in this diff, so the changelog is the only in-diff place this can be recorded.

Recommendation:

Extend the 3.5.0 entry so the data stream enablement is recorded alongside the input change:

- version: "3.5.0"
  changes:
    - description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356
    - description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

]
},
"source": {
"ip": "54.236.186.184"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/data_stream/siem_logs/sample_event.json:73

The regenerated sample events replace previously sanitised placeholders (example.com, 8.8.8.8) with routable public IPs and personal-name mailboxes at non-reserved domains. Please re-anonymise them to RFC 5737 addresses and example.com.

Details

The anonymisation conventions for committed fixtures are RFC 5737 ranges (192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) for IPv4 and the reserved example.com/example.org/example.net domains for hosts and mailboxes. Several sample events regress against that in this diff, replacing values that were already compliant:

  • siem_logs/sample_event.json: adds source.ip / related.ip 54.236.186.184 (a routable, publicly allocated address), and replaces johndoe@​example.com and o365_service_account@​example.com with personal-name mailboxes at demo-int.elastic.mime-api.com and pacific-concept.b41.one.
  • ttp_url_logs/sample_event.json (lines 90 and 101): replaces 8.8.8.8 with 54.243.138.179 and johndoe@​example.com / googlealerts-noreply@​google.com with personal-name mailboxes at thejunglegroup.b41.one and demo-int.elastic.mime-api.com.
  • dlp_logs/sample_event.json and ttp_ap_logs/sample_event.json: same substitution of example.com mailboxes for personal-name addresses at non-reserved domains.

The same values are mirrored into packages/mimecast/docs/README.md, so they are rendered on the public integration documentation page. These files are regenerated from the mock service under _dev/deploy/docker/files/, so the durable fix is in the mock fixtures rather than by hand-editing the generated sample events.

Recommendation:

Sanitise the mock fixtures so regeneration produces compliant values, e.g. for the siem_logs sender IP:

{
    "source": {
        "ip": "203.0.113.18"
    },
    "related": {
        "user": [
            "chris.germany@​example.com",
            "dkinney@​example.org"
        ]
    }
}

Apply the same mapping consistently (one original value -> one placeholder) across siem_logs, ttp_url_logs, dlp_logs and ttp_ap_logs, then re-run the system tests so sample_event.json and docs/README.md are regenerated rather than edited.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

ID`, `Access Key`, and `Secret Key`) should be provided by a Mimecast
representative for this integration. Under `Advanced options` you can set the
time interval between two API requests as well as the API URL. A Mimecast
Authorization parameters for the Mimecast API (`Client ID` and `Client Key`) should

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🔵 Low confidence: medium path: packages/mimecast/_dev/build/docs/README.md:14

The v2 section, now the primary configuration instructions, tells users to obtain a Client Key, but the field the UI actually presents is Client Secret. Rename it in the docs so it matches the manifest.

Details

packages/mimecast/manifest.yml declares the v2 credential pair as client_id (title Client ID for v2 API Endpoints) and client_secret (title Client Secret for v2 API Endpoints). The README text names them Client ID and Client Key, so the second field does not match anything a user sees in Fleet.

This wording predates the PR, but the PR promotes this paragraph from the secondary section to the primary onboarding instructions for the now-default input, so it is the first thing a new user reads. The same text is mirrored into the generated packages/mimecast/docs/README.md, which is also in this changeset.

Recommendation:

Match the manifest field titles:

### v2 API Endpoints

Authorization parameters for the Mimecast API (`Client ID` and `Client Secret`) should
be provided by a Mimecast representative for this integration. Under `Advanced options`
you can set the time interval between two API requests as well as the API URL. A Mimecast
representative should also be able to give you this information in case you need
to change the defaults.

Then re-run elastic-package build so packages/mimecast/docs/README.md picks up the change.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Comment thread packages/mimecast/docs/README.md Outdated
ID`, `Access Key`, and `Secret Key`) should be provided by a Mimecast
representative for this integration. Under `Advanced options` you can set the
time interval between two API requests as well as the API URL. A Mimecast
Authorization parameters for the Mimecast API (`Client ID` and `Client Key`) should

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟠 High confidence: high path: packages/mimecast/docs/README.md:14

The generated docs/README.md still says Client Key while the source template _dev/build/docs/README.md now says Client Secret - the README was not rebuilt, so run elastic-package build and commit the regenerated file.

Details

packages/mimecast/docs/README.md is generated from packages/mimecast/_dev/build/docs/README.md by elastic-package build. Line 14 of the source template was updated in this PR to read Client Secret (matching the client_secret var in the root manifest), but line 14 of the generated file still reads Client Key. The generated copy therefore diverges from its own source, and it is the copy users actually read. CI rebuilds the package and asserts the working tree is clean, so this divergence fails the build check.

Recommendation:

Regenerate the docs so the built README matches the template:

cd packages/mimecast
elastic-package build

After the rebuild, line 14 of packages/mimecast/docs/README.md should read:

Authorization parameters for the Mimecast API (`Client ID` and `Client Secret`) should
be provided by a Mimecast representative for this integration. Under `Advanced options`
you can set the time interval between two API requests as well as the API URL. A Mimecast
representative should also be able to give you this information in case you need
to change the defaults.

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Comment thread packages/mimecast/docs/README.md Outdated
"subject": "Undelivered Mail Returned to Sender",
"from": {
"address": [
"webmaster@empirepartners.b41.one"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟠 High confidence: high path: packages/mimecast/docs/README.md:397

All 11 sample events embedded in the generated docs/README.md predate the anonymisation pass and still contain the old mock addresses/domains, so the published docs leak the values this PR scrubbed everywhere else - rebuild the package docs from the current sample_event.json files.

Details

The event.ingested stamps show the README was built from an earlier system-test run than the committed sample events: every event block in docs/README.md carries an ingested value between 2026-07-27T03:45Z and 04:02Z, while all 11 data_stream/*/sample_event.json files carry 21:30Z-21:46Z. The later run is the anonymised one, so the generated README was never refreshed after it.

Concretely, data_stream/dlp_logs/sample_event.json now holds webmaster@​example.org / vkamins@​example.com / <...@​mail.example.net>, but docs/README.md lines 397-417 still hold webmaster@​empirepartners.b41.one, vkamins@​demo-int.elastic.mime-api.com and <ae9f2f0678ed116f-152138@​hapi.b41.one>. The same staleness affects the other data streams - e.g. the archive_search block still shows [User : dhamilton@​mimecast.local] where data_stream/archive_search_logs/sample_event.json shows [User : user1@​example.net].

This has two consequences: the generated file no longer matches its inputs, which fails the repo's post-build clean-tree check; and the pre-anonymisation addresses and domains that this PR deliberately removed from _dev/deploy/docker/files/config.yml and from every sample_event.json remain in the published documentation.

Recommendation:

Rebuild the package so the README picks up the current sample events, then verify no pre-anonymisation values survive:

cd packages/mimecast
elastic-package build
grep -nE 'mime-api\.com|b41\.one|hamilton321|mimecast\.local' docs/README.md

The grep should return nothing, and each event block in docs/README.md should match its data stream's sample_event.json byte for byte, e.g. for dlp:

    "email": {
        "direction": "inbound",
        "from": {
            "address": [
                "webmaster@​example.org"
            ]
        },
        "message_id": "<ae9f2f0678ed116f-152138@​mail.example.net>",
        "subject": "New CERA.com Coming Soon! - CERA Alert",
        "to": {
            "address": [
                "vkamins@​example.com"
            ]
        }
    },

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

@efd6
efd6 force-pushed the 20296-mimecast branch from 005f16a to 6dd99a5 Compare July 27, 2026 23:02
required: true
show_user: false
default: 5m
- name: initial_interval

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: high path: packages/mimecast/data_stream/siem_logs/manifest.yml:17

initial_interval is now a user-facing option on the default siem_logs stream but the CEL program ignores it — either wire look_back into the request or drop the variable.

Details

This PR promotes the CEL stream to be the default for siem_logs, which brings initial_interval (described as "Initial interval for the first API call. Defaults to 24 hours") with it as a required: true option.

The CEL program does not use it. data_stream/siem_logs/agent/stream/cel.yml.hbs sets look_back: {{initial_interval}}, start_field: dateRangeStartsAt and end_field: dateRangeEndsAt into state (lines 14-17), but the program body never reads state.look_back, state.start_field or state.end_field. The only place a date range is built is the batch-list request, which reads state.?start / state.?end — keys the template never populates:

?"dateRangeStartsAt": state.?start.optMap(start, [start.format("2006-01-02")]),
?"dateRangeEndsAt": state.?end.optMap(end, [end.format("2006-01-02")]),

So on a first run the request carries no date range at all and Mimecast returns its own default window (the program comment on lines 38-42 says that is the "full 7-day window"), regardless of what the user sets. Setting initial_interval: 1h collects seven days; setting 168h collects the same seven days.

The other nine data streams do consume it (state.start_field: state.?cursor.last.orValue((now - duration(state.look_back))...)), so the inconsistency is specific to the two streams that share the batch program: siem_logs and cloud_integrated_logs (whose cel.yml.hbs has the identical unused look_back/start_field/end_field keys). Because cloud_integrated_logs is also being enabled by default here, both default-on batch streams expose an option that does nothing.

Recommendation:

Either populate the date range from look_back so the option takes effect on the first poll:

// in the batch-list request, replace the state.?start / state.?end lookups
state.url.trim_right("/") + state.path + "?" + {
  "type": [work_list[0].type],
  ?"nextPage": work_list[0].?next.optMap(next, [next]),
  "dateRangeStartsAt": [
    state.?cursor.last.orValue((now - duration(state.look_back)).format("2006-01-02"))
  ],
  ?"pageSize": state.?page_size.optMap(size, [string(int(size))]),
}.format_query()

or, if the batch API is intentionally left to its own default window, drop the dead keys from the template and remove the variable from the manifest so the UI does not advertise a setting that has no effect:

# data_stream/siem_logs/agent/stream/cel.yml.hbs
state:
  client_id: {{client_id}}
  client_secret: {{client_secret}}
  page_size: {{batch_size}}
  path: /siem/v1/batch/events/cg

Apply the same change to data_stream/cloud_integrated_logs/agent/stream/cel.yml.hbs and its manifest.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is pre-existing.

be provided by a Mimecast representative for this integration. Under `Advanced options`
you can set the time interval between two API requests as well as the API URL. A Mimecast
> **Deprecated:** Mimecast API 1.0 is [end-of-life](https://mimecastsupport.zendesk.com/hc/en-us/articles/43572890309651-API-Integrations-API-1-0-End-of-Life-Project-Extension-Aug-2025).
> New installations should use the v2 API. Existing v1 configurations continue

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/_dev/build/docs/README.md:25

The new deprecation note should also tell existing v1 users what happens at cutover — the httpjson streams are now off by default and switching a stream to CEL re-collects the last initial_interval of events.

Details

The note says "Existing v1 configurations continue to work", which is accurate for policies that are simply upgraded, but it omits the two things a v1 user actually needs to know once this ships:

  1. The v1 streams are now disabled by default. Every data stream manifest now carries enabled: false on its httpjson stream (e.g. data_stream/siem_logs/manifest.yml:100). A user who reads this section on a fresh install, enters the four v1 credentials and saves will collect nothing until they also enable each ... (deprecated) stream by hand.

  2. Migrating a stream from httpjson to CEL replays data. The CEL and httpjson streams keep independent cursors, so enabling CEL on a stream that has been running on httpjson starts from a fresh CEL cursor. For the nine non-batch streams that is now - initial_interval, default 24h (state.start_field: state.?cursor.last.orValue((now - duration(state.look_back))...) in each cel.yml.hbs), so the cutover re-ingests roughly a day of already-collected events; for siem_logs it is whatever window the Mimecast batch API defaults to. Linked issue 20296 calls this out explicitly ("Switching existing users off HTTPJSON can reset cursors and cause gaps or duplicates at cutover ... plus a documented deprecation path").

Both points belong in this block since it is the only migration guidance in the README.

Recommendation:

Extend the deprecation blockquote with the cutover details:

> **Deprecated:** Mimecast API 1.0 is [end-of-life](https://mimecastsupport.zendesk.com/hc/en-us/articles/43572890309651-API-Integrations-API-1-0-End-of-Life-Project-Extension-Aug-2025).
> New installations should use the v2 API. The v1 (HTTP JSON) streams are now
> disabled by default; to keep using them, enable the `... (deprecated)` stream
> on each data stream you need. Existing v1 configurations continue to work but
> will stop functioning when Mimecast retires API 1.0 application credentials.
> See the [API 1.0 to 2.0 Migration Guide](https://developer.services.mimecast.com/api-1-0-to-2-0-migration-guide)
> for details on provisioning v2 API credentials.
>
> **Migrating a data stream from v1 to v2:** the v1 and v2 streams track
> collection position independently, so enabling the v2 stream starts a fresh
> cursor at `now - Initial Interval` (default `24h`) and re-collects events
> already ingested via v1. Lower `Initial Interval` before the cutover to
> reduce the overlap, or accept the duplicates and de-duplicate downstream.

Run elastic-package build afterwards so docs/README.md is regenerated.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I do not think this would add any value.

- description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.
type: enhancement
link: https://github.com/elastic/integrations/pull/20356
- description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/changelog.yml:7

Enabling cloud_integrated_logs by default puts it alongside siem_logs, but the two target different Mimecast products — consider leaving it opt-in or documenting which tenants should turn it on.

Details

data_stream/siem_logs/agent/stream/cel.yml.hbs:15 collects from /siem/v1/batch/events/cg and data_stream/cloud_integrated_logs/agent/stream/cel.yml.hbs:15 collects from /siem/v1/batch/events/ci — the Cloud Gateway and Cloud Integrated batch endpoints. The package's own docs reinforce the split: the Cloud Integrated section of _dev/build/docs/README.md:68 links to Mimecast's threatssecurityeventsanddataforci reference. A tenant is normally entitled to one of these two products, which is presumably why cloud_integrated_logs shipped with enabled: false while the Gateway streams were on.

With this change both are on by default, so on a typical install one of the two runs permanently against an endpoint the tenant is not entitled to. The shared batch program treats a non-200/403/404 response as terminal ("events": {"error": {...}}, "want_more": false), so that stream emits an error event on every interval (default 5m) indefinitely.

message_release_logs is a Gateway feature and does not have this problem — enabling it by default is fine.

Note I could not reach Mimecast's developer docs to confirm the entitlement model (the host is not on the fetch allowlist), so this is flagged as a judgement call rather than a certainty; if hybrid Gateway + Cloud Integrated tenants are common, defaulting both on is defensible and only the docs gap remains.

Recommendation:

Either restore the opt-in default for the Cloud Integrated stream:

# packages/mimecast/data_stream/cloud_integrated_logs/manifest.yml
streams:
  - input: cel
    template_path: cel.yml.hbs
    title: Cloud Integrated logs
    enabled: false
    description: Collect Cloud Integrated Logs

or keep it enabled and add the guidance to _dev/build/docs/README.md next to the Cloud Integrated section:

### Cloud Integrated Logs

> Enable this data stream only if your tenant uses Mimecast Email Security,
> Cloud Integrated. Cloud Gateway tenants should use **SIEM Logs** instead and
> leave this data stream disabled — the Cloud Integrated endpoint will return
> errors for a Gateway-only tenant.

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This would diminish the value of the change here; to give a uniform entry.

{"_offset":74369,"_partition":60,"taggedExternal":"true","taggedMalicious":"false","accountId":"CUSB4A274","aggregateId":"Zyc2YQp5NiebreJzicSY0g_1731827123","messageId":"<69b360ac6c02441e-173123@hapi.b41.one>","processingId":"rdbUbf7dO9buFz-hm-jV4eMdfFO2Qnu6iZy__ONwPng_1731827848","recipients":"max.yzaguirre@demo-int.elastic.mime-api.com","route":"Inbound","senderDomain":"arcadia-group.b41.one","senderEnvelope":"nikep@arcadia-group.b41.one","senderHeader":"nikep@arcadia-group.b41.one","senderIp":"81.2.69.144","subject":"Weekly Report","subtype":null,"timestamp":1731827851036,"type":"spam"}
{"_offset":75400,"_partition":60,"accountId":"CUSB4A274","aggregateId":"avtest1_1731500000","emailSize":"1234","fileExtension":"zip","fileName":"eicar.zip","md5":"40be8f71c7eb6fc53bba6e2edc1c5af2","messageId":"<test-av-1@hapi.b41.one>","processingId":"avtest1_proc_1731500000","recipients":"bob@demo-int.elastic.mime-api.com","route":"inbound","senderDomain":"evaluation-fuzz.b41.one","senderDomainInternal":"false","senderEnvelope":"alice@evaluation-fuzz.b41.one","senderIp":"81.2.69.144","sha1":"22fd3d86d8ec05c28d42fab2b765ba4e89147552","sha256":"f99da86bb6bd89416ff53fed876f48330fd8b9505a456d9968ae1321e331babb","subject":"Test AV Detection","subtype":null,"timestamp":1731500100000,"type":"av","virusFound":"Malware detected by AV Scan policy: Eicar-Test-Signature"}
{"_offset":75401,"_partition":60,"accountId":"CUSB4A274","aggregateId":"avtest2_1731600000","emailSize":"5678","fileExtension":"pdf","fileName":"document.pdf","md5":"d41d8cd98f00b204e9800998ecf8427e","messageId":"<test-av-2@demo-int.elastic.mime-api.com>","processingId":"avtest2_proc_1731600000","recipients":"carol@demo-int.elastic.mime-api.com","route":"internal","senderDomain":"demo-int.elastic.mime-api.com","senderDomainInternal":"true","senderEnvelope":"dave@demo-int.elastic.mime-api.com","senderIp":"10.108.135.241","sha1":"da39a3ee5e6b4b0d3255bfef95601890afd80709","sha256":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","subject":"Internal Document","subtype":null,"timestamp":1731600200000,"type":"av","virusFound":null}
{"Hostname":"mail.example.net","_offset":70901,"_partition":60,"accountId":"CUSB4A274","aggregateId":"x0J66B7HOZCFDsdRtjBrdg","delivered":"true","deliveryAttempts":"1","deliveryErrors":null,"deliveryTime":"1633","destinationIp":"81.2.69.144","direction":"Internal","emailSize":"31363","messageId":"<27856769-1731451446596@usb-mta-24.usb.mimecast.lan>","numberAttachments":"0","processingId":"LcoZUvowTgh0_A1V-OdChmPWPlyI1gOurfQRUFoRMZk","recipients":"veronica.espinoza@example.com","rejectionCode":null,"rejectionInfo":null,"rejectionType":null,"route":"Accept and drop messages","senderEnvelope":"postmaster@example.com","subject":"We found suspicious files in a message","subtype":"true","timestamp":1731451448010,"tlsCipher":null,"tlsUsed":"No","tlsVersion":null,"totalSizeAttachments":"0","type":"delivery"}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🔵 Low confidence: medium path: packages/mimecast/data_stream/siem_logs/_dev/test/pipeline/test-siem-v2-logs.log:11

The re-anonymised SIEM fixture still carries Mimecast internal MTA hostnames and real-looking personal names in the local part — replace those too for consistency with the rest of the pass.

Details

This pass replaced the customer-identifying domains (hamilton321.net, b41.one, demo-int.elastic.mime-api.com) with example.com / example.net / example.org, which is the important part. Two classes of value were left behind on the rewritten lines:

  • Internal MTA hostnames inside messageId. Line 11 sets "Hostname":"mail.example.net" but the same record keeps "messageId":"<27856769-1731451446596@​usb-mta-24.usb.mimecast.lan>". Other rewritten lines keep usb-mta-10, usb-mta-22, usb-mta-26, usb-mta-40, and _dev/deploy/docker/files/config.yml keeps us-mta-167.us.mimecast.lan. The result is internally inconsistent — the envelope host is synthetic while the Message-ID host is not.
  • Personal-name local parts. veronica.espinoza@​example.com, richard.costigan@​example.com, coo.jeff@​example.com and dl-ga-all_enron_worldwide1@​example.com still name individuals; anonymising only the domain does not remove that. config.yml also retains "searchText":"example.org AND !Devin" where the domain was substituted but the personal name was not.

This is cosmetic rather than functional — the fixtures and their -expected.json are internally consistent and the pipeline tests will pass either way.

Recommendation:

Substitute the remaining hostnames and local parts, keeping the record shape identical:

{"Hostname":"mail.example.net","messageId":"<27856769-1731451446596@​mta-24.example.net>","recipients":"user2@​example.com","senderEnvelope":"postmaster@​example.com","type":"delivery"}

and in _dev/deploy/docker/files/config.yml:

# searchText: "example.org AND !Devin"  ->
searchText: "example.org AND !user3"

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Names here are Mimecast test environment names.

@efd6
efd6 force-pushed the 20296-mimecast branch 2 times, most recently from b9d81af to 2eb8b20 Compare July 28, 2026 23:05
@@ -1,9 +1,12 @@
# newer versions go on top
- version: "3.5.0"
- version: "3.6.0"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟠 High confidence: high path: packages/mimecast/changelog.yml:2

This edits the existing 3.5.0 changelog entry into 3.6.0 instead of adding a new entry, so the released 3.5.0 version and its 'Set elastic owner type' change (PR 20381) disappear from the history. Add a new 3.6.0 block above the untouched 3.5.0 block.

Details

On main the top of packages/mimecast/changelog.yml is:

I fetched the default-branch copy to confirm this. This PR rewrites that same block in place: the version string is changed to 3.6.0 and the single 3.5.0 change entry is replaced with the two new entries. The result is a changelog that goes 3.6.0 -> 3.4.4, with no 3.5.0 entry at all.

3.5.0 is already published, so its entry must remain. Removing it loses the record of the owner-type change and breaks the contiguous version history that the changelog is meant to provide.

Recommendation:

Keep the 3.5.0 block intact and prepend a new 3.6.0 block:

# newer versions go on top
- version: "3.6.0"
  changes:
    - description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356
    - description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356
- version: "3.5.0"
  changes:
    - description: Set 'elastic' owner type.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20381
- version: "3.4.4"
  changes:
    - description: Apply grace period to threat intel feed end timestamp to avoid Mimecast API rejecting requests due to clock skew.
      type: bugfix
      link: https://github.com/elastic/integrations/pull/20001

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

type: enhancement
link: https://github.com/elastic/integrations/pull/20381
link: https://github.com/elastic/integrations/pull/20356
- description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: low path: packages/mimecast/changelog.yml:7

Enabling cloud_integrated_logs by default means every new install polls both the Cloud Integrated and Cloud Gateway batch endpoints, and a tenant provisioned for only one will get continuous error events from the other. Consider leaving cloud_integrated_logs disabled by default, or documenting which one to turn off.

Details

cloud_integrated_logs and siem_logs share one CEL program (the program comment in both cel.yml.hbs files says so explicitly). They differ only in state.path: siem_logs uses /siem/v1/batch/events/cg (Cloud Gateway) and cloud_integrated_logs uses /siem/v1/batch/events/ci (Cloud Integrated). Their types defaults are also product specific -- siem_logs defaults to av/delivery/journal/receipt/spam etc., cloud_integrated_logs to entities/mailflow/urlclick.

This PR removes enabled: false from cloud_integrated_logs (and message_release_logs) while also making CEL the default input everywhere, so a fresh install now has both siem_logs and cloud_integrated_logs polling with the same v2 credentials.

In the shared program, a non-200 from the batch list endpoint falls into the error branch, which emits {"events": {"error": {...}}, "want_more": false}. That surfaces as an error event every interval for whichever product the tenant does not have. I could not reach the Mimecast developer portal to confirm the tenant-level exclusivity of the two products, hence the low confidence -- but if they are exclusive, this default is wrong for every installation.

message_release_logs is not affected by this concern; it has no Cloud Gateway/Cloud Integrated counterpart.

Recommendation:

Either keep cloud_integrated_logs opt-in:

# packages/mimecast/data_stream/cloud_integrated_logs/manifest.yml
title: "Cloud Integrated Logs"
type: logs
streams:
  - input: cel
    template_path: cel.yml.hbs
    title: Cloud Integrated logs
    enabled: false
    description: Collect Cloud Integrated Logs

or, if enabling both by default is intentional, say so in the README so users know to disable the one that does not apply to their tenant:

### Cloud Integrated Logs

> Mimecast tenants are provisioned for either Cloud Gateway or Cloud Integrated.
> Enable `cloud_integrated_logs` for Cloud Integrated tenants and `siem_logs` for
> Cloud Gateway tenants; leaving both enabled causes the endpoint your tenant does
> not have to return errors on every polling interval.

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

# Mimecast Integration

The Mimecast integration collects events from the [Mimecast API](https://integrations.mimecast.com/documentation/).
The Mimecast integration collects events from the [Mimecast API](https://developer.services.mimecast.com/apis).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🔵 Low confidence: medium path: packages/mimecast/_dev/build/docs/README.md:3

The intro link was moved to the v2 developer portal, but the ten per-dataset 'more information' links still point at integrations.mimecast.com, the documentation for the v1 API this PR deprecates. Repoint them at developer.services.mimecast.com.

Details

This PR changes the intro link from https://integrations.mimecast.com/documentation/ to https://developer.services.mimecast.com/apis, and adds a deprecation banner explaining that Mimecast API 1.0 is end-of-life. But integrations.mimecast.com is the API 1.0 documentation portal, and ten dataset descriptions further down the same file still link there:

  • line 46 archive_search_logs
  • line 57 audit_events
  • line 79 dlp_logs
  • line 90 message_release_logs
  • line 101 siem_logs
  • lines 112 and 123 threat_intel_malware_customer / _grid
  • line 137 ttp_ap_logs
  • line 148 ttp_ip_logs
  • line 165 ttp_url_logs

Since CEL/v2 is now the default input for all of these data streams, the reference documentation a reader is sent to describes endpoints they are no longer calling. cloud_integrated_logs (line 68) already uses a developer.services.mimecast.com link, so the target style is established in this file.

Remember to regenerate packages/mimecast/docs/README.md after editing the source template.

Recommendation:

Repoint each dataset link at the v2 developer portal, matching the style already used for cloud_integrated_logs. For example:

### Archive Search Logs

This is the `mimecast.archive_search_logs` dataset. These logs contain Mimecast archive
search logs with the following details: search source, description and detailed
information about the search performed. More information about these logs is available [here](
https://developer.services.mimecast.com/docs/archivesearchlogs/1/routes/api/archive/get-archive-search-logs/post).

Verify each replacement path against the v2 portal before committing; if a v2 equivalent does not exist for a given dataset, leave that link and add a short note that it documents the deprecated v1 endpoint.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Comment thread packages/mimecast/validation.yml Outdated
- SVR00005 # Kibana version for saved tags.
- SVR00006 # tags
- SVR00008 # on_failure event.kind
- SVR00009 # on_failure error.message No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🔵 Low confidence: medium path: packages/mimecast/validation.yml:7

validation.yml now ends without a trailing newline, which elastic-package format will rewrite. Add the newline so a formatting check does not report the file as unformatted.

Details

The diff for packages/mimecast/validation.yml ends with \ No newline at end of file. The three new exclusion entries were appended without terminating the last line.

elastic-package normalises YAML files in the package and emits a trailing newline, so elastic-package format will rewrite this file and a format check will flag it as unformatted. Every other line in the file is otherwise untouched, so this is a one-character fix.

Recommendation:

Terminate the final line:

errors:
  exclude_checks:
    - SVR00004 # References in dashboards.
    - SVR00005 # Kibana version for saved tags.
    - SVR00006 # tags
    - SVR00008 # on_failure event.kind
    - SVR00009 # on_failure error.message

(with a newline after the last entry). Running elastic-package format in packages/mimecast will do this for you.


🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

@efd6
efd6 force-pushed the 20296-mimecast branch 2 times, most recently from 1a3ea48 to b672571 Compare July 28, 2026 23:23
name: '{{ IngestPipeline "v2_pipeline" }}'
if: ctx.mimecast?.timestamp != null
tag: v1_pipeline
tag: v2_pipeline

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: high path: packages/mimecast/data_stream/siem_logs/elasticsearch/ingest_pipeline/default.yml:52

The v2 SIEM pipeline this change promotes to the default path renames three field names the v2 API never emits (mimecast.tlsVer, mimecast.Delivered, mimecast.Hld), so tls.version, event.outcome and event.kind stay unpopulated; rename them to the actual v2 keys tlsVersion / delivered / holdReason.

Details

This PR makes the CEL (v2 API) stream the default for siem_logs, so v2_pipeline.yml is now the path every new installation takes. Three of its processors key off field names the v2 batch API does not produce, and the fixtures regenerated in this PR prove each one is a no-op:

  1. v2_pipeline.yml:126 renames mimecast.tlsVer to tls.version. The v2 payload uses tlsVersion (see the added lines in _dev/test/pipeline/test-siem-v2-logs.log, and fields/field.yml:244 which declares mimecast.tlsVersion). Result: tls.version is never set, and the raw value is left behind under mimecast.tlsVersion (sample_event.json:64; test-siem-v2-logs.log-expected.json:2255). Note tlsCipher on the adjacent processor is spelled correctly and does map to tls.cipher.

  2. v2_pipeline.yml:311 renames mimecast.Delivered to event.outcome. The v2 payload uses lowercase delivered. Every delivery event in the regenerated expectations therefore falls through to event.outcome: "unknown" while mimecast.delivered: "true" remains unmapped (test-siem-v2-logs.log-expected.json:511 and :517).

  3. v2_pipeline.yml:150 sets event.kind: alert when ctx.mimecast?.Hld != null. No Hld field exists in v2 process logs; the hold is signalled by action: "Hld" plus holdReason. Held messages consequently carry event.action: "Hld" and event.reason: "Spm" but no event.kind: "alert" (test-siem-v2-logs.log-expected.json:1750-1759), which weakens alert-based detection on the default path.

Recommendation:

Correct the three field references in data_stream/siem_logs/elasticsearch/ingest_pipeline/v2_pipeline.yml and regenerate the pipeline-test expectations:

  # was: field: mimecast.tlsVer
  - rename:
      field: mimecast.tlsVersion
      tag: rename_tls_version
      target_field: tls.version
      ignore_missing: true

  # was: if: ctx.mimecast?.Hld != null && ctx.mimecast.Hld != ''
  - set:
      field: event.kind
      tag: set_event_kind_held
      value: alert
      if: ctx.mimecast?.holdReason != null && ctx.mimecast.holdReason != ''

  # was: field: mimecast.Delivered
  - rename:
      field: mimecast.delivered
      tag: rename_delivered_to_event_outcome
      target_field: event.outcome
      ignore_missing: true

The delivered value arrives as the string "true"/"false", so the follow-up set processors need to match strings rather than booleans:

  - set:
      field: event.outcome
      tag: set_event_outcome_success
      value: success
      if: ctx.event?.outcome instanceof String && ctx.event.outcome.equalsIgnoreCase('true')
  - set:
      field: event.outcome
      tag: set_event_outcome_failure
      value: failure
      if: ctx.event?.outcome instanceof String && ctx.event.outcome.equalsIgnoreCase('false')

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

- name: alerting
type: text
title: Alert Actions
description: The set of DLP actions that should be classified as an alert. Possible values are delete, hold, bouce, smart_folder, disable_smart_folder, content_expire, meta_expire, stationery, disable_stationery, gcc, secure_delivery, delivery_route, document_policy, disable_document_policy, secure_messaging, disable_secure_messaging_policy, attach_set_policy, remove_email, tag, link, block, none, and notification.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🔵 Low confidence: high path: packages/mimecast/data_stream/dlp_logs/manifest.yml:36

The DLP Alert Actions description added to the CEL stream misspells the Mimecast action bounce as bouce; fix the spelling so the Fleet UI lists a value users can actually enter.

Details

This line moves the alerting variable description onto the CEL stream, which this PR makes the default and which is therefore the copy users now see in Fleet. The enumerated list of accepted DLP actions contains bouce instead of bounce. Since the description is the only place the accepted values are documented, a user copying the value verbatim configures an action the pipeline will never match.

Recommendation:

Fix the spelling in the alerting variable description:

      - name: alerting
        type: text
        title: Alert Actions
        description: The set of DLP actions that should be classified as an alert. Possible values are delete, hold, bounce, smart_folder, disable_smart_folder, content_expire, meta_expire, stationery, disable_stationery, gcc, secure_delivery, delivery_route, document_policy, disable_document_policy, secure_messaging, disable_secure_messaging_policy, attach_set_policy, remove_email, tag, link, block, none, and notification.
        multi: true
        required: true
        show_user: true
        default:
          - block

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

{
"senderAddress": "kay.mann@demo-int.elastic.mime-api.com",
"recipientAddress": "cbrashear@demo-visionary.b41.one",
"senderAddress": "kay.mann@example.com",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/_dev/deploy/docker/files/config.yml:279

The anonymisation pass replaced the domains in these fixtures but left real personal names in the email local parts (and the tenant account ID in the SIEM fixture); replace the local parts with synthetic names such as alice.johnson/bob.smith and the account ID with a synthetic code.

Details

This PR rewrites the mock service data and the siem_logs pipeline fixture to use RFC 2606 domains (example.com / example.net / example.org) and RFC 5737 addresses, but only the domain part was substituted. The local parts are still recognisable real people's names carried over from the source corpus - kay.mann, zimin.lu, vince.j.kaminski, thomas.bentz, william.mccoy, monika.causholli, craig.dean, mike.a.roberts, gregoryhunt and, in packages/mimecast/data_stream/siem_logs/_dev/test/pipeline/test-siem-v2-logs.log, veronica.espinoza and richard.costigan. One search string in the same file also still carries a bare first name ('... AND !Devin'). The siem_logs fixture additionally retains the tenant-scoped accountId value on every record, which is an organisational identifier. The anonymisation guidance treats usernames, display names and account IDs as identifiers that must be replaced with synthetic values, not merely re-domained, so the pass is incomplete on files this PR is explicitly anonymising.

Recommendation:

Substitute the local parts and the account identifier with synthetic values, keeping the record shape byte-for-byte otherwise:

{
    "senderAddress": "alice.johnson@​example.com",
    "recipientAddress": "bob.smith@​example.net",
    "subject": "RE",
    "eventTime": "2024-11-18T05:11:02+0000",
    "route": "outbound",
    "policy": "Confidential",
    "action": "hold",
    "messageId": "<ee36704d0e84b012-226716@​mail.example.net>"
}

Apply the same mapping consistently across _dev/deploy/docker/files/config.yml and data_stream/siem_logs/_dev/test/pipeline/test-siem-v2-logs.log (plus its -expected.json), and replace the accountId value with a synthetic same-shape code, e.g.:

{
    "accountId": "CUSA0A000",
    "recipients": "alice.johnson@​example.com",
    "senderEnvelope": "postmaster@​example.com"
}

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

- description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.
type: enhancement
link: https://github.com/elastic/integrations/pull/20356
- description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/changelog.yml:7

Enabling cloud_integrated_logs by default makes every new policy poll both the Cloud Integrated and the Cloud Gateway SIEM endpoints, but a tenant only has one of those products; keep cloud_integrated_logs disabled by default or document which product each stream requires.

Details

packages/mimecast/data_stream/cloud_integrated_logs/agent/stream/cel.yml.hbs requests /siem/v1/batch/events/ci (Mimecast Cloud Integrated) while packages/mimecast/data_stream/siem_logs/agent/stream/cel.yml.hbs requests /siem/v1/batch/events/cg (Mimecast Cloud Gateway). These are separate Mimecast product lines and a tenant is provisioned for one of them. siem_logs is already enabled by default; this PR removes enabled: false from cloud_integrated_logs, so every newly created policy now polls both endpoints and one of the two will never return data for the tenant. message_release_logs (/api/gateway/get-held-release-logs) is Cloud Gateway only and is enabled by default in the same change. Existing policies keep their stored per-stream state on upgrade, so this affects new installations. cloud_integrated_logs was shipped disabled up to now, which suggests the product split was the reason.

Recommendation:

Either keep the Cloud Integrated stream opt-in:

# packages/mimecast/data_stream/cloud_integrated_logs/manifest.yml
streams:
  - input: cel
    template_path: cel.yml.hbs
    title: Cloud Integrated logs
    enabled: false
    description: Collect Cloud Integrated Logs

or, if enabling it by default is deliberate, say so in the changelog entry and in _dev/build/docs/README.md so users know which streams belong to which Mimecast product:

    - description: Enable the cloud_integrated_logs and message_release_logs data streams by default. cloud_integrated_logs applies to Mimecast Cloud Integrated tenants; siem_logs and message_release_logs apply to Mimecast Cloud Gateway tenants. Disable the streams that do not apply to your tenant.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

efd6 added 5 commits August 5, 2026 08:55
Make the CEL (v2 API) input the default for all data streams by
listing it first and enabling it. The HTTP JSON (v1 API) input is
now disabled by default and marked as deprecated in stream titles,
descriptions, and documentation.

Mimecast API 1.0 is end-of-life (ability to create new applications
ends December 2026). Existing policies with HTTP JSON enabled are
unaffected; the stream definitions remain present for users who have
not yet migrated to v2 API credentials.

Also enables the two CEL-only data streams (cloud_integrated_logs,
message_release_logs) by default. They were previously disabled
with no alternative.
On supporting version of kibana this will display a banner indicating deprecation
and will not display the deprecated input for new installations (I think this is
the wrong behaviour, but it is intended in the kibana change that added it).

Validation checks that fail due to the bump in format version are deferred to a
follow-up PR.
@elastic-vault-github-plugin-prod

Copy link
Copy Markdown
Contributor

✅ All changelog entries have the correct PR link.

- description: Make CEL the default input for all data streams. The HTTPJSON input is deprecated and will be removed in a future release. New installations use the Mimecast v2 API via CEL; existing HTTPJSON configurations continue to work but users should migrate to CEL by provisioning v2 API credentials.
type: enhancement
link: https://github.com/elastic/integrations/pull/20356
- description: Enable the cloud_integrated_logs and message_release_logs data streams by default. These are CEL-only data streams that were previously shipped disabled.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: medium path: packages/mimecast/changelog.yml:7

Enabling cloud_integrated_logs by default makes every new install poll both the Cloud Integrated and Cloud Gateway SIEM endpoints, but a tenant is provisioned for only one; keep cloud_integrated_logs disabled by default (or make the pair mutually exclusive) and document which product each applies to.

Details

This PR removes enabled: false from data_stream/cloud_integrated_logs/manifest.yml while siem_logs is also enabled by default, so a fresh install runs both. The two streams target different Mimecast product lines, not two views of the same data: cloud_integrated_logs/agent/stream/cel.yml.hbs:15 sets path: /siem/v1/batch/events/ci with default types entities, mailflow, urlclick, whereas siem_logs/agent/stream/cel.yml.hbs sets path: /siem/v1/batch/events/cg with default types av, delivery, journal, receipt, spam, etc. The disjoint paths and disjoint event-type vocabularies are the Cloud Integrated and Cloud Gateway products. A tenant on Cloud Gateway has no /ci entitlement and a tenant on Cloud Integrated has no /cg entitlement, so on every new install one of the two streams issues a failing request each interval (default 5m) and, per the shared CEL program's non-200 branch, emits an error event and halts with want_more: false. message_release_logs is unaffected by this — it is a Gateway held-message endpoint and pairs with siem_logs. Note the two streams were shipped enabled: false for exactly this reason, not merely because they lacked an HTTPJSON alternative.

Recommendation:

Keep cloud_integrated_logs opt-in and leave message_release_logs enabled, so the default policy is coherent for a Cloud Gateway tenant:

# packages/mimecast/data_stream/cloud_integrated_logs/manifest.yml
title: "Cloud Integrated Logs"
type: logs
streams:
  - input: cel
    template_path: cel.yml.hbs
    title: Cloud Integrated logs
    enabled: false
    description: Collect Cloud Integrated Logs. Enable this only on Mimecast Cloud Integrated tenants; Cloud Gateway tenants should use the SIEM Logs data stream instead.

and narrow the changelog entry to match:

    - description: Enable the message_release_logs data stream by default. cloud_integrated_logs remains disabled by default because it applies only to Mimecast Cloud Integrated tenants, whereas siem_logs applies to Cloud Gateway tenants.
      type: enhancement
      link: https://github.com/elastic/integrations/pull/20356

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

Authorization parameters for the Mimecast API (`Client ID` and `Client Key`) should
be provided by a Mimecast representative for this integration. Under `Advanced options`
you can set the time interval between two API requests as well as the API URL. A Mimecast
> **Deprecated:** Mimecast API 1.0 is [end-of-life](https://mimecastsupport.zendesk.com/hc/en-us/articles/43572890309651-API-Integrations-API-1-0-End-of-Life-Project-Extension-Aug-2025).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Severity: 🟡 Medium confidence: high path: packages/mimecast/_dev/build/docs/README.md:24

The new deprecation notice tells v1 users to migrate to the v2 CEL input but does not say the CEL stream starts with an empty cursor, so the cutover re-ingests up to initial_interval of events; add a migration subsection describing the duplicate/gap window and how to control it.

Details

The HTTPJSON and CEL streams are separate Filebeat inputs with separate state stores, so enabling the CEL stream does not inherit the HTTPJSON cursor. In data_stream/archive_search_logs/agent/stream/cel.yml.hbs:71 the start time is state.?cursor.last.orValue((now - duration(state.look_back)).format(time_layout.RFC3339)) — with no saved cursor it falls back to look_back, which is bound to the initial_interval var (default 24h). The same pattern is used by the shared program in dlp_logs, message_release_logs, ttp_ap_logs, ttp_ip_logs and ttp_url_logs; the siem_logs/cloud_integrated_logs program similarly seeds a fresh work_list with no last_tokens. So a user who follows this PR's advice and switches a data stream from HTTPJSON to CEL re-collects up to 24 hours of events already indexed by the HTTPJSON stream (duplicates), and if HTTPJSON is disabled more than initial_interval before CEL is enabled, the intervening window is never collected (gap). Neither the README nor the changelog entry mentions this, and linked issue #​20296 explicitly calls out cursor continuity at cutover as the main risk of this migration.

Recommendation:

Add a migration subsection under the v1 deprecation notice in _dev/build/docs/README.md (then rebuild docs/README.md):

### Migrating from the v1 (HTTPJSON) input to the v2 (CEL) input

The v1 and v2 inputs keep separate collection cursors, so the v2 input does not
resume where the v1 input stopped. When you enable a v2 data stream for the
first time it starts from `now - Initial Interval` (default `24h`).

To migrate a data stream:

1. Note the time at which you disable the v1 stream.
2. Enable the v2 stream and set `Initial Interval` to cover the gap between that
   time and now. Values shorter than the gap lose events; longer values
   re-collect events the v1 stream already indexed.
3. Expect duplicate documents for the overlap window. `event.id` is stable per
   record for most data streams, so duplicates can be filtered at query time.

Run both inputs in parallel only if you accept full duplication for the overlap.

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

@vera-review-bot

Copy link
Copy Markdown

Review summary

Issues found across the latest commits dd8dee57039598 (51 commits) — 2 medium
  • 🟡 Enabling cloud_integrated_logs by default makes every new install poll both the Cloud Integrated and Cloud Gateway SIEM endpoints, but a tenant is provisioned for only one (link) (Unresolved)
  • 🟡 The new deprecation notice tells v1 users to migrate to the v2 CEL input but does not say the CEL stream starts with an empty cursor, so the cutover re-ingests up to initial_interval of events (link) (Unresolved)
Issues found across earlier commits a16ff9c — 2 medium
  • 🟡 The anonymisation pass replaced the domains in these fixtures but left real personal names in the email local parts (and the tenant account ID in the SIEM fixture) (link) (Unresolved)
  • 🟡 Enabling cloud_integrated_logs by default makes every new policy poll both the Cloud Integrated and the Cloud Gateway SIEM endpoints, but a tenant only has one of those products (link) (Unresolved)
Issues found across earlier commits 3afbf5fc555423 (3 commits) — 1 medium, 1 low
  • 🟡 The v2 SIEM pipeline this change promotes to the default path renames three field names the v2 API never emits (mimecast.tlsVer, mimecast.Delivered, mimecast.Hld), so tls.version, event.outcome and event.kind stay unpopulated (link) (Unresolved)
  • 🔵 The DLP Alert Actions description added to the CEL stream misspells the Mimecast action bounce as bouce (link) (Unresolved)
Issues found across earlier commits dc194c5b9d81af (13 commits) — 1 high, 1 medium, 2 low
  • 🟠 This edits the existing 3.5.0 changelog entry into 3.6.0 instead of adding a new entry, so the released 3.5.0 version and its 'Set elastic owner type' change (PR 20381) disappear from the history. Add a new 3.6.0 block above the untouched 3.5.0 block. (link) (Unresolved)
  • 🟡 Enabling cloud_integrated_logs by default means every new install polls both the Cloud Integrated and Cloud Gateway batch endpoints, and a tenant provisioned for only one will get continuous error events from the other. Consider leaving cloud_integrated_logs disabled by default, or documenting which one to turn off. (link) (Unresolved)
  • 🔵 The intro link was moved to the v2 developer portal, but the ten per-dataset 'more information' links still point at integrations.mimecast.com, the documentation for the v1 API this PR deprecates. Repoint them at developer.services.mimecast.com. (link) (Unresolved)
  • 🔵 validation.yml now ends without a trailing newline, which elastic-package format will rewrite. Add the newline so a formatting check does not report the file as unformatted. (link) (Unresolved)
Issues found across earlier commits 6dd99a5 — 3 medium, 1 low
  • 🟡 initial_interval is now a user-facing option on the default siem_logs stream but the CEL program ignores it — either wire look_back into the request or drop the variable. (link) (Unresolved)
  • 🟡 The new deprecation note should also tell existing v1 users what happens at cutover — the httpjson streams are now off by default and switching a stream to CEL re-collects the last initial_interval of events. (link) (Unresolved)
  • 🟡 Enabling cloud_integrated_logs by default puts it alongside siem_logs, but the two target different Mimecast products — consider leaving it opt-in or documenting which tenants should turn it on. (link) (Unresolved)
  • 🔵 The re-anonymised SIEM fixture still carries Mimecast internal MTA hostnames and real-looking personal names in the local part — replace those too for consistency with the rest of the pass. (link) (Unresolved)
Issues found across earlier commits 005f16a — 2 high
  • 🟠 The generated docs/README.md still says Client Key while the source template _dev/build/docs/README.md now says Client Secret - the README was not rebuilt, so run elastic-package build and commit the regenerated file. (link) (Unresolved)
  • 🟠 All 11 sample events embedded in the generated docs/README.md predate the anonymisation pass and still contain the old mock addresses/domains, so the published docs leak the values this PR scrubbed everywhere else - rebuild the package docs from the current sample_event.json files. (link) (Unresolved)
Issues found across earlier commits 7e9b9bd — 2 medium, 1 low
  • 🟡 The 3.5.0 changelog entry only describes the CEL/HTTPJSON default swap, but this PR also drops enabled: false from the cloud_integrated_logs and message_release_logs streams, so those two data streams now start collecting on a fresh install. Please mention that in the changelog. (link) (Unresolved)
  • 🟡 The regenerated sample events replace previously sanitised placeholders (example.com, 8.8.8.8) with routable public IPs and personal-name mailboxes at non-reserved domains. Please re-anonymise them to RFC 5737 addresses and example.com. (link) (Unresolved)
  • 🔵 The v2 section, now the primary configuration instructions, tells users to obtain a Client Key, but the field the UI actually presents is Client Secret. Rename it in the docs so it matches the manifest. (link) (Unresolved)

A new commit triggers another review — at most once every 15 minutes. I skip the PR while it's approved or has merge conflicts.

🤖 AI-Generated Review | Vera Review Bot | 📚 Knowledge base: integration-skills

⚠️ Automated review — verify suggestions before applying.

@infra-vault-gh-plugin-prod

Copy link
Copy Markdown

💚 Build Succeeded

History

cc @efd6

@chrisberkhout chrisberkhout left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good. A bit noisy with the data changes but good to get them done as well.

@mergify

mergify Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

Tick the box to add this pull request to the merge queue (same as @mergifyio queue).

  • Queue this pull request

@efd6
efd6 merged commit bd91693 into elastic:main Aug 6, 2026
13 checks passed
@elastic-vault-github-plugin-prod

Copy link
Copy Markdown
Contributor

Package mimecast - 3.6.0 containing this change is available at https://epr.elastic.co/package/mimecast/3.6.0/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation. Applied to PRs that modify *.md files. enhancement New feature or request Integration:mimecast Mimecast Team:Security-Service Integrations Security Service Integrations team [elastic/security-service-integrations]

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[mimecast] Make CEL the default and retire the HTTPJSON input

5 participants