Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions packages/sentinel_one_cloud_funnel/_dev/build/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,19 @@
3. To configure event notifications for an S3 bucket, check [this guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html).
- While creating `event notification` select the event type as `s3:ObjectCreated:*`, destination type `SQS Queue`, and select the queue name created in Step 2.

### Collect data from an S3-compatible service (MinIO, Ceph, ...)

Check notice on line 100 in packages/sentinel_one_cloud_funnel/_dev/build/docs/README.md

View workflow job for this annotation

GitHub Actions / Lint user-facing content

Elastic.Ellipses: In general, don't use an ellipsis.

1. Enable the **Collect logs via S3 Bucket** toggle. The S3-compatible options below only
take effect in bucket-polling mode; with the toggle off the agent runs in SQS mode and

Check notice on line 103 in packages/sentinel_one_cloud_funnel/_dev/build/docs/README.md

View workflow job for this annotation

GitHub Actions / Lint user-facing content

Elastic.Semicolons: Use semicolons judiciously.
ignores the Non-AWS Bucket Name.
2. Under **Advanced options**, instead of a Bucket ARN or Access Point ARN, set:
- **[S3] Non-AWS Bucket Name** — the bucket name on the S3-compatible service.
- **Endpoint** — the full service URI, including the scheme, for example `https://s3.example.com:9000`.
- **Region** — required whenever a Non-AWS Bucket Name is set.
- **Path Style** — enable this; S3-compatible services generally require path-style access.

Authentication must use **Access Key ID** and **Secret Access Key**; IAM roles and shared credential profiles are AWS-only.

### Collect data from an Azure Blob Storage

- Considering you already have an Blob Storage setup, to configure it with SentinelOne Cloud Funnel, follow the steps mentioned here: `[Your Login URL]/docs/en/how-to-configure-your-amazon-s3-bucket.html`.
Expand Down
11 changes: 11 additions & 0 deletions packages/sentinel_one_cloud_funnel/changelog.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
# newer versions go on top
- version: "1.14.0"
changes:
- description: Fix event.dataset constant_keyword values for routing target data streams, allowing rerouted events to be correctly indexed.

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/sentinel_one_cloud_funnel/changelog.yml:4

The 1.14.0 changelog does not mention that the logins data stream dataset was renamed from sentinel_one_cloud_funnel.login to .logins; add an entry for it since the backing index name changes for existing users.

Details

packages/sentinel_one_cloud_funnel/data_stream/logins/manifest.yml changes dataset from sentinel_one_cloud_funnel.login to sentinel_one_cloud_funnel.logins. That renames the index template and the data stream backing the logins stream (logs-sentinel_one_cloud_funnel.login-* -> logs-sentinel_one_cloud_funnel.logins-*), which is user-visible on upgrade: any saved search, detection rule, or ES|QL query pinned to the old dataset stops matching, and previously ingested .login documents are no longer covered by a package-managed index template. The three entries added for 1.14.0 cover the event.dataset constant_keyword fix, dynamic_dataset/dynamic_namespace, and the new S3-compatible options, but none of them describes this rename, so nothing in the changelog tells an upgrading user their logins index name changed. This is also the kind of change the repo's breaking-change detector reports, so an explicit entry avoids a surprise later in CI.

Recommendation:

Add a dedicated entry describing the rename (use breaking-change if the team agrees the index rename is breaking for existing installs):

- version: "1.14.0"
  changes:
    - description: Rename the logins data stream dataset from `sentinel_one_cloud_funnel.login` to `sentinel_one_cloud_funnel.logins` so it matches the routing rule target. Existing data indexed under `logs-sentinel_one_cloud_funnel.login-*` is no longer written to.
      type: breaking-change
      link: https://github.com/elastic/integrations/pull/20467
    - description: Fix event.dataset constant_keyword values for routing target data streams, allowing rerouted events to be correctly indexed.
      type: bugfix
      link: https://github.com/elastic/integrations/pull/20467

🤖 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.

It never worked, so I'm OK with this.

