Beim Umgang mit komplexen Cloud-Infrastrukturen und Diensten in vielen verschiedenen Bereichen sind oft wichtige Sicherheitskontrollen und Audits erforderlich. Glücklicherweise bietet die öffentliche Cloud Dienste für Überwachung, Sicherheit, Schwachstellenprüfung usw. an.
Wenn wir mit AWS arbeiten, haben wir Dienste wie GuardDuty, CloudWatch, CloudTrail, Inspector usw. Wir können mit all diesen Diensten Ausgabedateien generieren, so dass ein Bericht bei Bedarf nicht schwer zu erstellen ist. Aber warum müssen wir uns einem Audit stellen, um die Sicherheitsschwachstellen in unserer Infrastruktur zu untersuchen?
Wenn man über Schwachstellen spricht, kommt einem AWS Inspector in den Sinn. Dabei handelt es sich um einen Dienst, der Anwendungen automatisch auf Schwachstellen und Abweichungen von bewährten Verfahren prüft und eine detaillierte Liste mit Sicherheitsfeststellungen und priorisierten Empfehlungen bereitstellt. Klingt gut, nicht wahr. Aber es gibt keine Benachrichtigungen, wenn ein kritisches Problem gefunden wird. Das bedeutet, dass die Infrastrukturingenieure den Inspektor regelmäßig überprüfen müssen, um die Infrastruktur zu überwachen. Diese Aufgabe ist nicht besonders schwierig, aber sie kostet Zeit und kann sehr lästig sein, vor allem, wenn es wichtigere und entscheidendere Dinge zu tun gibt. Wenn es also standardmäßig keine vorgefertigten Benachrichtigungen gibt, sollten wir sie mit einer Lambda-Funktion, einem SNS-Thema und einem S3-Bucket erstellen.
S3-Bucket erstellen
Zunächst müssen Sie einen S3-Bucket erstellen, um die Ergebnisse von Inspector zu speichern. Gehen Sie dazu einfach zu Amazon S3 -> Bucket erstellen. Geben Sie ihm einen Namen, in unserem Fall wählen wir aws-inspector-findings-01. Denken Sie daran, dass der Bucket-Name in S3 eindeutig sein sollte.

Behalten Sie die Einstellung zum Blockieren aller öffentlichen Zugriffe bei, denn Sie wollen ja nicht, dass Ihre Schwachstellen öffentlich sind, oder?

