Blog

So richten Sie einen SSH-Tunnel zu privaten AWS RDS- und EC2-Instanzen ein

Aktualisiert Oktober 16, 2025
3 Minuten

Wenn wir Anwendungen in der Cloud debuggen, müssen wir manchmal einen SSH-Tunnel von unserem lokalen Netzwerk aus einrichten, um mit ihnen zu interagieren. Wir wollen jedoch fast nie, dass diese Maschinen öffentlich zugänglich sind! In diesem Beitrag erkläre ich Ihnen, wie Sie mit aws-ssh-tunnel und einer einzelnen privaten EC2-Instanz SSH-Tunnel zu privaten EC2- und RDS-Instanzen erstellen können, ohne öffentliche Endpunkte preiszugeben.

Anforderungen

Um einen SSH-Tunnel einzurichten, benötigen wir drei Dinge: einen EC2-Sprungserver bereitstellen, die richtigen IAM-Berechtigungen für unsere AWS-Rolle einrichten und die aws-ssh-tunnel CLI konfigurieren. In meinem nächsten Beitrag werde ich erklären, was genau aws-ssh-tunnel im Hintergrund tut. Im Wesentlichen geht es darum, dass wir die AWS Systems Manager StartSession API nutzen können, um SSH-Datenverkehr an eine private EC2-Instanz weiterzuleiten. Diese Instanz fungiert als Jump Server, der unsere Shell-Befehle an einen entfernten Host, wie z.B. RDS, tunnelt.

Einrichten der Jump Server-Instanz

Lassen Sie uns zunächst die Jump Server-Instanz einrichten. Dies kann eine beliebige Instanz sein, solange sie sich in einem privaten Subnetz befindet und keinen eingehenden Datenverkehr zulässt. AWS CDK verfügt über ein speziell für diesen Zweck vorgesehenes Konstrukt namens BastionHostLinux. Nachfolgend finden Sie ein funktionierendes Beispiel, das Sie in Ihre CDK-Anwendung importieren können:

import {
    App,
    Stack,
    Tags,
    aws_ec2 as ec2,
} from "aws-cdk-lib";

export class JumpServerStack extends Stack {

    constructor(app: App, id: string, props ? : any) {
        super(app, id, props);

        Tags.of(this).add('application', 'jump_server')

        const vpc = ec2.Vpc.fromLookup(this, "JumpServerVpc", {
            tags: {
                "vpc_id": "jump_server_vpc"
            }
        });

        const jumpServer = new ec2.BastionHostLinux(this, 'JumpServer', {
            vpc,
            blockDevices: [{
                deviceName: '/dev/sdf',
                volume: ec2.BlockDeviceVolume.ebs(10, {
                    encrypted: true,
                }),
            }],
        });
    }
}

Die richtige IAM-Richtlinie erstellen

Unser Benutzer muss außerdem über die folgenden IAM-Berechtigungen verfügen, um den Tunnel einrichten zu können:

ec2:DescribeInstances - zur Identifizierung des Jump-Servers verwendet.

ec2-instance-connect:SendSSHPublicKey - zur Authentifizierung der SSH-Sitzung mit dem Jump Server verwendet.

ssm:StartSession - verwendet, um die SSM-Sitzung zu starten, die als Proxy für unsere SSH-Sitzung fungiert. In diesem Beispiel schränken wir den Umfang dieser Berechtigungen ein, indem wir eine Bedingung hinzufügen, die unseren Zugriff auf ec2-Instanzen beschränkt, die ein Tag mit dem Schlüssel application und dem Wert jump_server haben. Fügen Sie der AWS-Rolle, die wir übernehmen wollen, die folgende IAM-Richtlinie hinzu (achten Sie darauf, die Platzhalterwerte anzupassen):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeInstances",
                "ec2-instance-connect:SendSSHPublicKey",
                "ssm:StartSession"
            ],
            "Resource": [
                "arn:aws:ec2:eu-west-1:123456789123:instance/*"
            ],
            "Condition": {
                "StringLike": {
                    "ec2:resourceTag/application": [
                        "jump_server"
                    ]
                }
            }
        }
    ]
}

aws-ssh-tunnel verwenden

Jetzt, da wir einen Jump Server haben und unserer AWS-Rolle die richtigen IAM-Berechtigungen hinzugefügt haben, können wir uns mit aws-ssh-tunnel mit ihm verbinden. Rufen wir zunächst auf, um ihn zu konfigurieren. Wir werden nach unserer AWS-Region, dem AWS-Profil, dem Jump Server-Tag und dem Jump Server-Benutzer gefragt. Für EC2-Instanzen, auf denen AWS AMIs laufen, ist der Standardbenutzer .Sobald wir unsere Einrichtung konfiguriert haben, können wir uns mit unserer Zielinstanz verbinden, indem wir den Service-Endpunkt und den Port an übergeben. Zum Beispiel können wir eine Portweiterleitung mit einer RDS Postgres-Datenbank wie folgt starten:

aws-ssh-tunnel run --remote_host mydb.123456789012.eu-west-1.rds.amazonaws.com --port 5432 Das war's! Wir haben jetzt eine Tunnelsitzung mit unserer entfernten privaten Datenbank, mit der wir uns lokal verbinden können.

Fazit

Wie wir gesehen haben, ist es mit diesem Tool sehr einfach, schnell einen SSH-Tunnel mit privaten Instanzen in AWS einzurichten. Außerdem müssen wir nicht einmal öffentliche Bastion-Hosts freigeben, um auf unser privates Subnetz zuzugreifen! Dies reduziert die Angriffsfläche unserer Anwendung und macht unsere AWS-Umgebung viel sicherer. In meinem nächsten Beitrag werde ich genauer darauf eingehen, was aws-ssh-tunnel im Hintergrund tut.

Contact

Let’s discuss how we can support your journey.