Ubuntu Sunucu İlk Kurulum ve Güvenlik Rehberi (SSH, UFW)
Yeni bir Ubuntu sunucu teslim aldığınızda yapmanız gereken ilk iş, root ile parola girişini kapatıp SSH anahtarlı bir sudo kullanıcısına geçmek, ardından UFW güvenlik duvarı, fail2ban ve otomatik güvenlik güncellemelerini açmaktır. Bu rehberde Ubuntu 22.04 ve 24.04 LTS için sırasıyla uygulayabileceğiniz komutları, her adımın doğrulamasını ve sahada en sık görülen hataları bulacaksınız.
Örneklerde dokümantasyon amaçlı 203.0.113.10 sunucu IP'si, 192.0.2.50 ise yönetim IP'si olarak kullanılmıştır. Kendi değerlerinizle değiştirin.
1. Sistemi güncelleyin
İlk bağlantıyı genelde root ile yaparsınız. Önce paket listesini ve yüklü paketleri güncelleyin:
ssh root@203.0.113.10
apt update && apt full-upgrade -y
Kernel güncellendiyse reboot ile yeniden başlatın. Ardından saat dilimini ayarlayın; log korelasyonu için zaman doğru olmalıdır:
timedatectl set-timezone Europe/Istanbul
timedatectl status
2. Sudo yetkili kullanıcı oluşturun
Günlük işlerde root kullanmak hem riskli hem de denetlenemezdir. Yönetim için ayrı bir kullanıcı açın:
adduser deploy
usermod -aG sudo deploy
id deploy
id çıktısında sudo grubunu görmelisiniz. Kullanıcı adı olarak admin veya ubuntu gibi tahmin edilebilir isimlerden kaçınmak, otomatik tarayıcıların işini biraz zorlaştırır.
3. SSH anahtarı üretin ve sunucuya kopyalayın
Anahtarı kendi bilgisayarınızda üretin, sunucuda değil. Ed25519 hem kısa hem güçlüdür:
ssh-keygen -t ed25519 -a 100 -C "deploy@sunucu01"
ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@203.0.113.10
Windows'ta OpenSSH istemcisi PowerShell'de aynı ssh-keygen komutunu çalıştırır; ssh-copy-id yoksa genel anahtarı sunucuda elle ekleyin:
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... deploy@sunucu01" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Önemli: Bir sonraki adıma geçmeden yeni bir terminal açıp ssh deploy@203.0.113.10 ile parolasız girebildiğinizi ve sudo -l komutunun çalıştığını doğrulayın. Mevcut root oturumunu bu test bitene kadar kapatmayın.
4. Root girişini ve parola doğrulamasını kapatın
Ubuntu'da ayarları ana dosyayı değiştirmek yerine /etc/ssh/sshd_config.d/ altına ayrı bir dosya olarak koymak daha temizdir. OpenSSH, bu dizindeki dosyaları alfabetik sırayla okur ve ilk okunan değer geçerli olur. Bu yüzden dosyamıza 00- öneki veriyoruz:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
AllowUsers deploy
EOF
sudo sshd -t && sudo systemctl reload ssh
sshd -t sözdizimi hatası varsa çıktı verir ve reload yapılmaz; bu kontrolü atlamayın. Ubuntu'da servis adı ssh'tır (sshd değil). Etkin değerleri şöyle doğrulayın:
sudo sshd -T | grep -Ei 'permitrootlogin|passwordauthentication|allowusers'
SSH portunu değiştirmek gerekir mi?
Zorunlu değildir; port değiştirmek güvenlik değil, yalnızca log gürültüsü azaltır. Ubuntu 24.04'te SSH varsayılan olarak ssh.socket ile başladığı için Port satırı tek başına etkili olmayabilir. Port değiştirecekseniz önce UFW'de yeni porta izin verin ve socket yapılandırmasını da güncelleyin. Çoğu ortamda 22'de kalıp anahtar doğrulaması ve fail2ban kullanmak daha az sorun çıkarır.
5. UFW ile güvenlik duvarını kurun
UFW, iptables/nftables üzerinde basit bir arayüzdür. Mantık: gelen her şeyi reddet, yalnızca gerekenlere izin ver. Etkinleştirmeden önce SSH'a izin verin, yoksa kendinizi dışarıda bırakırsınız:
sudo apt install ufw -y
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
limit kuralı, aynı IP'den 30 saniyede 6 veya daha fazla bağlantı denemesini geçici olarak engeller. Yönetim IP'niz sabitse SSH'ı yalnızca ona açmak daha da sıkı bir yoldur:
sudo ufw delete limit OpenSSH
sudo ufw allow from 192.0.2.50 to any port 22 proto tcp
IPv6 kullanıyorsanız /etc/default/ufw içinde IPV6=yes olduğundan emin olun (Ubuntu'da genelde varsayılandır). Docker kullanıyorsanız dikkat: Docker, yayınladığı portlar için kendi iptables kurallarını ekler ve UFW kurallarını atlayabilir. Yayınlanan portları 127.0.0.1:8080:80 biçiminde yerel arayüze bağlamak güvenli bir alışkanlıktır.
6. fail2ban ile kaba kuvvet denemelerini engelleyin
fail2ban, log dosyalarını izleyip tekrarlayan başarısız girişleri güvenlik duvarında geçici olarak banlar:
sudo apt install fail2ban -y
sudo tee /etc/fail2ban/jail.local > /dev/null <<'EOF'
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 4
ignoreip = 127.0.0.1/8 ::1 192.0.2.50
banaction = ufw
[sshd]
enabled = true
backend = systemd
EOF
sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd
jail.conf dosyasını doğrudan düzenlemeyin; paket güncellemelerinde ezilir, bu yüzden jail.local kullanılır. banaction = ufw ile banlar UFW kurallarına işlenir. backend = systemd ise Ubuntu'nun journald tabanlı loglarıyla uyum için önemlidir. Bir IP'yi elle açmak için:
sudo fail2ban-client set sshd unbanip 198.51.100.25
Not: Anahtar tabanlı girişte parola denemeleri zaten başarısız olur; fail2ban burada ikinci katman ve log gürültüsü azaltıcıdır. Hacimsel DDoS saldırılarına karşı sunucu üzerindeki araçlar yetmez, çünkü hat dolduktan sonra paketler sunucuya ulaşmadan önce engellenmelidir. Bunun için ağ seviyesinde koruma gerekir; bkz. DDoS koruma ve firewall.
7. Otomatik güvenlik güncellemelerini açın
Ubuntu'da unattended-upgrades çoğu imajda hazır gelir, ama yoksa kurup etkinleştirin:
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure -plow unattended-upgrades
Bu komut /etc/apt/apt.conf.d/20auto-upgrades dosyasını oluşturur:
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
Varsayılan olarak yalnızca -security deposundaki güncellemeler uygulanır; bu üretim sunucuları için makul bir ayardır. Kernel güncellemelerinden sonra yeniden başlatma gerekiyorsa /etc/apt/apt.conf.d/50unattended-upgrades içinde şunları ayarlayabilirsiniz:
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
Unattended-Upgrade::Mail "root";
Otomatik reboot, tek sunuculu servislerde kısa kesinti demektir. Bu yüzden bakım penceresine uygun saat seçin veya kapalı bırakıp /var/run/reboot-required dosyasını izleyin. Yapılandırmayı test etmek için:
sudo unattended-upgrade --dry-run --debug
systemctl list-timers apt-daily*
8. Son kontrol listesi
Kurulumdan sonra aşağıdakileri tek tek doğrulayın:
sudo ufw status verbose # active, SSH/80/443 izinli
sudo fail2ban-client status # sshd jail listede
sudo ss -tulpn # dinleyen servisleri gözden geçirin
sudo sshd -T | grep -i permitroot
ssh -o PubkeyAuthentication=no deploy@203.0.113.10 # reddedilmeli
ss -tulpn çıktısında tanımadığınız bir servis varsa kaldırın ya da yalnızca 127.0.0.1'e bağlayın. Kullanılmayan her açık port, saldırı yüzeyini büyütür.
Sık yapılan hatalar ve çözümleri
| Sorun | Neden | Çözüm |
|---|---|---|
| Parola kapatıldı ama hâlâ parolayla giriliyor | 50-cloud-init.conf gibi bir dosya PasswordAuthentication yes tanımlıyor ve önce okunuyor |
Dosyanıza 00- öneki verin, sshd -T ile doğrulayın |
Permission denied (publickey) |
~/.ssh veya authorized_keys izinleri geniş, sahibi yanlış |
chmod 700 ~/.ssh, chmod 600 authorized_keys, chown -R deploy:deploy ~/.ssh |
| UFW açınca bağlantı koptu | SSH kuralı eklenmeden enable yapıldı |
Konsol/KVM ile girip ufw allow OpenSSH ekleyin |
| fail2ban kendi IP'nizi banladı | ignoreip boş |
ignoreip içine yönetim IP'nizi ekleyip servisi yeniden başlatın |
sshd servisi bulunamadı |
Ubuntu'da servis adı ssh |
systemctl reload ssh kullanın |
| Güncellemeler uygulanmıyor | Timer devre dışı veya dpkg kilitli | systemctl status apt-daily-upgrade.timer, log: /var/log/unattended-upgrades/ |
Parola erişimini kapatmadan önce sağlayıcınızın sağladığı konsol (KVM/VNC) erişimini bildiğinizden emin olun; yanlış yapılandırmada geri dönüş yolunuz o olacaktır.
Sonraki adımlar
Temel sertleştirme tamamlandı; sıradaki işler yedekleme, izleme ve servis bazlı güvenlik (ör. web sunucusu başlıkları, veritabanını yalnızca yerel dinletmek) olmalı. Yeni bir ortam kuruyorsanız, VMware vSphere tabanlı VDS sunucularımızda bu adımları temiz bir Ubuntu imajı üzerinde uygulayabilir, kendi ASN'iniz varsa aynı sunucudan BGP oturumu da açabilirsiniz.
Sık sorulan sorular
Root girişini kapatmak yeterli güvenlik sağlar mı?
Tek başına yeterli değildir. Root girişini kapatmak, parola doğrulamasını devre dışı bırakmak, SSH anahtarı kullanmak, güvenlik duvarı ve güncellemelerle birlikte katmanlı bir yaklaşımın parçasıdır.
UFW ile fail2ban birlikte kullanılabilir mi?
Evet. UFW hangi portların açık olacağını belirler, fail2ban ise tekrarlayan başarısız girişleri algılayıp banaction = ufw ayarıyla IP'yi UFW üzerinden geçici olarak engeller.
unattended-upgrades tüm paketleri günceller mi?
Varsayılan yapılandırma yalnızca Ubuntu güvenlik deposundaki güncellemeleri uygular. Diğer paketleri güncellemek istiyorsanız 50unattended-upgrades dosyasındaki Allowed-Origins listesini düzenleyebilirsiniz, ancak üretimde dikkatli olun.
SSH anahtarımı kaybedersem sunucuya nasıl girerim?
Sağlayıcınızın KVM/VNC konsolu veya kurtarma modu üzerinden girip authorized_keys dosyasına yeni bir genel anahtar ekleyebilirsiniz. Bu yüzden parolayı kapatmadan önce konsol erişiminizi test edin.