Nachdem Sie die Einrichtung und Erstellung des Containers abgeschlossen haben, gehen Sie in den Container und dann auf Permissions -> Bucket policy -> Edit. Sie müssen dem AWS Inspector die Erlaubnis erteilen, Ergebnisse im Container zu speichern. Die Richtlinie sollte in etwa wie folgt aussehen:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Allow inspector to perform Put and Delete actions on s3",
"Effect": "Allow",
"Principal": {
"Service": "inspector2.amazonaws.com"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:AbortMultipartUpload"
],
"Resource": "arn:aws:s3:::BUCKET_NAME/*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "AWS_ACCOUNT_ID"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:inspector2:REGION:WS_ACCOUNT_ID:report/*"
}
}
}
]
}
Stellen Sie sicher, dass Sie die Wörter in Großbuchstaben durch Ihre Informationen ersetzen: BUCKET_NAME, AWS_ACCOUNT_ID, REGION.
KMS-Schlüssel generieren
Der nächste Schritt vor der Erstellung der Lambda-Funktion besteht darin, einen KMS-Schlüssel mit einigen Berechtigungen zu erzeugen. Denn wir wollen unsere sensiblen Schwachstelleninformationen nicht unverschlüsselt vom Inspector übertragen und speichern. Um Ihren Schlüssel zu generieren, gehen Sie zu Key Management Service -> Create a key und folgen Sie den Schritten. Nachdem Sie den Schlüssel erstellt haben, müssen Sie die Schlüsselrichtlinie bearbeiten. Unten sehen Sie ein Beispiel dafür, wie sie aussehen sollte:
{
"Version": "2012-10-17",
"Id": "ID",
"Statement": [
{
"Sid": "Enable IAM User Permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::AWS_ACCOUNT_ID:root"
},
"Action": "kms:*",
"Resource": "*"
},
{
"Sid": "Allow inspector to perform kms actions",
"Effect": "Allow",
"Principal": {
"Service": "inspector2.amazonaws.com"
},
"Action": [
"kms:Decrypt",
"kms:GenerateDataKey*"
],
"Resource": "*",
"Condition": {
"StringEquals": {
"aws:SourceAccount": "AWS_ACCOUNT_ID"
},
"ArnLike": {
"aws:SourceArn": "arn:aws:inspector2:REGION:AWS_ACCOUNT_ID:report/*"
}
}
}
]
}
Lambda-Funktion einrichten
Jetzt können Sie mit der Erstellung Ihrer Lambda-Funktion beginnen. Die Funktion soll eine Datei generieren, wenn eine kritische Sicherheitslücke gefunden wird, und sie automatisch und ohne manuelle Schritte im S3-Bucket speichern.
In diesem Beispiel werden wir Python verwenden, aber Sie können die Sprache Ihrer Wahl wählen. Um eine Funktion zu erstellen, gehen Sie zu Lambda -> Funktion erstellen. Geben Sie ihm einen Namen (wir wählen aws-inspector-benachrichtigungen-01), ändern Sie die Laufzeit in Python 3.10 und die Architektur beibehalten x86_64. Dann können Sie auf Funktion erstellen.

Hier ist ein Codeschnipsel, wenn Sie unser Beispiel verwenden möchten:
import json boto3
service = boto3.service('inspector2')
def lambda_handler(event, context):
response = service.create_sbom_export(
reportFormat='SPDX_2_3',
resourceFilterCriteria={
'ec2InstanceTags': [
{
'comparison': 'EQUALS',
'key': 'Criticality',
'value': event['Criticality']
},
]
},
s3Destination={
'bucketName': 'BUCKET_NAME',
'kmsKeyArn': 'KMS_KEY_ARN'
}
)
return {
'statusCode': 200,
'body': json.dumps(response)
}
In diesem Beispiel verwenden wir die Module json und boto3. Das Json-Modul dient der Serialisierung und Deserialisierung von JSON. Das Boto3-Modul wird importiert, um mit AWS-Services zu interagieren. Die service-Variable initialisiert einen AWS Inspector-Service mit Boto3. Die Service-Variable ermöglicht die Interaktion mit dem AWS Inspector-Service.
Lambda_handler ist die wichtigste Lambda-Handler-Funktion, die aufgerufen wird, wenn die Lambda-Funktion aufgerufen wird und die create_sbom_export-Methode des AWS Inspector-Clients aufruft. Sie exportiert einen Software Bill of Materials (SBOM)-Bericht. Das Format(reportFormat) in unserem Beispiel ist SPDX_2_3.
Die Filterkriterien basieren auf einem Wert des Schlüssels Criticality, der später in Critical geändert wird, um nur kritische Schwachstellen herauszufiltern.
Der SBOM-Bericht wird in einen S3-Bucket exportiert, der durch BUCKET_NAME angegeben wird, und der für die Verschlüsselung verwendete KMS-Schlüssel wird durch KMS_KEY_ARM angegeben. Sie können die Funktion testen, indem Sie auf Test gehen. Geben Sie ihr einen Namen und vergessen Sie nicht, den Filter auf kritisch zu setzen:
{
"Criticality": "critical"
}

Klicken Sie dann einfach auf Test. Wenn alles richtig konfiguriert ist, sollten Sie dieses grüne Feld mit Funktion ausführen: erfolgreich sehen .

