CohesityHelios

Integrate with Cohesity Helios services to fetch alerts and take remedial action.

Vulnerability Management · Cohesity Helios

Details

IDCohesityHelios
ProviderCohesity
CategoryVulnerability Management
From Version6.0.0
Docker Imagedemisto/python3:3.12.13.10116658
Supported ModulesAgentix XSIAM

README

Integrate with Cohesity Helios services to fetch alerts and take remedial action.
This integration was integrated and tested with version 08.01 of CohesityHelios.

Configure CohesityHelios in Cortex

Parameter Description Required
Your server URL   True
API Key The API Key to use for connection True
Trust any certificate (not secure) Trust any certificate (not secure). False
Use system proxy settings Use system proxy settings. False
Incident type   False
Maximum number of incidents to fetch every time   True
First fetch timestamp   False
Fetch incidents   False
Incidents Fetch Interval   False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

cohesity-helios-get-ransomware-alerts


Get Cohesity Helios ransomware alerts.

Base Command

cohesity-helios-get-ransomware-alerts

Input

Argument Name Description Required
created_after Returns only alerts created after the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ). Optional
created_before Returns only alerts created before the provided timestamp (ISO8601 format YYYY-MM-DDTHH:MM:SSZ). Optional
limit Limits the number of alerts to return. Default is 200. Optional
alert_id_list List of comma-separated alert identifiers to filter alerts. Optional
cluster_id_list List of comma-separated cluster identifiers to filter alerts. Optional
region_id_list List of comma-separated region identifiers to filter alerts. Optional
alert_state_list One or more state values. Possible values are: kOpen, kSuppressed, kResolved, kNote. Default is kOpen. Optional
alert_severity_list One or more severity levels. Possible values are: kCritical, kWarning, kInfo. Default is kCritical,kWarning. Optional

Context Output

Path Type Description
CohesityHelios.RansomwareAlert.alert_id String The identifier for the ransomware alert.
CohesityHelios.RansomwareAlert.occurrence_time Date The timestamp when the alert occurred (for example, 2020-01-01T00:11:22Z).
CohesityHelios.RansomwareAlert.severity String The severity of the ransomware alert.
CohesityHelios.RansomwareAlert.alert_description String The description for the ransomware alert.
CohesityHelios.RansomwareAlert.alert_cause String The cause for the ransomware alert.
CohesityHelios.RansomwareAlert.cluster_id Number The cluster ID where the alert originated.
CohesityHelios.RansomwareAlert.cluster_name String The cluster name where the alert originated.
CohesityHelios.RansomwareAlert.entity_id String The entity ID (object ID) from the alert propertyList.
CohesityHelios.RansomwareAlert.job_id String The job ID from the alert propertyList.

cohesity-helios-ignore-anomalous-object


Ignore detected anomalous object by suppressing the alert.

Base Command

cohesity-helios-ignore-anomalous-object

Input

Argument Name Description Required
alert_id The alert ID to suppress. Required

Context Output

There is no context output for this command.

Command Example

!cohesity-helios-ignore-anomalous-object alert_id=9346668452014081:1632849269030240

Human Readable Output

Ignored alert 9346668452014081:1632849269030240.

cohesity-helios-restore-latest-clean-snapshot


Restore the latest clean snapshot for the given object using incidence details.

Base Command

cohesity-helios-restore-latest-clean-snapshot

Input

Argument Name Description Required
alert_id The alert ID to restore the latest clean snapshot for. Required

Context Output

There is no context output for this command.

Command Example

!cohesity-helios-restore-latest-clean-snapshot alert_id=2122491972847952:1632848348897740

Human Readable Output

Restored vm-ubuntu-05 (id=object-1002) from latest clean snapshot.

Configuration parameters

  • url — Your server URL (required)
  • apikey — API Key (required)
  • insecure — Trust any certificate (not secure)
  • proxy — Use system proxy settings
  • incidentType — Incident type
  • max_fetch — Maximum number of incidents to fetch every time (required)
  • first_fetch — First fetch timestamp
  • isFetch — Fetch incidents
  • incidentFetchInterval — Incidents Fetch Interval

Commands (3)

  • cohesity-helios-get-ransomware-alerts

    Get Cohesity Helios ransomware alerts.

  • cohesity-helios-ignore-anomalous-object

    Ignore detected anomalous object by suppressing the alert.

  • cohesity-helios-restore-latest-clean-snapshot

    Restore the latest clean snapshot for the given object using incidence details.

"""Cohesity Helios Cortex XSOAR - Unit Tests file"""

import json

BASE_URL = "https://helios.cohesity.com/"
ALERTS_V2_URL = BASE_URL + "v2/mcm/alerts"
ALERT_PATCH_URL = BASE_URL + "mcm/alerts/"
INCIDENCES_URL = BASE_URL + "mcm/argus/api/v1/public/incidences"
RECOVERIES_URL = BASE_URL + "v2/data-protect/recoveries"

