Sunucu Yönetimi 10 dk okuma

Ubuntu Sunucu Güvenliği: SSH Anahtarı, Root Girişini Kapatma, UFW ve Fail2ban

Yeni Linux VDS'inizi ilk gün sıkılaştırın: SSH anahtarıyla giriş, root ve şifre girişini kapatma, UFW güvenlik duvarı ve Fail2ban. Ubuntu 24.04 ve Debian 13 için kendinizi kilitlemeden adım adım.

Ubuntu Sunucu Güvenliği: SSH Anahtarı, Root Girişini Kapatma, UFW ve Fail2ban
AnkSOFT
Yayıncı

Yeni bir Linux VDS açıldığı dakikadan itibaren internetteki otomatik tarayıcılar onu bulur ve SSH portuna şifre denemeye başlar. Bu denemeler kişisel değildir; tüm IP aralıkları sırayla taranır. Şifreniz güçlü olsa bile sunucuyu ilk gün sıkılaştırmak, ileride yaşanabilecek bir ele geçirilmenin önüne geçmenin en ucuz yoludur. Bu rehberde Ubuntu 24.04 ve Debian 13 bir VDS'te SSH anahtarıyla girişi, root girişini kapatmayı, UFW güvenlik duvarını ve Fail2ban'ı adım adım kuruyoruz. Toplam süre yaklaşık 20 dakikadır.

Komutlar Ubuntu 24.04 ve Debian 13 için yazıldı; Ubuntu 20.04'te de büyük ölçüde aynı çalışır. Örneklerdeki 203.0.113.10 adresini kendi VDS IP adresinizle, yonetici kullanıcı adını kendi seçtiğiniz adla değiştirin.


Başlamadan Önce: Kendinizi Kilitlememe Kuralları

Güvenlik ayarlarında en sık yaşanan sorun, saldırgan yerine sunucu sahibinin dışarıda kalmasıdır. Şu üç kurala uyarsanız bu neredeyse imkânsız hâle gelir:

  1. Açık SSH oturumunu kapatmayın. Her değişiklikten sonra ikinci bir terminal açıp yeni ayarla bağlanmayı deneyin. Yeni bağlantı çalışana kadar ilk oturum açık kalsın.
  2. Web konsolun yerini bilin. Müşteri panelinizde VDS hizmetinizin içindeki Konsol düğmesi sunucunun ekranını tarayıcıda açar. Konsol SSH'tan ve güvenlik duvarından bağımsızdır; bir ayarı yanlış yaparsanız oradan root şifrenizle girip geri alırsınız.
  3. Önce izin, sonra yasak. Güvenlik duvarını açmadan önce SSH portuna izin verin; şifre girişini kapatmadan önce anahtarla girişin çalıştığını görün.

Bağlantı aşamasında takılırsanız VDS'e Uzak Masaüstü ve SSH ile bağlanamıyorum rehberimiz en sık nedenleri sırayla anlatır.

Linux VDS güvenlik katmanları: panel güvenlik duvarı, UFW, Fail2ban ve SSH anahtarı


1. Adım: Sistemi Güncelleyin

İlk bağlantıyı root kullanıcısıyla yapın ve paketleri güncelleyin:

ssh root@203.0.113.10
apt update && apt full-upgrade -y

Güncelleme çekirdek (kernel) paketini yenilediyse reboot ile sunucuyu yeniden başlatın. Ardından güvenlik güncellemelerinin kendiliğinden kurulması için otomatik güncellemeyi açın:

apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

Açılan soruya Yes deyin. Ubuntu'da paket genellikle zaten kuruludur; Debian 13'te bu komutla kurulur. Otomatik güncelleme yalnız güvenlik yamalarını alır, büyük sürüm yükseltmesi yapmaz. Dağıtım dışı depolardan (PPA, NodeSource gibi) kurduğunuz PHP ya da Node.js sürümlerini ayrıca takip edin; yamalı sürümler ve kontrol komutları için PHP, Node.js ve Next.js güvenlik güncelleme rehberimize bakın.


2. Adım: Sudo Yetkili Bir Kullanıcı Oluşturun

Root ile doğrudan çalışmak, tek bir yanlış komutun bütün sistemi etkilemesi demektir. Kendinize günlük kullanım için bir kullanıcı açın ve ona yönetici (sudo) yetkisi verin:

adduser yonetici
usermod -aG sudo yonetici

adduser sizden şifre ister; bu şifre ileride sudo komutlarında sorulacak, güçlü bir şifre seçin. Diğer sorular (ad soyad, oda numarası) boş geçilebilir. Debian 13'te sudo paketi kurulu değilse önce apt install -y sudo çalıştırın.

Yetkiyi denemek için yeni kullanıcıya geçin:

su - yonetici
sudo whoami