EventBridge Scheduler
Wenn die Lambda-Funktion fertig ist, sollten Sie mit AWS EventBridge einen Scheduler erstellen. Es gibt viele verschiedene Möglichkeiten, eine Lambda-Funktion auszulösen, aber für dieses Beispiel werden wir es auf täglicher Basis tun. Um den Scheduler zu konfigurieren, gehen Sie zu EventBridge -> Scheduler -> Schedules -> Create schedule. Geben Sie ihm einen Namen und eine Beschreibung Ihrer Wahl, Occurrence sollte Recurring schedule sein, so dass er die Lambda-Funktion kontinuierlich auf einer Cron-Basis auslöst. Hier können Sie den Cron so ändern, dass er die Funktion auslöst, wann immer Sie wollen, aber wir bevorzugen es, jeden Tag um 1:00 Uhr zu starten:

Wählen Sie dann für das Ziel AWS Lambda Invoke, wählen Sie dann Ihre Lambda-Funktion und schreiben Sie für Payload das json, das wir zum Testen verwenden:

SNS-Thema für Benachrichtigungen
So weit so gut, wir haben einen Scheduler und eine Funktion, die Befunde an S3 sendet. Jetzt brauchen wir ein SNS-Thema und eine S3-Ereignisbenachrichtigung, damit wir benachrichtigt werden können, wenn ein neuer Fund in unserem Bucket erscheint. Gehen Sie zu SNS -> Themen -> Thema erstellen und folgen Sie dem Prozess. Wir müssen die Richtlinie für das SNS-Thema bearbeiten, unsere sieht wie folgt aus:
{
"Version": "2012-10-17",
"Id": "__default_policy_ID",
"Statement": [
{
"Sid": "__default_statement_ID",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"SNS:GetTopicAttributes",
"SNS:SetTopicAttributes",
"SNS:AddPermission",
"SNS:RemovePermission",
"SNS:DeleteTopic",
"SNS:Subscribe",
"SNS:ListSubscriptionsByTopic",
"SNS:Publish"
],
"Resource": "SNS_TOPIC_ARN",
"Condition": {
"StringEquals": {
"AWS:SourceOwner": "ACOUNT_ID"
}
}
},
{
"Sid": "AllowS3ToPublishToSNSTopic",
"Effect": "Allow",
"Principal": {
"Service": "s3.amazonaws.com"
},
"Action": "sns:Publish",
"Resource": "SNS_TOPIC_ARN"
}
]
}
Dann benötigen Sie ein SNS-Abonnement für Ihre E-Mail-Adresse oder die E-Mail-Adresse, an die die Benachrichtigungen gesendet werden sollen. Sie können der offiziellen AWS-Dokumentation folgen.
Nachdem die E-Mail konfiguriert ist, müssen Sie zurück zum S3-Bucket gehen, das wir unter 1 erstellt haben. Gehen Sie dann zu Eigenschaften und scrollen Sie nach unten zu Ereignisbenachrichtigungen. Jetzt sollten wir eine Benachrichtigung für die Ergebnisse mit Pfad, Präfix und Suffix erstellen, damit das sns-Thema Sie benachrichtigt, wenn ein neues Objekt dort hochgeladen wird.

Wählen Sie Event Types to Put and Post und scrollen Sie nach unten, um Ihr SNS-Thema auszuwählen.

Zum Abschluss
Jetzt haben wir eine Automatisierungsfunktion, mit der wir täglich die Ergebnisse für kritische Schwachstellen erhalten und sie rechtzeitig beheben können. Sie können die Lambda-Funktion jederzeit so ändern, dass Sie jeden Tag vollständige Befunde erhalten. Vielleicht brauchen Sie sie aber auch nicht jeden Tag. Vielleicht brauchen Sie sie einmal in der Woche oder einmal im Monat. Das bleibt Ihnen überlassen.
Entdecken Sie die Dienstleistungen von ITGix und erfahren Sie mehr über unser Know-how.

