Wie richte ich mithilfe von EventBridge mit einem Amazon-SNS-Thema benutzerdefinierte E-Mail-Benachrichtigungen für Security-Hub-Ergebnisse ein?

Letzte Aktualisierung: 11.01.2022

Ich möchte mithilfe von Amazon EventBridge und einem Amazon-Simple-Notification-Service-Thema (Amazon SNS) eine benutzerdefinierte E-Mail-Benachrichtigung für Security-Hub-Ergebnisse einrichten.

Kurzbeschreibung

Die folgende Auflösung zeigt Ihnen, wie Sie EventBridge mit SNS für den Empfang von Security-Hub-Benachrichtigungen konfigurieren. Basierend auf der EventBridge-Regel sendet Amazon SNS eine Benachrichtigung an die E-Mail-Adresse oder Adressen, die das Thema abonniert haben, wenn Ihr Ereignis eintritt. Die generierte Nachricht kann aufgrund ihrer Formatierung schwer lesbar sein. Durch das Einfügen einer AWS Lambda-Funktion wird jedoch eine benutzerdefinierte Warnmeldung mit verbesserter Formatierung erstellt, bevor sie an die SNS-Abonnenten gesendet wird.

Gehen Sie wie folgt vor, um eine benutzerdefinierte E-Mail-Benachrichtigung zu erstellen:

1.    Erstellen Sie die folgenden EventBridge-Regelziele:
Ein SNS-Thema und E-Mail-Abonnements.
Eine Lambda-Funktion.

2.    Erstellen Sie eine EventBridge-Regel.

3.    Sie erhalten eine individuelle Benachrichtigung.

Wichtig: Die folgende Lösung verwendet AWS-Security-Hub-Ereignisse und eine Lambda-Funktion für die Anpassung. Weitere Informationen zu den damit verbundenen Kosten finden Sie unter AWS-Security-Hub-Preisgestaltung und AWS Lambda-Preisgestaltung.

Auflösung

Erstellen Sie ein SNS-Thema und ein Abonnement

1.    Amazon SNS-Konsole öffnen.

2.    Wählen Sie im Navigationsbereich Themen aus.

3.    Wählen Sie Thema erstellen.

4.    Wählen Sie im Abschnitt Details für Typ die Option Standard aus.

5.    Geben Sie unter Name den Namen Ihres Themas ein.

6.    Wählen Sie Thema erstellen.

7.    Wählen Sie im erstellten Thema Abonnement erstellen aus.

8.    Wählen Sie für Themen-ARN den Amazon Resource Name (ARN) des Themas aus, das Sie erstellt haben, falls es nicht automatisch ausgefüllt wird.

9.    Geben Sie für ProtokollE-Mail ein.

10.    Geben Sie für Endpunkt die E-Mail-Adresse ein, an die Sie SNS-Benachrichtigungen erhalten möchten.

11.    Wählen Sie Abonnement erstellen.

Wichtig: Sie müssen das Abonnement in der Bestätigungs-E-Mail bestätigen, die an den Abonnenten gesendet wurde, damit das Abonnement vom Status Ausstehende Bestätigung zu Bestätigt wechselt.

Hinweis: (Optional) Sie können auch ein authentifiziertes Abonnement erstellen, das die Abmeldeaktion für Ihr Thema verhindert.

Lambda-Funktion erstellen

Erstellen Sie eine Lambda-Funktion, die die gewünschten Informationen aus dem JSON-Inhalt extrahiert und eine benutzerdefinierte Nachricht in Amazon SNS veröffentlicht.

1.    Öffnen Sie die Lambda-Konsole.

2.    Wählen Sie Funktionen im Navigationsbereich aus.

3.    Wählen Sie Funktion erstellen.

4.    Wählen Sie Von Grund auf neu verfassen.

5.    Geben Sie für Funktionsname einen Namen für Ihre Funktion ein.

6.    Wählen Sie Runtime und dann Python 3.9.

7.    Wählen Sie für Architekturx86_64.

8.    Erweitern Sie Standardausführungsrolle ändern.

9.    Wählen Sie für Ausführungsrolle die Option Neue Rolle aus AWS-Richtlinienvorlagen erstellen aus.

10.    Geben Sie für Rollenname einen Namen für die Rolle ein.

