← Back to list

Sıfırdan Güvenli Linux Sunucusu Kurulumu (Homelab & VPS): Ubuntu, SSH Hardening ve Firewall

Ev veya küçük bir ofis ortamında Mini PC üzerinde yerel sunucu (homelab) koşturmak son derece popüler bir hobi haline geldi. Ben de kişisel…

Murat Kara · 2026-08-01 17:00 · 0 claps · 6.0 min read
#ubuntu-server #ufw #fail2ban #homelab #vps
Open on Medium ↗
Wiki topics: 🔒 · Cybersecurity 🔓 · Open Source

Sıfırdan Güvenli Linux Sunucusu Kurulumu (Homelab & VPS): Ubuntu, SSH Hardening ve Firewall

Ev veya küçük bir ofis ortamında Mini PC üzerinde yerel sunucu (homelab) koşturmak son derece popüler bir hobi haline geldi. Ben de kişisel developer eğlencem için birçok kere bir şeyler deneyip format atıp sonra tekrar başka şeyler denediğim döngülerden geçtim.

Bu döngüler içinde fark ettiğim en önemli ve en sık yapılan/yaptığım hatalardan biri, “Nasıl olsa sunucum evdeki modem/router arkasında, local ağda duruyor” düşüncesiyle güvenliği tamamen göz ardı etmektir.

Oysa yerel ağdaki cihazlar bile ele geçirilmiş (compromised) bir bilgisayar veya akıllı ev (IoT) cihazı üzerinden hedef alınabilir. Kurumsal bir veri merkezinin aşırı karmaşık protokollerine boğulmadan, bir ev/ofis sunucusunun ihtiyaç duyduğu temel güvenlik katmanlarını (basic hardening) adım adım nasıl uyguladığımı bu yazıda derledim.

1. Temel Katman: Güncel Bir Sistem, Otomatik Yamalar ve Yeni Bir User

Güvenliğin ilk kuralı güncel kalmaktır. Sıfırdan kurduğum Ubuntu Server sisteminde ilk iş olarak paket listelerini yenileyip çekirdek (kernel) ve yazılım güncellemelerini tamamladım:

sudo apt update && sudo apt full-upgrade -y
sudo apt autoremove -y

Sistemdeki kritik güvenlik açıklarının benim manuel müdahaleme gerek kalmadan arka planda otomatik kapanması için unattended-upgrades paketini aktifleştirdim:

sudo apt install unattended-upgrades -y
sudo dpkg-reconfigure --priority=low unattended-upgrades

(Açılan pencerede Yes seçeneğini işaretleyerek kritik güvenlik güncellemelerini otomatike bağladım).

Her şeye Başlamadan Önce Önemli Bir Ön Koşul: Yeni Sudo Kullanıcısı Oluşturmak Eğer sunucunuza root kullanıcısı ile bağlıysanız (örneğin bir bulut VPS kullanıyorsanız), root girişini kapatmadan önce mutlaka yetkili bir standart kullanıcı oluşturmalısınız. (Evde USB ile Ubuntu Server kurduysanız, kurulumda zaten bir kullanıcı oluşturduğunuz için bu adımı atlayabilirsiniz).

Yeni bir kullanıcı oluşturmak ve ona sudo (yönetici) yetkisi vermek için şu komutları kullanın:

# Yeni kullanıcıyı oluşturun (örneğin 'siyah' adında):
adduser siyah

# Kullanıcıyı 'sudo' grubuna ekleyerek yetkilendirin:
usermod -aG sudo siyah

# Yeni kullanıcıya geçiş yapın:
su - siyah

2. SSH Hardening: Şifreleri Çöpe Atmak ve Port Değişikliği

Bir Linux sunucusunun en kritik dış kapısı SSH servisidir. Varsayılan ayarlarla bırakılmış bir SSH, otomatize edilmiş botların ve tarayıcıların birinci hedefidir.

2.A. Şifresiz Bağlantı (Ed25519 SSH Key)

