Ubuntu Minimal Kurulum ile Güvenli Sunucu Hazırlama Rehberi

Yeni bir Ubuntu sunucusu kurduğunuzda karşınıza çıkan o şişirilmiş paket listesi, gereksiz servisler ve onlarca daemon ile uğraşmak zorunda kalmak hiç de keyifli değil. Özellikle production ortamlarında, sunucunuzda ne çalıştığını tam olarak bilmek hem güvenlik hem de performans açısından kritik önem taşıyor. Bu yüzden minimal kurulum yaklaşımı, deneyimli sistem yöneticilerinin vazgeçilmez pratiğidir.

Neden Minimal Kurulum?

Bir sunucuya ihtiyacınız olandan fazlasını yüklemek, birden fazla sorunu beraberinde getirir. Her ekstra paket potansiyel bir güvenlik açığı demektir. Her gereksiz servis, kapatmanız gereken bir saldırı yüzeyi oluşturur. Bunların yanı sıra, gereksiz paketler disk alanı tüketir, güncellemeler uzar ve sistemin ne yaptığını takip etmek zorlaşır.

Minimal kurulum ile başladığınızda:

  • Tam kontrol sizde olur, sisteme ne girdiğini siz belirlersiniz
  • Saldırı yüzeyi minimize edilir
  • Kaynak kullanımı optimize edilir
  • Troubleshooting çok daha kolaylaşır
  • Uyumluluk ve audit süreçleri basitleşir

Şimdi adım adım nasıl yapılır, bunu inceleyelim.

Ubuntu Server ISO ile Başlamak

İlk adım doğru ISO’yu seçmek. Ubuntu’nun iki ana server kurulum seçeneği var: standart Ubuntu Server ve Ubuntu Server (minimized). Resmi siteden indireceğiniz Ubuntu Server ISO’su zaten Desktop’a göre çok daha sade, ama biz bunu daha da ileri taşıyacağız.

Kurulum sırasında “Ubuntu Server (minimized)” seçeneğini işaretlediğinizde, sistem man sayfaları, locales ve pek çok yardımcı araç olmadan kurulur. Production sunucular için bu ideal başlangıç noktasıdır.

Eğer mevcut bir Ubuntu Server kurulumunu minimal hale getirmek istiyorsanız:

# Mevcut gereksiz paketleri temizle
sudo apt-get purge --auto-remove snapd ubuntu-advantage-tools 
  apport landscape-common motd-news-config

# Otomatik olarak yüklenen ama artık gerekli olmayan paketleri kaldır
sudo apt-get autoremove --purge

# Paket önbelleğini temizle
sudo apt-get clean
sudo apt-get autoclean

Kurulum Sonrası İlk Adımlar

Sistem kurulur kurulmaz yapmanız gereken bazı temel işlemler var. Bunları bir checklist gibi düşünebilirsiniz.

Sistem Güncellemesi

Her şeyden önce sistemi güncel hale getirin:

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get dist-upgrade -y
sudo reboot

Reboot sonrası sisteme tekrar bağlanın ve kernel versiyonunu kontrol edin:

uname -r
cat /etc/os-release

Hostname ve Timezone Ayarları

Sunucunuzun kimliği olan hostname’i doğru ayarlamak, özellikle log yönetimi ve monitoring açısından kritik:

# Hostname ayarla
sudo hostnamectl set-hostname web-prod-01

# /etc/hosts dosyasını güncelle
sudo nano /etc/hosts
# 127.0.1.1 satırını yeni hostname ile eşleştir

# Timezone ayarla
sudo timedatectl set-timezone Europe/Istanbul

# NTP senkronizasyonunu kontrol et
timedatectl status
systemctl status systemd-timesyncd

Locale Ayarları

Minimal kurulumda locale bazen eksik gelir. Türkçe ortam için:

# Mevcut locale'leri listele
locale -a

# Türkçe locale ekle
sudo locale-gen tr_TR.UTF-8
sudo update-locale LANG=tr_TR.UTF-8

# Ya da İngilizce tercih ediyorsanız (genellikle server için önerilen)
sudo update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8

Kullanıcı Yönetimi ve SSH Güvenliği

Minimal kurulum tamamlandıktan sonra yapmanız gereken en önemli işlemlerden biri güvenli erişim yapılandırmasıdır.