11.    Wählen Sie für Richtlinienvorlage die Amazon-SNS-Veröffentlichungsrichtlinie aus.

12.    Wählen Sie Funktion erstellen.

13.    Nachdem die Funktion erstellt wurde, fügen Sie den folgenden Code in den Abschnitt Codequelle ein:

import json
import boto3

sns = boto3.client('sns')

def lambda_handler(event, context):
    
    #Extract details from JSON event
    detailType= event["detail-type"]
    region = event["region"]
    accountId = event["account"] 
    
    #Security Hub Insight Results
    if (detailType == "Security Hub Insight Results"):
        
        action = event["detail"]["actionDescription"]
        
        message = "Alert: %s in %s for account: %s\n Action description: %s" % (detailType, region,accountId,action)
    
    elif  ("Security Hub Findings" in detailType):
        
        finding = event["detail"]["findings"][0] 
        findingTime = finding["FirstObservedAt"]
        findingType = finding["Types"][0]
        findingDescription = finding["Description"]
        remediation = finding["Remediation"]["Recommendation"]["Text"]
        
        #Security Hub Findings - Custom finding
        if(detailType == "Security Hub Findings - Custom"):
            complianceStatus = finding["Compliance"]["Status"]
            severity = finding["Severity"]["Label"]
            remediationUrl = finding["Remediation"]["Recommendation"]["Url"]
            
            message = "Alert: %s in %s for account: %s\n\nFinding regarding: [%s] %s\n Severity: %s\nDescription: %s\nFirst observed at: %s\n%s: %s" % (detailType, region, accountId, complianceStatus, findingType, 
            severity, findingDescription, findingTime, remediation, remediationUrl)
        
        #Security Hub Findings - Imported finding
        else:
            message = "Alert: %s in %s for account: %s\n\nFinding regarding: %s\nFirst observed at: %s\nRemediation recommendation: %s" % (detailType, region, accountId, findingDescription,findingTime, remediation)
    
    #AWS API Call via CloudTrail finding
    elif (detailType == "AWS API Call via CloudTrail"):
        
        time = event["detail"]["eventTime"]
        eventName = event["detail"]["eventName"]
        requestParameters = event["detail"]["requestParameters"]
        
        message = "Alert: %s in %s for account: %s at time: %s\n\n Event: %s \n Request parameters: %s" % (detailType, region, accountId, time, eventName, requestParameters)
        
        
    #If the event doesn't match any of the above, return the event    
    else:
        message = str(event)
    
    response = sns.publish(
            TopicArn = "arn:aws:sns:eu-west-1:219900010836:test",
            Message = message
            )
    
    return {
      'statusCode': 200,
      'body': json.dumps('Success!')
}

Hinweis: Der vorhergehende Code passt alle Security-Hub-Warnmeldungen an und formatiert sie neu. Ersetzen Sie TopicArn („arn:aws:sns:region:account_id:SecurityHub-Befunde“) durch Ihr Thema ARN.

14.    Um den Funktionscode zu speichern, wählen Sie Bereitstellen.

Diese Funktion verwendet die standardmäßigen Security-Hub-Ereignisse und formatiert sie in ein besser lesbares Format um. Im Folgenden sind Beispielmeldungen aufgeführt:

Beispiel 1: Ergebnis des Security Hub Insight

Standard:

{"version": "0", "id": "ac844908-d14e-05b1-4b7b-836d85110e26", "detail-type": "Security Hub Insight Results", "source": "aws.securityhub", "account": "123456789012", "time": "2019-04-11T21:31:57Z", "region": "us-east-1", "resources": ["arn:aws:securityhub:us-east-1:123456789012:action/custom/slackMessaging"], "detail": {"actionName": "SendToSlack", "actionDescription": "Send Findings to Slack", "insightName": "5. AWS users with the most suspicious activity", "insightArn": "arn:aws:securityhub:::insight/securityhub/default/9", "resultType": "ResourceAwsIamAccessKeyUserName", "insightResults": [{"Admin": 7}, {"DenySlr_UI_User": 1}]}}

Benutzerdefinierte:

Alert: Security Hub Insight Results in us-east-1 for account: 123456789012
Action description: Send Findings to Slack

Beispiel 2: Security-Hub-Ergebnisse — Benutzerdefinierte Aktion

Standard:

