Özel Alt Ağdaki RDS'e Nasıl Erişilir? (SSM ve Bastion ile Güvenli Yöntem)
Özel bir alt ağda (private subnet) bulunan Amazon RDS örneğine erişmek, geliştiriciler için yaygın bir zorluktur. Veritabanınızı izole etmek güvenlik açısından en iyi uygulama olsa da, geliştirme veya hata ayıklama sırasında bağlantı engelleri yaratabilir.
Bu rehberde, geleneksel SSH bastion sunucularının (Jump Host) neden yetersiz kaldığını ve AWS Systems Manager'ın (SSM) nasıl daha üstün ve güvenli bir alternatif sunduğunu inceleyeceğiz.
İçindekiler
- Bağlantı Zorluğu
- Geleneksel SSH Bastion Sunucuları Neden Riskli?
- Modern Çözüm: AWS Systems Manager (SSM)
- Mimari Genel Bakış
- AWS CDK ile Adım Adım Uygulama
- Veritabanınıza Bağlanma
- SSS (FAQ)
- Sonuç
Bağlantı Zorluğu
AWS en iyi uygulamalarını takip ettiğinizde, RDS örneklerinizi özel bir alt ağa yerleştirirsiniz. Bu, genel bir IP adresine sahip olmadıkları ve internetten doğrudan erişilemedikleri anlamına gelir. Bu güvenlik için harika olsa da bir sürtünme noktası yaratır: Yerel makinenizden (örneğin DBeaver, pgAdmin veya terminal kullanarak) veritabanınıza nasıl bağlanırsınız?
Geliştiriciler genellikle bağlantıyı sağlamak için genel bir alt ağda bir "Jump Host" veya "Bastion Host" oluşturmaya başvururlar. Geleneksel olarak bu, SSH kullanmak anlamına geliyordu.
Geleneksel SSH Bastion Sunucuları Neden Riskli?
Klasik yaklaşım, genel bir alt ağda bir EC2 örneği başlatmayı, 22 numaralı bağlantı noktasını (SSH) açmayı ve SSH anahtarlarını yönetmeyi içerir. Ancak bu, çeşitli güvenlik ve operasyonel yükler getirir:
- Anahtar Yönetimi: SSH anahtarları kaybolabilir, çalınabilir veya ekip üyeleri arasında güvensiz bir şekilde paylaşılabilir. Bunları döndürmek (rotation) manuel bir yüktür.
- Saldırı Yüzeyi: 22 numaralı bağlantı noktasını internete açmak (belirli IP'lerle sınırlı olsa bile) saldırı yüzeyini artırır. Tarayıcılar sürekli olarak açık SSH portlarını arar.
- Denetim Günlükleri: Veritabanına kimin ve ne zaman eriştiğini standart SSH günlükleriyle takip etmek zordur.
- Ağ Yapılandırması: Bastion sunucusu için Güvenlik Gruplarını, NACL'leri ve potansiyel olarak bir İnternet Ağ Geçidini (Internet Gateway) yönetmeniz gerekir.
Modern Çözüm: AWS Systems Manager (SSM)
AWS Systems Manager Session Manager, gelen bağlantı noktalarını açmadan veya SSH anahtarlarını yönetmeden örneklerinizi yönetmek için daha güvenli bir yol sunar.
SSM Session Manager'ın Temel Faydaları
- Açık Port Yok: Güvenlik Grubunuzda 22 veya başka bir gelen bağlantı noktasını açmanıza gerek yoktur.
- SSH Anahtarı Yok: Kimlik doğrulama IAM politikaları aracılığıyla gerçekleştirilir. Artık yönetilecek PEM dosyası yok!
- Merkezi Erişim Kontrolü: Standart IAM rolleri ve politikalarını kullanarak erişim verin veya iptal edin.
- Denetlenebilirlik: Her oturum ve komut CloudTrail ve S3/CloudWatch Logs'a kaydedilebilir.
- Port Yönlendirme: SSM, uzak bağlantı noktalarını (Postgres için 5432 gibi) yerel makinenize zahmetsizce tünellemeyi destekler.
Mimari Genel Bakış
Hedef mimari şöyledir:
- RDS Örneği: Özel bir alt ağda bulunur (örn.
10.0.1.0/24). - EC2 Bastion Sunucusu: Aynı özel alt ağda (veya RDS'e rotası olan başka bir özel alt ağda) bulunur. Evet, bastion'ın kendisi de tamamen özel (private) olabilir!
- VPC Uç Noktaları (Endpoints): EC2 örneği, SSM'e VPC Uç Noktaları (veya bir NAT Gateway) aracılığıyla bağlanır, bu da trafiğin AWS ağı içinde kalmasını sağlar.
- IAM Rolü: EC2 örneği,
AmazonSSMManagedInstanceCorepolitikası ekli bir IAM rolüne sahiptir.
Bu kurulum, yönetim altyapınız için herhangi bir genel alt ağa veya genel IP'ye olan ihtiyacı ortadan kaldırır.
AWS CDK ile Adım Adım Uygulama
Aşağıda, bu mimariyi dağıtmak için bir TypeScript CDK parçası bulunmaktadır. Bir VPC, bir RDS örneği ve SSM için yapılandırılmış özel bir EC2 örneği oluşturuyoruz.
import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as rds from 'aws-cdk-lib/aws-rds';
import * as iam from 'aws-cdk-lib/aws-iam';
import { Construct } from 'constructs';
export class RdsSsmStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
// 1. Sadece özel alt ağlara sahip bir VPC oluşturun (izole)
// Not: Gerçek bir senaryoda, SSM için NAT Gateway veya VPC Uç Noktalarına ihtiyacınız olabilir
const vpc = new ec2.Vpc(this, 'MyVpc', {
maxAzs: 2,
natGateways: 0, // Demo için maliyet tasarrufu; prod ortamında SSM için VPC Uç Noktaları kullanın
subnetConfiguration: [
{
cidrMask: 24,
name: 'Private',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED,
},
],
});
// SSM için VPC Uç Noktaları ekleyin (Sadece özel alt ağlar için kritiktir)
vpc.addInterfaceEndpoint('SsmEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.SSM,
});
vpc.addInterfaceEndpoint('Ec2MessagesEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.EC2_MESSAGES,
});
vpc.addInterfaceEndpoint('SsmMessagesEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.SSM_MESSAGES,
});
// 2. RDS için Güvenlik Grubu
const rdsSg = new ec2.SecurityGroup(this, 'RdsSg', { vpc });
// 3. Bastion için Güvenlik Grubu
const bastionSg = new ec2.SecurityGroup(this, 'BastionSg', { vpc });
// Bastion'ın RDS'e 5432 portundan bağlanmasına izin ver
rdsSg.addIngressRule(bastionSg, ec2.Port.tcp(5432), 'Bastion'dan gelen bağlantıya izin ver');
// 4. RDS Örneği Oluşturun
const database = new rds.DatabaseInstance(this, 'MyRds', {
engine: rds.DatabaseInstanceEngine.postgres({ version: rds.PostgresEngineVersion.VER_15 }),
vpc,
securityGroups: [rdsSg],
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
});
// 5. SSM için EC2 Bastion Sunucusu Oluşturun
const bastion = new ec2.Instance(this, 'BastionHost', {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.NANO),
machineImage: ec2.MachineImage.latestAmazonLinux2(),
securityGroup: bastionSg,
vpcSubnets: { subnetType: ec2.SubnetType.PRIVATE_ISOLATED },
role: new iam.Role(this, 'BastionRole', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'),
managedPolicies: [
iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonSSMManagedInstanceCore'),
],
}),
});
}
}
Veritabanınıza Bağlanma
Altyapınız dağıtıldıktan sonra, AWS CLI kullanarak yerel terminalinizden bir oturum başlatabilirsiniz.
Önkoşullar
- AWS CLI yüklü ve yapılandırılmış olmalı.
- AWS CLI için Session Manager eklentisi (plugin) yüklü olmalı.
Tüneli Başlatın
Yerel portunuzdan (örn. 54320) uzak RDS uç noktasına bastion sunucusu üzerinden bir tünel açmak için aşağıdaki komutu çalıştırın.
# Değişkenleri kendi değerlerinizle değiştirin
BASTION_INSTANCE_ID="i-0123456789abcdef0"
RDS_ENDPOINT="myrds.cluster-xyz.us-east-1.rds.amazonaws.com"
LOCAL_PORT="54320"
REMOTE_PORT="5432"
aws ssm start-session --target $BASTION_INSTANCE_ID --document-name AWS-StartPortForwardingSessionToRemoteHost --parameters '{"host":["'$RDS_ENDPOINT'"],"portNumber":["'$REMOTE_PORT'"],"localPortNumber":["'$LOCAL_PORT'"]}'
Artık localhost:54320 adresini kullanarak veritabanınıza bağlanabilirsiniz!
psql -h localhost -p 54320 -U myuser -d mydb
SSS (FAQ)
1. AWS Systems Manager Session Manager ücretsiz mi?
Evet, standart Session Manager işlevselliği (port yönlendirme dahil) EC2 örnekleri için ek bir ücret ödemeden kullanılabilir. Yalnızca temel kaynaklar (EC2, VPC Uç Noktaları vb.) için ödeme yaparsınız.
2. Bunu Windows sunucularıyla kullanabilir miyim?
Evet, SSM Session Manager hem Linux hem de Windows örneklerini destekler.
3. Bastion Sunucusu için genel bir IP'ye ihtiyacım var mı?
Hayır! SSM için VPC Uç Noktaları ile Bastion Sunucunuz tamamen özel bir alt ağda bulunabilir, bu da güvenliği daha da artırır.
Sonuç
Veritabanı erişimi için SSH'tan SSM Session Manager'a geçmek önemli bir güvenlik yükseltmesidir. Erişim yönetimini basitleştirir, genel IP ihtiyacını ortadan kaldırır ve kapsamlı denetim sağlar. Yukarıda belirtilen mimariyi ve adımları izleyerek, RDS örneklerinizin geliştirme ve bakım görevleri için erişilebilir olmaya devam ederken güvende kalmasını sağlayabilirsiniz.
Bulut güvenliği ve altyapı hakkında daha fazla bilgi için AWS Danışmanlığı ve Kubernetes Hizmetlerimize göz atın.
Kaynaklar:
JSON-LD Şeması (SEO İçin)
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Özel Alt Ağdaki RDS'e Nasıl Erişilir? (SSM ve Bastion ile Güvenli Yöntem)",
"image": "https://www.devopsn.cloud/blog/116/hero.jpg",
"author": "Sandro Volpicella",
"publisher": {
"@type": "Organization",
"name": "DevOpsN",
"logo": {
"@type": "ImageObject",
"url": "https://www.devopsn.cloud/logo.png"
}
},
"datePublished": "2026-02-23",
"description": "AWS Systems Manager (SSM) ve EC2 Bastion sunucusu kullanarak, genel IP veya SSH anahtarı olmadan özel RDS veritabanınıza nasıl güvenle erişebileceğinizi öğrenin."
}