Çıktı root ise kullanıcı hazırdır. exit ile root oturumuna dönün.


3. Adım: SSH Anahtarı Oluşturun ve Sunucuya Kopyalayın

SSH anahtarı iki parçadan oluşur: bilgisayarınızda kalan özel anahtar (kimseyle paylaşılmaz) ve sunucuya koyduğunuz açık anahtar. Şifre tahmin edilebilir; ed25519 anahtarı pratikte tahmin edilemez.

Windows 10 / 11'de

Windows'ta OpenSSH istemcisi yerleşik gelir. PowerShell'i açın (sunucuda değil, kendi bilgisayarınızda):

ssh-keygen -t ed25519 -C "dizustu-2026"

Dosya yolu sorusunda Enter'a basın, ardından anahtar için bir parola (passphrase) belirleyin. Parola, anahtar dosyanız çalınırsa ikinci bir kilit görevi görür.

Açık anahtarı sunucudaki yeni kullanıcıya kopyalayın:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh yonetici@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

Windows PowerShell'de ssh-keygen ile ed25519 anahtarı oluşturma ve sunucuya kopyalama

macOS ve Linux'ta

ssh-keygen -t ed25519 -C "dizustu-2026"
ssh-copy-id yonetici@203.0.113.10

Anahtarla girişi deneyin

Yeni bir terminal açın ve bağlanın:

ssh yonetici@203.0.113.10

Bu sefer kullanıcı şifresi değil, anahtar parolası sorulmalı (parola koymadıysanız doğrudan bağlanırsınız). Sorulan şey hâlâ yonetici@203.0.113.10's password: ise anahtar devreye girmemiştir; dosya izinlerini (~/.ssh 700, authorized_keys 600) ve kopyaladığınız satırın eksiksiz olduğunu kontrol edin. Anahtarla giriş çalışmadan bir sonraki adıma geçmeyin.

PuTTY kullanıyorsanız anahtarı PuTTYgen ile oluşturup .ppk biçiminde saklayabilirsiniz; Windows'un yerleşik ssh komutu ise ek programa gerek bırakmaz.


4. Adım: Root Girişini ve Şifreyle Girişi Kapatın

SSH ayarları /etc/ssh/sshd_config dosyasındadır. Ubuntu 24.04 ve Debian 13'te bu dosyanın başında Include /etc/ssh/sshd_config.d/*.conf satırı vardır ve bir ayar için ilk okunan değer geçerlidir. Bu yüzden ana dosyayı düzenlemek yerine, alfabetik olarak en önce okunacak ayrı bir dosya oluşturmak daha güvenlidir:

sudo nano /etc/ssh/sshd_config.d/00-guvenlik.conf

İçine şunları yazın:

PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
AllowUsers yonetici
  • PermitRootLogin no root kullanıcısıyla SSH girişini tamamen kapatır.
  • PasswordAuthentication no ve KbdInteractiveAuthentication no şifreyle girişi kapatır; yalnız anahtar kabul edilir.
  • AllowUsers yalnız listelediğiniz kullanıcıların SSH ile girmesine izin verir. Birden fazla kullanıcıyı boşlukla ayırın.

Dosyayı kaydedin (Ctrl+O, Enter, Ctrl+X), sözdizimini kontrol edin ve SSH servisini yeniden başlatın:

sudo sshd -t && sudo systemctl restart ssh
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication|kbdinteractive"

sshd -t hiçbir şey yazmıyorsa dosya hatasızdır. İkinci komutun çıktısında üç ayarın da no görünmesi gerekir.

sshd_config.d/00-guvenlik.conf dosyası ve sshd -T ile ayar doğrulama

Şimdi ilk oturumu kapatmadan yeni bir terminalden ssh yonetici@203.0.113.10 ile bağlanmayı deneyin. Ardından ssh root@203.0.113.10 denemesinin Permission denied (publickey) ile reddedildiğini görün. İkisi de beklendiği gibiyse eski oturumu kapatabilirsiniz.

Root girişini kapatmak paneldeki işlemleri etkilemez: web konsoldan root şifrenizle girmeye devam edebilirsiniz, çünkü konsol SSH üzerinden çalışmaz.

İsteğe bağlı: SSH portunu değiştirmek

SSH'ı 22 yerine örneğin 2222 numaralı porta taşımak log kalabalığını azaltır ama tek başına güvenlik önlemi değildir; anahtar girişi ve Fail2ban asıl korumadır. Port değiştirecekseniz sırayı bozmayın: önce yeni porta güvenlik duvarında izin verin, sonra 00-guvenlik.conf dosyasına Port 2222 satırını ekleyin. Ubuntu 24.04'te SSH soket etkinleştirmeyle çalıştığı için port değişikliğinden sonra şunları da çalıştırın:

sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Debian 13'te sudo systemctl restart ssh yeterlidir. Bağlanırken ssh -p 2222 yonetici@203.0.113.10 yazmanız gerekir.


5. Adım: UFW ile Güvenlik Duvarını Açın

UFW (Uncomplicated Firewall), Linux'un paket filtresini birkaç sade komutla yönetmenizi sağlar. Ubuntu'da genellikle kuruludur ama kapalıdır; Debian 13'te ayrıca kurulur:

sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 22/tcp
  • default deny incoming: açıkça izin vermediğiniz hiçbir gelen bağlantı kabul edilmez.
  • limit 22/tcp: SSH'a izin verir ama aynı IP'den 30 saniyede 6'dan fazla bağlantı denemesini keser. SSH portunu değiştirdiyseniz 22 yerine yeni portu yazın.

Web sunucusu çalıştıracaksanız 80 ve 443'ü de açın, ardından güvenlik duvarını etkinleştirin:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

ufw enable "mevcut SSH bağlantıları kesilebilir" uyarısı verir; SSH portuna izin verdiyseniz y ile onaylayın.

ufw status verbose çıktısı: varsayılan deny incoming, SSH limit, 80 ve 443 açık

Sık kullanılan UFW komutları:

İşlem Komut
Kuralları numaralı listele sudo ufw status numbered
Numaraya göre kural sil sudo ufw delete 3
Yalnız tek bir IP'ye port aç sudo ufw allow from 198.51.100.25 to any port 3306 proto tcp
UDP port aç (ör. oyun, VPN) sudo ufw allow 51820/udp
Güvenlik duvarını kapat sudo ufw disable

Veritabanı (3306), Redis (6379) gibi servisleri internete açmayın. Uzaktan erişmeniz gerekiyorsa yukarıdaki gibi yalnız kendi sabit IP adresinize izin verin ya da WireGuard VPN üzerinden bağlanın.

Paneldeki Güvenlik Duvarı ile birlikte kullanmak

AnkSOFT VDS'lerinde müşteri panelinde ayrıca bir Güvenlik Duvarı sekmesi vardır. Buradan gelen bağlantılar için kural ekler, "Web sunucusu", "Uzak erişim" gibi hazır profilleri seçersiniz; kurallar birkaç saniyede sunucunuza uygulanır. Panel kuralları sunucunun içinde UFW'den ayrı bir kural tablosu olarak çalışır. Bu yüzden:

  • Panelde güvenlik duvarını Engelle politikasıyla açtıysanız, bir portun dışarıdan erişilebilmesi için o portun hem panelde hem UFW'de izinli olması gerekir.
  • SSH portunu değiştirdiyseniz yeni portu panele de ekleyin; yoksa panel kuralı bağlantınızı keser.
  • İki katmanı da aynı anda yönetmek istemiyorsanız birini seçin: basit kurulumlar için panel, sunucuya özel ayrıntılı kurallar için UFW.

6. Adım: Fail2ban ile Kaba Kuvvet Denemelerini Engelleyin

Fail2ban, log kayıtlarını izler; kısa sürede çok sayıda hatalı giriş deneyen IP adresini belirli bir süre engeller. Şifre girişini kapatmış olsanız bile denemeleri erkenden kesmek logları temiz tutar ve sunucuyu gereksiz yükten kurtarır.

sudo apt install -y fail2ban

Debian 13'te SSH kayıtları klasik /var/log/auth.log dosyasına değil sistem günlüğüne (journald) yazılır. Bu yüzden Debian'da şu paketi de kurun:

sudo apt install -y python3-systemd

Ayarları ana dosyaya değil, güncellemede ezilmeyen jail.local dosyasına yazın:

sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1

[sshd]
enabled = true
port    = ssh
  • bantime: engelleme süresi. Tekrarlayan saldırganlar için bantime.increment = true satırını ekleyerek süreyi her seferinde katlayabilirsiniz.
  • ignoreip: asla engellenmeyecek adresler. Sabit bir ofis IP'niz varsa buraya ekleyin.
  • SSH portunu değiştirdiyseniz port = 2222 yazın.
  • Debian 13'te [sshd] bölümüne backend = systemd satırını da ekleyin.

Servisi başlatın ve durumunu kontrol edin:

sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

fail2ban-client status sshd çıktısı: engellenen IP adresleri

Çıktıda Total failed sayısı zamanla artıyor ve Banned IP list doluyorsa Fail2ban çalışıyordur. Birkaç saat sonra hâlâ Total failed: 0 görüyorsanız log kaynağı okunmuyor olabilir; Debian'da backend = systemd satırını ve python3-systemd paketini kontrol edin.

Kendi IP'nizi yanlışlıkla engellediyseniz başka bir bağlantıdan ya da web konsoldan şu komutla kaldırın:

