SSH Port Değiştirme ve İki Faktörlü Doğrulama ile Sunucu Güvenliğini Artırma
Sunucunuza SSH ile bağlandığınızda, arka planda binlerce bot aynı anda 22. porta knock atıyor. Honeypot loglarına baktığınızda bu gerçeği net görürsünüz: varsayılan SSH portu olan 22, internetin en çok tarama yapılan portlarından biridir. Sadece port değiştirmek “security through obscurity” olarak eleştirilse de, iki faktörlü doğrulama ile birleştiğinde ciddi bir güvenlik katmanı oluşturur. Bu yazıda bu iki önlemi birlikte, production ortamında nasıl uygulayacağınızı adım adım göstereceğim.
Neden Sadece Güçlü Şifre Yetmez?
Klasik sysadmin yaklaşımı “güçlü şifre koydum, tamam” şeklindedir. Ama şunu düşünün: bir VPS açtınız, 5 dakika sonra auth loglarına bakın.
sudo tail -f /var/log/auth.log | grep "Failed password"
Büyük ihtimalle şöyle bir manzarayla karşılaşırsınız:
Jan 15 03:22:11 server sshd[1234]: Failed password for root from 185.234.219.xx port 54321 ssh2
Jan 15 03:22:13 server sshd[1235]: Failed password for admin from 185.234.219.xx port 54322 ssh2
Jan 15 03:22:15 server sshd[1236]: Failed password for ubuntu from 45.33.32.xx port 11234 ssh2
Bu botlar 7/24 çalışıyor, milyonlarca kombinasyon deniyor ve bir gün şanslı olabiliyorlar. Hem port değişikliği hem de 2FA uyguladığınızda bu saldırı yüzeyi dramatik biçimde küçülür.
SSH Port Değiştirme
Mevcut Durumu Kontrol Etme
Önce neyin çalıştığına bakalım:
sudo ss -tlnp | grep sshd
sudo systemctl status sshd
Hangi portta dinlediğini ve servisin aktif olup olmadığını teyit edin. Bu adımı atlamak, kendinizi dışarıda kilitlemenin en kolay yoludur.
sshd_config Dosyasını Düzenleme
SSH konfigürasyonu /etc/ssh/sshd_config dosyasında bulunur. Düzenlemeden önce mutlaka yedek alın:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config
Dosya içinde şu satırı bulun:
#Port 22
Yorumu kaldırıp port numarasını değiştirin. Ben genellikle 1024-65535 arasında, yaygın servislerle çakışmayan bir port seçiyorum. Örnek olarak 2222 kullanacağım ama siz farklı bir şey seçin, 2222 de artık taranıyor:
Port 2222
Bu aşamada bazı ek güvenlik ayarlarını da yapmanızı öneririm. Aynı dosyada şu satırları kontrol edin ve düzenleyin:
Port 2222
PermitRootLogin no
PasswordAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
LoginGraceTime 30
PasswordAuthentication yes şimdilik açık bırakıyoruz çünkü 2FA kurulumunu tamamladıktan sonra bunu değiştireceğiz.
Firewall Kurallarını Güncelleme
Bu adımı SSH servisini yeniden başlatmadan ÖNCE yapın. Aksi halde kendinizi sunucudan kilitlersiniz.
UFW kullanıyorsanız:
sudo ufw allow 2222/tcp
sudo ufw status
firewalld kullanıyorsanız (CentOS/RHEL/Rocky):
sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
iptables doğrudan kullanıyorsanız:
sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
SELinux Varsa Port İzni
CentOS, RHEL veya Rocky Linux kullanıyorsanız SELinux’un da yeni portu tanıması gerekir:
sudo semanage port -a -t ssh_port_t -p tcp 2222
sudo semanage port -l | grep ssh
Bu adımı atladığınızda SSH servisi yeni portta başlamaz ve logda “Permission denied” hatası görürsünüz.
SSH Servisini Yeniden Başlatma ve Test
Her şey hazır olduğunda servisi yeniden başlatın:
sudo systemctl restart sshd
sudo ss -tlnp | grep sshd
Mevcut bağlantınızı KAPATMAYIN. Yeni bir terminal açın ve yeni portla bağlanmayı test edin:
ssh -p 2222 kullanici@sunucu_ip
Bağlantı başarılıysa eski terminaldeki oturumu kapatabilirsiniz. Başarısız olursa eski oturumdan sorun giderme yapabilirsiniz.
Google Authenticator ile 2FA Kurulumu
İki faktörlü doğrulama için en yaygın yöntem TOTP (Time-based One-Time Password) protokolüdür. Google Authenticator, Authy veya herhangi bir TOTP uygulamasıyla çalışır.
Gerekli Paketi Kurma
Ubuntu/Debian:
sudo apt update
sudo apt install libpam-google-authenticator
CentOS/RHEL/Rocky:
sudo dnf install epel-release
sudo dnf install google-authenticator
Kullanıcı Bazında 2FA Yapılandırması
Bu adım her kullanıcı için ayrı ayrı yapılmalıdır. Hangi kullanıcıyla SSH’a bağlanacaksanız o kullanıcıyla çalıştırın:
google-authenticator
Komut size bir dizi soru soracak. Önerilen cevaplar şunlardır:
- “Do you want authentication tokens to be time-based?” –
ydeyin. TOTP için gerekli. - “Do you want me to update your ~/.google_authenticator file?” –
ydeyin. - “Do you want to disallow multiple uses of the same authentication token?” –
ydeyin. Replay saldırılarına karşı koruma sağlar. - “By default, tokens are good for 30 seconds…” –
ndeyin. Zaman senkronizasyonu için 1 periyot yeterli. - “Do you want to enable rate-limiting?” –
ydeyin. Brute force’a karşı koruma.
Bu süreçte bir QR kodu ve yedek kodlar göreceksiniz. Yedek kodları mutlaka kaydedin, telefonunuzu kaybederseniz bu kodlar tek çıkış yolunuzdur.
QR kodu telefonunuzdaki Google Authenticator, Authy veya FreeOTP uygulamasıyla tarayın.
PAM Konfigürasyonu
PAM (Pluggable Authentication Modules) SSH kimlik doğrulamasını yönetir. /etc/pam.d/sshd dosyasını düzenleyin:
sudo nano /etc/pam.d/sshd
Dosyanın en üstüne şu satırı ekleyin:
auth required pam_google_authenticator.so nullok
nullok parametresi, henüz 2FA kurulmamış kullanıcıların sisteme girebilmesini sağlar. Tüm kullanıcılar kurulumu tamamladıktan sonra bunu kaldırabilirsiniz.
Ubuntu/Debian’da ayrıca şu satırı yorum satırına alın veya silin:
# @include common-auth
Bu satır aktif kalırsa çift şifre sorulur, kullanıcılar kafaları karışır.
sshd_config’i 2FA için Güncelleme
Tekrar /etc/ssh/sshd_config dosyasını açın ve şu satırları güncelleyin:
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
UsePAM yes
AuthenticationMethods satırı çok önemli. Burada şunu söylüyoruz: “önce SSH key ile doğrula, sonra 2FA kodunu sor.” Eğer hem SSH key hem 2FA istiyorsanız bu yapı idealdir.
Sadece şifre + 2FA istiyorsanız:
AuthenticationMethods keyboard-interactive
SSH key + 2FA istiyorsanız (önerilen):
AuthenticationMethods publickey,keyboard-interactive
Değişikliklerden sonra servisi yeniden başlatın:
sudo systemctl restart sshd
Gerçek Dünya Senaryosu: CI/CD Pipeline Sorunu
Burada sık karşılaşılan bir problem var. GitHub Actions, Jenkins veya GitLab CI gibi sistemler otomatik SSH bağlantısı yapar. 2FA devreye girince bu bağlantılar kırılır.
Çözüm: Servis hesapları için 2FA’yı devre dışı bırakmak ve bu hesapları sadece SSH key ile kısıtlamak.
/etc/ssh/sshd_config dosyasına şunu ekleyin:
Match User deploy
AuthenticationMethods publickey
PasswordAuthentication no
Match User gitlabci
AuthenticationMethods publickey
PasswordAuthentication no
Bu sayede deploy ve gitlabci kullanıcıları sadece SSH key ile bağlanır, 2FA sorulmaz. Normal kullanıcılar ise tam güvenlik protokolünden geçer.
SSH Key + 2FA: En Güçlü Kombinasyon
SSH key’i olmayan kullanıcılar için bile 2FA büyük fark yaratır. Ama gerçekten paranoyak olmak istiyorsanız üçlü kombinasyona geçin: SSH key + şifre + 2FA.
Önce SSH key oluşturun (istemci tarafında):
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/sunucu_key
Public key’i sunucuya kopyalayın:
ssh-copy-id -i ~/.ssh/sunucu_key.pub -p 2222 kullanici@sunucu_ip
Ya da manuel olarak:
cat ~/.ssh/sunucu_key.pub | ssh -p 2222 kullanici@sunucu_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
Artık bağlantı şu akışta ilerler:
- SSH key doğrulaması (sahip olduğun şey)
- Şifre veya 2FA kodu (bildiğin şey)
Bu iki faktörün ikisi de ele geçirilmeden kimse sisteme giremez.
Bağlantı Testleri ve Sorun Giderme
Yeni konfigürasyonu test ederken verbose mod kullanın, nerede takıldığını görmek çok kolaylaşır:
ssh -vvv -p 2222 -i ~/.ssh/sunucu_key kullanici@sunucu_ip
Sunucu tarafında anlık logları izlemek için:
sudo journalctl -u sshd -f
Sık karşılaşılan sorunlar:
- “Permission denied (publickey)”:
~/.ssh/authorized_keysdosyasının izinleri 600,.sshdizininin 700 olmalı. - 2FA kodu kabul edilmiyor: Sunucu saatinin senkronize olduğunu kontrol edin.
timedatectl statusçalıştırın, NTP aktif değilsesudo timedatectl set-ntp truedeyin. - “Bad owner or permissions on /home/user/.google_authenticator”: Dosya izinlerini düzeltin:
chmod 600 ~/.google_authenticator - SELinux hatası:
sudo ausearch -m avc -ts recent | audit2allowile hangi izin eksik görebilirsiniz.
Fail2Ban ile Ek Koruma Katmanı
Port değişikliği ve 2FA yetmez diyorsanız Fail2Ban da devreye alın. Belirli sayıda başarısız denemeden sonra IP’yi otomatik bloklar.
sudo apt install fail2ban
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[sshd] bölümünü güncelleyin:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
Bu konfigürasyon: 10 dakika içinde 3 başarısız denemede IP’yi 1 saat bloklar.
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo fail2ban-client status sshd
SSH Client Tarafı Konfigürasyonu
Sunucu hazır, ama her seferinde ssh -p 2222 -i ~/.ssh/sunucu_key kullanici@sunucu_ip yazmak sinir bozucu. ~/.ssh/config dosyasıyla bunu çözün:
Host sunucum
HostName sunucu_ip
User kullanici
Port 2222
IdentityFile ~/.ssh/sunucu_key
ServerAliveInterval 60
ServerAliveCountMax 3
Artık sadece ssh sunucum yazmanız yeterli. Hem port hem key otomatik kullanılır.
Sonuç
SSH port değişikliği ve iki faktörlü doğrulama, birbirini tamamlayan iki güvenlik katmanıdır. Port değişikliği otomatik taramaların büyük çoğunluğunu eler, 2FA ise gerçek anlamda hesap güvenliği sağlar. Bu iki önlemi uyguladıktan sonra auth loglarınıza bakın, gürültünün dramatik biçimde azaldığını göreceksiniz.
Production ortamında dikkat etmeniz gereken kritik noktaları şöyle özetleyebilirim: Değişiklik yaparken mevcut SSH oturumunuzu kapatmayın, her adımdan sonra yeni terminal ile test edin, yedek 2FA kodlarını güvenli bir yere saklayın ve CI/CD gibi otomatik sistemler için istisna kurallarını önceden tanımlayın.
Bu kurulumu tamamladıktan sonra bir de SSH key rotation politikası oluşturmanızı öneririm. Anahtarlar da belirli aralıklarla yenilenmelidir. Güvenlik tek seferlik bir iş değil, süregelen bir süreçtir.