{ "version": "0", "id": "e215f5c7-a866-e0cd-6d11-fc7ecf97e381", "detail-type": "Security Hub Findings - Custom Action", "source": "aws.securityhub", "account": "123456789012", "time": "2019-04-11T22:06:13Z", "region": "us-east-1", "resources": ["arn:aws:securityhub:us-east-1:123456789012:action/custom/slackMessaging"], "detail": { "actionName": "SendToSlack", "actionDescription": "Send Findings to Slack", "findings": [{ "SchemaVersion": "2018-10-08", "Id": "arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/1.12/finding/17932c44-6d58-4b3c", "ProductArn": "arn:aws:securityhub:us-east-1::product/aws/securityhub", "GeneratorId": "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0/rule/1.12", "AwsAccountId": "123456789012", "Types": ["Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark"], "FirstObservedAt": "2018-12-02T05:06:34.874Z", "LastObservedAt": "2019-04-11T18:07:10.995Z", "CreatedAt": "2018-12-02T05:06:34.874Z", "UpdatedAt": "2019-04-11T18:26:20.631Z", "Severity": { "Product": 0, "Normalized": 0 }, "Title": "1.12 Ensure no root account access key exists", "Description": "The root account is the most privileged user in an AWS account...", "Remediation": { "Recommendation": { "Text": "For directions on how to fix this issue, please consult the AWS Security Hub CIS documentation.", "Url": "https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards.html#securityhub-standards-checks-1.12" } }, "ProductFields": { "StandardsGuideArn": "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0", "StandardsGuideSubscriptionArn": "arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0", "RuleId": "1.12", "RecommendationUrl": "https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards.html#securityhub-standards-checks-1.12", "RecordState": "ACTIVE", "aws/securityhub/FindingId": "arn:aws:securityhub:us-east-1::product/aws/securityhub/arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/1.12/finding/17932c44-6d58-4b3c", "aws/securityhub/SeverityLabel": "INFORMATIONAL", "aws/securityhub/ProductName": "Security Hub", "aws/securityhub/CompanyName": "AWS" }, "Resources": [{ "Type": "AwsAccount", "Id": "AWS::::Account:123456789012", "Partition": "aws", "Region": "us-east-1" }], "Compliance": { "Status": "PASSED" }, "RecordState": "ACTIVE", "WorkflowState": "NEW" }, { "SchemaVersion": "2018-10-08", "Id": "arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/2.8/finding/5d6b42d8-122b-4cdf-8498-e045752e170c", "ProductArn": "arn:aws:securityhub:us-east-1::product/aws/securityhub", "GeneratorId": "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0/rule/2.8", "AwsAccountId": "123456789012", "Types": ["Software and Configuration Checks/Industry and Regulatory Standards/CIS AWS Foundations Benchmark"], "FirstObservedAt": "2019-01-05T05:21:44.990Z", "LastObservedAt": "2019-04-11T18:26:12.510Z", "CreatedAt": "2019-01-05T05:21:44.990Z", "UpdatedAt": "2019-04-11T18:26:12.510Z", "Severity": { "Product": 0, "Normalized": 0 }, "Title": "2.8 Ensure rotation for customer created CMKs is enabled", "Description": "AWS Key Management Service (KMS) allows customers to rotate the backing key...", "Remediation": { "Recommendation": { "Text": "For directions on how to fix this issue, please consult the AWS Security Hub CIS documentation.", "Url": "https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards.html#securityhub-standards-checks-2.8" } }, "ProductFields": { "StandardsGuideArn": "arn:aws:securityhub:::ruleset/cis-aws-foundations-benchmark/v/1.2.0", "StandardsGuideSubscriptionArn": "arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0", "RuleId": "2.8", "RecommendationUrl": "https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-standards.html#securityhub-standards-checks-2.8", "RecordState": "ACTIVE", "aws/securityhub/FindingId": "arn:aws:securityhub:us-east-1::product/aws/securityhub/arn:aws:securityhub:us-east-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/2.8/finding/5d6b42d8-122b-4cdf-8498-e045752e170c", "aws/securityhub/SeverityLabel": "INFORMATIONAL", "aws/securityhub/ProductName": "Security Hub", "aws/securityhub/CompanyName": "AWS" }, "Resources": [{ "Type": "AwsAccount", "Id": "AWS::::Account:123456789012", "Partition": "aws", "Region": "us-east-1" }], "Compliance": { "Status": "PASSED" }, "RecordState": "ACTIVE", "WorkflowState": "NEW" }] } }