Şifre ile giriş yapmak kaba kuvvet (brute-force) saldırılarına kapı aralar. Bu riski tamamen ortadan kaldırmak için kendi ana bilgisayarımda matematiksel olarak kırılması imkansız kabul edilen bir Ed25519 anahtar çifti kullandım ve açık anahtarı sunucuya gönderdim:

# Kendi bilgisayarımdan sunucuya anahtarımı aktardım:
ssh-copy-id siyah@192.168.1.46

# Şifresiz girişi test ettim:
ssh siyah@192.168.1.46

Burada geçen siyah@192.168.1.46 benim username ve evimdeki mini bilgisarıma modemin dhcp den atanan ip nin kendisi. VPS için direkt onun ip adresi olmalı.

ssh siyah@192.168.1.46 bu bash komutunu tekrar yeni bir terminalde deneyip şifresiz girişin çalıştığını doğruladıktan sonra sunucu tarafındaki /etc/ssh/sshd_config dosyasına girerek şifreli girişleri ve root kullanıcısının doğrudan oturum açmasını tamamen kilitledim:

PasswordAuthentication no
PermitRootLogin no
sudo systemctl reload ssh

Note: Değişikliklerin yansıması için ssh reload gerekli.

⚠️ UYARI: Bu değişiklikleri yapıp SSH servisini yeniden başlatmadan önce, ssh-copy-id ile anahtarınızı başarıyla gönderdiğinizden ve anahtarla giriş yapabildiğinizden emin olun. Aksi takdirde sunucuya erişiminizi tamamen kaybedersiniz (kendinizi dışarı kilitlersiniz).

2.B. Varsayılan Port 22'yi Değiştirmek

Botlar internet genelinde sürekli varsayılan 22. portu ve yaygın tahmin edilen limanları (2222, 52222 vb.) tararlar. Bu durum sunucuda ciddi bir log kirliliğine ve gereksiz sistem yüküne sebep olur. Bu yüzden port kirliliğini engellemek için 57672 gibi özel (dynamic/private) bir port seçtim. Linux’ta geçerli port aralığı 1 ile 65535 arasındadır. 1024 ile 65535 arasında (kullanılmayan) rastgele bir port seçebilirsiniz. Fakat Tavsiyem 49151 sonrasının kullanıma en uygun olan aralıktır. Herhangi bir resmi servise tahsis edilmemiştir diye bir bilgi hafızamda bir yerlerden geliyor. AI a sorarsanız daha detaylı bilgi verir muhtemelen.

Yeni Ubuntu sürümlerinde (Ubuntu 22.04 LTS ve 24.04 LTS) SSH varsayılan olarak systemd socket-activation (ssh.socket) ile çalışır. Bu yapı, traditional sshd_config dosyasındaki Port parametresini bazen ezebilir veya yapılandırmayı karmaşıklaştırabilir. Bu yüzden geleneksel ve güvenilir sshd_config dosyasındaki port ayarımızın doğrudan geçerli olması için öncelikle socket dinleyicisini kapatıp standart servis moduna geçiyoruz.

2.B.1. systemd ssh.socket’i Devre Dışı Bırakın:

Socket yapısını kapatıp varsayılan ssh.service moduna geçiş yapın:

# Socket'i kapatıp geleneksel servise geçiş
sudo systemctl stop ssh.socket
sudo systemctl disable ssh.socket
sudo systemctl enable --now ssh.service

2.B.2. SSH Konfigürasyon Dosyasında Portu Güncelleyin:

SSH yapılandırma dosyasını nano editörü ile açın:

sudo nano /etc/ssh/sshd_config

Dosya içinde #Port 22 yazan satırı bulun. Başındaki # yorum işaretini kaldırın ve port numarasını seçtiğimiz yeni özel port ile değiştirin:

Port 57672

Alternatif İpucu (Ubuntu 24.04+): Ana dosyayı bozmamak için bu kuralı /etc/ssh/sshd_config.d/custom_port.conf adında özel bir dosyaya da Port 52072 şeklinde yazabilirsiniz.

