Sunucularınıza SSH ile bağlanıyorsunuz, bu zaten bildiğimiz bir gerçek. Ama o SSH bağlantısının arkasında ne kadar güvenli bir yapı kurduğunuz, sistemlerinizin başına iş açıp açmayacağını belirliyor. Rocky Linux, enterprise ortamlarda giderek daha fazla tercih edilir hale geldi ve beraberinde SSH güvenliğini doğru yapılandırmanın önemi de arttı. Bu yazıda, Rocky Linux üzerinde SSH servisini sertleştirmek için yapmanız gereken her şeyi adım adım ele alacağız.
Neden SSH Sertleştirmesi Gerekiyor?
Açık internete bakan herhangi bir sunucunun log dosyalarına bakın. Saatte yüzlerce, hatta binlerce başarısız SSH giriş denemesiyle karşılaşmanız çok olası. Bu denemeler genellikle botnet’ler tarafından yapılıyor ve hedefleri basit: varsayılan kullanıcı adı/şifre kombinasyonlarını denemek, bilinen zafiyetleri istismar etmek ve açık kapı bulmak.
Rocky Linux kurulumunun ardından SSH varsayılan olarak çalışır durumda geliyor ve pek çok ayarı “güvenli ama kullanışlı” dengesini bozmadan yapılandırılmış şekilde. Bu “yeterince güvenli” yaklaşım production ortamlar için yeterli değil.
# Mevcut başarısız giriş denemelerini görmek için
sudo grep "Failed password" /var/log/secure | tail -20
# SSH servisinin durumunu kontrol et
sudo systemctl status sshd
Temel Yapılandırma Dosyasını Anlamak
SSH’ın ana yapılandırma dosyası /etc/ssh/sshd_config dosyasıdır. Değişiklik yapmadan önce mutlaka yedek alın. Bu tavsiyeyi görmezden gelip sonra pişman olan sistem yöneticisi sayısı az değil.
# Önce yedek al
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# Dosyayı düzenle
sudo nano /etc/ssh/sshd_config
# ya da vim tercih edenler için
sudo vim /etc/ssh/sshd_config
Yapılandırma dosyasını düzenledikten sonra sözdizimi kontrolü yapmayı alışkanlık haline getirin. Yanlış bir satır yüzünden SSH servisi başlamayabilir ve kendinizi sunucudan kilitleyebilirsiniz.
# Syntax kontrolü
sudo sshd -t
# Daha detaylı çıktı için
sudo sshd -T | grep -i port
Port Değiştirme ve Temel Erişim Kısıtlamaları
Varsayılan 22. portu değiştirmek tek başına bir güvenlik önlemi değil, ama otomatik tarama araçlarının büyük çoğunluğunu uzak tutuyor. Gerçek saldırganlar port taraması yapabilir, ama basit botnet trafiğini önemli ölçüde azaltıyor.
/etc/ssh/sshd_config dosyasında şu değişiklikleri yapın:
# Port numarasını değiştir (1024-65535 arası bir port seç)
Port 2299
# IPv4 ile sınırla (eğer IPv6 kullanmıyorsanız)
AddressFamily inet
# Root girişini tamamen kapat
PermitRootLogin no
# Şifre ile girişi kapat, sadece anahtar kullan
PasswordAuthentication no
# Boş şifrelere izin verme
PermitEmptyPasswords no
# X11 yönlendirmesini kapat (masaüstü uygulaması çalıştırmıyorsanız)
X11Forwarding no
# Maksimum kimlik doğrulama denemesi
MaxAuthTries 3
# Maksimum eş zamanlı oturum
MaxSessions 5
# Bağlantı zaman aşımı
LoginGraceTime 30
Port değişikliğinden sonra SELinux ve Firewalld tarafında da gerekli düzenlemeleri yapmanız gerekiyor. Rocky Linux varsayılan olarak SELinux’u enforcing modda çalıştırıyor.
# SELinux için yeni portu kaydet
sudo semanage port -a -t ssh_port_t -p tcp 2299
# Firewalld'da yeni portu aç
sudo firewall-cmd --permanent --add-port=2299/tcp
# Eski 22. portu kapat (dikkatli ol, mevcut bağlantın üzerinden yap)
sudo firewall-cmd --permanent --remove-service=ssh
# Kuralları yenile
sudo firewall-cmd --reload
# SSHD'yi yeniden başlat
sudo systemctl restart sshd
Bu adımı yaparken mevcut SSH oturumunuzu kapatmayın. Yeni bir terminal açıp yeni porttan bağlanabildiğinizi test ettikten sonra eski oturumu kapatın.
SSH Anahtar Tabanlı Kimlik Doğrulama
Şifre tabanlı kimlik doğrulamayı kapatıp anahtar tabanlı sisteme geçmek, SSH güvenliğinin en kritik adımlarından biri. Şifreler brute force saldırılarına karşı savunmasız, anahtarlar ise bu tür saldırıları matematiksel olarak imkânsız hale getiriyor.
İstemci tarafında (kendi bilgisayarınızda) anahtar çifti oluşturun:
# ED25519 algoritması ile anahtar oluştur (RSA'dan daha güvenli ve hızlı)
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/rocky_server_key
# Ya da RSA kullanmak istiyorsanız minimum 4096 bit
ssh-keygen -t rsa -b 4096 -C "[email protected]" -f ~/.ssh/rocky_server_key
# Oluşturulan anahtarları kontrol et
ls -la ~/.ssh/
Anahtar passphrase kullanmanızı kesinlikle tavsiye ederim. “Her seferinde şifre giriyorum, can sıkıcı” diyebilirsiniz, ama ssh-agent ile bu sorunu çözebilirsiniz.
Sunucu tarafında genel anahtarı ekleyin:
# authorized_keys dosyasını oluştur
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# Public key'i sunucuya kopyala (istemciden çalıştırın)
ssh-copy-id -i ~/.ssh/rocky_server_key.pub -p 2299 kullanici@sunucu_ip
# Ya da manuel olarak
cat ~/.ssh/rocky_server_key.pub >> ~/.ssh/authorized_keys
sshd_config dosyasında anahtar tabanlı kimlik doğrulamanın etkin olduğunu kontrol edin:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
Kullanıcı ve Grup Tabanlı Erişim Kontrolü
Her kullanıcının SSH erişimine ihtiyacı yok. AllowUsers ve AllowGroups direktifleriyle erişimi kısıtlayın.
/etc/ssh/sshd_config dosyasına ekleyin:
# Sadece belirli kullanıcılara izin ver
AllowUsers ahmet mehmet deploy_user
# Ya da grup bazlı kısıtlama (genellikle daha yönetilebilir)
AllowGroups sshusers wheel
# Belirli kullanıcıları veya grupları engelle
DenyUsers testuser eski_calisan
DenyGroups contractors
SSH erişimine izin verilecek grubu oluşturun ve kullanıcıları bu gruba ekleyin:
# SSH kullanıcıları grubu oluştur
sudo groupadd sshusers
# Kullanıcıları gruba ekle
sudo usermod -aG sshusers ahmet
sudo usermod -aG sshusers mehmet
# Grup üyeliklerini kontrol et
getent group sshusers
Fail2Ban ile Brute Force Koruması
Yapılandırma ne kadar sağlam olursa olsun, başarısız giriş denemelerini aktif olarak izleyip engellemek için Fail2Ban kullanmalısınız. Rocky Linux’ta EPEL reposundan kurabilirsiniz.
# EPEL reposunu ekle
sudo dnf install -y epel-release
# Fail2Ban'i kur
sudo dnf install -y fail2ban
# Servisi başlat ve etkinleştir
sudo systemctl enable --now fail2ban
Fail2Ban yapılandırması için yerel override dosyası oluşturun. Ana .conf dosyalarını değiştirmek yerine her zaman .local dosyaları kullanın, yoksa güncellemelerde ayarlarınız gidebilir.
sudo nano /etc/fail2ban/jail.local
Dosya içeriği:
[DEFAULT]
# Engelleme süresi (saniye cinsinden, -1 kalıcı engel)
bantime = 3600
# Bu süre içinde
findtime = 600
# Bu kadar başarısız deneme olursa engelle
maxretry = 5
# Kendi IP'nizi whitelist'e al
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
[sshd]
enabled = true
port = 2299
filter = sshd
logpath = /var/log/secure
maxretry = 3
bantime = 7200
# Fail2Ban'i yeniden başlat
sudo systemctl restart fail2ban
# Durumu kontrol et
sudo fail2ban-client status sshd
# Engellenen IP'leri gör
sudo fail2ban-client status sshd | grep "Banned IP"
# Bir IP'yi unban et (gerekirse)
sudo fail2ban-client set sshd unbanip 1.2.3.4
SSH Banner ve Uyarı Mesajları
Hukuki açıdan önemli olan ama çoğu zaman atlanan bir detay: sunucuya bağlanmadan önce bir uyarı mesajı göstermek. Bu mesaj hem yetkisiz kullanıcıları caydırır hem de olası hukuki süreçlerde kanıt niteliği taşır.
# Banner dosyası oluştur
sudo nano /etc/ssh/banner.txt
Banner içeriği:
*******************************************************************
UYARI: Bu sisteme yetkisiz erisim kesinlikle yasaktir.
Tum baglanti ve islemler kayit altina alinmaktadir.
Yetkisiz erisim tespitinde yasal islem baslatilacaktir.
*******************************************************************
sshd_config dosyasına ekleyin:
Banner /etc/ssh/banner.txt
Gelişmiş SSH Sertleştirme Ayarları
Temel ayarların ötesine geçmek isteyenler için daha ileri düzey yapılandırma seçenekleri:
/etc/ssh/sshd_config dosyasına şunları ekleyin:
# Güçlü şifreleme algoritmalarını zorla
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
# Güçlü MAC algoritmaları
MACs [email protected],[email protected],[email protected]
# Güvenli anahtar değişimi
KexAlgorithms curve25519-sha256,[email protected],diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
# TCP keepalive ayarları (ghost session'ları temizle)
ClientAliveInterval 300
ClientAliveCountMax 2
TCPKeepAlive no
# DNS lookup'ı kapat (daha hızlı bağlantı, log'da IP görünür)
UseDNS no
# SSH agent forwarding'i kapat (gerekmedikçe)
AllowAgentForwarding no
# TCP forwarding'i kapat
AllowTcpForwarding no
# Oturum ortam değişkenlerini kabul etme
PermitUserEnvironment no
# Compression'ı kapat
Compression no
# Sisteme özgü mesaj gösterme
PrintMotd no
# Son giriş bilgisini göster
PrintLastLog yes
Kullandığınız OpenSSH versiyonuna göre bazı parametreler desteklenmeyebilir. Her değişiklikten sonra sshd -t ile syntax kontrolü yapın.
SELinux ve Firewalld ile Katmanlı Güvenlik
Rocky Linux’ta güvenlik sadece SSH ayarlarından ibaret değil. SELinux ve Firewalld katmanlarını da doğru yapılandırmak gerekiyor.
# SELinux durumunu kontrol et
getenforce
sestatus
# SSH için SELinux politikalarını gör
sudo semanage port -l | grep ssh
# SELinux audit loglarını izle
sudo ausearch -c sshd --raw | audit2allow -M mysshpolicy
# Firewalld kurallarını listele
sudo firewall-cmd --list-all
# Belirli bir IP'ye SSH erişimine izin ver (rich rule)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="2299" protocol="tcp" accept'
# Diğer IP'lerden yeni SSH bağlantılarını rate limit'le
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" service name="ssh" reject'
sudo firewall-cmd --reload
SSH İki Faktörlü Kimlik Doğrulama
Anahtar tabanlı kimlik doğrulamaya ek olarak TOTP (Time-based One-Time Password) ile iki faktörlü doğrulama ekleyebilirsiniz.
# Google Authenticator PAM modülünü kur
sudo dnf install -y google-authenticator
# Kullanıcı için yapılandır (normal kullanıcı olarak çalıştır)
google-authenticator
# PAM yapılandırması
sudo nano /etc/pam.d/sshd
Dosyanın başına ekleyin:
auth required pam_google_authenticator.so
sshd_config dosyasında şunları ayarlayın:
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
Bu yapılandırmayla hem SSH anahtarı hem de TOTP kodu gerekecek. Bu kombinasyon son derece güçlü bir kimlik doğrulama katmanı sağlıyor.
SSH Oturum Kayıtları ve Denetim
Kimin, ne zaman, nereden bağlandığını takip etmek sistem yönetiminin temel gerekliliklerinden biri.
# Son başarılı girişleri gör
last -n 20
# Başarısız giriş denemelerini gör
lastb -n 20
# Detaylı SSH logları
sudo journalctl -u sshd -n 50 --no-pager
# Belirli bir kullanıcının girişlerini filtrele
sudo grep "Accepted" /var/log/secure | grep "ahmet"
# Farklı IP'lerden gelen giriş denemelerini say
sudo grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -rn | head -20
Daha kapsamlı denetim için auditd servisini kullanabilirsiniz:
# Auditd'yi etkinleştir
sudo systemctl enable --now auditd
# SSH ile ilgili audit kuralı ekle
sudo auditctl -w /etc/ssh/sshd_config -p wa -k ssh_config_changes
# Audit loglarını ara
sudo ausearch -k ssh_config_changes
Yapılandırmayı Test Etme ve Doğrulama
Tüm değişiklikleri yaptıktan sonra güvenlik durumunu test etmek önemli.
# SSH yapılandırmasının genel özeti
sudo sshd -T
# Aktif SSH bağlantılarını gör
ss -tnp | grep sshd
# SSH servisinin dinlediği portu kontrol et
sudo ss -tlnp | grep ssh
# Nmap ile dışarıdan port taraması (farklı bir makineden)
nmap -sV -p 2299 sunucu_ip
# ssh-audit aracı ile güvenlik denetimi (pip ile kur)
pip3 install ssh-audit
ssh-audit sunucu_ip:2299
OpenSSH’ın son sürümlerinde gelen sshd -T komutu tüm aktif yapılandırmayı gösteriyor. Bu çıktıyı inceleyerek beklenmeyen ayarları tespit edebilirsiniz.
Chroot ile SFTP Kullanıcılarını İzole Etme
Sadece dosya transferi yapacak kullanıcılar varsa onları chroot ortamında izole etmek iyi bir uygulama.
# SFTP grubu oluştur
sudo groupadd sftpusers
# SFTP kullanıcısı oluştur
sudo useradd -m -s /sbin/nologin -G sftpusers sftp_musteri1
# Dizin sahipliğini ayarla (chroot için root sahipli olmalı)
sudo chown root:root /home/sftp_musteri1
sudo chmod 755 /home/sftp_musteri1
# Upload dizini oluştur
sudo mkdir /home/sftp_musteri1/upload
sudo chown sftp_musteri1:sftp_musteri1 /home/sftp_musteri1/upload
sshd_config dosyasına ekleyin:
# SFTP subsystem
Subsystem sftp internal-sftp
# SFTP kullanıcıları için chroot yapılandırması
Match Group sftpusers
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication yes
Bu yapılandırmayla SFTP kullanıcıları kendi home dizinlerinin dışına çıkamıyor ve sadece dosya transferi yapabiliyor.
Acil Durum Erişim Planı
Tüm bu sertleştirme adımlarını uygularken kendinizi sunucudan kitlememeye dikkat edin. Bir acil durum planı şart.
- Konsol erişimi: Bulut sağlayıcısının web konsolu veya fiziksel KVM erişimi her zaman hazırda olsun
- Yedek anahtar: Farklı bir lokasyonda saklanan yedek SSH anahtarı oluşturun
- Recovery user: Acil kullanım için ayrı bir kullanıcı ve anahtar hazırlayın
- Değişiklik sırası: Önce yeni port’tan bağlanabildiğinizi test edin, sonra eski porttan bağlantıyı kesin
- Bakım penceresi: Kritik değişiklikleri mesai saatleri içinde yapın, destek erişilebilir olsun
# Değişikliklerden önce mevcut bağlantıları gör
who
w
# Test için geçici bir terminal açık bırak
# Yeni terminalden bağlanmayı test et, sonra servisi yeniden başlat
sudo systemctl reload sshd
Sonuç
SSH sertleştirmesi tek seferlik bir işlem değil, süregelen bir süreç. Rocky Linux’ta bu yazıda anlattıklarımı özetlersek: varsayılan portu değiştirin, root girişini kapatın, şifre yerine anahtar kullanın, Fail2Ban ile brute force saldırılarını engelleyin, SELinux ve Firewalld katmanlarını aktif tutun ve düzenli log analizi yapın.
Hangi önlemin ne zaman işe yaradığını görmek için log dosyalarını düzenli kontrol edin. grep "Failed password" /var/log/secure | wc -l çıktısı uyguladığınız önlemlerden sonra dramatik biçimde azalıyorsa doğru yoldasınız demektir.
Gerçek dünya senaryosunda hiçbir güvenlik önlemi yüzde yüz garanti vermiyor, ama savunma derinliği prensibiyle katman katman güvenlik oluşturmak saldırganların işini son derece zorlaştırıyor. Zayıf noktaların farkında olmak, düzeltmek için gerekli adımları atmak ve sistemi düzenli olarak denetlemek iyi bir sistem yöneticisinin vazgeçilmez alışkanlıkları.
Son olarak, bu değişiklikleri test ortamında uygulayıp test ettikten sonra production’a alın. Gece 02:00’de production sunucusunda SSH bağlantısını kaybetmek istediğiniz son şey.