Sudo Kullanıcısı Oluşturma

Root ile direkt çalışmaktan kaçının. Her işlem için ayrı bir kullanıcı oluşturun:

# Yeni kullanıcı ekle
sudo adduser sysadmin

# Kullanıcıyı sudo grubuna ekle
sudo usermod -aG sudo sysadmin

# Kullanıcıya geç ve test et
su - sysadmin
sudo whoami

SSH Key Tabanlı Kimlik Doğrulama

Parola ile SSH girişi kabul etmek, özellikle internet’e açık sunucularda büyük bir risk. Key tabanlı authentication kuralım:

# Lokal makinenizde key oluşturun (sunucuda değil!)
ssh-keygen -t ed25519 -C "web-prod-01-access" -f ~/.ssh/web_prod_01

# Public key'i sunucuya kopyalayın
ssh-copy-id -i ~/.ssh/web_prod_01.pub sysadmin@sunucu_ip

# Ya da manuel olarak
cat ~/.ssh/web_prod_01.pub | ssh sysadmin@sunucu_ip 
  "mkdir -p ~/.ssh && chmod 700 ~/.ssh && 
   cat >> ~/.ssh/authorized_keys && 
   chmod 600 ~/.ssh/authorized_keys"

SSH Daemon Güvenlik Yapılandırması

sudo nano /etc/ssh/sshd_config

Değiştirmeniz gereken kritik ayarlar:

  • Port 22: Varsayılan portu değiştirin, örneğin 2222 yapın
  • PermitRootLogin no: Root ile direkt giriş engellenir
  • PasswordAuthentication no: Parola girişini kapatır
  • PubkeyAuthentication yes: Key tabanlı girişi aktif eder
  • MaxAuthTries 3: Başarısız giriş denemesini sınırlar
  • LoginGraceTime 30: Bağlantı timeout süresi
  • AllowUsers sysadmin: Sadece belirtilen kullanıcıya izin verir
  • X11Forwarding no: GUI yönlendirmeyi kapatır

Değişiklikler sonrası SSH servisini yeniden başlatın:

sudo systemctl restart sshd

# Mevcut bağlantıyı kapatmadan önce yeni terminal ile test edin!
ssh -p 2222 -i ~/.ssh/web_prod_01 sysadmin@sunucu_ip

Firewall Yapılandırması

Ubuntu’da UFW (Uncomplicated Firewall) kullanımı oldukça pratik. Minimal kurulumda bile UFW genellikle kurulu gelir, ama aktif değildir.

# UFW durumunu kontrol et
sudo ufw status

# Varsayılan politikaları ayarla
sudo ufw default deny incoming
sudo ufw default allow outgoing

# SSH portuna izin ver (değiştirdiyseniz kendi portunuzu yazın)
sudo ufw allow 2222/tcp comment 'SSH Access'

# HTTP ve HTTPS için (web sunucu ise)
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

# UFW'yi aktif et
sudo ufw enable

# Kuralları doğrula
sudo ufw status verbose

Önemli uyarı: UFW’yi aktif etmeden önce SSH portuna izin vermeyi unutmayın, aksi takdirde sunucunuza erişiminizi kaybedebilirsiniz. Bu durumu yaşadım, sizin başınıza gelmesin.

Temel Araçların Kurulumu

Minimal kurulumda pek çok temel araç eksik gelir. İşte bir production sunucusunda olması gereken minimum araç seti:

# Temel sistem araçları
sudo apt-get install -y 
  curl 
  wget 
  vim 
  htop 
  iotop 
  iftop 
  net-tools 
  dnsutils 
  tcpdump 
  lsof 
  strace 
  git 
  unzip 
  tar 
  rsync 
  fail2ban 
  logrotate 
  cron 
  ntp

# Güvenlik araçları
sudo apt-get install -y 
  ufw 
  aide 
  rkhunter 
  lynis 
  auditd

Bu listeyi başlangıç noktası olarak kullanın. Sunucunuzun rolüne göre ekleyip çıkarabilirsiniz. Örneğin bir database sunucusunda tcpdump ve iftop belki gereksizdir, ama bir network sorununu debug etmek zorunda kaldığınızda bu araçların yokluğunu hissedersiniz.

Fail2Ban Yapılandırması

SSH brute force saldırılarına karşı Fail2Ban olmazsa olmaz:

# Fail2Ban için local konfigürasyon oluştur
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Önemli ayarlar:

  • bantime = 3600: 1 saat ban süresi
  • findtime = 600: 10 dakika içinde
  • maxretry = 3: 3 başarısız denemede ban uygula
  • ignoreip = 127.0.0.1/8 kendi_ip_adresiniz: Kendi IP’nizi ban listesinden muaf tut
# Fail2Ban servisini başlat ve aktif et
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

# Durumu kontrol et
sudo fail2ban-client status
sudo fail2ban-client status sshd

Otomatik Güvenlik Güncellemeleri

Production sunucularda güvenlik yamalarının zamanında uygulanması kritik. Bunu otomatikleştirin:

sudo apt-get install -y unattended-upgrades apt-listchanges

# Yapılandırma dosyasını düzenle
sudo dpkg-reconfigure -plow unattended-upgrades

# Ya da direkt dosyayı düzenle
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Yapılandırmada dikkat edilecekler:

  • Unattended-Upgrade::Allowed-Origins: Hangi repoların otomatik güncelleneceği
  • Unattended-Upgrade::AutoFixInterruptedDpkg: Yarım kalan kurulumları otomatik düzelt
  • Unattended-Upgrade::Remove-Unused-Dependencies: Gereksiz bağımlılıkları temizle
  • Unattended-Upgrade::Automatic-Reboot: Kernel güncellemelerinden sonra otomatik reboot
# Otomatik güncellemeyi test et
sudo unattended-upgrade --dry-run --debug

# Servis durumunu kontrol et
sudo systemctl status unattended-upgrades

Sistem Kaynaklarını Optimize Etme

Swap Yapılandırması

Cloud sunucularda genellikle swap gelmez, ama eklemekte fayda var:

# Mevcut swap durumunu kontrol et
free -h
swapon --show

# 2GB swap dosyası oluştur
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# Kalıcı hale getir
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

# Swappiness ayarı (server için düşük tutun)
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

Gereksiz Servislerin Devre Dışı Bırakılması

Minimal kurulumda bile bazı servisler gereksiz çalışabilir:

# Çalışan servisleri listele
systemctl list-units --type=service --state=running

# Genellikle kapatılabilecek servisler (role'e göre değişir)
sudo systemctl disable --now snapd
sudo systemctl disable --now apport
sudo systemctl disable --now ubuntu-advantage
sudo systemctl disable --now motd-news.timer

# Aktif timer'ları kontrol et
systemctl list-timers

Kernel Parametreleri

Network performansı ve güvenlik için önemli kernel ayarları:

sudo nano /etc/sysctl.d/99-sysadmin.conf

Dosyaya eklenecek parametreler:

  • net.ipv4.tcp_syncookies = 1: SYN flood koruması
  • net.ipv4.conf.all.rp_filter = 1: IP spoofing koruması
  • net.ipv4.conf.all.accept_redirects = 0: ICMP redirect’leri engelle
  • net.ipv4.conf.all.send_redirects = 0: ICMP redirect gönderme
  • net.ipv4.ip_forward = 0: IP forwarding (router değilseniz kapalı)
  • net.core.somaxconn = 65535: Maximum socket bağlantısı
  • fs.file-max = 65536: Maximum açık dosya sayısı
# Değişiklikleri uygula
sudo sysctl --system

Log Yönetimi

Minimal kurulumda log yönetimini doğru yapılandırmak, hem troubleshooting hem de güvenlik audit’i için şart.

Journald Yapılandırması

sudo nano /etc/systemd/journald.conf

Önemli ayarlar:

  • Storage=persistent: Logları diske yaz
  • SystemMaxUse=1G: Maximum disk kullanımı
  • MaxRetentionSec=1month: Log saklama süresi
  • Compress=yes: Sıkıştırma aktif
sudo systemctl restart systemd-journald

# Log durumunu kontrol et
journalctl --disk-usage
journalctl -u sshd -f  # SSH loglarını canlı izle

Logrotate Yapılandırması

Custom uygulama logları için logrotate kuralı ekleyin:

sudo nano /etc/logrotate.d/myapp

Örnek kural:

