Debian sunucuyu kurdun, ekran siyahlandı, önünde bir login prompt var. İşte tam bu noktada çoğu sysadmin “ne yapacağım şimdi?” diye düşünür. Minimal kurulum sana kasıtlı olarak çıplak bir sistem verir; ne fazlası ne eksiği. Bu aslında harika bir şey çünkü neyin kurulu olduğunu tam olarak biliyorsun. Ama bu çıplak sistemi production’a hazır hale getirmek için yapman gereken bir dizi kritik adım var. Bu yazıda Debian minimal kurulum sonrası mutlaka yapman gereken işlemleri, neden yapman gerektiğini ve nasıl yapacağını anlatacağım.
Sistem Güncellemesi ve Temel Paketler
İlk iş her zaman sistem güncellemesi. Bunu atlamak, evin kapısını açık bırakıp tatile gitmek gibi bir şey.
apt update && apt upgrade -y
apt install -y curl wget git vim htop tmux net-tools
dnsutils sudo ufw fail2ban unattended-upgrades
apt-transport-https ca-certificates gnupg lsb-release
Bu komuttaki paketlerin her biri bir amaca hizmet ediyor. curl ve wget dosya indirmek için, htop sistem kaynaklarını izlemek için, tmux uzun süren işlemler için terminal oturumunu canlı tutmak için, net-tools ağ araçları için, dnsutils DNS sorgulama için şart. unattended-upgrades ise güvenlik güncellemelerini otomatik uygulaması için kritik.
Paket listesini güncelledikten sonra sistemin tam olarak güncel olup olmadığını kontrol et:
apt list --upgradable 2>/dev/null | head -20
Zaman Dilimi ve Locale Ayarları
Sunucunda yanlış zaman dilimi varsa log dosyaları anlamsızlaşır, cron job’lar yanlış saatte çalışır, sertifika doğrulamaları başarısız olabilir. Gerçekten yaşanmış bir senaryo: bir e-ticaret sitesinin log dosyaları UTC+3 yerine UTC’deydi, güvenlik olayı incelemesinde 3 saatlik fark ciddi kafa karışıklığı yarattı.
timedatectl set-timezone Europe/Istanbul
timedatectl status
Locale ayarlarını da düzelt. Minimal kurulumda genellikle locale eksik gelir:
locale-gen tr_TR.UTF-8
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
dpkg-reconfigure locales
Neden en_US.UTF-8 kullanıyoruz? Çünkü Türkçe locale bazı yazılımlarla uyumsuzluk yaratabilir, özellikle büyük/küçük harf dönüşümlerinde. Sunucuda en_US.UTF-8 locale ile gidip, sadece görüntüleme ihtiyacında Türkçe’ye geç.
NTP senkronizasyonunu kontrol et. Debian’da systemd-timesyncd genellikle varsayılan olarak gelir:
systemctl status systemd-timesyncd
timedatectl show-timesync
SSH Güvenlik Sertleştirmesi
Default SSH ayarları production için kabul edilemez. /etc/ssh/sshd_config dosyasını açıp şu değişiklikleri yap:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
cat >> /etc/ssh/sshd_config << 'EOF'
# Guvenlik Sertlestirme
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
X11Forwarding no
AllowTcpForwarding no
Protocol 2
EOF
PermitRootLogin no: Root ile direkt bağlantıyı kapat. Her zaman normal kullanıcıyla gir, sudo ile yükselt.
PasswordAuthentication no: Şifreyle girişi kapat, sadece SSH key ile bağlantı kabul et. Bu ayarı yapmadan önce SSH key’ini sunucuya eklediğinden emin ol, yoksa dışarıda kalırsın.
MaxAuthTries 3: 3 başarısız denemeden sonra bağlantıyı kes.
Değişiklikleri uygulamadan önce syntax kontrolü yap:
sshd -t
systemctl reload sshd
SSH key’ini sunucuya eklemek için (bunu yapmadan PasswordAuthentication’ı kapatma!):
# Kendi makinende SSH key yoksa olustur
ssh-keygen -t ed25519 -C "[email protected]"
# Sunucuya kopyala (bunu kendi makinende calistir)
ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanici@sunucu_ip
Yeni Sudo Kullanıcısı Oluşturma
Root ile çalışmak tehlikeli. Bir yazım hatası tüm sistemi silebilir. Her zaman normal kullanıcı oluştur ve sudo ver:
adduser sysadmin
usermod -aG sudo sysadmin
# Kullanicinin sudo grubunda oldugundan emin ol
groups sysadmin
Eğer sudo yetkilerini daha granüler kontrol etmek istersen /etc/sudoers.d/ dizinini kullan:
echo "sysadmin ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/systemctl"
> /etc/sudoers.d/sysadmin-limits
chmod 440 /etc/sudoers.d/sysadmin-limits
Bu örnekte sysadmin kullanıcısı sadece apt ve systemctl komutlarını şifresiz çalıştırabilir. Her şey için NOPASSWD: ALL vermek güvenlik açığı yaratır.
Güvenlik Duvarı Yapılandırması (UFW)
ufw Debian’da iptables’ın üstüne oturmuş, kullanımı çok daha basit bir araç. Minimal kurulumda güvenlik duvarı genellikle yapılandırılmamış gelir.
# Varsayilan politikalari belirle
ufw default deny incoming
ufw default allow outgoing
# SSH'a izin ver (SSH portununu degistirdiysen duzelt)
ufw allow 22/tcp
# Eger web sunucusu kuruyorsan
ufw allow 80/tcp
ufw allow 443/tcp
# UFW'yi etkinlestir
ufw enable
ufw status verbose
Önemli bir uyarı: ufw enable komutunu çalıştırmadan önce SSH portuna izin verdiğinden kesinlikle emin ol. Aksi halde sisteme erişimi kaybedersin. Bu basit ama can yakan bir hata, bizzat yaşadım.
Belirli IP’lerden erişim kısıtlaması yapmak istersen:
# Sadece belirli IP'den SSH izni
ufw delete allow 22/tcp
ufw allow from 192.168.1.100 to any port 22
# Subnet icin
ufw allow from 10.0.0.0/24 to any port 22
Fail2ban Yapılandırması
Güvenlik duvarı iyi ama aktif saldırılara karşı Fail2ban şart. Brute force denemelerini otomatik olarak engeller.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
/etc/fail2ban/jail.local dosyasını düzenle:
cat > /etc/fail2ban/jail.d/custom.conf << 'EOF'
[DEFAULT]
bantime = 3600
findtime = 600
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
maxretry = 3
bantime = 7200
EOF
systemctl enable fail2ban
systemctl start fail2ban
fail2ban-client status sshd
bantime = 3600: Başarısız denemeden sonra 1 saat ban. findtime = 600: 10 dakika içinde. maxretry = 3: 3 başarısız deneme yeterli.
Ban’lı IP’leri görüntülemek ve yönetmek için:
# Ban'li IP'leri listele
fail2ban-client status sshd
# Bir IP'nin banini kaldir
fail2ban-client set sshd unbanip 1.2.3.4
Otomatik Güvenlik Güncellemeleri
unattended-upgrades paketini kurdun, şimdi yapılandır:
dpkg-reconfigure -plow unattended-upgrades
Daha detaylı ayar için /etc/apt/apt.conf.d/50unattended-upgrades dosyasını düzenle. En azından şu satırların aktif olduğundan emin ol:
grep -E "security|Unattended" /etc/apt/apt.conf.d/50unattended-upgrades | head -10
/etc/apt/apt.conf.d/20auto-upgrades dosyasının içeriği şöyle olmalı:
cat /etc/apt/apt.conf.d/20auto-upgrades
# Cikti:
# APT::Periodic::Update-Package-Lists "1";
# APT::Periodic::Unattended-Upgrade "1";
Swap Alanı Yapılandırması
Minimal Debian kurulumunda swap olmayabilir ya da yeterli olmayabilir. Özellikle RAM az olan sunucularda kritik:
# Mevcut swap durumu
free -h
swapon --show
# 2GB swap dosyasi olustur
fallocate -l 2G /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
# Kalici hale getir
echo '/swapfile none swap sw 0 0' >> /etc/fstab
# Swappiness ayari (0-100, dusuk = swap'i az kullan)
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
vm.swappiness=10: Sistem RAM’i dolmadan swap’e geçmesin. 60 olan varsayılan değer masaüstü için uygundur ama sunucu için çok yüksek. 10 iyi bir başlangıç noktası.
Kernel Parametreleri ve Sistem Optimizasyonu
cat >> /etc/sysctl.conf << 'EOF'
# Network optimizasyonu
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# IP spoofing koruması
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP redirect'leri reddet
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
# SYN flood koruması
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_syn_retries = 2
# IPv4 forwarding (router degilsen kapali kalsın)
net.ipv4.ip_forward = 0
EOF
sysctl -p
Disk ve Log Yönetimi
Disk alanı yönetimi ihmal edilince production’da felaket yaşanır. Log dosyaları sunucuyu doldurabilir.
# Mevcut disk kullanimi
df -h
du -sh /var/log/* | sort -rh | head -10
logrotate genellikle kurulu gelir ama kontrol et:
systemctl status logrotate.timer
cat /etc/logrotate.conf
Büyük log dosyaları için journald’yi sınırla:
# /etc/systemd/journald.conf dosyasını düzenle
sed -i 's/#SystemMaxUse=/SystemMaxUse=500M/' /etc/systemd/journald.conf
sed -i 's/#RuntimeMaxUse=/RuntimeMaxUse=100M/' /etc/systemd/journald.conf
systemctl restart systemd-journald
Eski kernel dosyalarını temizle:
apt autoremove -y
apt autoclean
Sistem İzleme için Temel Araçlar
Production sunucusunda ne olduğunu bilmen lazım. Birkaç temel izleme aracı kur:
apt install -y sysstat iotop iftop nmon logwatch
# sysstat'i etkinlestir (sistem istatistikleri toplar)
sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
systemctl enable sysstat
systemctl start sysstat
sysstat: CPU, disk, ağ kullanım geçmişini kaydeder. Bir sorun yaşandığında geriye dönük bakabilmek paha biçilmez.
# Son 1 saatin CPU kullanimi
sar -u 1 5
# Disk I/O istatistikleri
sar -d 1 5
# Network istatistikleri
sar -n DEV 1 5
logwatch günlük log özeti maili gönderebilir, ancak mail altyapısı kuruluysa işe yarar.
Hostname ve Hosts Dosyası
hostnamectl set-hostname sunucu-adi.domain.com
# /etc/hosts dosyasini guncelle
cat > /etc/hosts << 'EOF'
127.0.0.1 localhost
127.0.1.1 sunucu-adi.domain.com sunucu-adi
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
EOF
Servis Optimizasyonu: Gereksizleri Kapat
Minimal kurulumda bile bazı gereksiz servisler çalışıyor olabilir. Saldırı yüzeyini küçült:
# Calisan servisleri listele
systemctl list-units --type=service --state=running
# Genellikle sunucularda gerekmeyen servisler
systemctl disable --now bluetooth.service 2>/dev/null
systemctl disable --now avahi-daemon.service 2>/dev/null
systemctl disable --now cups.service 2>/dev/null
# Hangi servislerin ne port dinledigini gör
ss -tlnp
SSH Key Yönetimi ve Güvenli Erişim
Birden fazla admin varsa SSH key yönetimi önemli hale gelir:
# Her admin icin ayri authorized_keys satiri
mkdir -p /home/sysadmin/.ssh
chmod 700 /home/sysadmin/.ssh
touch /home/sysadmin/.ssh/authorized_keys
chmod 600 /home/sysadmin/.ssh/authorized_keys
chown -R sysadmin:sysadmin /home/sysadmin/.ssh
# Key'lere yorum ekle (kimin key'i olduğunu bil)
# ssh-ed25519 AAAA... ahmet@laptop
# ssh-ed25519 BBBB... mehmet@workstation
Ayrılan bir çalışanın key’ini kaldırmak için sadece ilgili satırı sil. Bu yüzden her key’e açıklayıcı yorum eklemek kritik.
Yedekleme Altyapısı Temeli
Yedekleme olmadan sistem yönetimi olmaz. En azından basit bir yapı kur:
mkdir -p /opt/backup/scripts
cat > /opt/backup/scripts/system-backup.sh << 'EOF'
#!/bin/bash
BACKUP_DIR="/opt/backup/daily"
DATE=$(date +%Y%m%d)
mkdir -p $BACKUP_DIR
# Onemli konfigurasyonlari yedekle
tar -czf $BACKUP_DIR/etc-$DATE.tar.gz /etc/
tar -czf $BACKUP_DIR/home-$DATE.tar.gz /home/
# 7 gunden eski yedekleri sil
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "Yedekleme tamamlandi: $DATE"
EOF
chmod +x /opt/backup/scripts/system-backup.sh
# Cron ile gecenin 2'sinde calistir
echo "0 2 * * * root /opt/backup/scripts/system-backup.sh >> /var/log/backup.log 2>&1"
> /etc/cron.d/system-backup
Son Kontrol Listesi
Tüm bu adımları uyguladıktan sonra bir kontrol geçişi yap:
# Guvenlik durumu ozeti
echo "=== UFW Durumu ===" && ufw status
echo "=== Fail2ban ===" && fail2ban-client status
echo "=== SSH Servisi ===" && systemctl status sshd --no-pager
echo "=== Sistem Zamani ===" && timedatectl
echo "=== Disk Kullanimi ===" && df -h
echo "=== Memory ===" && free -h
echo "=== Acik Portlar ===" && ss -tlnp
Sonuç
Debian minimal kurulum sonrası bu adımları uygulamak bir kez yapıp unutulacak bir iş değil. Bunları bir runbook haline getir, her yeni sunucu kurduğunda sistematik olarak uygula. Daha da iyisi, Ansible gibi bir otomasyon aracıyla bu adımları kodla ve tekrar eden işleri otomatize et.
En kritik başlıkları özetlersek: SSH sertleştirmesi ve key-based authentication kesinlikle geçilemez bir adım. UFW ve Fail2ban olmadan sunucu doğrudan tehdide açık. Otomatik güvenlik güncellemeleri ihmalkarlığa karşı sigortanı. Zaman dilimi ve log yönetimi ise operasyonel sağlığın temeli.
Bu listeyi bir şablon olarak kullan ama körce kopyalama. Her sunucunun amacı farklı; web sunucusu, veritabanı sunucusu ya da build makinesi için ihtiyaçlar değişiyor. Temel güvenlik ve izleme adımları sabit, ama detaylar senin altyapının gereksinimlerine göre şekillenmeli. Sunucunu tanı, ne yaptığını bil ve her değişikliği belgeле.