Blog

Fargate and Cribl (Stream): Wie wir es zum Laufen gebracht haben

Page Glave
October 2, 2023

Es wurde (und wird) viel über die ständig wachsenden Daten, die Unternehmen generieren, und über die Notwendigkeit, sie zu überwachen, gesprochen. Die Zentralisierung von Protokollen, SIEM (Security Information and Event Management) und die damit verbundenen Preisschilder sorgen dafür, dass viele nach einer besseren Kontrolle über die Protokollaufnahme suchen. Kribbel bietet Stream als Observability-Pipeline, die Ihnen viel mehr Kontrolle über den Ablauf und die Struktur von Protokollen bietet, als dies normalerweise bei der Aufnahme in SIEM möglich ist.

Eines der schönen Dinge an Panther (unserem SIEM) - erfahre mehr hier, hier, und hier) ist, dass Sie alles, was Sie bekommen, in einen S3-Bucket aufnehmen können. Wir haben benutzerdefinierte Ingestions mit AWS Lambdas bearbeitet, und obwohl das gut funktioniert hat, waren die Logs nicht immer so schön, wie wir es uns gewünscht hätten. JSON ist großartig, aber manchmal sind Dinge verschachtelt, die bei Erkennungen nicht einfach funktionieren oder Informationen enthalten, die besser organisiert werden könnten.

Hier kommt Cribl Stream (Cribl) ins Spiel. Wir können es verwenden, um die Baumstämme hereinzubringen, sie so zu formen, wie wir es für richtig halten, und sie überall hin versenden. In den meisten Fällen bedeutet das einen S3-Bucket. Mit Cribl sind wir in der Lage, Daten einfach zu archivieren, um sie später auf Panther wiederzugeben, die Logs zu verarbeiten, um sie besser nutzbar zu machen, und so ziemlich alles andere, was wir tun wollen. Es gibt eine Menge Optionen, und für die meisten davon sollten Sie ins Cribl gehen Ressource Seite. Die Sandbox und die Cribl University sind besonders hilfreich.

Wenn Sie jedoch nach Informationen zur Bereitstellung von Cribl mithilfe von AWS Fargate suchen, sind Sie hier genau richtig. Dies ist kein typischer Ansatz, um Cribl in Containern auszuführen. Sie verfügen über Helm-Charts, die Sie mit EKS verwenden können, aber ECS und Fargate sind unsere bevorzugten Ansätze. Außerdem, wer möchte der Dokumentation überhaupt folgen?

Ja, das tue ich. Zumindest für solche Dinge. Was ist dort reicht aus, um den größten Teil des Weges dorthin zurückzulegen, aber es gibt einige Lücken. Mein Ziel ist es, diese Lücken zu schließen. Wenn Sie Fargate aus... Gründen verwenden müssen, können Sie dies ohne große Schwierigkeiten tun. Es ist sehr sinnvoll, einen Entwicklungs-/Test-Cluster über die AWS-Konsole einzurichten und über Infrastructure as Code zu produzieren. Es bietet Ihnen auch einen schönen Testbereich, wenn Sie Versionsupgrades durchführen müssen. Dies wird keine vollständige Komplettlösung sein — Sie benötigen Grundkenntnisse in AWS und/oder Terraform. Wenn Sie mit der Arbeit mit AWS über die Konsole und die CLI und der Bereitstellung von Ressourcen über Terraform vertraut sind, sollten die Informationen hier die fehlenden Teile der Cribl-Dokumentation ergänzen. Wenn nicht, suchen Sie bei Bedarf nach der entsprechenden Dokumentation für AWS/Terraform.

Wird der Einsatz über Fargate von Cribl verpönt? Nicht wirklich; es ist einfach nichts, was sie dokumentiert haben. Ihre Slack-Community war fantastisch, wenn ich auf Probleme stieß. Abhängig von Ihren Umweltanforderungen sollten Sie möglicherweise auch die Verwendung von EC2 für den Leader in Betracht ziehen. Es gibt so oder so Vor- und Nachteile, also YMMV.

Überblick

Einige architektonische Grundlagen — in diesem Beispiel betrachten wir eine Führungskraft mit einer einzigen Gruppe von 2 Arbeitern. Die Container werden sich in ihrer eigenen VPC mit internen und externen Netzwerk-Load-Balancern befinden. Die Load Balancer müssen der Netzwerkvariante entsprechen - die anderen Optionen funktionieren nicht. Ich würde Ihre Sicherheitsgruppen für maximale Isolierung in kleine Teile aufteilen.

Eine grundlegende Aufschlüsselung der Infrastruktur:
  • VPC und damit verbundene Dinge — Der typische Ansatz mit 3 öffentlichen und 3 privaten Subnetzen ist in Ordnung
  • Interner Netzwerk-Load Balancer — NICHT Anwendungs- oder klassische Load Balancer
  • Externer Netzwerk-Loadbalancer - Das Gleiche
  • Sicherheitsgruppen — Die benötigten Eingangsregeln finden Sie in der Abbildung
    • Arbeiter - Ich würde einen pro Cribl-Gruppe verdienen
    • Anführer
    • EFS
  • Fargate-Cluster
  • Leader Fargate Service- und Aufgabendefinition
  • Worker Fargate Service- und Aufgabendefinition
  • EFS (persistenter Speicher) mit Access Point und Mount-Target für den Leader
  • ECR-Bild — Wenn du nicht einfach ziehen willst neueste
  • IAM-Rollen
    • Aufgaben- und Aufgabenausführungsrollen des Leiters
    • Rollen für Mitarbeiteraufgaben und Aufgabenausführung