Benutzerdefinierte:

Alert: Security Hub Findings - Custom Action in us-east-1 for account: 123456789012

Finding regarding: The root account is the most privileged user in an AWS account...
First observed at: 2018-12-02T05:06:34.874Z
Remediation recommendation: For directions on how to fix this issue, please consult the AWS Security Hub CIS documentation.

Beispiel 3: Security-Hub-Ergebnisse — importiert

Standard:

{ "version": "0", "id": "8e5622f9-d81c-4d81-612a-9319e7ee2506", "detail-type": "Security Hub Findings - Imported", "source": "aws.securityhub", "account": "123456789012", "time": "2019-04-11T21:52:17Z", "region": "us-west-2", "resources": ["arn:aws:securityhub:us-west-2::product/aws/macie/arn:aws:macie:us-west-2:123456789012:integtest/trigger/6294d71b927c41cbab915159a8f326a3/alert/f2893b211841"], "detail": { "findings": [{ "SchemaVersion": "2018-10-08", "Id": "arn:aws:macie:us-west-2:123456789012:integtest/trigger/6214d71b927c41cbab015159a8f316a3/alert/f2893b211841467198cc1201e9031ee4", "ProductArn": "arn:aws:securityhub:us-west-2::product/aws/macie", "GeneratorId": "arn:aws:macie:us-west-2:123456789012:integtest/trigger/6214d71b927c41cbab015159a8f316a3", "AwsAccountId": "123456789012", "Types": ["Sensitive Data Identifications/Passwords/Google Suite Two-factor backup codes in S3"], "FirstObservedAt": "2019-04-11T21:52:15.900Z", "LastObservedAt": "2019-04-11T21:52:15.900Z", "CreatedAt": "2019-04-11T21:52:15.900Z", "UpdatedAt": "2019-04-11T21:52:15.900Z", "Severity": { "Product": 6, "Normalized": 15 }, "Confidence": 5, "Title": "Google Suite Two-Factor Backup Codes uploaded to S3", "Description": "Google Suite two-factor backup codes uploaded to S3....", "Remediation": { "Recommendation": { "Text": "v2 Release" } }, "ProductFields": { "rule-arn": "arn:aws:macie:us-west-2:123456789012:trigger/6214d71b927c41cbab015159a8f316a3", "tags:0": "DATA_COMPLIANCE", "tags:1": "BASIC_ALERT", "themes:0/theme": "google_two_factor_backup", "themes:0/count": "1", "dlpRisk:0/risk": "8", "dlpRisk:0/count": "1", "owner:0/name": "vchin", "owner:0/count": "1", "aws/securityhub/FindingId": "arn:aws:securityhub:us-west-2::product/aws/macie/arn:aws:macie:us-west-2:123456789012:integtest/trigger/6214d71b927c41cbab015159a8f316a3/alert/f2893b211841467198cc1201e9031ee4", "aws/securityhub/SeverityLabel": "LOW", "aws/securityhub/ProductName": "Macie", "aws/securityhub/CompanyName": "Amazon" }, "Resources": [{ "Type": "AwsS3Bucket", "Id": "arn:aws:s3:::test-bucket-12", "Partition": "aws", "Region": "us-west-2" }], "RecordState": "ACTIVE", "WorkflowState": "NEW" }] } }

Benutzerdefinierte:

Alert: Security Hub Findings - Imported in us-west-2 for account: 123456789012

Finding regarding: Google Suite two-factor backup codes uploaded to S3....
First observed at: 2019-04-11T21:52:15.900Z
Remediation recommendation: v2 Release

Beispiel 4 – AWS-API-Aufruf über CloudTrail

Standard:

{"version": "0", "id": "b34c4525-95f0-8dd1-cd9e-9fc5be10039e", "detail-type": "AWS API Call via CloudTrail", "source": "aws.securityhub", "account": "123456789012", "time": "2021-12-10T10:47:54Z", "region": "eu-west-1", "resources": [], "detail": {"eventVersion": "1.08", "userIdentity": {"type": "AssumedRole", "principalId": "AROATGMYP4FKHTE5RKJC3", "arn": "arn:aws:sts::123456789012", "accountId": "123456789012", "accessKeyId": "ASIATGMYXXFKNHWOYQF7", "sessionContext": {"sessionIssuer": {"type": "Role", "principalId": "AROATGMYP4FKHX5RKJC3", "arn": "arn:aws:iam::123456789012:role/Admin", "accountId": "123456789012", "userName": "Admin"}, "webIdFederationData": {}, "attributes": {"creationDate": "2021-12-10T10:08:16Z", "mfaAuthenticated": "false"}}}, "eventTime": "2021-12-10T10:47:54Z", "eventSource": "securityhub.amazonaws.com", "eventName": "BatchUpdateFindings", "awsRegion": "eu-west-1", "sourceIPAddress": "54.240.197.20", "userAgent": "aws-internal/3 aws-sdk-java/1.12.112 Linux/5.4.156-94.273.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.312-b07 java/1.8.0_312 vendor/Oracle_Corporation cfg/retry-mode/standard", "requestParameters": {"Workflow": {"Status": "NEW"}, "FindingIdentifiers": [{"Id": "arn:aws:securityhub:eu-west-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/2.5/finding/2fd7f0dd-1088-44c5-bbe1-9c8a0ddce035", "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/securityhub"}]}, "responseElements": {"UnprocessedFindings": [], "ProcessedFindings": [{"Id": "arn:aws:securityhub:eu-west-1:123456789012:subscription/cis-aws-foundations-benchmark/v/1.2.0/2.5/finding/2fd7f0dd-1088-44c5-bbe1-9c8a0ddce035", "ProductArn": "arn:aws:securityhub:eu-west-1::product/aws/securityhub"}]}, "requestID": "fd52e76e-282f-47c7-a7bc-b9a1e1ca2cdd", "eventID": "433b8e9c-cf08-4909-adf7-ea0c548459ad", "readOnly": "False", "eventType": "AwsApiCall", "managementEvent": "True", "recipientAccountId": "123456789012", "eventCategory": "Management"}}

Benutzerdefinierte:

Alert: AWS API Call via CloudTrail in eu-west-1 for account: 123456789012 at time: 2021-12-10T10:47:32Z

Event: BatchUpdateFindings
Request parameters: {'Workflow': {'Status': 'NOTIFIED'}, 'FindingIdentifiers': [{'Id': 'arn:aws:securityhub:eu-west-1:219900010836:subscription/cis-aws-foundations-benchmark/v/1.2.0/2.5/finding/2fd7f0dd-1088-44c5-bbe1-9c8a0ddce035', 'ProductArn': 'arn:aws:securityhub:eu-west-1::product/aws/securityhub'}]}

Hinweis: Sie können die Nachricht für jeden Typ der Sicherheitsfindung bearbeiten, damit sie für Ihren Anwendungsfall besser geeignet ist.

Erstellen und Konfigurieren der EventBridge-Regel

1.    Öffnen Sie die EventBridge-Konsole.

2.    Wählen Sie Regel erstellen aus.

3.    Geben Sie einen Namen für Ihre Regel ein. Optional können Sie eine Beschreibung eingeben.

4.    Wählen Sie unter Muster definieren die Option Ereignismuster aus.

5.    Wählen Sie für Ereignisabgleichsmuster die Option Vordefiniertes Muster nach Dienst aus.

6.    Wählen Sie alsDienstanbieter AWS aus.

7.    Wählen Sie für Dienstname die Option Security Hub aus.

8.    Wählen Sie für VeranstaltungstypAlle Ereignisse aus.

Hinweis: Sie können auch Warnungen für bestimmte Ereignisse und nicht für alle Ereignisse konfigurieren. Die Lambda-Funktion ist so konfiguriert, dass alle Ereignisse in ein besser lesbares Format umformatiert werden.

9.    Wählen Sie im Abschnitt Ereignisbus auswählen die Option AWS-Standard-Ereignisbus.

10.    Wählen Sie unter Ziele auswählen die Option Lambda-Ziel aus dem Menü Ziel.

11.    Wählen Sie die zuvor erstellte Lambda-Funktion aus.

Eine individuelle Benachrichtigung erhalten

Wenn eines der konfigurierten Ereignisse eintritt, erhalten Sie eine benutzerdefinierte Benachrichtigung per E-Mail von no-reply@sns.amazonaws.com.