MOCK_ALERT_ID = "6595940238747379:1630539139046817"
MOCK_ALERTS_RESP_FILE = "test_data/get_ransomware_alerts_resp.json"
MOCK_ALERT_DETAIL_RESP_FILE = "test_data/get_ransomware_alert_detail_resp.json"
MOCK_INCIDENCE_RESP_FILE = "test_data/get_incidence_details_resp.json"


def util_load_json(path):
    with open(path, encoding="utf-8") as f:
        return json.loads(f.read())


def test_test_module(requests_mock):
    """Tests test-module command function."""
    from CohesityHelios import Client, test_module

    # Given: A Cohesity client with a valid alerts endpoint response.
    client = Client(base_url=BASE_URL, verify=False)
    mock_response = {"alertsList": []}
    requests_mock.get(ALERTS_V2_URL, json=mock_response)

    # When: The test-module command is executed.
    response = test_module(client)

    # Then: The integration returns an "ok" connectivity result.
    assert response == "ok"


def test_fetch_incidents_command(requests_mock):
    """Tests fetch incidents command with v2 API response format."""
    from CohesityHelios import Client, fetch_incidents_command

    # Given: A Cohesity client and a mocked v2 alerts response payload.
    client = Client(base_url=BASE_URL, verify=False)
    mock_response = util_load_json(MOCK_ALERTS_RESP_FILE)
    requests_mock.get(ALERTS_V2_URL, json=mock_response)

    # When: fetch-incidents runs against the mocked data.
    response = fetch_incidents_command(client)

    # Then: One incident is created with expected mapped custom fields.
    assert len(response) == 1

    incident = response[0]
    assert incident["name"] == "DataIngestAnomalyAlert"
    assert incident["CustomFields"]["cohesityheliosalertid"] == MOCK_ALERT_ID
    assert incident["CustomFields"]["cohesityheliosobjectid"] == "2294"
    assert incident["CustomFields"]["cohesityheliosclustername"] == "sac01-pm-haswell2-p1"
    assert incident["CustomFields"]["cohesityheliosclusterid"] == 6573823962906680


def test_get_ransomware_alerts_command(requests_mock):
    """Tests get_ransomware_alerts_command with v2 API response format."""
    from CohesityHelios import Client, get_ransomware_alerts_command

    # Given: A Cohesity client and one ransomware alert in the API response.
    client = Client(base_url=BASE_URL, verify=False)
    mock_response = util_load_json(MOCK_ALERTS_RESP_FILE)
    requests_mock.get(ALERTS_V2_URL, json=mock_response)

    # When: The get-ransomware-alerts command is called.
    args = {"limit": "10"}
    result = get_ransomware_alerts_command(client, args)

    # Then: Command outputs contain expected context fields from the alert.
    assert result.outputs_prefix == "CohesityHelios.RansomwareAlert"
    assert len(result.outputs) == 1
    assert result.outputs[0]["alert_id"] == MOCK_ALERT_ID
    assert result.outputs[0]["entity_id"] == "2294"
    assert result.outputs[0]["job_id"] == "245242"
    assert result.outputs[0]["cluster_name"] == "sac01-pm-haswell2-p1"


def test_ignore_ransomware_anomaly_command(requests_mock):
    """Tests ignore_ransomware_anomaly_command with alert_id argument."""
    from CohesityHelios import Client, ignore_ransomware_anomaly_command

    # Given: A Cohesity client and a successful suppress alert API response.
    client = Client(base_url=BASE_URL, verify=False)
    requests_mock.patch(ALERT_PATCH_URL + MOCK_ALERT_ID, status_code=200, text="")

    # When: ignore-anomalous-object is called with alert_id.
    args = {"alert_id": MOCK_ALERT_ID}
    response = ignore_ransomware_anomaly_command(client, args)

    # Then: A success message references the same alert_id.
    assert response == f"Ignored alert {MOCK_ALERT_ID}."


def test_restore_latest_clean_snapshot(requests_mock):
    """Tests restore_latest_clean_snapshot with incidences and recoveries APIs."""
    from CohesityHelios import Client, restore_latest_clean_snapshot

    # Given: Incidence details, recovery API, and resolve alert API are mocked.
    client = Client(base_url=BASE_URL, verify=False)
    mock_incidence_resp = util_load_json(MOCK_INCIDENCE_RESP_FILE)
    requests_mock.get(INCIDENCES_URL, json=mock_incidence_resp)
    requests_mock.post(RECOVERIES_URL, json={})
    requests_mock.patch(ALERT_PATCH_URL + MOCK_ALERT_ID, status_code=200, text="")

    # When: restore-latest-clean-snapshot is called with alert_id.
    args = {"alert_id": MOCK_ALERT_ID}
    response = restore_latest_clean_snapshot(client, args)

    # Then: The command reports successful recovery of the expected entity.
    assert response == "Restored mock-testing03 (id=2294) from latest clean snapshot."