SSH-Protokollierung und Sitzungsverwaltung mit AWS SSM
Veröffentlicht: 2022-03-11Das Einrichten benutzerdefinierter Tools oder Skripts zum Führen eines SSH-Protokolls unter Linux kann mühsam und fehleranfällig sein.
Ingenieure können rootsh , screen oder ein anderes Dienstprogramm verwenden, um Benutzeraktivitäten zu protokollieren, aber wenn die Benutzerberechtigungen nicht richtig eingestellt sind, kann ein erfahrener Benutzer Überwachungsprotokolle löschen, um ihre Spuren zu verwischen. Eine andere Möglichkeit wäre, die Protokollierung auf Kernel-Ebene einzurichten, aber das dafür erforderliche Fachwissen ist nicht so verbreitet.
Glücklicherweise gibt es eine Möglichkeit, Benutzeraktivitäten zu protokollieren, ohne auch nur einen einzigen Linux-Befehl schreiben zu müssen! Wir benötigen diese Dienste:
- EC2
- IAM (Identitäts- und Zugriffsverwaltung)
- KMS (Schlüsselverwaltungsdienst)
- CloudWatch Logs (und/oder S3)
- AWS Systems Manager (früher bekannt als SSM)
Mal sehen, wie man jeden von ihnen einrichtet.
EC2 und IAM
Das Starten einer EC2-Instance ist normalerweise ziemlich einfach, aber es gibt eine wichtige Aufgabe, die während des Starts erledigt werden muss: Wir müssen unserer Instance eine IAM-Rolle zuweisen, da wir sonst nicht in der Lage sein werden, die erwarteten Ergebnisse zu erzielen, die am Ende beschrieben werden Artikel.
Die IAM-Rolle, die wir unserer EC2-Instance zuordnen, muss über die integrierte AmazonSSMManagedInstanceCore -Richtlinie verfügen, plus diese Richtlinie (als Inline angehängt oder vom Kunden verwaltet):
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }Abgesehen von der IAM-Rolle verwenden wir im Allgemeinen diese EC2-Instance-Konfiguration:
- Das Betriebssystem ist Amazon Linux 2, da es standardmäßig mit installiertem AWS Systems Manager Agent (SSM Agent) geliefert wird. (Das gilt auch für Ubuntu-Distributionen, die ebenfalls eine Option sind.)
- Der Instanztyp ist t3.micro (aber jeder Typ ist geeignet).
- Die standardmäßige Sicherheitsgruppe , die AWS der VPC zuweist, funktioniert, da wir für diese Übung keinen offenen SSH-Port benötigen.
Wir können mit der Einrichtung von KMS beginnen, ohne auf das Hochfahren der EC2-Instanz zu warten.
KMS
Wir benötigen einen KMS-Schlüssel, wenn alle an CloudWatch übermittelten Sitzungsprotokolle verschlüsselt gespeichert werden sollen. Gehen wir zum KMS-Dienst und erstellen einen Schlüssel.
Wir empfehlen, einen Administrator zuzuweisen, damit der Schlüssel von anderen Benutzern als dem Root-Benutzer des AWS-Kontos verwaltet werden kann, aber wenn andere keinen Zugriff benötigen, können wir Schritt 3 überspringen.
Hier haben wir den IAM-Benutzer „admin“ als Schlüsseladministrator gewählt, aber wir können jeden Benutzer oder jede Rolle frei wählen. Wir können uns auch dafür entscheiden, die Berechtigung zum Löschen von Schlüsseln für den Administrator zu deaktivieren.
Wir werden diesem Schlüssel keine Benutzer zuweisen, da wir möchten, dass dieser Schlüssel nur vom CloudWatch Logs-Dienst für Verschlüsselungs- und Entschlüsselungsvorgänge von SSH-Protokollen verwendet wird.
Auf der Überprüfungsseite müssen wir die KMS-generierte Schlüsselrichtlinie ändern, da sie keine Berechtigungen für CloudWatch Logs zur Verwendung des Schlüssels enthält. Wir ersetzen sie durch diese Richtlinie:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/USERNAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow access to CloudWatch Log", "Effect": "Allow", "Principal": { "Service": "logs.REGION.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT_ID:*" } } } ] }Stellen Sie sicher, dass Sie alle Platzhalter ersetzen:
-
ACCOUNT_IDwird zu unserer AWS-Konto-ID. -
USERNAMEwird zum Administrator-Benutzernamen, der in Schritt 3 ausgewählt wurde. Wenn wir diesen Schritt abgelehnt haben, entfernen wir hier den zweiten Anweisungsblock (den mit"Sid": "Allow access for Key Administrators"). -
REGIONwird zum regionalen Identifikationscode, für den wir Dienste bereitstellen (z. B.us-west-1).
Damit ist KMS startklar.
CloudWatch-Protokollgruppe
Als nächstes benötigen wir eine CloudWatch Log-Gruppe (und/oder einen S3-Bucket – siehe unten), an die der SSM-Agent SSH-Sitzungsprotokolle senden kann. Lassen Sie es uns erstellen.
Beachten Sie das KMS-Schlüssel-ARN-Feld: AWS stellt uns den hier benötigten Wert bereit, nachdem der Schlüssel in Schritt 5 des KMS-Abschnitts erstellt wurde.
(Wenn wir unserem KMS-Schlüssel nicht früher die richtige Richtlinie zugeordnet haben, sodass der CloudWatch Logs-Dienst den Schlüssel verwenden kann, erhalten wir an dieser Stelle einen Fehler in Bezug auf den KMS-Schlüssel.)
Speichern von SSH-Protokollen in einem S3-Bucket
Um Aktivitätsprotokolle mit S3 anstelle von – oder zusätzlich zu – CloudWatch Logs zu speichern, müssen wir diese Berechtigungen unserem EC2-Instance-Profil als separate Richtlinie hinzufügen (oder sie manuell mit anderen Berechtigungen kombinieren, die wir möglicherweise verknüpfen müssen):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "*" } ] } Achten Sie im obigen Snippet darauf, den Platzhalter BUCKET_NAME zu ersetzen.
Jetzt, da wir einen Ort zum Speichern der Protokolle eingerichtet haben – CloudWatch Logs, einen S3-Bucket oder beides –, sind wir bereit, SSH-Sitzungen anzuzapfen.
AWS Systems Manager-Sitzungsmanager
Dies ist der letzte wichtige Schritt, in dem wir den sicheren Zugriff auf unseren Linux-Computer für die Überwachung und Protokollierung von SSH-Sitzungen konfigurieren. Wir beginnen mit dem Session Manager-Dashboard.

