Yeni bir Ubuntu sunucu kurulumunu tamamladınızda aslında işin yarısını bitirmiş sayılırsınız. Asıl mesele, o sunucuyu production’a almadan önce doğru yapılandırmak. Pek çok sysadmin kurulumu hızlıca geçip “zaten çalışıyor” diye ilerliyor, sonra güvenlik açıkları, performans sorunları veya bakımı imkansız bir sistem ortaya çıkıyor. Bu yazıda Ubuntu Server kurulumundan başlayarak, ilk güvenlik adımlarına, kullanıcı yönetimine ve temel servislerin yapılandırılmasına kadar her şeyi ele alacağız. Gerçek bir sunucu hazırlar gibi adım adım ilerleyeceğiz.
Kurulum Öncesi Hazırlık
Sunucuyu kurmadan önce birkaç şeyi netleştirmeniz gerekiyor. Fiziksel mi sanal mı? Hangi Ubuntu sürümü? Ben her zaman LTS (Long Term Support) sürümlerini öneriyorum. Ubuntu 22.04 LTS veya 24.04 LTS şu an için en mantıklı tercihler çünkü 5 yıl güvenlik desteği alıyorsunuz.
ISO dosyasını indirmeden önce SHA256 checksum doğrulaması yapmayı alışkanlık haline getirin:
# ISO dosyasını indirdikten sonra dogrulama
sha256sum ubuntu-22.04.3-live-server-amd64.iso
# Ubuntu'nun resmi checksum dosyasiyla karsilastirin
# Cikan hash, Ubuntu sitesindeki degerle birebir eslesmelidir
Disk planlamasını da önceden yapın. Üretim sunucularında tek partition yerine ayrı mount point’ler kullanmak çok daha mantıklı. Örneğin /var için ayrı bir partition açmazsanız, log dosyaları dolduğunda tüm sistemi kitleyebilir. Genel bir öneri olarak:
- / (root): 20-30 GB
- /var: 50 GB veya daha fazla (log ve uygulama verisi için)
- /tmp: 5-10 GB
- /home: Kullanıcı sayısına göre
- swap: RAM miktarının 1-2 katı (16 GB RAM’e kadar)
Kurulum Adımları
Ubuntu Server kurulumu oldukça sezgisel ama bazı noktalara dikkat etmek gerekiyor. Kurulum sırasında OpenSSH server paketini seçmeyi unutmayın, sonradan da kurulabilir ama baştan seçmek zaman kazandırır.
Network yapılandırmasını kurulum sırasında statik IP ile yapmanızı öneririm. DHCP ile gidebilirsiniz ama sunucu IP’si değişirse SSH bağlantısı kopar ve başınız ağrır. Netplan ile statik IP vermek için:
# Kurulum sonrasi statik IP yapilandirmasi
sudo nano /etc/netplan/00-installer-config.yaml
Dosyanın içeriği şöyle olmalı:
network:
version: 2
ethernets:
ens3:
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
dhcp4: false
# Yapilandirmayi uygula
sudo netplan apply
# Baglanti kontrolu
ip addr show
ping -c 4 google.com
İlk Sistem Güncellemesi
Sistemi açtıktan sonra yapacağınız ilk iş güncellemeleri uygulamak olmalı. Bu adımı atlayanlar sonradan “nasıl exploit yedik” diye sormaya başlıyor.
# Paket listesini guncelle
sudo apt update
# Tum paketleri yukselt
sudo apt upgrade -y
# Kernel guncellemesi varsa tam yukseltme
sudo apt full-upgrade -y
# Gereksiz paketleri temizle
sudo apt autoremove -y
sudo apt autoclean
# Sistem yeniden baslatma gerekiyorsa
sudo reboot
Reboot sonrası sisteme giriş yaptığınızda kernel sürümünü kontrol edin:
uname -r
# Ornek cikti: 5.15.0-91-generic
Kullanıcı Yönetimi ve Sudo Yapılandırması
Root ile çalışmak hem tehlikeli hem de kötü bir alışkanlık. Her zaman sudo yetkili normal bir kullanıcı oluşturun. Eğer kurulum sırasında kullanıcı oluşturmadıysanız:
# Yeni kullanici olustur
sudo adduser sysadmin
# Kullaniciyi sudo grubuna ekle
sudo usermod -aG sudo sysadmin
# Kullanicinin gruplarini dogrula
groups sysadmin
# Cikti: sysadmin : sysadmin sudo
Şimdi sudo yapılandırmasını biraz sıkılaştıralım. /etc/sudoers dosyasını mutlaka visudo komutuyla düzenleyin, direkt nano/vim kullanmayın:
sudo visudo
Dosyaya şu satırları ekleyin veya düzenleyin:
# sudo kullaniminda parola sorulsun (NOPASSWD kullanmayin production'da)
%sudo ALL=(ALL:ALL) ALL
# Belirli bir kullaniciya sadece belirli komutlara izin vermek icin
# sysadmin ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx
Burada bir gerçek dünya senaryosundan bahsedeyim. Bir müşteride, deployment scriptleri için servis hesabına NOPASSWD ile tam sudo vermiştiler. Script çalıştıran bir geliştirici yanlışlıkla sudo rm -rf / komutunu tetikleyince sistemi mahvettiler. Minimal yetki prensibi (principle of least privilege) burada çok kritik.
SSH Güvenlik Sertleştirmesi
SSH, sunucunuzun dışarıya açık kapısı. Bu kapıyı doğru kilitlemezseniz brute force saldırıları, dictionary attack’lar derken log’larınız dolup taşar.
sudo nano /etc/ssh/sshd_config
Yapılandırma dosyasında şu değişiklikleri yapın:
# Default portu degistirin (opsiyonel ama tavsiye)
Port 2222
# Root login'i kapat
PermitRootLogin no
# Parola ile login'i kapat, sadece SSH key kullan
PasswordAuthentication no
# Bos parola ile girisi kapat
PermitEmptyPasswords no
# Maksimum giris denemesi
MaxAuthTries 3
# Bos session timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# Sadece belirli kullanicilara izin ver
AllowUsers sysadmin deploy
# X11 forwarding kapat (gerek yoksa)
X11Forwarding no
SSH key’i henüz oluşturmadıysanız önce bunu yapın:
# LOCAL makinenizde (sunucuda degil!) key olusturun
ssh-keygen -t ed25519 -C "sunucu-adi-$(date +%Y%m%d)"
# Public key'i sunucuya kopyalayin
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]
# Veya manuel olarak
cat ~/.ssh/id_ed25519.pub | ssh [email protected] "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
SSH servisini yeniden başlatmadan önce mevcut oturumunuzu kapatmayın. Yeni bir terminal açıp bağlantıyı test edin, her şey yolundaysa eski oturumu kapatın:
sudo systemctl restart sshd
# Servis durumunu kontrol et
sudo systemctl status sshd
Güvenlik Duvarı Yapılandırması (UFW)
Ubuntu ile gelen UFW (Uncomplicated Firewall), iptables’ın üzerinde basit bir arayüz sunuyor. Başlangıç için idealdir.
# UFW durumunu kontrol et
sudo ufw status
# Default politikalar
sudo ufw default deny incoming
sudo ufw default allow outgoing
# SSH portuna izin ver (hangi portu kullandıysanız)
sudo ufw allow 2222/tcp
# HTTP ve HTTPS (web sunucu kullanacaksanız)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# UFW'yi aktif et
sudo ufw enable
# Kuralları listele
sudo ufw status verbose
Belirli bir IP aralığından SSH’a izin vermek çok daha güvenli bir yaklaşım:
# Sadece ofis IP blogundan SSH
sudo ufw allow from 203.0.113.0/24 to any port 2222
# Tek IP'den
sudo ufw allow from 203.0.113.10 to any port 2222
Fail2Ban Kurulumu
UFW güzel ama tek başına yeterli değil. Fail2Ban, belirli sayıda başarısız giriş denemesinden sonra IP adresini otomatik olarak engelliyor. Brute force saldırılarına karşı çok etkili.
# Fail2Ban kur
sudo apt install fail2ban -y
# Servis başlat ve otomatik baslat
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
# Yapilandirma dosyasini kopyala (orijinaline dokunma)
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
jail.local dosyasında SSH için yapılandırma:
[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# Fail2Ban'i yeniden baslat
sudo systemctl restart fail2ban
# Engellenen IP'leri goruntule
sudo fail2ban-client status sshd
Sistem Zamanı ve Timezone Ayarları
Log analizinde en büyük baş ağrılarından biri tutarsız zaman damgaları. Tüm sunucularınızı UTC’ye ayarlayın, uygulama katmanında gerekli dönüşümü yapın.
# Mevcut timezone kontrolu
timedatectl
# UTC'ye ayarla
sudo timedatectl set-timezone UTC
# NTP senkronizasyonunu aktif et
sudo timedatectl set-ntp true
# Kontrol et
timedatectl status
Eğer systemd-timesyncd yerine daha güvenilir bir NTP istemcisi istiyorsanız chrony kullanabilirsiniz:
sudo apt install chrony -y
sudo systemctl enable chrony
sudo systemctl start chrony
# Senkronizasyon durumu
chronyc tracking
Hostname ve Hosts Dosyası
Hostname’i anlamlı bir şekilde ayarlamak, özellikle birden fazla sunucu yönetirken log okumayı ve servisleri birbirinden ayırt etmeyi kolaylaştırır.
# Hostname ayarla
sudo hostnamectl set-hostname web-prod-01
# Hosts dosyasini guncelle
sudo nano /etc/hosts
Hosts dosyasına ekleyin:
127.0.0.1 localhost
127.0.1.1 web-prod-01
192.168.1.100 web-prod-01.sirket.local web-prod-01
# Diger sunuculari da ekleyebilirsiniz
192.168.1.101 db-prod-01.sirket.local db-prod-01
Otomatik Güvenlik Güncellemeleri
Production sunucularında her güncelleştirmeyi otomatik uygulamak riskli olabilir (bir güncelleme servisi bozabilir), ama en azından güvenlik güncellemelerini otomatik alın.
sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades
Yapılandırma dosyasını düzenleyin:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Kritik ayarlar:
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
};
# Reboot gerekirse otomatik yeniden baslatma (dikkatli kullanin)
Unattended-Upgrade::Automatic-Reboot "false";
# Mail bildirimi
Unattended-Upgrade::Mail "[email protected]";
# Sadece hata durumunda mail
Unattended-Upgrade::MailReport "on-change";
Sistem İzleme ve Log Yönetimi
Sunucunuzda ne olduğunu takip etmek için temel araçları kurun:
# Sistem izleme araclari
sudo apt install htop iotop iftop sysstat -y
# sysstat'i aktif et (sistem istatistikleri toplama)
sudo systemctl enable sysstat
sudo systemctl start sysstat
# Disk kullanimi ozeti
df -hT
# Memory kullanimi
free -h
# En cok CPU kullanan prosesler
ps aux --sort=-%cpu | head -10
Logları merkezi olarak yönetmek için journalctl’ı öğrenin:
# Son 100 log satirini goster
sudo journalctl -n 100
# Belirli bir servise ait loglar
sudo journalctl -u nginx -f
# Son 1 saatin loglari
sudo journalctl --since "1 hour ago"
# Boot sonrasi loglar
sudo journalctl -b
Log rotasyonunu da kontrol edin. Loglardan bahsetmişken, bir müşteride /var/log partisyon ayrılmamıştı ve 3 ay sonra loglar tüm disk alanını doldurdu. MySQL veritabanı yeni veri yazamaz oldu ve servis çöktü. Bu yüzden başta bahsettiğim partition planlaması gerçekten önemli.
Swap Yapılandırması
Kurulum sırasında swap oluşturmadıysanız veya daha sonra ayarlamak istiyorsanız:
# Mevcut swap durumu
sudo swapon --show
free -h
# 4GB swap dosyasi olustur
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# Kalici hale getir
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# Swappiness degerini ayarla (production sunucu icin dusuk tutun)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
vm.swappiness=10 değeri, sistemin RAM dolmadan swap’a gitmesini engeller. Veritabanı sunucularında genellikle 1-10 arası bir değer tercih edilir.
Temel Güvenlik Kontrolleri
Yapılandırmayı tamamladıktan sonra bazı kontrol adımları:
# Acik portlari listele
sudo ss -tlnp
# Aktif servisler
sudo systemctl list-units --type=service --state=active
# Son giris denemeleri
sudo lastb | head -20
# Basarili girisler
last | head -20
# Sudoers dosyasini kontrol et
sudo visudo -c
# SUID/SGID bit set edilmis dosyalar (guvenlik taramasi)
sudo find / -perm /6000 -type f 2>/dev/null | grep -v proc
ss -tlnp çıktısını inceleyin. Gereksiz açık port görüyorsanız o servisi durdurun:
# Gereksiz servisi durdur ve devre disi birak
sudo systemctl stop avahi-daemon
sudo systemctl disable avahi-daemon
Yedekleme Stratejisi
Sunucuyu yapılandırdınız, güvenliği sağladınız ama yedekleme yoksa hepsi boşa gidebilir. Basit bir rsync tabanlı yedekleme scripti:
sudo nano /usr/local/bin/backup-config.sh
#!/bin/bash
BACKUP_DIR="/backup/configs"
DATE=$(date +%Y%m%d_%H%M%S)
HOSTNAME=$(hostname)
mkdir -p "$BACKUP_DIR"
# Kritik konfigurasyonlari yedekle
tar -czf "$BACKUP_DIR/${HOSTNAME}_config_${DATE}.tar.gz"
/etc/ssh/sshd_config
/etc/ufw
/etc/fail2ban/jail.local
/etc/netplan/
/etc/hosts
/etc/crontab 2>/dev/null
# 30 gunden eski yedekleri sil
find "$BACKUP_DIR" -name "*.tar.gz" -mtime +30 -delete
echo "Yedekleme tamamlandi: ${BACKUP_DIR}/${HOSTNAME}_config_${DATE}.tar.gz"
sudo chmod +x /usr/local/bin/backup-config.sh
# Gunluk cron gorevi ekle
echo "0 2 * * * root /usr/local/bin/backup-config.sh >> /var/log/backup.log 2>&1" | sudo tee -a /etc/cron.d/config-backup
Son Kontrol Listesi
Tüm adımları tamamladıktan sonra şunları doğrulayın:
- Sistem güncellemeleri uygulandı ve güncel durumda
- Root login SSH üzerinden devre dışı
- SSH key tabanlı kimlik doğrulama aktif, parola girişi kapalı
- UFW aktif ve sadece gerekli portlar açık
- Fail2Ban çalışıyor
- Timezone UTC olarak ayarlandı, NTP senkronizasyonu aktif
- Hostname doğru set edildi
- Otomatik güvenlik güncellemeleri aktif
- Yedekleme cronjob çalışıyor
- Gereksiz servisler devre dışı
# Hizli sistem saglik kontrolu
echo "=== Sistem Bilgisi ===" && uname -a
echo "=== Uptime ===" && uptime
echo "=== Disk Kullanimi ===" && df -h
echo "=== Memory ===" && free -h
echo "=== UFW Durumu ===" && sudo ufw status
echo "=== Fail2Ban ===" && sudo fail2ban-client status
echo "=== Acik Portlar ===" && sudo ss -tlnp
Sonuç
Ubuntu Server kurulumu ve ilk yapılandırma aşamaları, bir sistemin uzun vadeli güvenliği ve stabilitesi için kritik öneme sahip. Burada anlattığım adımlar bir başlangıç noktası, her ortam kendi özelliklerine göre ek yapılandırmalar gerektirebilir. Web sunucusu için Nginx/Apache yapılandırması, veritabanı sunucusu için PostgreSQL/MySQL optimizasyonu, container ortamı için Docker güvenlik sertleştirmesi gibi konular bunların üzerine eklenen katmanlar.
Özellikle vurgulamak istediğim nokta: güvenliği kurulum sonrasına bırakmayın. Sunucu internete açılır açılmaz botlar taramaya başlıyor. Birkaç dakika içinde auth.log’unuzda başarısız giriş denemeleri görmeye başlarsınız. SSH’ı sertleştirip Fail2Ban’ı aktif etmeden sunucuyu dışa açmak gerçekten riskli.
Bir de şunu ekleyeyim: bu adımları manuel yapmak öğrenmek için değerli ama production ortamınızda birden fazla sunucu varsa Ansible gibi bir yapılandırma yönetimi aracı kullanın. Tüm bu adımları Ansible playbook olarak yazarsınız, yeni bir sunucu geldiğinde birkaç dakikada standart bir hale getirirsiniz. Tutarlılık hem güvenlik hem de yönetilebilirlik açısından çok önemli.