MySQL SSH-Tunneling mit AWS Session Manager

Nov 12, 2021


In den letzten Monaten hat das DevOps-Team in unserem Unternehmen nach Möglichkeiten gesucht, die Sicherheit unserer AWS-Cloud-Infrastrukturprojekte zu erhöhen. Dies führte zur Erstellung einer umfangreichen Liste von Anforderungen, die für alle bestehenden und zukünftigen Projekte umgesetzt werden sollten.

Zurzeit nutzen fast alle Projekte eine EC2-Instanz, die als Bastion-Host (Jump Box) fungiert und uns den Zugriff auf Ressourcen in unseren privaten Subnetzen ermöglicht. Obwohl wir dafür sorgen, dass der Bastion-Host nicht zu einem Sicherheitsproblem wird, besteht das Problem bei diesem Ansatz darin, dass sich der Bastion-Host in einem öffentlichen Subnetz befindet und die Ingress-Regeln Verbindungen von außen zulassen.

AWS Session Manager als Retter in der Not

Session Manager ist eine Funktion von AWS Systems Manager, mit der wir die EC2-Instanzen über eine interaktive, browserbasierte Shell mit nur einem Klick oder über die AWS CLI verwalten können. AWS Session Manager bietet uns eine sichere Instanzverwaltung, ohne dass wir eingehende Ports öffnen oder Bastion-Hosts verwalten müssen.

Wir werden jedoch nicht näher auf die Einrichtung des Session Managers für Ihre EC2-Instances eingehen, da die offizielle Dokumentation ausführlich genug ist und Sie sie auch hier nachlesen können.

Außerdem scheint die Session Manager-Funktion eine Verbesserung unserer Cloud-Sicherheit zu sein, aber jetzt stehen wir vor einer neuen Herausforderung. Wir brauchen immer noch eine Möglichkeit, auf unsere RDS-Instanzen zuzugreifen, die sich in einem privaten Subnetz befinden.

In der Vergangenheit haben wir dies getan, indem wir einen ssh-Tunnel über unseren öffentlichen Bastion-Host erstellt und auf die privaten MySQL-RDS-Instanzen zugegriffen haben. Das erste, was wir bei Google suchten, war natürlich "AWS Session Manager tunneling". Es tauchten zahlreiche Anleitungen auf, aber keine von ihnen erläuterte gründlich den gesamten Prozess der Erstellung des SSH-Tunnels.

Erstellen des SSH-Tunnels

Auch wenn wir gesagt haben, dass Session Manager die Wartung von Bastion-Hosts überflüssig macht, müssen wir, um auf Ressourcen in unserem privaten Subnetz zugreifen zu können, immer noch eine EC2-Instanz erstellen, die als Bastion-Host dient. Der Vorteil der Verwendung von Session Manager ist, dass sich der Bastion-Host nun in einem privaten Subnetz befindet und seine Sicherheitsgruppen keinen eingehenden Verkehr zulassen.

Als nächstes müssen wir unsere lokale ssh-Konfigurationsdatei, die sich normalerweise in ~/.ssh/config (Linux und MacOS) oder C:\Users\username.ssh\config (Windows) befindet, mit folgendem Inhalt ändern:

# SSH over Session Manager host i-* mi-* ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"

Damit kann ein Proxy-Befehl ausgeführt werden, der eine Session Manager-Sitzung startet und alle Daten über die Verbindung überträgt.

Wir sind nun bereit, eine Session Manager-Verbindung mit SSH zu starten. Sie können versuchen, sich mit dem folgenden Befehl bei Ihrem Bastion-Host anzumelden:

ssh -i KEY-FILE.pem username@INSTANCE-ID

wobei KEY-FILE der Name des Schlüssels ist, den Sie für Ihren Bastion-Host erstellt oder ausgewählt haben, und der Benutzername ec2-user ist, wenn Sie ein Amazon Linux AMI verwenden, ubuntu, wenn Sie ein Ubuntu AMI verwenden, usw... und die INSTANCE-ID sieht etwa so aus wie i-0ac772dd11dc4b4e8.

Wenn Sie sich erfolgreich beim Bastion-Host angemeldet haben, können Sie nun den nächsten Schritt ausführen, nämlich einen Tunnel erstellen und auf die RDS-Instanz zugreifen. Dazu führen Sie den folgenden Befehl aus:

ssh -i KEY-FILE.pem ec2-user@INSTANCE_ID -L 9090:RDS-ENDPOINT:3306

Der Befehl stellt den Zugang zur Datenbank auf der RDS-Instanz her - der lokale Port 9090 wird zu Port 3306 auf der RDS-Instanz getunnelt.

Bitte beachten Sie, dass INSTANCE-DNS etwa so aussehen sollte wie ip-10-0-1-204.region.compute.internal und RDS-ENDPOINT etwa so wie database1.chefcaow2ket.region.rds.amazonaws.com.

Da die Sitzung noch aktiv ist, können Sie nun ein neues Terminalfenster öffnen und versuchen, sich mit folgendem Befehl mit der Datenbank zu verbinden:

mysql -u USERNAME -h 127.0.0.1 -P 9090 -p password

oder Sie können einfach MySQL Workbench verwenden, um sich mit der Datenbank zu verbinden.

Wichtig zu wissen:

Die Sicherheitsgruppe der RDS-Instanz muss den Zugriff von Ihrem Bastion-Host erlauben.

Wenn Sie versuchen, eine SSH-Verbindung zu erstellen und die Instanz nicht in der Standardregion gefunden wird, schlägt der Befehl mit dem Fehler "kex_exchange_identification: Verbindung vom entfernten Host geschlossen'. Um dies zu verhindern, denken Sie daran, die Standardregion in der * Datei ~/.aws/config* zu aktualisieren .

Viktor Nanevski

Viktor Nanevski

Buchen Sie eine kostenlose Beratung

Wählen Sie Ihre Branche*

Bitte wählen Sie Ihre Branche*

Wählen Sie Ihren Servicetyp

Bitte wählen Sie Ihren Servicetyp

calendarWann passt es Ihnen am besten für ein kurzes Gespräch

Die mit * gekennzeichneten Felder sind Pflichtfelder

Alle Beiträge anzeigen