Ein grobes Diagramm der Architektur

Wenn Sie die Terraform-Route wählen, benötigt Ihr Repo Andockfenster und Terraform Verzeichnisse, einschließlich einer docker-compose.yaml Die Datei macht das lokale Testen zum Kinderspiel. Die Grundstruktur würde ungefähr so aussehen. Ich/wir haben uns dafür entschieden, die Terraform aufzuteilen, um die wichtigsten Dinge von den EFS- und VPC-Dingen zu trennen, weil das für uns am sinnvollsten war.

  • Andockfenster
    • Docker-Datei
    • docker-compose.yaml
  • Terraform
    • cribl - TF-Dateien im Zusammenhang mit dem Cluster
      • Richtlinien — IAM-Richtlinien
      • task_definition - JSON-Aufgabendefinitionen
    • efs — TF-Dateien zum Einrichten von EFS für persistenten Speicher
    • vpc — TF-Dateien zum Einrichten der VPC und der zugehörigen Infrastruktur

Sie können Ihre Terraform-Dateien nach Belieben aufteilen/ist überall dort üblich, wo Sie sich befinden. Welchen Linter Sie auch verwenden, Sie werden sich wahrscheinlich über das Format der Aufgabendefinitionen beschweren. Aber sie sind wahrscheinlich in Ordnung. Achten Sie hier auf Ihre Umgebungsvariablen — schützen Sie sensible Variablen mit dem Geheimnisse Block- und SSM-Parameter oder Geheimnisse.

Noch nichts Unheimliches, oder?

Nuancen

Sie werden Spaß daran haben, dass Sie auf der AWS-Konsole manchmal nicht das tun können, was Sie tun müssen. Insbesondere müssen Sie hinzufügen weitere Zielgruppen zu den Diensten, weil Sie in der Konsole nur eine einzige Zielgruppe hinzufügen können. Die zusätzlichen müssen über die CLI hinzugefügt werden. Sie fügen die durch Kommas getrennten Zielgruppen-ARNs in der --Loadbalancer Parameter. Sie müssen das erste, das über die Konsole hinzugefügt wurde, hinzufügen.

aws ecs update-service --cluster <cluster_name> --service <service_name> -- load-balancers "targetGroupArn=<arn_target_group_1>, targetGroupArn=<arn_target_group_2>"

Durch die Bereitstellung mit Terraform können Sie das Netzwerk nach Bedarf einrichten. Wenn Sie also diesen Weg für die Produktion einschlagen, ist das ziemlich einfach. Das Terraform-Dokumentation auf jeder der Ressourcen werden Sie dorthin gebracht, wo Sie sein müssen.

Für den Anführer wird die Terraform ungefähr so aussehen wie...

resource "aws_ecs_service" "leader" {
  name                 = "cribl-leader"
  cluster              = aws_ecs_cluster.cribl.id
  task_definition      = aws_ecs_task_definition.cribl-leader.arn
  desired_count        = 1
  launch_type          = "FARGATE"
  platform_version     = "1.4.0"
  force_new_deployment = true

  network_configuration {
    subnets          = data.aws_subnet.private.*.id
    security_groups  = [aws_security_group.cribl-leader.id]
    assign_public_ip = false
  }

  # Internal load balancer for leader <> worker communication
  load_balancer {
    target_group_arn = aws_lb_target_group.cribl-coms.arn
    container_name   = "cribl-leader"
    container_port   = 4200
  }

  # External load balancer for access to leader GUI
  load_balancer {
    target_group_arn = aws_lb_target_group.cribl-gui.arn
    container_name   = "cribl-leader"
    container_port   = 9000
  }

  # And whatever else you need
}


Folgen Sie der gleichen grundlegenden Gliederung für die Worker-Dienste. Ich würde empfehlen, die Standard-Worker in einem bestimmten Subnetz (nicht in allen Subnetzen) zu platzieren, damit Sie die Worker später problemlos in verschiedene Gruppen einteilen können. Wenn Sie verschiedene Subnetze verwenden, können Sie in Cribl eine Logik erstellen, um den Worker anhand der IP in eine bestimmte Gruppe einzuordnen.

Nun zu den Aufgabendefinitionen. Das Erstellen in der Konsole ist einfach. Sie benötigen separate Aufgabendefinitionen für den Leiter und jede Mitarbeitergruppe. Um über Terraform zu erstellen, können Sie das JSON abrufen, indem Sie entweder die Aufgabendefinition in der Konsole erstellen und das JSON abrufen oder von einem Beispiel. Geben Sie sich genug Rechenleistung, um die Arbeit zu erledigen. Sie können nach Bedarf nach oben anpassen, aber ich fand, dass die kleinsten Optionen nicht ausreichen. Vielleicht kommen Sie mit dem 0,5 vCPU-Level aus, aber ich würde für Ihre Tests auf etwas im Bereich von 1 vCPU abschätzen. Benutze das Dokumente dimensionieren um herauszufinden, was Sie für Prod benötigen.