type: bugfix
link: https://github.com/elastic/integrations/pull/20467
- description: Add dynamic_dataset and dynamic_namespace to event data stream so Fleet grants the agent write permissions to routing targets.
type: bugfix
link: https://github.com/elastic/integrations/pull/20467
- description: Add endpoint, path_style, region, and non_aws_bucket_name configuration options for S3-compatible storage services.
type: enhancement
link: https://github.com/elastic/integrations/pull/20467
- version: "1.13.1"
changes:
- description: Remove duplicated installation instructions from the documentation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.command_script
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.cross_process
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.dns
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[!exec:echo] skip 'Skipping test requiring absent echo command'

exec echo ${PACKAGE_NAME}
stdout '^sentinel_one_cloud_funnel$'

exec echo ${DATA_STREAM}
stdout '^event$'

exec echo ${CURRENT_VERSION}
stdout '^[0-9]+\.[0-9]+\.[0-9]+$'
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Verify that events are correctly routed from the event data stream to
# category-specific data streams via routing rules when rerouting is enabled.
#
# The test data in minio provides:
# - 2 dns events → sentinel_one_cloud_funnel.dns (rerouted)
# - 1 process event → sentinel_one_cloud_funnel.process (rerouted)
# - 1 file event → sentinel_one_cloud_funnel.event (retained, reroute_file not enabled)

[!external_stack] skip 'Skipping external stack test.'
[!exec:jq] skip 'Skipping test requiring absent jq command'

# Connect to the running stack.
use_stack -profile ${CONFIG_PROFILES}/${PROFILE}

# Install an agent.
install_agent -profile ${CONFIG_PROFILES}/${PROFILE} -network_name NETWORK_NAME

# Start the minio service with pre-loaded test data.
docker_up -profile ${CONFIG_PROFILES}/${PROFILE} -network ${NETWORK_NAME} s1cf-minio

# Add the package resources.
add_package -profile ${CONFIG_PROFILES}/${PROFILE}

# Add the data stream policy with S3 polling against minio.
add_package_policy -profile ${CONFIG_PROFILES}/${PROFILE} test_config.yaml EVENT_DS

# The file event should remain in the event data stream (reroute_file not enabled).
get_docs -profile ${CONFIG_PROFILES}/${PROFILE} -want 1 -confirm 30s -timeout 5m ${EVENT_DS}
cp stdout event_docs.json
exec jq '.hits.hits[0]._source.sentinel_one_cloud_funnel.event.category' event_docs.json
stdout 'file'

# DNS events should be routed to the dns data stream.
get_docs -profile ${CONFIG_PROFILES}/${PROFILE} -want 2 -confirm 15s -timeout 2m logs-sentinel_one_cloud_funnel.dns-*
cp stdout dns_docs.json
exec jq -c '[.hits.hits[]._source.sentinel_one_cloud_funnel.event.category] | unique' dns_docs.json
stdout '\["dns"\]'

# Process events should be routed to the process data stream.
get_docs -profile ${CONFIG_PROFILES}/${PROFILE} -want 1 -confirm 15s -timeout 2m logs-sentinel_one_cloud_funnel.process-*
cp stdout proc_docs.json
exec jq '.hits.hits[0]._source.sentinel_one_cloud_funnel.event.category' proc_docs.json
stdout 'process'

# Clean up.
remove_package_policy -profile ${CONFIG_PROFILES}/${PROFILE} ${EVENT_DS}
uninstall_agent -profile ${CONFIG_PROFILES}/${PROFILE} -timeout 1m
docker_down s1cf-minio

-- test_config.yaml --
input: aws-s3
vars:
collect_s3_logs: true
non_aws_bucket_name: test-bucket
endpoint: http://svc-s1cf-minio:9000
access_key_id: minioadmin
secret_access_key: minioadmin
path_style: true
region: us-east-1
reroute_dns: true
reroute_process: true
data_stream:
vars:
preserve_original_event: true
interval: 10s