Dosyayı kaydetmek için Ctrl + O -> Enter yapın, çıkmak için Ctrl + X tuşlarına basın.

2.B.3. SSH Servisini Yeniden Başlatın ve Doğrulayın:

Yapılan değişikliklerin geçerli olması için SSH servisini yeniden başlatın ve dinlediği portu doğrulayın:

# SSH servisini yeniden başlatın
sudo systemctl restart ssh
# Servisin 52072 portunu dinlediğini doğrulayın
sudo ss -tulpn | grep ssh

2.B.4. Bağlantıyı Koparmadan Yeni Terminalde Test Edin:

⚠️ Altın Kurallardan Biri: Mevcut SSH oturumunuzu asla kapatmayın!

Bilgisayarınızda yeni bir terminal penceresi açın ve yeni port üzerinden bağlanmayı deneyin:

ssh -p 57672 siyah@192.168.1.46

2.C. Ek SSH Parametreleri

Lynis güvenlik standartları doğrultusunda /etc/ssh/sshd_config dosyasının en altına şu sıkılaştırma parametrelerini ekledim:

MaxAuthTries 3
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
ClientAliveCountMax 2
LogLevel VERBOSE

Artık sunucuma bağlanırken şu komutu kullanıyorum:

ssh -p 57672 siyah@192.168.1.46

3. Ağ ve İhlal Koruması: UFW, Fail2ban ve Zaman Senkronizasyonu

3.A. UFW Güvenlik Duvarı

UFW (Uncomplicated Firewall) üzerinde “Varsayılan olarak gelen tüm trafiği engelle, sadece belirlediğim portu aç” mantığını uyguladım. Port kilitlenmesi yaşamamak için önce yeni SSH portuma izin verip ardından duvarı aktifleştirdim:

3.A.3. Güvenlik Duvarında (UFW) Yükleyin ve Yeni Porta İzin Verin: Sisteminizde UFW kurulu değilse aşağıdaki komutlarla yükleyin:

sudo apt install ufw -y

3.A.1. SSH Erişimine İzin Verin: KRİTİK ADIM: Güvenlik duvarını açmadan önce SSH’a izin vermelisiniz!.

Güvenlik duvarını aktifleştirmeden önce SSH bağlantısına izin vermezseniz sunucu erişiminiz kilitlenir.

sudo ufw allow ssh

(Önceden port değişikliğini uyguladık. Eğer o adımı yaptıysanız ve varsayılan 22 portu dışında farklı bir SSH portu kullanıyorsanız, örneğin 2222: sudo ufw allow 2222/tcp yazmalısınız.)

3.A.2. Temel Trafik Politikalarını Belirleyin: Gelen trafiği engelleyip giden trafiğe izin verin.

En güvenli temel yaklaşım; dışarıdan gelen tüm istekleri engellemek, sunucudan dışarı çıkan isteklere izin vermektir:

sudo ufw default deny incoming
sudo ufw default allow outgoing

3.A.3.İhtiyacınız Olan Diğer Portlara İzin Verin: Web sunucusu veya diğer servisler için.

Sunucunuzda web sitesi yayınlayacaksanız HTTP ve HTTPS portlarını açabilirsiniz:

sudo ufw allow http   # Port 80
sudo ufw allow https  # Port 443

3.A.4. UFW’yi Aktifleştirin: Güvenlik duvarını başlatın.

Tüm kuralları tanımladıktan sonra UFW’yi etkinleştirin:

sudo ufw enable

Ekrana gelen onay uyarısına y yazıp Enter'a basın.

3.B. Fail2ban Yapılandırması

Açık bıraktığım 57672. porta yapılabilecek olası saldırıları anlık izlemek için

apt install fail2ban -y

komutu ile Fail2ban kurdum. Sistem güncellemelerinde sıfırlanmaması adına orijinal jail.conf dosyasına dokunmayarak ayarlarımı jail.local dosyasında tanımladım:

# Önce orijinal dosyayı kopyalayarak jail.local oluşturalım:
sudo touch /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
banaction = ufw
backend = auto

