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.