-- s1cf-minio/docker-compose.yml --
services:
s1cf-minio:
image: minio/minio:RELEASE.2024-06-13T22-53-53Z
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
entrypoint: /bin/sh
command:
- -c
- |
minio server /data &
MINIO_PID=$$!
until curl -sf http://localhost:9000/minio/health/live; do sleep 1; done
mc alias set local http://localhost:9000 minioadmin minioadmin
mc mb local/test-bucket
mc cp /testdata/events.ndjson local/test-bucket/s1/cloud_funnel/events.ndjson
wait $$MINIO_PID
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 5s
timeout: 3s
retries: 10
volumes:
- ./testdata:/testdata:ro

-- s1cf-minio/testdata/events.ndjson --
{"event.category":"dns","event.time":1664811149495,"event.id":"TEST_DNS_001","event.type":"DNS Resolved","meta.event.name":"DNS","site.id":"123456789","account.id":"123456789","endpoint.name":"test-host","endpoint.os":"windows","endpoint.type":"laptop","agent.uuid":"test-agent-1","agent.version":"22.1.2.217","mgmt.id":"1337","mgmt.url":"test.sentinelone.org","os.name":"Windows10Pro","src.process.name":"chrome.exe","src.process.pid":1234,"src.process.uid":"AAAA0000","process.unique.key":"AAAA0000","trace.id":"TEST_DNS_001","packet.id":"PKT001","event.dns.request":"example.com","event.dns.response":"93.184.216.34","dataSource.name":"SentinelOne","dataSource.category":"security","i.scheme":"edr","i.version":"preprocess-lib-1.0","site.name":"TEST","group.id":"test-group","sca:atlantisIngestTime":1664811166298,"sca:ingestTime":1664811166,"timestamp":"18:32:29.495"}
{"event.category":"dns","event.time":1664811150000,"event.id":"TEST_DNS_002","event.type":"DNS Resolved","meta.event.name":"DNS","site.id":"123456789","account.id":"123456789","endpoint.name":"test-host","endpoint.os":"windows","endpoint.type":"laptop","agent.uuid":"test-agent-1","agent.version":"22.1.2.217","mgmt.id":"1337","mgmt.url":"test.sentinelone.org","os.name":"Windows10Pro","src.process.name":"firefox.exe","src.process.pid":5678,"src.process.uid":"BBBB0000","process.unique.key":"BBBB0000","trace.id":"TEST_DNS_002","packet.id":"PKT002","event.dns.request":"elastic.co","event.dns.response":"34.120.115.39","dataSource.name":"SentinelOne","dataSource.category":"security","i.scheme":"edr","i.version":"preprocess-lib-1.0","site.name":"TEST","group.id":"test-group","sca:atlantisIngestTime":1664811166298,"sca:ingestTime":1664811166,"timestamp":"18:32:30.000"}

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/sentinel_one_cloud_funnel/data_stream/event/_dev/test/scripts/routed_data_streams.txt:95

The new routing test fixture uses real routable IP addresses and a real domain instead of documentation placeholders; replace them with RFC 5737 addresses and example.com.

Details

The s1cf-minio/testdata/events.ndjson records embedded in this txtar file use event.dns.response values 93.184.216.34 (line 94) and 34.120.115.39 (line 95) and an event.dns.request of elastic.co (line 95). These are real, routable addresses belonging to real infrastructure rather than synthetic placeholders. Committed integration fixtures are expected to use the documentation ranges (RFC 5737: 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24) and example.com-style names, so that geo/ASN enrichment and any downstream analysis in tests never resolve to a real organisation. The existing pipeline fixtures in this data stream already follow that convention (blog.example.com, infra-cdn.example.com).

Recommendation:

Swap the values for documentation-range equivalents; the routing assertions only depend on event.category, so nothing else needs to change:

{"event.category":"dns","event.id":"TEST_DNS_001","event.dns.request":"blog.example.com","event.dns.response":"192.0.2.10"}
{"event.category":"dns","event.id":"TEST_DNS_002","event.dns.request":"infra-cdn.example.com","event.dns.response":"198.51.100.24"}

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

⚠️ Automated review — verify suggestions before applying.