[sshd]
enabled = true
port    = 57672
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Bu yapılandırma ile 10 dakika içinde 5 kez hatalı şifre/anahtar denemesi yapan bir IP adresi, UFW üzerinden 1 saat boyunca otomatik olarak bloklanıyor.

Yapılandırma sonrasında sistemi tekrar yenilemek gerekli:

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

3.C. Saat Senkronizasyonu (NTP)

Fail2ban’in log dosyalarını doğru zaman damgasıyla okuyabilmesi için sistem saat senkronizasyonunu doğruladım:

sudo systemctl restart systemd-timesyncd
sudo timedatectl set-ntp true

4. Güvenlik Analizi ve Test: Lynis İle Sıfır Uyarıya Ulaşmak

Yapılan sıkılaştırma adımlarının doğruluğunu test etmek için Linux dünyasının en popüler güvenlik tarama aracı Lynis’i çalıştırdım:

sudo apt install lynis -y
sudo lynis audit system

Lynis; çekirdek parametrelerinden dosya izinlerine, ağ servislerinden SSH konfigürasyonuna kadar 250'den fazla noktayı denetledi. Yaptığım düzeltmelerin ardından tarama sonucu şu şekilde çıktı:

  • Warnings (Uyarılar): 0
  • Hardening Index (Güvenlik Skoru): 70

Neden 70 Skoru Ve 0 Uyarı İdealdir?

Lynis, devasa kurumsal veri merkezlerinin standartlarına göre puanlama yapar. Örneğin sistem klasörlerini (/tmp, /var, /home) ayrı fiziksel disklere bölmek veya GRUB ön yükleyicisine şifre koymak puanı 80+ seviyelerine çıkarabilir; ancak evdeki bir Mini PC için bu adımlar sadece karmaşıklık getirir. 0 Uyarı ve 69 Puan, ev/ofis ortamında kullanılabilirliği bozmadan ulaşılabilecek en ideal standart sayılabilir.

Özet ve Güvenlik Mimarisi

Bu çalışma sonucunda Mini PC üzerinde aşamalı bir güvenlik katmanı (Defense in Depth) oluşturmuş oldum:

  • Erişim Güvenliği: Ed25519 SSH Key (PasswordAuthentication no)Kaba kuvvet (brute-force) şifre saldırıları imkansız hale geldi.
  • Ağ Gizliliği: Özel SSH Portu (57672)Varsayılan 22. portu tarayan otomatik botların radardan çıkıldı.
  • Ağ Filtreleme: UFW Firewall (Default: deny)İhtiyaç duyulmayan tüm giriş portları tamamen kilitlendi.
  • Saldırı Önleme: Fail2ban (banaction = ufw)Şüpheli hareket gösteren IP'ler otomatik olarak banlanıyor.
  • Bakım & Analiz: Unattended-Upgrades & Lynis AuditGüvenlik yamaları otomatize edildi, sistem 0 uyarı ile doğrulandı.

Kendi sunucunuzu yönetirken güvenlik adımını en baştan sağlam atmak, ileride üzerine kuracağınız servislerin (Docker, Web Sunucuları, Veritabanları) çok daha stabil ve güvende çalışmasını sağlar.


메타데이터
post_id
3f8ea832144f
slug
sıfırdan-güvenli-linux-sunucusu-kurulumu-homelab-vps-ubuntu-ssh-hardening-ve-firewall-3f8ea832144f
url
https://medium.com/@murat-kara/s%C4%B1f%C4%B1rdan-g%C3%BCvenli-linux-sunucusu-kurulumu-homelab-vps-ubuntu-ssh-hardening-ve-firewall-3f8ea832144f
canonical_url
https://medium.com/@murat-kara/s%C4%B1f%C4%B1rdan-g%C3%BCvenli-linux-sunucusu-kurulumu-homelab-vps-ubuntu-ssh-hardening-ve-firewall-3f8ea832144f
author_url
https://medium.com/@murat-kara
status
ok
fetched_at
2026-09-07 21:27:04