/var/log/myapp/*.log {
    daily
    missingok
    rotate 14
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript
}

Gerçek Dünya Senaryosu: Web Sunucusu Hazırlama

Tüm bu adımları bir araya getiren bir senaryo düşünelim. Bir e-ticaret sitesi için Nginx tabanlı web sunucu hazırlıyorsunuz. Minimal Ubuntu kurulumu sonrası yapacaklarınız şu şekilde özetlenebilir:

#!/bin/bash
# Minimal Ubuntu Web Sunucu Hazırlama Script'i
# Dikkat: Bu script'i production'da çalıştırmadan önce test edin

set -e

echo "Sistem güncelleniyor..."
apt-get update && apt-get upgrade -y

echo "Temel araçlar kuruluyor..."
apt-get install -y curl wget vim htop net-tools git 
  ufw fail2ban unattended-upgrades logrotate

echo "Nginx kuruluyor..."
apt-get install -y nginx certbot python3-certbot-nginx

echo "Firewall yapılandırılıyor..."
ufw default deny incoming
ufw default allow outgoing
ufw allow 2222/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw --force enable

echo "Fail2Ban başlatılıyor..."
systemctl enable fail2ban
systemctl start fail2ban

echo "Nginx başlatılıyor..."
systemctl enable nginx
systemctl start nginx

echo "Sunucu hazır!"
echo "Nginx durumu: $(systemctl is-active nginx)"
echo "Firewall durumu: $(ufw status | head -1)"

Bu script’i çalıştırdıktan sonra Nginx konfigürasyonuna geçebilir, SSL sertifikası kurabilir ve sitenizi deploy edebilirsiniz.

Monitoring ve Alerting

Minimal kurulum hazır olduğunda, sunucunuzu takip edecek basit bir monitoring altyapısı ekleyin:

# Node Exporter kurulumu (Prometheus ile kullanım için)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz
sudo cp node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
sudo useradd -rs /bin/false node_exporter

# Systemd servis dosyası oluştur
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

Daha basit bir çözüm istiyorsanız, monit oldukça kullanışlı:

sudo apt-get install -y monit
sudo nano /etc/monit/monitrc
# check system localhost ile CPU, memory, disk alertleri tanımlayabilirsiniz
sudo systemctl enable monit
sudo systemctl start monit

Backup Stratejisi

Minimal sunucunuz hazır olduğunda son adım backup yapılandırması. Basit ama etkili bir yaklaşım:

# Kritik config dosyalarını yedekle
sudo mkdir -p /backup/configs

sudo cp -r /etc/ssh /backup/configs/
sudo cp -r /etc/ufw /backup/configs/
sudo cp /etc/sysctl.conf /backup/configs/
sudo cp /etc/fstab /backup/configs/

# Sıkıştır ve remote'a gönder
tar -czf /backup/server-config-$(date +%Y%m%d).tar.gz /backup/configs/
rsync -avz /backup/ backup_user@backup_server:/backups/web-prod-01/

Bu işlemi cron’a ekleyin:

sudo crontab -e
# Her gece 2'de backup al
0 2 * * * /usr/local/bin/backup-configs.sh >> /var/log/backup.log 2>&1

Sonuç

Minimal Ubuntu kurulum yaklaşımı, sistem yöneticiliğinin temel prensiplerinden birini yansıtıyor: ne gerekiyorsa o kadar, daha fazlası değil. Bu prensibi uygulayan sunucular daha güvenli, daha öngörülebilir ve bakımı çok daha kolay oluyor.

Özetlemek gerekirse izlememiz gereken yol şu şekilde: minimal ISO ile başla, sistemi güncelle, SSH güvenliğini sağla, firewall’u yapılandır, sadece ihtiyacın olan araçları kur, gereksiz servisleri kapat, logging’i ayarla ve monitoring ekle. Bu adımları doğru uyguladığınızda elinizde tam kontrol edebildiğiniz, güvenli ve performanslı bir sunucu olacak.

Yeni bir sunucu kurduğumda bu checklist’i her seferinde takip ediyorum ve birkaç yıl önce “zaten şimdi yaparım” diyerek atlattığım adımların sonradan ne kadar baş ağrısına yol açtığını hatırlıyorum. Minimal başlamak, sonradan temizlemekten her zaman daha kolay. Bir kez bu disiplini edindiğinizde, şişirilmiş kurulumlarla çalışmak inanılmaz hantal geliyor.

Yorum yapın