Blog
So analysieren Sie VPC-Flow-Protokolle und finden verdächtige Ziele über die Befehlszeile

In diesem Blog zeige ich Ihnen, wie Sie die Protokolle der VPC-Flows ganz einfach über die Befehlszeile analysieren und verdächtige Internet-Ziele finden können. Der Prozess läuft in den folgenden 5 Schritten ab.
- Ablaufprotokoll in einer Textdatei abrufen
- Beschränken Sie das Flussprotokoll auf den NAT-Gateway-Verkehr
- Entfernen des Datenverkehrs zu eigenen öffentlichen IP-Adressen
- Entfernen des Datenverkehrs zu Datadog
- Analysieren Sie die restlichen Flussprotokolle
Aber zunächst einmal: Was finden wir in einem VPC-Flow-Protokoll?
VPC-Ablaufprotokolle
VPC-Flow-Protokolle enthalten Aufzeichnungen über die Netzwerkflüsse innerhalb Ihrer VPC. Ein Protokolleintrag ist ziemlich einfach und enthält zumindest die Quell- und Ziel-IP-Adresse, das Protokoll, die Ports sowie die übertragene Datenmenge. Ein VPC-Flow-Protokolleintrag sieht etwa so aus:
2 123456789012 eni-adf878fe 10.10.1.10 13.233.147.224 38511 443 6 56 60297 1732951951 1732951981 ACCEPT OK
Es sind nicht viele Informationen enthalten. Es sind einfach nur Daten. In der folgenden Tabelle finden Sie eine Beschreibung der einzelnen Spalten:
| Feld | Wert | Beschreibung |
|---|---|---|
| Version | 2 | Hier wird die Version des Flow Log-Formats angegeben. |
| Konto-ID | 123456789012 | Dies ist die AWS-Konto-ID, die mit der VPC verbunden ist. |
| ENI ID | eni-adf878fe | Dies ist die Elastic Network Interface (ENI) ID. Sie identifiziert die spezifische Netzwerkschnittstelle, mit der der Datenverkehr verbunden ist. |
| Quelle IP | 10.10.1.10 | Dies ist die private IP-Adresse der Quelle des Datenverkehrs (die Instanz oder Ressource innerhalb der VPC). |
| Ziel-IP | 13.233.147.224 | Dies ist die öffentliche IP-Adresse des Ziels (eine externe IP-Adresse, möglicherweise ein Internetdienst). |
| Quelle Hafen | 38511 | Dies ist die Portnummer der Quellinstanz, von der der Datenverkehr ausgeht. |
| Zielhafen | 443 | Dies ist die Portnummer des Ziels, auf das der Datenverkehr abzielt. Port 443 wird in der Regel für HTTPS-Datenverkehr verwendet. |
| Protokoll | 6 | Dies steht für das Protokoll, das für den Datenverkehr verwendet wird. In diesem Fall entspricht 6 dem TCP (Transmission Control Protocol). |
| Pakete | 56 | Hier wird die Anzahl der Pakete angezeigt, die während dieses Flusses übertragen wurden. |
| Bytes | 60297 | Zeigt die Gesamtzahl der während dieses Vorgangs übertragenen Bytes an. |
| Startzeit | 1732951951 | Dies ist die Startzeit des Flusses in Unix-Epochenzeit (Sekunden seit dem 1. Januar 1970). |
| Endzeit | 1732951981 | Dies ist die Endzeit des Flusses in Unix-Epochenzeit. |
| Aktion | ACCEPT | Dies bedeutet, dass der Datenverkehr über die Netzwerkschnittstelle zugelassen wurde (gemäß den Sicherheitsgruppen und Netzwerk-ACLs). |
| Status protokollieren | OK | Dies zeigt den Status des Protokolleintrags an. In diesem Fall zeigt es an, dass die Protokollierung erfolgreich war. |
Sie können Flussprotokolle für Ihre VPC konfigurieren, um den gesamten Datenverkehr in Ihrem Cloud-Netzwerk zu verfolgen: Ich gehe davon aus, dass Sie dies bereits getan haben.
1. Abrufen von Flow Log-Datensätzen
Um die VPC-Flow-Protokolle abzurufen, habe ich das Dienstprogramm flowlogs_reader verwendet. Es unterstützt sowohl das Lesen aus S3-Buckets als auch aus CloudWatch-Protokollen. In meinem Fall habe ich die Flussprotokolle in CloudWatch, also gebe ich ein:
$ flowlogs_reader --location-type cwl /vpc/flow-log > flow-logs.txt
Um herauszufinden, wie viele Datensätze abgerufen wurden, geben Sie ein:
$ wc -l flow-logs.txt
1512436 flow-logs.txt
In diesem Fall sind es sage und schreibe 1.512.436 Datensätze!
2. Beschränken Sie das Flussprotokoll auf NAT-Gateway-Verkehr
Führen Sie die folgenden Schritte aus, um die Flussprotokolle auf ausgehenden, NAT-Gateway-bezogenen Verkehr zu beschränken:
- Rufen Sie die privaten IP-Adressen des NAT-Gateways ab
- Filter zum Entfernen von Flussdatensätzen mit anderen Quelladressen
- Entfernen Sie Flow Records vom NAT-Gateway in die VPC
2.1. Abrufen von privaten NAT-Gateway-IP-Adressen
Ich interessiere mich nur für den Verkehr, der vom NAT-Gateway ausgeht. Um die privaten IP-Adressen der NAT-Gateways in der VPC zu erhalten, geben Sie ein:
$ nat_gateways=$(aws ec2 describe-nat-gateways
--query 'join(`n`,NatGateways[].NatGatewayAddresses[].PrivateIp)'
--output text)
2.2. Ein AWK-Filter für NAT-Gateway-Verkehr
Mit den öffentlichen IP-Adressen können wir die Datenflussprotokolle nach Verkehr filtern, der von den NAT-Gateways ausgeht, indem wir eingeben:
$ awk_filter=$(sed -e 's/.*/$4 == "&"/g' <<< "$nat_gateways" |
paste -s -d '|' - |
sed -e 's/|/ || /g'
-e 's/^/$4 != "-" && (/'
-e 's/$/) {print $0}')
$ awk "$awk_filter" flow-logs.txt > from-nat-gateways.txt
So, jetzt haben wir alle Protokolle, die von den NAT-Gateways stammen.
2.3. Filterung des Rückverkehrs zum Anfragesteller
Wir konzentrieren uns auf den vom NAT-Gateway ausgehenden Datenverkehr in das öffentliche Internet. Um jeglichen Verkehr herauszufiltern, der für die VPC (CIDR 10.0.0.0/8) bestimmt ist, geben Sie ein:
$ awk '$5 !~ /^10..*/{print $0}' from-nat-gateways.txt > from-nat-gateways-out.txt
$ wc -l from-nat-gateways-out.txt
28894 from-nat-gateways-out.txt
Das ist gut: Die Menge der zu analysierenden Datensätze hat sich bereits von 1,5 Millionen auf 29000 reduziert!
3. Entfernen des Datenverkehrs zu unseren eigenen öffentlichen IP-Adressen
Um Flow-Protokolle des Datenverkehrs von unserer VPC zu ihren eigenen öffentlichen IP-Adressen zu entfernen, gehen Sie wie folgt vor:
- Rufen Sie die öffentlichen IP-Adressen in der VPC ab
- Verwenden Sie einen Awk-Filter, um Flow-Records zu unseren eigenen IPs zu entfernen
3.1. Abrufen der öffentlichen IP-Adressen unserer VPC
Um die öffentlichen IP-Adressen zu finden, die von der VPC angeboten werden, geben Sie ein:
public_ips=$(aws ec2 describe-network-interfaces
--query 'join(`n`,NetworkInterfaces[].PrivateIpAddresses[].Association.PublicIp)'
--output text)
3.2. Verwenden Sie AWK, um den Datenverkehr zurück zu eigenen IPs zu filtern
Um alle Flow-Protokolle des Datenverkehrs zurück zu den öffentlichen IP-Adressen der VPC zu entfernen, geben Sie ein:
awk_filter=$(sed -e 's/.*/$5 != "&"/g' <<< "$public_ips" |
paste -s -d '|' - |
sed -e 's/|/ && /g'
-e 's/$/ {print $0}/')
awk "$awk_filter" from-nat-gateways-out.txt > outgoing-public-internet.txt
4. Entfernen von ausgehenden Datadog-Zielen
In unserem Fall ist ein ausgehender Datenverkehr zu Datadog bekannt. Wenn Sie Datadog nicht verwenden, können Sie diesen Schritt überspringen.
Es war nicht einfach, Protokolleinträge für eine Reihe von IP-Adressbereichen zu filtern. Daher habe ich das folgende Python-Skript filter-datadog-ips erstellt. Mit dem folgenden Befehl werden alle Datenströme zu Datadog entfernt:
filter-datadog-ips < outgoing-public-internet.txt > outgoing-public-internet-without-datadog.txt
5. Analyse des verbleibenden Verkehrs
Nach dem Filtern können Sie analysieren, was übrig bleibt:
- Die Anzahl der eindeutigen Ziel-IP-Adressen
- Die Anzahl der eindeutigen Ziel-IP-Ports
- Der DNS-Name der IP-Adressen
- Der Zertifikatsname der IP-Adresse
- Identifizieren von Zielen
5.1. Identifizierung von Ziel-IP-Adressen
Um die Anzahl der eindeutigen Ziel-IP-Adressen zu ermitteln, geben Sie ein:
$ awk '{print $5, $7}' outgoing-public-internet-without-datadog.txt | sort -u > unique-ip-and-port.txt
$ wc -l unique-ip-and-port.txt
26 unique-ip-and-port.txt
Wie cool ist das denn! Ich habe nur noch 26 IP-Adressen zu analysieren. Eine große Verbesserung gegenüber 1,6 Millionen!
5.2. Identifizierung der verwendeten Ports
Um zu sehen, auf welche Ports zugegriffen wird, geben Sie ein:
$ awk '{print $2}' unique-ip-and-port.txt | sort | uniq -c | sort -r -n
19 443
3 80
2 465
1 30120
1 2593
Offensichtlich einige HTTP-, HTTP-, SMTP- und zwei vage Zielports.
5.3. DNS Reverse-Lookup der IP-Adressen
Um eine Vorstellung vom Zielort zu bekommen, führen Sie einen DNS-Reverse-Lookup der IP-Adressen durch, indem Sie eingeben:
cat unique-ip-and-port.txt | while read ip port ; do
domain_name=$(dig +short -x $ip)
echo "$ip,$port,${domain_name:--}"
done > dns-lookups.csv
Dieses Skript führt für jede IP-Adresse einen Reverse-Lookup durch. Wenn die Suche erfolglos ist, wird stattdessen ein Bindestrich verwendet.
5.4. Abrufen der Zertifikatsnamen der IP-Adressen
Für den IP-Verkehr zu den Ports 80 oder 443 ist es möglicherweise möglich, die Namen auf den SSL-Zertifikaten zu lesen. Um das herauszufinden, geben Sie ein:
cat unique-ip-and-port.txt |while read ip port; do
if [[ $port -eq 80 ]] || [[ $port -eq 443 ]]; then
alt_subject_name=$(timeout 3 openssl s_client -connect $ip:443 < /dev/null 2>&/dev/null |
openssl x509 -noout -text 2>/dev/null |
grep DNS: |
tr 'n' ' ' |
sed -e 's/[ ]*DNS://g' -e 's/,/ /g' | tr -d 'n'
)
[[ -z $alt_subject_name ]] && alt_subject_name="-"
else
alt_subject_name="-"
fi
echo "$ip,$port,$alt_subject_name"
done > certificate-lookups.csv
Dieses Skript versucht, das SSL-Zertifikat von der IP-Adresse an Port 443 abzurufen. Wenn es gefunden wird, extrahiert es die DNS-Namen des Zertifikats. Dies ist möglicherweise nicht ganz korrekt. Da die SSL-Verbindung ohne einen Hostnamen aufgebaut wird, kann es sein, dass der Server das Standardzertifikat auf diesem Host präsentiert. Wenn Sie zum Beispiel eine Verbindung zu einer IP-Adresse xebia.com herstellen, wird ein Zertifikat von kinsta.cloud angezeigt.
5.5. Identifizieren von Reisezielen
Nachdem Sie den DNS und den Zertifikatsnamen erfasst haben, führen Sie die beiden Datensätze zusammen, indem Sie eingeben:
paste -d, dns-lookups.csv certificate-lookups.csv > domain-and-certificate-names.csv
In der resultierenden Datei finden Sie alle öffentlichen IP-Verkehrsziele, die mit DNS- und Zertifikatsnamen vermerkt sind.
Fazit
Mit dieser Reihe von Unix-Befehlen können Sie schnell herausfinden, mit welchen öffentlichen IP-Adressen sich unsere Anwendungen verbinden. Der Reverse-DNS-Lookup und das Abrufen von Zertifikaten für HTTP/HTTPS-Hosts helfen bei der Identifizierung der Ziele und bei der Erstellung einer Liste der zulässigen Egress-Autorisierungen. Beachten Sie, dass dies keine generische Lösung ist. Jede Situation ist anders, und Sie müssen möglicherweise zusätzliche Schritte einleiten.
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