{"event.category":"process","event.time":1664811149470,"event.id":"TEST_PROC_001","event.type":"ProcessCreation","meta.event.name":"PROCESSCREATION","site.id":"123456789","account.id":"123456789","endpoint.name":"test-host","endpoint.os":"windows","endpoint.type":"server","agent.uuid":"test-agent-1","agent.version":"22.1.2.217","mgmt.id":"1337","mgmt.url":"test.sentinelone.org","os.name":"WindowsServer2019","src.process.name":"svchost.exe","src.process.pid":776,"src.process.uid":"CCCC0000","process.unique.key":"CCCC0000","trace.id":"TEST_PROC_001","packet.id":"PKT003","tgt.process.name":"notepad.exe","tgt.process.pid":9999,"tgt.process.uid":"DDDD0000","dataSource.name":"SentinelOne","dataSource.category":"security","i.scheme":"edr","i.version":"preprocess-lib-1.0","site.name":"TEST","group.id":"test-group","sca:atlantisIngestTime":1664811166298,"sca:ingestTime":1664811166,"timestamp":"18:32:29.470"}
{"event.category":"file","event.time":1664811149488,"event.id":"TEST_FILE_001","event.type":"FileCreation","meta.event.name":"FILECREATION","site.id":"123456789","account.id":"123456789","endpoint.name":"test-host","endpoint.os":"windows","endpoint.type":"desktop","agent.uuid":"test-agent-1","agent.version":"22.1.2.217","mgmt.id":"1337","mgmt.url":"test.sentinelone.org","os.name":"Windows10Pro","src.process.name":"explorer.exe","src.process.pid":2222,"src.process.uid":"EEEE0000","process.unique.key":"EEEE0000","trace.id":"TEST_FILE_001","packet.id":"PKT004","tgt.file.path":"C:\\Users\\test\\Documents\\test.txt","tgt.file.type":"UNKNOWN","dataSource.name":"SentinelOne","dataSource.category":"security","i.scheme":"edr","i.version":"preprocess-lib-1.0","site.name":"TEST","group.id":"test-group","sca:atlantisIngestTime":1664811166298,"sca:ingestTime":1664811166,"timestamp":"18:32:29.488"}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
bucket_arn: {{bucket_arn}}
{{else if access_point_arn}}
access_point_arn: {{access_point_arn}}
{{else if non_aws_bucket_name}}
non_aws_bucket_name: {{non_aws_bucket_name}}
{{/if}}
{{#if interval}}
bucket_list_interval: {{interval}}
Expand Down Expand Up @@ -68,6 +70,15 @@ fips_enabled: {{fips_enabled}}
{{#if proxy_url}}
proxy_url: {{proxy_url}}
{{/if}}
{{#if endpoint}}
endpoint: {{endpoint}}
{{/if}}
{{#if path_style}}
path_style: {{path_style}}
{{/if}}
{{#if region}}
region: {{region}}
{{/if}}
{{#if ssl}}
ssl: {{ssl}}
{{/if}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
title: Collect Event logs from SentinelOne Cloud Funnel.
elasticsearch:
dynamic_dataset: true

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/sentinel_one_cloud_funnel/data_stream/event/manifest.yml:3

Rerouted events now index successfully but every shipped dashboard filters on data_stream.dataset == sentinel_one_cloud_funnel.event, so routed documents are invisible; widen the dashboard filters to cover the routing targets.

Details

Before this PR, a document rerouted to sentinel_one_cloud_funnel.dns carried event.dataset: sentinel_one_cloud_funnel.dns but landed in an index whose template declared event.dataset as constant_keyword with value sentinel_one_cloud_funnel.event, so it was rejected. With the base-fields fix plus dynamic_dataset/dynamic_namespace here, those documents are now indexed into logs-sentinel_one_cloud_funnel.<category>-*.

All six dashboards and the saved search in kibana/ carry a top-level phrase filter data_stream.dataset: sentinel_one_cloud_funnel.event (for example kibana/dashboard/sentinel_one_cloud_funnel-724f8d70-f966-11ed-b51d-ef5658e04999.json lines 16-26, and the same filter in the 008e94d0, 42ecf8a0, afecde30, c90a2bc0 and dd209080 dashboards). Any user who turns on a reroute_* option therefore sees those events disappear from the DNS, Login, Network Action, Registry, Threat Intelligence Indicator and URL dashboards, because the routed documents no longer have data_stream.dataset: sentinel_one_cloud_funnel.event.

Recommendation:

Replace the single phrase filter with one that also matches the routing targets, e.g. a data_stream.dataset prefix/is one of filter on each dashboard and the saved search:

{
  "$state": { "store": "appState" },
  "meta": {
    "alias": "SentinelOne Cloud Funnel datasets",
    "disabled": false,
    "indexRefName": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index",
    "key": "data_stream.dataset",
    "negate": false,
    "params": ["sentinel_one_cloud_funnel.event", "sentinel_one_cloud_funnel.dns"],
    "type": "phrases"
  },
  "query": {
    "bool": {
      "minimum_should_match": 1,
      "should": [
        { "match_phrase": { "data_stream.dataset": "sentinel_one_cloud_funnel.event" } },
        { "match_phrase": { "data_stream.dataset": "sentinel_one_cloud_funnel.dns" } }
      ]
    }
  }
}

If updating the dashboards is out of scope for this PR, please note the limitation in the README section that documents the rerouting options.


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

⚠️ Automated review — verify suggestions before applying.

dynamic_namespace: true
index_template:
settings:
analysis:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.file
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.indicators
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.ip
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.logins
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
title: SentinelOne Cloud Funnel Logins Events
dataset: sentinel_one_cloud_funnel.login
dataset: sentinel_one_cloud_funnel.logins
type: logs
elasticsearch:
index_template:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.module
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.process
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.registry
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.scheduled_task
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.threat_intelligence_indicators
- name: '@timestamp'
type: date
description: Event timestamp.
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
- name: event.dataset
type: constant_keyword
description: Event dataset.
value: sentinel_one_cloud_funnel.event
value: sentinel_one_cloud_funnel.url
- name: '@timestamp'
type: date
description: Event timestamp.
13 changes: 13 additions & 0 deletions packages/sentinel_one_cloud_funnel/docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,19 @@ A sample JSON Credentials file looks as follows:
3. To configure event notifications for an S3 bucket, check [this guide](https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-event-notifications.html).
- While creating `event notification` select the event type as `s3:ObjectCreated:*`, destination type `SQS Queue`, and select the queue name created in Step 2.

### Collect data from an S3-compatible service (MinIO, Ceph, ...)

1. Enable the **Collect logs via S3 Bucket** toggle. The S3-compatible options below only
take effect in bucket-polling mode; with the toggle off the agent runs in SQS mode and
ignores the Non-AWS Bucket Name.
2. Under **Advanced options**, instead of a Bucket ARN or Access Point ARN, set:
- **[S3] Non-AWS Bucket Name** — the bucket name on the S3-compatible service.
- **Endpoint** — the full service URI, including the scheme, for example `https://s3.example.com:9000`.
- **Region** — required whenever a Non-AWS Bucket Name is set.
- **Path Style** — enable this; S3-compatible services generally require path-style access.

Authentication must use **Access Key ID** and **Secret Access Key**; IAM roles and shared credential profiles are AWS-only.

### Collect data from an Azure Blob Storage

- Considering you already have an Blob Storage setup, to configure it with SentinelOne Cloud Funnel, follow the steps mentioned here: `[Your Login URL]/docs/en/how-to-configure-your-amazon-s3-bucket.html`.
Expand Down
37 changes: 34 additions & 3 deletions packages/sentinel_one_cloud_funnel/manifest.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
format_version: "3.0.2"
name: sentinel_one_cloud_funnel
title: SentinelOne Cloud Funnel
version: "1.13.1"
version: "1.14.0"
description: Collect logs from SentinelOne Cloud Funnel with Elastic Agent.
type: integration
categories:
Expand Down Expand Up @@ -65,14 +65,21 @@
multi: false
required: false
show_user: true
description: ARN of the AWS S3 bucket that will be polled for list operation. It is a required parameter for collecting logs via the AWS S3 Bucket unless you set an Access Point ARN. In case both configurations are added, this one takes precedence.
description: ARN of the AWS S3 bucket that will be polled for list operation. Required for collecting logs via the AWS S3 Bucket unless you set an Access Point ARN, or a Non-AWS Bucket Name for an S3-compatible service. In case both configurations are added, this one takes precedence.
- name: access_point_arn
type: text
title: "[S3] Access Point ARN"
multi: false
required: false
show_user: true
description: ARN of the AWS S3 Access Point that will be polled for list operation. Mandatory if the "Collect logs via S3 Bucket" switch is on. It is a required parameter for collecting logs via the AWS S3 Bucket unless you set a Bucket ARN.
description: ARN of the AWS S3 Access Point that will be polled for list operation. Required for collecting logs via the AWS S3 Bucket unless you set a Bucket ARN, or a Non-AWS Bucket Name for an S3-compatible service.
- name: non_aws_bucket_name
type: text
title: "[S3] Non-AWS Bucket Name"
multi: false
required: false
show_user: false
description: Name of the S3 bucket for use with S3-compatible services (e.g. MinIO, Ceph). Use instead of Bucket ARN when not connecting to AWS S3.

Check warning on line 82 in packages/sentinel_one_cloud_funnel/manifest.yml

View workflow job for this annotation

GitHub Actions / Lint user-facing content

Elastic.Latinisms: Latin terms and abbreviations are a common source of confusion. Use 'for example' instead of 'e.g'.

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/sentinel_one_cloud_funnel/manifest.yml:82

The S3-compatible options (non_aws_bucket_name, endpoint, path_style, region) are all show_user: false and unmentioned in the README, so a MinIO/Ceph user only sees Bucket ARN and Access Point ARN; document the S3-compatible flow in _dev/build/docs/README.md.

Details

non_aws_bucket_name, endpoint, path_style and region are all added with show_user: false, which matches the convention in packages/aws_logs/data_stream/generic/manifest.yml. The gap is that nothing tells a user this path exists: _dev/build/docs/README.md only documents the AWS S3 polling and AWS SQS modes, and the two visible bucket options (bucket_arn, access_point_arn, both show_user: true) still describe themselves as the only choices — bucket_arn says it is required "unless you set an Access Point ARN" and access_point_arn says it is "Mandatory if the 'Collect logs via S3 Bucket' switch is on". Neither mentions the third alternative this PR introduces.

There is also a hard requirement that is easy to miss: the Filebeat aws-s3 docs state that region is required when non_aws_bucket_name is defined, and that endpoint must be a full URI of the form http(s)://<s3 endpoint> in that case. The manifest cannot express a conditional required, so the README is the only place this can be conveyed. Without it, a misconfigured policy fails at agent runtime with no hint from the UI.

Recommendation:

Add a short subsection to packages/sentinel_one_cloud_funnel/_dev/build/docs/README.md under "Collect data from an AWS S3 bucket", for example:

### Collect data from an S3-compatible service (MinIO, Ceph, ...)

Under **Advanced options**, instead of a Bucket ARN or Access Point ARN, set:

- **[S3] Non-AWS Bucket Name** — the bucket name on the S3-compatible service.
- **Endpoint** — the full service URI, including the scheme, for example `https://s3.example.com:9000`.
- **Region** — required whenever a Non-AWS Bucket Name is set.
- **Path Style** — enable this; S3-compatible services generally require path-style access.

Authentication must use **Access Key ID** and **Secret Access Key**; IAM roles and shared credential profiles are AWS-only.

Optionally, also point the two visible bucket options at the alternative so the UI is self-consistent:

          - name: bucket_arn
            type: text
            title: "[S3] Bucket ARN"
            multi: false
            required: false
            show_user: true
            description: ARN of the AWS S3 bucket that will be polled for list operation. Required when collecting logs via the AWS S3 Bucket unless you set an Access Point ARN, or a Non-AWS Bucket Name for an S3-compatible service. In case both configurations are added, this one takes precedence.

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

⚠️ Automated review — verify suggestions before applying.

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/sentinel_one_cloud_funnel/manifest.yml:82

Adding non_aws_bucket_name as a third bucket option makes the neighbouring bucket_arn and access_point_arn descriptions inaccurate (they still claim one of the two ARNs is mandatory); update those two descriptions to mention the Non-AWS Bucket Name alternative.

Details

aws-s3.yml.hbs now selects between three mutually exclusive options: bucket_arn, access_point_arn, non_aws_bucket_name. The existing UI descriptions were written for two:

  • manifest.yml:68 (bucket_arn): "It is a required parameter for collecting logs via the AWS S3 Bucket unless you set an Access Point ARN."
  • manifest.yml:75 (access_point_arn): "Mandatory if the "Collect logs via S3 Bucket" switch is on. It is a required parameter for collecting logs via the AWS S3 Bucket unless you set a Bucket ARN."

Both statements are now false for the S3-compatible flow this PR adds, and they are the descriptions a MinIO/Ceph user reads first because those two vars are show_user: true while non_aws_bucket_name is not.

Recommendation:

Mention the third option in both descriptions:

          - name: bucket_arn
            type: text
            title: "[S3] Bucket ARN"
            multi: false
            required: false
            show_user: true
            description: ARN of the AWS S3 bucket that will be polled for list operation. Required for collecting logs via the AWS S3 Bucket unless you set an Access Point ARN, or a Non-AWS Bucket Name for an S3-compatible service. In case both configurations are added, this one takes precedence.
          - name: access_point_arn
            type: text
            title: "[S3] Access Point ARN"
            multi: false
            required: false
            show_user: true
            description: ARN of the AWS S3 Access Point that will be polled for list operation. Required for collecting logs via the AWS S3 Bucket unless you set a Bucket ARN, or a Non-AWS Bucket Name for an S3-compatible service.

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

⚠️ Automated review — verify suggestions before applying.

- name: queue_url
type: text
title: "[SQS] Queue URL"
Expand Down Expand Up @@ -169,6 +176,30 @@
# yvgJ38BRsFOtkRuAGSf6ZUwTO8JJRRIFnpUzXflAnGivK9M13D5GEQMmIl6U9Pvk
# sxSmbIUfc2SGJGCJD4I=
# -----END CERTIFICATE-----
- name: endpoint
type: text
title: Endpoint
multi: false
required: false
show_user: false
default: ""
description: URL of the entry point for an AWS web service. If set, the input will use this endpoint instead of the default AWS endpoint.

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/sentinel_one_cloud_funnel/manifest.yml:186

The Endpoint variable description shown in Fleet does not say the value must be a full URI including the scheme, unlike the README; restate the requirement in the manifest description.

Details

The Filebeat aws-s3 input requires endpoint to be a full URI of the form http(s)://<s3 endpoint> when non_aws_bucket_name is used (see the S3-compatible services section of https://www.elastic.co/docs/reference/beats/filebeat/filebeat-input-aws-s3). The README added in this PR states that correctly ("the full service URI, including the scheme, for example https://s3.example.com:9000"), but the manifest description, which is the text a user actually sees next to the field in Fleet, only says "URL of the entry point for an AWS web service. If set, the input will use this endpoint instead of the default AWS endpoint." A user who follows the Fleet UI alone can enter a bare host such as s3.example.com:9000 and the input will fail to connect. The same section is also where the region requirement is worth restating, which the region var already does.

Recommendation:

Make the in-product description match the README and the Filebeat requirement:

          - name: endpoint
            type: text
            title: Endpoint
            multi: false
            required: false
            show_user: false
            default: ""
            description: Full URI of the S3 service endpoint, including the scheme, for example `https://s3.example.com:9000`. Required when using a Non-AWS Bucket Name for an S3-compatible service. Leave empty to use the default AWS endpoint.

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

⚠️ Automated review — verify suggestions before applying.

- name: path_style
type: bool
title: Path Style
multi: false
required: false
show_user: false
default: false
description: Enable path-style S3 access. Required when using non-AWS S3-compatible services.
- name: region
type: text
title: Region
multi: false
required: false
show_user: false
default: ""
description: AWS region for the S3 bucket. Required when using non_aws_bucket_name.
# Rerouting options
- name: reroute_command_script
type: bool
Expand Down
Loading