Sistem yöneticiliğinde en çok kullandığın araçlardan birini düşün. Büyük ihtimalle SSH ilk sıralarda geliyordur. Sunucuya fiziksel erişim olmadan, dünyanın öbür ucundan terminal açıp komut çalıştırabilmek, dosya transferi yapabilmek ve tüm sistemi yönetebilmek… Bu, modern sysadmin’in temel süper gücü diyebilirim. Bu yazıda SSH’ı sıfırdan profesyonel kullanıma kadar ele alacağız. Sadece teorik değil, gerçek senaryolarla.
SSH Nedir ve Nasıl Çalışır?
SSH (Secure Shell), ağ üzerinden şifreli iletişim kurmanı sağlayan bir protokoldür. 1995 yılında, güvensiz telnet ve rsh protokollerine alternatif olarak geliştirildi. Günümüzde neredeyse tüm Linux sunucu yönetimi SSH üzerinden yürütülüyor.
Temel çalışma mantığı şu şekilde: İstemci ile sunucu arasında şifreli bir tünel oluşturulur. Bu tünel üzerinden hem kimlik doğrulama hem de veri iletimi gerçekleşir. Varsayılan port 22 olmakla birlikte, güvenlik amacıyla bu portu değiştirmek yaygın bir pratiktir.
SSH’ın şifreleme için kullandığı yöntemler:
- Asimetrik şifreleme: Bağlantı kurulum aşamasında kullanılır (RSA, ECDSA, Ed25519)
- Simetrik şifreleme: Oturum verisi için kullanılır (AES, ChaCha20)
- Hashing: Veri bütünlüğü için kullanılır (SHA-2, SHA-3)
Temel SSH Bağlantısı
En basit haliyle SSH bağlantısı kurmak için şu komutu kullanırsın:
ssh kullanici@sunucu_ip
Gerçek dünya örneği olarak düşün: Şirketinin web sunucusuna bağlanman gerekiyor.
ssh [email protected]
ssh [email protected]
ssh [email protected]
İlk bağlantıda sunucunun parmak izi (fingerprint) ekrana gelir ve onay ister. Bu ekranı dikkate almadan “yes” yazıp geçmeyin! Özellikle production sunucularında, bu parmak izini sistem yöneticisinden alıp doğrulayın. MITM (Man-in-the-Middle) saldırıları gerçekten var.
Sık Kullanılan SSH Parametreleri
-p: Farklı port kullanır. ssh -p 2222 [email protected]
-i: Belirli bir kimlik dosyası (private key) kullanır. ssh -i ~/.ssh/ozel_anahtar [email protected]
-v: Verbose mod, bağlantı sorunlarını debug etmek için harika. ssh -v [email protected]
-vvv: Çok detaylı verbose mod, ciddi sorunlar için kullanılır.
-X: X11 forwarding aktif eder, grafiksel uygulamaları uzaktan çalıştırır.
-L: Local port forwarding için kullanılır. ssh -L 8080:localhost:80 [email protected]
-R: Remote port forwarding için kullanılır.
-N: Uzak komut çalıştırmadan sadece tünel kurar.
-f: SSH’ı arka planda çalıştırır.
-T: Pseudo-terminal tahsisini devre dışı bırakır.
SSH Anahtar Tabanlı Kimlik Doğrulama
Şifre ile giriş yapmak hem güvensiz hem de zahmetlidir. Anahtar tabanlı kimlik doğrulama, hem daha güvenli hem de otomasyona uygun bir yöntemdir. Her sunucu yöneticisinin mutlaka bilmesi gereken bir konudur.
Anahtar Çifti Oluşturma
# Moderne ve güvenli Ed25519 algoritması ile anahtar oluştur
ssh-keygen -t ed25519 -C "is_makinesi_2024"
# RSA kullanmak zorundaysan (eski sistemler için) 4096 bit kullan
ssh-keygen -t rsa -b 4096 -C "backup_sunucu_anahtari"
Komut çalıştıktan sonra birkaç soru sorar. Anahtar dosyasının kaydedileceği yol için varsayılanı (~/.ssh/id_ed25519) genellikle kabul edebilirsin. Passphrase kısmını kesinlikle boş bırakma! Bu, anahtarın çalınması durumunda seni koruyan son savunma hattıdır.
Oluşan dosyalar:
~/.ssh/id_ed25519: Özel anahtar (private key) – kimseyle paylaşma!~/.ssh/id_ed25519.pub: Genel anahtar (public key) – sunuculara kopyalanır
Public Key’i Sunucuya Kopyalama
# En kolay yöntem: ssh-copy-id
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
# Port farklıysa
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 [email protected]
# Manuel yöntem (ssh-copy-id yoksa)
cat ~/.ssh/id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Artık şifresiz (ama passphrase korumalı) giriş yapabilirsin. SSH agent kullanarak passphrase’i de tek seferlik girip oturum boyunca hatırlatabilirsin:
# SSH agent'ı başlat
eval $(ssh-agent -s)
# Anahtarı agent'a ekle
ssh-add ~/.ssh/id_ed25519
# Passphrase bir kez gir, oturum boyunca hatırlar
SSH Config Dosyası ile Hayatı Kolaylaştırma
Birden fazla sunucu yönetiyorsan, her seferinde uzun komutlar yazmak yorucu olur. ~/.ssh/config dosyası bu sorunu çözer.
nano ~/.ssh/config
Aşağıdaki gibi bir yapı kur:
# Genel ayarlar
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
# Web sunucusu
Host web
HostName 192.168.1.100
User deploy
Port 22
IdentityFile ~/.ssh/web_sunucu_key
# Veritabani sunucusu (sadece ic ag)
Host db
HostName 10.0.0.50
User dbadmin
Port 2222
IdentityFile ~/.ssh/db_key
# Staging ortami
Host staging
HostName staging.sirketim.com
User ubuntu
IdentityFile ~/.ssh/staging_key
# Bastion/Jump host uzerinden erisim
Host prod-app
HostName 10.10.1.20
User appuser
ProxyJump bastion
IdentityFile ~/.ssh/prod_key
Host bastion
HostName bastion.sirketim.com
User ec2-user
IdentityFile ~/.ssh/bastion_key
Artık ssh web, ssh db, ssh staging yazman yeterli. Bu kadar.
Config dosyasının izinlerini doğru ayarlamayı unutma:
chmod 600 ~/.ssh/config
Gerçek Dünya Senaryosu 1: Jump Host / Bastion Sunucusu
Kurumsal ortamlarda production sunucularına doğrudan erişim vermek güvenlik açısından risklidir. Bunun yerine bir bastion (jump) sunucusu üzerinden erişim sağlanır.
Senaryo: Production veritabanı sunucusu (10.10.5.20) internetten erişilemez, sadece bastion (bastion.sirket.com) üzerinden ulaşılabilir.
# Tek satırda jump host kullanimi
ssh -J [email protected] [email protected]
# Ya da daha pratik, config dosyasina ekle:
# Host prod-db
# HostName 10.10.5.20
# User dbadmin
# ProxyJump [email protected]
# Sonra sadece:
ssh prod-db
Gerçek Dünya Senaryosu 2: Port Forwarding ile Veritabanına Güvenli Erişim
Uzak sunucudaki MySQL veritabanına yerel makinenden bağlanmak istiyorsun ama veritabanı portu (3306) dışarıya açık değil ve açmamalısın.
# Local port forwarding: yerel 3307 portunu uzak 3306'ya yonlendir
ssh -L 3307:localhost:3306 -N -f [email protected]
# Artık yerel makinenden:
mysql -h 127.0.0.1 -P 3307 -u dbuser -p
# Birkac saniye icinde veritabanina baglandin,
# 3306 portu hic internete acilmadi
Bu yöntem, yönetim panelleri, iç servisler ve geliştirme amaçlı erişimler için çok işe yarar.
SSH Sunucu Tarafı Yapılandırması
Sunucu tarafında SSH’ı güvenli ve verimli çalışacak şekilde yapılandırmak sysadmin’in görevidir. Yapılandırma dosyası /etc/ssh/sshd_config adresindedir.
sudo nano /etc/ssh/sshd_config
Önerilen güvenlik ayarları:
# Varsayilan portu degistir (gizlilik degil ama bot trafikini azaltir)
Port 2222
# Root ile direkt giris engelle
PermitRootLogin no
# Sadece anahtar tabanli girise izin ver, sifre girisi kapat
PasswordAuthentication no
PubkeyAuthentication yes
# Bos sifrelere izin verme
PermitEmptyPasswords no
# Sadece belirli kullanicilara izin ver
AllowUsers deploy admin monitoring
# Veya sadece belirli gruba izin ver
AllowGroups sshusers
# Maksimum kimlik dogrulama denemesi
MaxAuthTries 3
# Bos kalan oturumlari kapat
ClientAliveInterval 300
ClientAliveCountMax 2
# X11 Forwarding (ihtiyac yoksa kapat)
X11Forwarding no
# Banner goster (yasal uyari icin)
Banner /etc/ssh/banner.txt
Değişikliklerden sonra sshd’yi yeniden başlatmadan önce mevcut bağlantıyı kesme! Başka bir terminal açık bırak, yapılandırmayı test et, sonra yeniden başlat:
# Konfigurasyon dosyasini test et
sudo sshd -t
# Hata yoksa servisi yeniden baslat
sudo systemctl restart sshd
# Durumu kontrol et
sudo systemctl status sshd
SCP ve SFTP ile Dosya Transferi
SSH sadece terminal bağlantısı için değil, dosya transferi için de kullanılır.
SCP (Secure Copy)
# Yerel dosyayi uzak sunucuya kopyala
scp /yerel/dosya.txt [email protected]:/uzak/dizin/
# Uzak sunucudan yerel makineye kopyala
scp [email protected]:/var/log/nginx/access.log ./yerel_kopyasi/
# Dizin kopyalamak icin -r kullan
scp -r /yerel/proje/ [email protected]:/var/www/
# Farkli port icin -P (buyuk harf!) kullan
scp -P 2222 dosya.tar.gz [email protected]:/tmp/
# Ilerleme gosterimi ve istatistikler icin
scp -v buyuk_dosya.iso [email protected]:/backup/
SFTP ile Interaktif Dosya Yonetimi
# SFTP oturumu ac
sftp [email protected]
# Temel SFTP komutlari:
# ls - uzak dizin listele
# lls - yerel dizin listele
# cd - uzak dizin degistir
# lcd - yerel dizin degistir
# get dosya.txt - uzaktan indir
# put dosya.txt - uzaga yukle
# mkdir yeni_dizin - uzakta dizin olustur
# exit - cikis
Grafiksel arayüz tercih ediyorsan, FileZilla veya WinSCP gibi uygulamalar da SFTP protokolünü destekler.
SSH Tünel ile Dinamik SOCKS Proxy
Bazen tüm trafiği belirli bir sunucu üzerinden geçirmek isteyebilirsin. Örneğin kısıtlı bir ağdayken veya belirli bir lokasyondan erişim simüle etmek gerektiğinde.
# Dinamik SOCKS proxy olustur (port 1080)
ssh -D 1080 -N -f [email protected]
# Tarayicida proxy ayarini: SOCKS5 127.0.0.1:1080 olarak ayarla
# Ya da curl ile kullan:
curl --socks5 127.0.0.1:1080 https://hedef-site.com
SSH Oturum Yonetimi: Screen ve Tmux
Uzak sunucuda uzun sürecek işlemler başlatıyorsan ve bağlantı koptuğunda işlemin durmamasını istiyorsan screen veya tmux kullanmalısın.
# Yeni bir tmux oturumu baslat
tmux new -s yedekleme
# Uzun suren bir islem calistir
tar -czf /backup/sistem_yedek.tar.gz /etc /home /var
# Ctrl+B sonra D ile oturumdan "detach" ol (islem devam eder)
# SSH baglantisini kesebilirsin, baglant kopabilir... sorun degil
# Geri baglandiginda:
tmux attach -t yedekleme
# Tum oturumlari listele
tmux ls
Bu yöntem, özellikle büyük dosya transferleri, veritabanı yedekleme ve sistem güncellemelerinde hayat kurtarır.
SSH Güvenlik Denetimi ve Log Takibi
Sunucuna kimlerin bağlandığını ve başarısız denemeleri takip etmek önemlidir:
# Son basarili SSH girisleri
last | head -20
# Basarisiz giris denemeleri (Ubuntu/Debian)
sudo grep "Failed password" /var/log/auth.log | tail -20
# Basarisiz giris denemeleri (CentOS/RHEL)
sudo grep "Failed password" /var/log/secure | tail -20
# IP bazinda basarisiz denemelerı say
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head -10
# Aktif SSH baglantilari
sudo ss -tnp | grep :22
Çok fazla başarısız deneme görüyorsan, Fail2Ban kurmanı şiddetle öneririm:
# Fail2Ban kur
sudo apt install fail2ban # Debian/Ubuntu
sudo yum install fail2ban # CentOS/RHEL
# SSH icin temel konfigurasyonu kontrol et
sudo cat /etc/fail2ban/jail.conf | grep -A 10 "[sshd]"
# Banlanan IP'leri goster
sudo fail2ban-client status sshd
SSH Authorized Keys Yonetimi
Birden fazla kişinin sunucuya erişeceği ortamlarda authorized_keys dosyasını düzenli tutmak kritiktir:
# Authorized keys dosyasini goruntule
cat ~/.ssh/authorized_keys
# Her satir bir public key'dir
# Yorum ekleyerek kimlere ait oldugunu belirtebilirsin:
# ssh-ed25519 AAAAC3Nza... ahmet@ismakinesi
# ssh-ed25519 AAAAC3Nzb... mehmet@laptop
# Eski/kullanilmayan bir anahtari kaldirmak icin ilgili satiri sil
nano ~/.ssh/authorized_keys
# Ya da sed ile otomatik kaldir (parmak izi ile eslestirerek)
ssh-keygen -l -f ~/.ssh/authorized_keys # Parmak izlerini listele
Dosya izinleri yanlışsa SSH anahtar doğrulama çalışmaz:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
Sorun Giderme
SSH bağlantı sorunlarıyla karşılaştığında sistematik yaklaşman gerekir:
# Verbose mod ile baglan, nerede takildigini gor
ssh -vvv [email protected]
# Sunucunun SSH portunu dinleyip dinlemedigini kontrol et
nc -zv sunucu.com 22
# ya da
telnet sunucu.com 22
# SSH servisinin calisip calismadigini kontrol et (sunucu tarafinda)
sudo systemctl status sshd
# Firewall SSH portunu bloklayabilir
sudo ufw status
sudo iptables -L -n | grep 22
# Permission denied hatasi aliyorsan authorized_keys izinlerini kontrol et
ls -la ~/.ssh/
stat ~/.ssh/authorized_keys
Sık karşılaşılan sorunlar ve çözümleri:
- “Connection refused”: SSH servisi çalışmıyor ya da port yanlış
- “Permission denied (publickey)”: Anahtar izinleri hatalı veya anahtar yüklenmemiş
- “Host key verification failed”: Sunucunun anahtarı değişmiş (ya yeni kurulum ya da MITM!)
- “Too many authentication failures”: Agent’ta çok fazla anahtar var,
-iile belirtici kullan
Sonuç
SSH, sistem yöneticisinin günlük işini kolaylaştıran, güvenli ve esnek bir araçtır. Temel bağlantıdan anahtar yönetimine, port forwardingt’tan jump host kullanımına kadar ele aldığımız tüm konular, gerçek dünya senaryolarında sıklıkla ihtiyaç duyulan şeyler.
En önemli noktalara tekrar değineyim: Root girişini kapat, şifre ile kimlik doğrulamayı devre dışı bırak, güçlü anahtar algoritmalarını kullan (Ed25519 tercih et) ve log dosyalarını düzenli takip et. Config dosyasını kullanmaya başlarsan, hem zamandan tasarruf edersin hem de hata yapma olasılığını düşürürsün.
SSH’ı iyi öğrenmek, sysadmin kariyerinin temel taşlarından birini yerli yerine koymak demektir. Zaman ayırmaya değer.