Klicken Sie auf dem Dashboard auf die weiße Schaltfläche „Einstellungen konfigurieren“ im oberen rechten Feld „Sitzung starten“, um die Sitzungsprotokollierung zu aktivieren.
Auf der Seite „Einstellungen“ finden wir mehrere Abschnitte, die wir untersuchen könnten, aber unser Fokus wird auf dem Streamen von SSH-Sitzungsprotokollen zu CloudWatch oder S3 liegen, damit wir schnell sehen können, was auf unserer Linux-Maschine passiert.
Direkt nach dem Abschnitt „CloudWatch-Protokollierung“ gibt es einen Abschnitt „S3-Protokollierung“, in dem wir den Bucket auswählen können.
Sobald die SSH-Protokollierung konfiguriert ist, können wir uns per SSH in unseren Linux-Computer einloggen und einige Befehle ausführen, um zu sehen, ob die Aktivität erfasst wird oder nicht.
Beginnen wir also eine Sitzung. Auf derselben Seite finden wir eine Registerkarte „Sitzungen“, auf der wir eine Sitzung starten können. Durch Klicken auf die Schaltfläche „Sitzung starten“ erhalten wir eine Liste der EC2-Maschinen, auf denen wir eine Sitzung starten können:
Wenn wir unsere EC2-Linux-Instance nicht in der Liste sehen, sollten wir überprüfen, ob sie ausgeführt wird und die ihr zugeordneten IAM-Berechtigungen hat, die wir zuvor beschrieben haben.
Umgang mit einem SSM-Agent-Fehler „Unterstützt keine Streaming-Protokolle“.
Falls wir eine Fehlermeldung erhalten, dass die auf unserem EC2-Rechner installierte SSM-Agent-Version das Streamen von CloudWatch-Protokollen nicht unterstützt, machen Sie sich keine Sorgen. Es gibt einen schmerzlosen Weg, dies zu beheben.
Um den SSM-Agenten zu aktualisieren, müssen wir im linken Bereich des AWS Systems Manager -Service zu Run Command navigieren.
Sobald wir dort sind, können wir auf die orangefarbene Schaltfläche „Befehl ausführen“ klicken, die zu einer neuen Seite führt, auf der wir einige Parameter eingeben können.
Wir beginnen mit der Auswahl von AWS-UpdateSSMAgent aus der Liste.
Sobald dies ausgewählt ist, scrollen wir nach unten, bis wir den Abschnitt „Ziele“ sehen. Dort müssen wir die EC2-Instanz auswählen, auf der wir den SSM-Agent aktualisieren möchten, und dann am Ende auf die Schaltfläche „Ausführen“ klicken. Dadurch werden wir zu einer Seite weitergeleitet, auf der wir den Fortschritt des Updates überwachen können.
Das Agenten-Update sollte nicht länger als fünf Minuten dauern. Sobald dies erledigt ist, sollten wir in der Lage sein, eine Sitzung im Sitzungsmanager zu erstellen.
An diesem Punkt sollte eine SSH-Sitzung gestartet werden.
Nachdem Sie einige Befehle ausgeführt haben, navigieren wir zur CloudWatch Logs-Protokollgruppe (oder unserem S3-Bucket, nicht gezeigt) und bestätigen, dass die Aktivität aufgezeichnet wird.
Wir haben jetzt ein Setup mit aktivierter Verschlüsselung im Ruhezustand, das jeden auf unserer Linux-Maschine ausgelösten Befehl aufzeichnet.
Tatsächlich kann jeder Befehl mehr sein, als wir wollen: Alle während der Sitzung bereitgestellten oder generierten Geheimnisse werden in CloudWatch oder S3 aufgezeichnet und können von jedem eingesehen werden, der über die erforderlichen Berechtigungen verfügt. Um das zu verhindern, können wir stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; für jedes Geheimnis, das wir während der Sitzung bereitstellen müssen.
Eine großartige SSM/SSH-AWS-Protokollierungslösung mit kleinen Einschränkungen
Session Manager ist ein nützliches Tool, um Fernzugriff auf unsere virtuellen Maschinen in AWS zu erhalten, ohne Port 22 öffnen zu müssen. Tatsächlich können wir auf diese Weise keine SSH-Protokolle generieren, wenn wir als Session Manager Portweiterleitung oder eine direkte SSH-Verbindung verwenden Dokumentationsnotizen.
Nichtsdestotrotz ist die Kombination von Session Manager mit Sitzungsprotokollierung eine robuste Lösung zur Steuerung und Überwachung von Aktivitäten innerhalb von VMs. Darüber hinaus wird uns die Nutzung des Session Manager-Dienstes nicht in Rechnung gestellt. Wir zahlen nur für unsere EC2-Instanz und CloudWatch Logs oder einen S3-Bucket zum Speichern von Protokollen.
Für Leser, die Video-Tutorials bevorzugen, habe ich ein sehr ähnliches Verfahren etwas ausführlicher auf YouTube behandelt.
Weiterführende Literatur im Toptal Engineering Blog:
- Fallstudie: Warum ich AWS Cloud Infrastructure für meine Produkte verwende