sudo fail2ban-client set sshd unbanip 198.51.100.25

Kontrol Listesi: Her Şey Yerinde mi?

Kontrol Komut Beklenen
Root SSH kapalı sudo sshd -T | grep permitrootlogin permitrootlogin no
Şifre girişi kapalı sudo sshd -T | grep passwordauthentication passwordauthentication no
Güvenlik duvarı açık sudo ufw status Status: active
Fail2ban çalışıyor sudo fail2ban-client status sshd jail listeleniyor
Otomatik güncelleme systemctl is-enabled unattended-upgrades enabled
Dinleyen portlar sudo ss -tulpn yalnız bildiğiniz servisler

ss -tulpn çıktısında tanımadığınız bir servis internete açık dinliyorsa (0.0.0.0:PORT ya da [::]:PORT), ya kapatın ya da yalnız 127.0.0.1 üzerinde dinleyecek şekilde ayarlayın.


En Sık Yapılan Hatalar

  1. Anahtarı denemeden şifre girişini kapatmak. Anahtar kopyalanmamışsa sunucuya SSH ile giremezsiniz. Çözüm: web konsoldan root ile girip 00-guvenlik.conf dosyasını silin, systemctl restart ssh çalıştırın.
  2. ufw enable komutunu SSH izni vermeden çalıştırmak. Bağlantınız anında kesilir. Web konsoldan ufw allow 22/tcp ya da ufw disable ile düzeltin.
  3. Ayarı ana sshd_config dosyasına yazıp etkisiz kalması. sshd_config.d altındaki başka bir dosya aynı ayarı daha önce tanımlıyorsa sizinki uygulanmaz. Dosyanızın adını 00- ile başlatın ve sshd -T ile kontrol edin.
  4. Port değiştirip panel güvenlik duvarına eklemeyi unutmak. UFW'de açık olsa bile panel kuralı bağlantıyı engeller.
  5. Özel anahtarı paylaşmak ya da sunucuya koymak. id_ed25519 (uzantısız) dosyası yalnız sizin bilgisayarınızda kalır. Sunucuya giden dosya .pub uzantılıdır.
  6. Debian'da Fail2ban'ın hiçbir şey engellememesi. backend = systemd eksiktir; Total failed sayısı hep sıfır kalır.

Sonraki Adımlar

Sunucunuz artık temel saldırılara karşı korunuyor. Bundan sonra ne kuracağınıza göre şu rehberlerle devam edebilirsiniz:

Ubuntu, Debian ve AlmaLinux kurulabilen, panelden güvenlik duvarı yönetimi ve web konsol erişimi sunan Türkiye lokasyonlu sanal sunucular için VDS paketlerimizi inceleyin. Bir adımda takılırsanız destek talebi açın; talebinize VDS IP adresinizi ve gördüğünüz hata mesajını ekleyin, şifrenizi ya da özel anahtarınızı yazmayın.


Kaynaklar

Sıkça Sorulan Sorular

Root girişini kapatırsam panelden sunucuma erişebilir miyim?

Evet. Root SSH girişini kapatmak yalnız SSH bağlantılarını etkiler. Müşteri panelindeki web konsol SSH'tan bağımsız çalışır; root şifrenizle konsoldan girmeye devam edebilirsiniz.

SSH anahtarımı kaybedersem ne yapmalıyım?

Panelden web konsolu açıp root şifrenizle girin. Yeni açık anahtarınızı kullanıcınızın ~/.ssh/authorized_keys dosyasına ekleyin ya da /etc/ssh/sshd_config.d/00-guvenlik.conf dosyasını geçici olarak kaldırıp SSH servisini yeniden başlatın.

UFW ile paneldeki güvenlik duvarı arasındaki fark nedir?

İkisi de gelen bağlantıları süzer. Panel güvenlik duvarı kuralları müşteri panelinden yönetilir ve sunucuya uygulanır; UFW ise sunucunun içinden komutla yönetilir. İkisi birlikte açıksa bir portun erişilebilir olması için iki tarafta da izinli olması gerekir.

SSH portunu değiştirmek gerekli mi?

Zorunlu değildir. Port değiştirmek log kalabalığını azaltır ama asıl koruma anahtarla giriş ve Fail2ban'dır. Değiştirirseniz yeni porta önce UFW'de ve panel güvenlik duvarında izin verin, ardından SSH ayarını değiştirin.

Fail2ban kendi IP adresimi engellerse ne yapmalıyım?

Başka bir bağlantıdan ya da panelin web konsolundan sudo fail2ban-client set sshd unbanip IP_ADRESINIZ komutuyla engeli kaldırın. Sabit IP adresinizi jail.local dosyasındaki ignoreip satırına ekleyerek tekrarını önleyin.

TR| EN