Автоматизация уведомлений CSPM

Материал из Документация Ключ-АСТРОМ
Версия от 18:32, 24 сентября 2026; IKuznetsov (обсуждение | вклад) (Новая страница: « = Автоматизация уведомлений CSPM = '''Ранний доступ''' Гиперскейлеры предоставляют предложения, такие как '''AWS Security Hub''', через которые события, связанные с безопасностью, дают представление о потенциальных угрозах. Эти события должны быть отсортированы, п...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Автоматизация уведомлений CSPM

Ранний доступ

Гиперскейлеры предоставляют предложения, такие как AWS Security Hub, через которые события, связанные с безопасностью, дают представление о потенциальных угрозах. Эти события должны быть отсортированы, проанализированы и устранены владельцами затронутых ресурсов, и достижение сотен тысяч таких оповещений является обычным делом.

Объём этих событий в настоящее время означает, что не все из них могут получить заслуженное внимание. Поскольку владение ресурсами распределено, требуется значительная координация и административные усилия, чтобы гарантировать, что все события будут обработаны. Ключ-АСТРОМ решает эти проблемы и улучшает управление состоянием безопасности облака (CSPM), предлагая рабочий процесс автоматизации, который фильтрует обнаружения безопасности и запускает оповещения только для событий, которые имеют значение.

Целевая аудитория

Эта страница предназначена для команд безопасности, анализирующих обнаружения безопасности.

Сценарий

Далее мы рассматриваем сценарий, в котором ежедневно выдаётся 400 000 оповещений в облаке.

Ручная обработка всех их просто невыполнима. Поэтому команда безопасности должна сосредоточиться только на событиях высокого приоритета и создала собственные инструменты для частичной автоматизации создания тикетов Jira.

В течение года из этих событий было вручную создано почти 1100 тикетов безопасности. Расследование этих тикетов включало около 300 человек, собирающих дополнительную информацию для анализа ситуации. Иногда усилия тратятся впустую, и оповещения оказываются неактуальными, но владелец ресурса всегда должен перепроверять решение с командой безопасности. Обеспечение того, чтобы все они были отслежены, требует значительных усилий по координации, оставляя меньше времени на фактическую работу по безопасности.

Запрос

Команда хочет иметь возможность исследовать все данные, но получать уведомления (тикеты) только для критических или высоких событий и только для определённых relevant учётных записей.

Уведомления должны включать тип оповещения, полный контекст, relevant сведения и рекомендации по устранению, чтобы обеспечить понимание, возможность действий и операционализацию.

Только владелец учётной записи должен быть проинформирован о проблеме (тикеты должны автоматически назначаться ему).

Команда не хочет получать спам из нескольких уведомлений по одной и той же проблеме, поэтому не должно быть дублирующихся тикетов.

Цель

Эффективность: команда должна иметь возможность немедленно действовать по всему, что имеет значение.

Результат

Автоматизация уведомлений CSPM Ключ-АСТРОМ — это инструмент, разработанный для решения проблем команды безопасности и значительного повышения их эффективности. Он позволяет команде продолжать мониторинг событий, не обременяя себя оповещениями; теперь они могут сосредоточиться только на том, что имеет значение и требует их экспертизы в области безопасности.

Более конкретно, из общего числа 400 000 оповещений в день, из которых только 40 000 являются relevant, с автоматизацией уведомлений CSPM Ключ-АСТРОМ теперь ежедневно создаётся всего пара тикетов Jira, только для relevant проблем.

Как это работает

Автоматизация уведомлений CSPM Ключ-АСТРОМ состоит из двух этапов.

  1. (Предварительное условие) Обнаружения безопасности из AWS Security Hub загружаются в Ключ-АСТРОМ посредством приёма логов Ключ-АСТРОМ.
  2. (Собственно автоматизация) Предопределённый рабочий процесс оркестрирует процессы запроса, фильтрации и группировки данных и преобразует полученные обнаружения в тикеты Jira для устранения. Шаги рабочего процесса см. в разделе «Начало работы».

Предварительные требования

Ниже приведены требования для облачных сервисов и Ключ-АСТРОМ.

Требования облачных сервисов

  • Настройте учётные записи, для которых вы хотите получать уведомления.
  • Настройте AWS Security Hub (собирает обнаружения безопасности).

Требования Ключ-АСТРОМ

  • Версия Ключ-АСТРОМ 1.276+
  • Настройте приём логов (загружает обнаружения безопасности).
  • Настройте Jira Connector (позволяет рабочему процессу преобразовывать полученные обнаружения в тикеты Jira).
  • Убедитесь, что включены следующие разрешения.
    • storage:logs:read. Инструкции см. в разделе «Назначение разрешений».
    • Рабочие процессы: разрешения на доступ, просмотр, запись и выполнение рабочих процессов. Подробности см. в разделе «Авторизация».

Чтобы получить доступ к разрешениям, перейдите в меню настроек в правом верхнем углу Рабочих процессов и выберите Настройки авторизации.

Начало работы

После того как ваши обнаружения безопасности загружены (см. «Предварительные требования»), вы можете настроить рабочий процесс автоматизации уведомлений CSPM.

Рабочий процесс состоит из нескольких шагов, которые вы можете адаптировать под свои нужды. Чтобы настроить его, вы можете начать с импорта предварительно заполненного рабочего процесса в вашу среду.

Шаг 1. Импортируйте рабочий процесс

Скопируйте и сохраните файл JSON ниже.

{
  "id": "dcce961d-26a9-46e6-a9e4-14a0f7f2185c",
  "title": "CSPM Notification Automation",
  "description": "",
  "tasks": {
    "count_all_new_findings": {
      "name": "count_all_new_findings",
      "description": "Executes query to count all recently created AWS findings",
      "action": "astromkey.automations:execute-dql-query",
      "active": true,
      "input": {
        "query": "fetch logs, from:now() - 24h, scanLimitGBytes: -1\n| filter aws.log_group == \"/aws/events/AWSSecurityHubLogGroup\"\n| fields timestamp\n| filter timestamp > now() - 24h                                                                        // Only filter created since last successful run         \n| summarize { count=count() }"
      },
      "position": {
        "x": -1,
        "y": 2
      },
      "predecessors": [
        "workflow_config_params"
      ],
      "conditions": {
        "states": {
          "workflow_config_params": "OK"
        }
      }
    },
    "log_new_findings_count": {
      "name": "log_new_findings_count",
      "description": "Logs total number of recently created AWS findings",
      "action": "astromkey.automations:run-javascript",
      "active": true,
      "input": {
        "script": "import { execution } from '@astromkey-sdk/automation-utils';\n\nexport default async function () {\n\n  const ex = await execution();\n  const countResult = await ex.result(\"count_all_new_findings\");\n\n  console.log('======================================================================')\n  console.log('Total findings added since last run: ')\n  console.log(countResult.records[0].count)\n  console.log('')\n}"
      },
      "position": {
        "x": -1,
        "y": 3
      },
      "predecessors": [
        "count_all_new_findings"
      ],
      "conditions": {
        "states": {
          "count_all_new_findings": "OK"
        }
      }
    },
    "log_tickets_by_account": {
      "name": "log_tickets_by_account",
      "description": "Logs potentially created Jira issues for findings by account",
      "action": "astromkey.automations:run-javascript",
      "active": true,
      "input": {
        "script": "import { execution } from '@astromkey-sdk/automation-utils';\n\nexport default async function () {\n  const ex = await execution();\n  const by_control_id = await ex.result(\"fetch_findings_by_account\");\n\n  console.log('=================================================================================================')\n  console.log(`Issues by accounts, ${by_control_id.records.length} findings`)\n  console.log('=================================================================================================')\n\n  for(let finding of by_control_id.records) {\n    console.log('')\n    console.log('=================================================================================================')\n    console.log(`Automatic Vulnerability Report for ${finding.controlId} - AWS account ${finding.awsAccountId}`)\n    console.log('=================================================================================================')\n    console.log('')\n    console.log('The following vulnerabilities were reported for your account via AWS Security Hub.')\n    console.log('')\n    console.log(`AWS Account: ${finding.awsAccountId}`)\n    console.log('')\n    console.log('Vulnerability:')\n    console.log(`${finding.controlId} - ${finding.title}`)\n    console.log(finding.severity)\n    console.log(finding.description)\n    console.log(finding.remediation[0].Recommendation.Url)\n    console.log('')\n    console.log('Affected resources:')\n    for(let resource of finding.resources) {\n      console.log(resource)\n    }\n    console.log('')          \n    console.log('=================================================================================================')\n    console.log('')\n    console.log('')\n  }\n  \n  return by_control_id.records;\n}"
      },
      "position": {
        "x": 0,
        "y": 3
      },
      "predecessors": [
        "fetch_findings_by_account"
      ],
      "conditions": {
        "states": {
          "fetch_findings_by_account": "OK"
        }
      }
    },
    "workflow_config_params": {
      "name": "workflow_config_params",
      "description": "Sets configuration parameters for the workflow run",
      "action": "astromkey.automations:run-javascript",
      "input": {
        "script": "// This step sets up some configurational parameters for the workflow run \n// (e.g. which accounts, which finding types we are filtering for)\nexport default async function () {\n\n  // AWS accounts to filter for\n  const awsAccountIds = [\n    // add your AWS account ids here, e.g.\n    // \"1234567890\"\n  ]\n\n  // Findings that should be grouped by AWS account\n  const securityControlIdsToGroupByAccount = [\n    // add you control IDs here, e.g.\n    // \"S3.1\" // S3 Block Public Access setting should be enabled\n  ]\n\n  // Findings that should be grouped by AWS Resource\n  const securityControlIdsToGroupByResource = [\n    // add you control IDs here, e.g.\n    // \"EC2.13\" // Security groups should not allow ingress from 0.0.0.0/0 to port 22\n  ]\n  \n  return { awsAccountIds, securityControlIdsToGroupByAccount, securityControlIdsToGroupByResource }\n}"
      },
      "position": {
        "x": 0,
        "y": 1
      },
      "predecessors": []
    },
    "log_tickets_by_resource": {
      "name": "log_tickets_by_resource",
      "description": "Logs potentially created Jira issues for findings by resource",
      "action": "astromkey.automations:run-javascript",
      "active": true,
      "input": {
        "script": "import { execution } from '@astromkey-sdk/automation-utils';\n\nexport default async function () {\n  const ex = await execution();\n  const by_resource = await ex.result(\"fetch_findings_by_resource\");\n\n  console.log('=================================================================================================')\n  console.log(`Issues by resource, ${by_resource.records.length} findings`)\n  console.log('=================================================================================================')\n\n  for(let finding of by_resource.records) {\n    console.log('')\n    console.log('=================================================================================================')\n    console.log(`Automatic Vulnerability Report for ${finding.resource.resourceId}`)\n    console.log('=================================================================================================')\n    console.log('')\n    console.log('The following vulnerabilities were reported for your resource via AWS Security Hub.')\n    console.log('')\n    console.log(`AWS Account: ${finding.aws.accountId}`)\n    console.log('')\n    console.log('Resource details:')\n    console.log(finding.resource.resourceType)\n    console.log(finding.resource.resourceId)\n    console.log('')\n    console.log('Vulnerabilities:')\n    for(let vulnerability of finding.vulnerabilities) {\n      console.log(`${vulnerability.controlId} - ${vulnerability.title}`)\n      console.log(vulnerability.severity)\n      console.log(vulnerability.description)\n      console.log(vulnerability.remediation[0].Recommendation.Url)      \n    }\n    console.log('=================================================================================================')\n    console.log('')\n    console.log('')\n  }\n  \n  return by_resource.records;\n}"
      },
      "position": {
        "x": 1,
        "y": 3
      },
      "predecessors": [
        "fetch_findings_by_resource"
      ],
      "conditions": {
        "states": {
          "fetch_findings_by_resource": "OK"
        }
      }
    },
    "create_issue_for_account": {
      "name": "create_issue_for_account",
      "description": "Creates new Jira issue or the vulnerable AWS account",
      "action": "astromkey.jira:jira-create-issue",
      "active": false,
      "input": {
        "labels": [],
        "summary": "{{ _.item.summary }}",
        "components": [],
        "description": "{{ _.item.description }}",
        "fieldSetters": []
      },
      "position": {
        "x": 0,
        "y": 5
      },
      "predecessors": [
        "prepare_tickets_by_account"
      ],
      "conditions": {
        "states": {
          "prepare_tickets_by_account": "OK"
        }
      },
      "concurrency": 1,
      "withItems": "item in {{result(\"prepare_tickets_by_account\")}}"
    },
    "create_issue_for_resource": {
      "name": "create_issue_for_resource",
      "description": "Creates new issue for the vulnerable AWS resource",
      "action": "astromkey.jira:jira-create-issue",
      "active": false,
      "input": {
        "labels": [],
        "summary": "{{ _.item.summary }}",
        "components": [],
        "description": "{{ _.item.description }}",
        "fieldSetters": []
      },
      "position": {
        "x": 1,
        "y": 5
      },
      "predecessors": [
        "prepare_tickets_by_resource"
      ],
      "conditions": {
        "states": {
          "prepare_tickets_by_resource": "OK"
        }
      },
      "concurrency": 1,
      "withItems": "item in {{result(\"prepare_tickets_by_resource\")}}"
    },
    "fetch_findings_by_account": {
      "name": "fetch_findings_by_account",
      "description": "Executes query to get relevant security findings grouped by AWS account",
      "action": "astromkey.automations:execute-dql-query",
      "active": true,
      "input": {
        "query": "fetch logs, from:now() - 24h, scanLimitGBytes: -1\n| filter aws.log_group == \"/aws/events/AWSSecurityHubLogGroup\"\n| parse content, \"JSON:alert\"\n| fields timestamp,\n         awsRegion = toString(alert[detail][findings][0][Region]),\n         awsAccountId = toString(alert[detail][findings][0][AwsAccountId]),\n         resourceType = toString(alert[detail][findings][0][Resources][0][Type]),          \n         resource = toString(alert[detail][findings][0][Resources][0][Id]),\n         alertType = toString(alert[detail][findings][0][Types][0]),\n         id = toString(alert[detail][findings][0][Id]),\n         severity = toString(alert[detail][findings][0][FindingProviderFields][Severity][Label]),\n         title = toString(alert[detail][findings][0][Title]),\n         description = toString(alert[detail][findings][0][Description]),\n         complianceStatus = toString(alert[detail][findings][0][Compliance][Status]),\n         controlId = toString(alert[detail][findings][0][Compliance][SecurityControlId]),\n         remediation = alert[detail][findings][0][Remediation],\n         created = toTimestamp(alert[detail][findings][0][CreatedAt]),\n         lastObservedAt = toTimestamp(alert[detail][findings][0][LastObservedAt])\n| filter in(severity, array(\"HIGH\", \"CRITICAL\", \"MEDIUM\"))\n| filter created > now() - 24h\n| filter in(awsAccountId, array(\"{{ result('workflow_config_params').awsAccountIds | join('\",\"') }}\"))\n| filter in(controlId, array(\"{{ result('workflow_config_params').securityControlIdsToGroupByAccount | join('\",\"') }}\"))\n| summarize { count=count(),\n              lastObservedAt = max(lastObservedAt),\n              remediation = collectDistinct(remediation),\n              complianceStatus = takeLast(complianceStatus),\n              resources = collectDistinct(resource),\n              title = takeAny(title),\n              description = takeAny(description),\n              severity = takeAny(severity),\n              awsRegion = collectArray(awsRegion)\n            },\n            by:{\n              controlId, \n              awsAccountId\n           }\n| lookup\n  [ fetch dt.entity.aws_credentials \n    | fields awsAccountId, entity.name\n  ], lookupField:awsAccountId, sourceField:awsAccountId, prefix: \"aws.account.\"\n"
      },
      "position": {
        "x": 0,
        "y": 2
      },
      "predecessors": [
        "workflow_config_params"
      ],
      "conditions": {
        "states": {
          "workflow_config_params": "OK"
        }
      }
    },
    "fetch_findings_by_resource": {
      "name": "fetch_findings_by_resource",
      "description": "Executes query to get relevant security findings grouped by AWS resource",
      "action": "astromkey.automations:execute-dql-query",
      "active": true,
      "input": {
        "query": "fetch logs, from:now() - 24h, scanLimitGBytes: -1\n| filter aws.log_group == \"/aws/events/AWSSecurityHubLogGroup\"\n| parse content, \"JSON:alert\"\n| fields timestamp,\n         awsRegion = toString(alert[detail][findings][0][Region]),\n         awsAccountId = toString(alert[detail][findings][0][AwsAccountId]),\n         resourceType = toString(alert[detail][findings][0][Resources][0][Type]),          \n         resourceId = toString(alert[detail][findings][0][Resources][0][Id]),\n         alertType = toString(alert[detail][findings][0][Types][0]),\n         id = toString(alert[detail][findings][0][Id]),\n         severity = toString(alert[detail][findings][0][FindingProviderFields][Severity][Label]),\n         title = toString(alert[detail][findings][0][Title]),\n         description = toString(alert[detail][findings][0][Description]),\n         complianceStatus = toString(alert[detail][findings][0][Compliance][Status]),\n         controlId = toString(alert[detail][findings][0][Compliance][SecurityControlId]),\n         remediation = alert[detail][findings][0][Remediation],\n         created = toTimestamp(alert[detail][findings][0][CreatedAt]),\n         lastObservedAt = toTimestamp(alert[detail][findings][0][LastObservedAt])\n| filter in(severity, array(\"HIGH\", \"CRITICAL\", \"MEDIUM\"))\n| filter created > now() - 24h\n| filter in(awsAccountId, array(\"{{ result('workflow_config_params').awsAccountIds | join('\",\"') }}\"))\n| filter in(controlId, array(\"{{ result('workflow_config_params').securityControlIdsToGroupByResource | join('\",\"') }}\"))\n| summarize { count=count(),\n              lastObservedAt = max(lastObservedAt),\n              remediation = collectDistinct(remediation),\n              complianceStatus = takeLast(complianceStatus)\n            },\n            by:{\n              alertType, \n              resourceType, \n              controlId, \n              title,\n              description, \n              severity, \n              resourceId, \n              awsAccountId,\n              created,\n              awsRegion\n           }\n| lookup\n  [ fetch dt.entity.aws_credentials \n    | fields id, awsAccountId, entity.name, tags, awsNameTag\n  ], lookupField:awsAccountId, sourceField:awsAccountId, prefix: \"aws.account.\"\n| fields aws = record(\n            accountId = awsAccountId,\n            name = aws.account.entity.name,\n            entity = aws.account.id\n         ), \n         resource = record(\n           resourceId = resourceId,\n           resourceType = resourceType\n         ),\n         region = awsRegion,\n         alert = record(controlId = controlId, \n           severity = severity, \n           complianceStatus = complianceStatus,\n           title = title,\n           description = description,\n           remediation = remediation\n         )\n| summarize {\n        count=count(),\n        vulnerabilities = collectDistinct(alert)\n      },\n      by:{\n        aws,\n        resource,\n        region\n      }"
      },
      "position": {
        "x": 1,
        "y": 2
      },
      "predecessors": [
        "workflow_config_params"
      ],
      "conditions": {
        "states": {
          "workflow_config_params": "OK"
        }
      }
    },
    "prepare_tickets_by_account": {
      "name": "prepare_tickets_by_account",
      "description": "Prepares payload of Jira tickets for vulnerable AWS accounts",
      "action": "astromkey.automations:run-javascript",
      "active": true,
      "input": {
        "script": "import { execution } from '@astromkey-sdk/automation-utils';\n\nexport default async function () {\n    const ex = await execution();\n    const records = await ex.result(\"log_tickets_by_account\");\n\n    console.log(`${records.length} Tickets will be created!`)\n    const result = [];\n    for (const finding of records) {\n        console.log('------------------------------------- NEW TICKET -------------------------------------')\n        const resourcesList = finding.resources\n          .map( resource => `|${resource}|` )\n          .join('\\n')\n        const ticket =  {\n            summary: `Automatic Vulnerability Report for ${finding.controlId} - AWS Account ${finding.awsAccountId}`,\n            description: 'The following vulnerabilities were reported for your resource via AWS Security Hub:\\n\\n'\n              + '*AWS Account*:\\n'\n              + '||AWS Account Id||\\n'\n              +  `|${finding.awsAccountId}|\\n\\n`\n              + '*Vulnerability*:\\n'\n              + '||Id||Sev||Title||Description||Remediation Url||\\n'\n              + `|{noformat}${finding.controlId}{noformat}|{noformat}${finding.severity}{noformat}|${finding.title}|${finding.description}|[${finding.remediation[0].Recommendation.Url}]|\\n\\n`\n              + '*Affected Resources*:\\n'\n              + '||Resource Id||\\n'\n              + resourcesList\n              + '\\n\\n---\\nAutomatically generated by CSPM Notification Automation'\n        }\n        console.log(JSON.stringify(ticket))\n        result.push(ticket)\n    }\n\n    return result;\n}"
      },
      "position": {
        "x": 0,
        "y": 4
      },
      "predecessors": [
        "log_tickets_by_account"
      ],
      "conditions": {
        "states": {
          "log_tickets_by_account": "OK"
        }
      }
    },
    "prepare_tickets_by_resource": {
      "name": "prepare_tickets_by_resource",
      "description": "Prepares payload of Jira tickets for vulnerable AWS resources",
      "action": "astromkey.automations:run-javascript",
      "active": true,
      "input": {
        "script": "import { execution } from '@astromkey-sdk/automation-utils';\n\nexport default async function () {\n    const ex = await execution();\n    const records = await ex.result(\"log_tickets_by_resource\");\n\n    console.log(`${records.length} Tickets will be created!`)\n    const result = [];\n    for (const finding of records) {\n        console.log('------------------------------------- NEW TICKET -------------------------------------')\n        const vulnerabilitiesList = finding.vulnerabilities\n          .map( vuln => \n            `|{noformat}${vuln.controlId}{noformat}|{noformat}${vuln.severity}{noformat}|${vuln.title}|${vuln.description}|[${vuln.remediation[0].Recommendation.Url}]|`)\n          .join('\\n')\n        const ticket =  {\n            summary: `Automatic Vulnerability Report for ${finding.resource.resourceId}`,\n            description: 'The following vulnerabilities were reported for your resource via AWS Security Hub:\\n\\n'\n              + '*AWS Account*:\\n'\n              + '||AWS Account Id||\\n'\n              +  `|${finding.aws.accountId}|\\n\\n`\n              + '*Resource Details*:\\n'\n              + '||Resource Type||Resource Id||\\n'\n              + `|${finding.resource.resourceType}|${finding.resource.resourceId}|\\n\\n`\n              + '*Vulnerabilities*:\\n'\n              + '||Id||Sev||Title||Description||Remediation Url||\\n'\n              + vulnerabilitiesList\n              + '\\n\\n---\\nAutomatically generated by CSPM Notification Automation'\n        }\n        console.log(JSON.stringify(ticket))\n        result.push(ticket)\n    }\n\n    return result;\n}"
      },
      "position": {
        "x": 1,
        "y": 4
      },
      "predecessors": [
        "log_tickets_by_resource"
      ],
      "conditions": {
        "states": {
          "log_tickets_by_resource": "OK"
        }
      }
    }
  },
  "ownerType": "USER",
  "isPrivate": false,
  "trigger": {
    "schedule": {
      "rule": null,
      "trigger": {
        "type": "time",
        "time": "09:00"
      },
      "timezone": "Europe/Berlin",
      "isActive": true,
      "isFaulty": false,
      "nextExecution": "2023-10-03T07:00:00.000Z",
      "filterParameters": {
        "earliestStart": "2023-09-25"
      },
      "inputs": {}
    }
  },
  "schemaVersion": 3
}

В Рабочих процессах выберите Загрузить и загрузите файл.

Шаг 2. Задайте время

  • Триггер по фиксированному времени: задаёт время, когда вы хотите, чтобы рабочий процесс запускался (в текущем случае рабочий процесс запускается ежедневно в 9:00). Дополнительные сведения о планировании рабочего процесса см. в разделе «Планирование рабочих процессов».

Шаг 3. Определите параметры

  • Параметры конфигурации рабочего процесса: определяет, какие обнаружения вы хотите фильтровать. В текущем сценарии команда хочет:
    • Получать уведомления только об обнаружениях из важных учётных записей, отбрасывая обнаружения из других учётных записей, таких как среды, не находящиеся в продуктивной эксплуатации.
      • В разделе awsAccountIds выберите, для каких учётных записей вы хотите получать обнаружения.
    • Группировать обнаружения для определённых идентификаторов контролей безопасности в один тикет на учётную запись.
      • В разделе securityControlIdsToGroupByAccount выберите, какие идентификаторы контролей безопасности вы хотите группировать по учётной записи.
    • Группировать обнаружения для определённых идентификаторов контролей безопасности в один тикет на ресурс.
      • В разделе securityControlIdsToGroupByResource выберите, какие идентификаторы контролей безопасности вы хотите группировать по ресурсу.

Шаг 4. Оркестрация обнаружений

По учётной записи

По ресурсу

Следующая последовательность задач оркестрирует группировку и преобразование полученных обнаружений в один тикет на учётную запись.

  • Получение обнаружений по учётной записи: выполняет запрос DQL, который получает обнаружения. Некоторые сведения, полученные для текущего случая для отображения в Jira, включают:
    • Количество обнаружений для соответствующей учётной записи.
    • Заголовок проблемы, включая идентификаторы контролей безопасности и имя учётной записи.
    • Краткое описание уязвимостей.
    • Ссылка на инструкции по устранению уязвимостей.
    • Список затронутых ресурсов.
  • Запись тикетов по учётной записи: показывает потенциальное содержимое тикета до его автоматического создания. Этот шаг гарантирует, что ваша конфигурация верна. Подробности см. в разделе «Отображение статистики перед созданием тикетов».
  • Подготовка тикетов по учётной записи: настраивает полезную нагрузку для тикета Jira.
  • Создание проблем для учётной записи: интегрируется с вашим подключением Jira. В разделе Ввод выберите ваше подключение Jira, созданное в разделе «Предварительные требования», и введите нужные параметры тикета Jira.

Шаг 5. Отображение статистики

Следующая последовательность задач отображает количество новых обнаружений с момента последнего запуска рабочего процесса.

  • Подсчёт всех новых обнаружений: выполняет запрос DQL, который получает количество обнаружений, созданных AWS Security Hub за последние 24 часа.
  • Запись количества новых обнаружений: отображает результат запроса.

После завершения настройки рабочего процесса выберите Сохранить.

Отображение статистики перед созданием тикетов

Чтобы протестировать конфигурацию перед отправкой тикетов Jira:

  1. Отключите задачи Подготовка тикетов по учётной записи/ресурсу и Создание проблем для учётной записи/ресурса.
    • Инструкции по отключению задачи см. в разделе «Отключение или включение задачи».
  2. Запустите рабочий процесс или выполните отдельные задачи, для которых вы хотите проверить вывод. Инструкции см. в разделе «Запуск и мониторинг рабочих процессов».

Умная безопасность

Поздравляем! Теперь вы настроили автоматизацию, которая расширяет возможности вашей команды безопасности. С автоматизацией уведомлений CSPM Ключ-АСТРОМ критические события оптимизируются, усталость от оповещений минимизируется, а безопасность облака повышается.