Sobald Sie einen Cluster haben, in dem die Worker mit dem Leiter sprechen können (dies anhand der Protokolle bestätigen), sollten Sie auch persistenten Speicher (fügen Sie ein Volume hinzu) in Form von EFS verwenden, damit Ihre Konfiguration erhalten bleibt — das ist auch für HA erforderlich. Remote-Git und persistenter Speicher, die beide als Umgebungsvariablen gesetzt sind, machen die Dinge jedoch kaputt. Richten Sie persistenten Speicher in den Umgebungsvariablen ein und fügen Sie über die Cribl-GUI ein Remote-Git hinzu, falls Sie eines möchten.

Wichtiger Hinweis: Derzeit zeigt die Cribl-Dokumentation, wie das persönliche Zugriffstoken für GitHub in die URL des Remote-Git eingefügt wird. TU DAS NICHT. Ich meine, du kannst, aber es wird das Token im Klartext in das Repo einfügen. Was einfach eklig ist. Verwenden Sie stattdessen die Standardauthentifizierungsoption und verwenden Sie das Token anstelle des Passworts. Dadurch wird der Wert verschlüsselt. Sie sollten ein privates Repo verwenden, was das Risiko der Protokollierung des Tokens begrenzen würde, aber das sollten Sie einfach nicht tun. Und stellen Sie sicher, dass das Token auf das jeweils benötigte Repo beschränkt ist, und beschränken Sie die Berechtigungen. (Sie arbeiten daran, die Dokumente zu aktualisieren - ich habe im Cribl-Slack Hilfe bekommen, um das zu beheben.)

Denken Sie beim Hinzufügen von Speicher, Quellen und Zielen daran, dass Sie die Infrastruktur aktualisieren müssen, um dies zu ermöglichen. Wenn Sie also Syslog hinzufügen möchten, müssen Sie Ingress zur Worker-Sicherheitsgruppe und einer Zielgruppe auf dem externen Load Balancer hinzufügen. Sie müssen dem Leiter Zugriff auf den EFS-Speicher und auf Dinge wie S3-Speicher gewähren.

Versionen aktualisieren

Ich habe festgestellt, dass es gut funktioniert, dem Versionsupdate-Prozess in der Cribl-GUI zu folgen. Informiere den Anführer, dann die Arbeiter. Testen Sie nach Bedarf. Wenn Sie dann bereit sind, können Sie Ihr ECR-Image aktualisieren, um das neueste Bild abzurufen. Ich bevorzuge es, ein ECR-Bild zu erstellen, um mehr Kontrolle über die Image-Version zu haben.

Ich füge auch ein Entwickler-Update hinzu, das direkt aus der neuesten Cribl-Version in Docker stammt, um zu sehen, wie viel sich ändert, wenn das neue Image abgerufen wird. Das kann ein zusätzlicher Schritt sein, den Sie unternehmen möchten oder auch nicht. Mit persistentem Speicher können Sie die alte Version des Images verwenden und es bei Bedarf einfach erneut aktualisieren. Aber ich aktualisiere auch gerne das ECR-Bild. Je nachdem, wie stark sich die Entwicklung zwischen dem vorherigen und dem neuesten Image geändert hat, möchten Sie möglicherweise auch die Produktdienste aktualisieren, sodass sie mit dem neuen Image ausgeführt werden. Tun Sie es zu einer Zeit, die für Sie Sinn macht. Es ist ziemlich nahtlos, aber es dauert einige Zeit und Sie könnten einige Ereignisse abbrechen.

Der gesamte Prozess ist:

  • Aktualisieren Sie den Entwicklerleiter über die GUI
  • Aktualisieren Sie die Entwicklerarbeiter über die GUI
  • Testen Sie, bis Sie zufrieden sind
  • Stellen Sie Dev von Cribl:latest bereit, falls gewünscht
  • Aktualisieren Sie Prod Leader über die GUI
  • Aktualisieren Sie die Prod Worker über die GUI
  • ECR-Bild aktualisieren
  • Aktualisieren Sie die Dienste, falls gewünscht

Das Ende

Das sollten genug Informationen sein, um die kleinen Kuriositäten beim Einsatz von Cribl über Fargate zu bewältigen. Ich habe versucht, genügend Details bereitzustellen, um den Schluckauf zu überwinden, ohne einen Roman zu schreiben. Dieses Setup funktioniert ganz gut. Wenn du zu Helm und EKS gehen kannst, ist das ein einfacherer Weg. Cribl aktualisiert die Helm-Charts regelmäßig. Die Krippe Slack, Universität, und Sandkasten sind alles hervorragende Ressourcen, um Ihnen beim Experimentieren oder beim Loslassen zu helfen. Es ist wirklich eine Frage, was in Ihrer Umgebung am besten funktioniert.