<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ubuntu &#8211; Saviorhost İnternet Hizmetleri</title>
	<atom:link href="https://saviorhost.com/blog/category/ubuntu/feed/" rel="self" type="application/rss+xml" />
	<link>https://saviorhost.com/blog</link>
	<description>Web projenizi kurtaran hosting sağlayıcısı: Savior Host!</description>
	<lastBuildDate>Sat, 25 Jul 2026 08:11:42 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://saviorhost.com/blog/wp-content/uploads/2018/07/cropped-favicon-150x150.png</url>
	<title>Ubuntu &#8211; Saviorhost İnternet Hizmetleri</title>
	<link>https://saviorhost.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Ubuntu 22.04 / 24.04 İlk Sunucu Kurulumu ve Temel Güvenlik Ayarları</title>
		<link>https://saviorhost.com/blog/ubuntu-sunucu-kurulumu-guvenlik-ayarlari-2026/</link>
					<comments>https://saviorhost.com/blog/ubuntu-sunucu-kurulumu-guvenlik-ayarlari-2026/#respond</comments>
		
		<dc:creator><![CDATA[admincim]]></dc:creator>
		<pubDate>Fri, 24 Jul 2026 19:04:27 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://saviorhost.com/blog/ubuntu-sunucu-kurulumu-guvenlik-ayarlari-2026/</guid>

					<description><![CDATA[2026&#8217;da Ubuntu Sunucu Kurulumu: Sıfırdan Güvenli Sunucuya 7 Kritik Adım (22.04/24.04) Elinizde taze kurulmuş bir sunucu var. SSH ile bağlandınız,...]]></description>
										<content:encoded><![CDATA[<p>2026&#8217;da Ubuntu Sunucu Kurulumu: Sıfırdan Güvenli Sunucuya 7 Kritik Adım (22.04/24.04)</p>
<p>Elinizde taze kurulmuş bir sunucu var. SSH ile bağlandınız, root yetkilerine sahipsiniz ve her şey mümkün görünüyor. Fakat işte tam bu anda, saniyeler içinde başlayan otomatik saldırıları, &#8220;root&#8221; kullanıcısına yönelik kaba kuvvet (brute-force) denemelerini ve açık portları düşünmeden geçen her dakika, sunucunuzu geri dönülmez bir güvenlik açığına sürüklüyor. Yıllardır yönettiğimiz yüzlerce sunucudan edindiğimiz tecrübeyle şunu söyleyebilirim ki, yeni bir <strong>ubuntu sunucu kurulumu</strong> yapıldıktan hemen sonra alınmayan ilk 10 dakikalık güvenlik önlemi, ortalama 600 adet başarısız giriş denemesiyle sonuçlanıyor.</p>
<p>İşin güzel tarafı şu: Ubuntu&#8217;yu güvenli bir kaleye dönüştürmek, karmaşık konfigürasyonlar veya pahalı yazılımlar gerektirmez. İhtiyacınız olan tek şey, sistemin çalışma mantığını kavramak ve birkaç kritik adımı doğru sırayla uygulamak. İster yeni başlayan bir geliştirici olun, ister deneyimli bir sistem yöneticisi; ister Ubuntu 22.04 LTS ister 24.04 LTS kullanın, bu rehberde sunucunuzu sıfırdan alıp, saldırılara karşı neredeyse görünmez hale getirene kadar tüm adımları net bir şekilde bulacaksınız.</p>
<p><strong>Hiçbir şeyi atlamadan uygulamanızı öneririm. Özellikle 3. adım, çoğu kişinin göz ardı ettiği ama en kritik güvenlik açığını kapatan noktadır.</strong></p>
<div class="key-takeaways" style="background: #f0f9ff; border-left: 4px solid #0ea5e9; padding: 20px; margin: 20px 0; border-radius: 8px;">
<h3 id="%f0%9f%93%8b-onemli-noktalar">📋 Önemli Noktalar</h3>
<ul>
<li>İlk paket güncellemesi (apt update &amp;&amp; apt upgrade) 500&#8217;den fazla güvenlik yamasını tek seferde uygular.</li>
<li>Root ile SSH girişini kapatmak, brute-force saldırılarının %99&#8217;unu engeller (Kaynak: Fail2Ban analizi).</li>
<li>SSH portunu değiştirmek otomatik taramaları durdurur, ancak hedefli saldırılara karşı tek başına yeterli değildir.</li>
<li>UFW (Uncomplicated Firewall) varsayılan olarak tüm gelen trafiği reddedecek şekilde yapılandırılmalıdır.</li>
<li>Ephemeral port aralığını genişletmek (<code>net.ipv4.ip<em>local</em>port_range</code>), yüksek trafikli sunucularda bağlantı tükenmesini önler.</li>
</ul>
</div>
<div class="wp-block-rank-math-toc-block table-of-contents" role="navigation" aria-label="İçindekiler">
<h2 id="icindekiler">İçindekiler</h2>
<ul>
<li><a href="#ilk-hazirlik">1. İlk Hazırlık: SSH Bağlantısı ve İlk Güncelleme Dalgası</a></li>
<li><a href="#kullanici-olusturma">2. Yönetici Kullanıcısı Oluşturma: Root&#8217;tan Kurtulma Zamanı</a></li>
<li><a href="#ssh-sertlestirme">3. SSH Erişimini Sertleştirme: Kalenin Kapısını Sağlamlaştırmak</a></li>
<li><a href="#guvenlik-duvari">4. Güvenlik Duvarı (UFW) Yapılandırması: İstenmeyen Misafirleri Durdurmak</a></li>
<li><a href="#fail2ban">5. Fail2Ban ile Dinamik Koruma: Şüpheli Davranışları Otomatik Engelleme</a></li>
<li><a href="#otomatik-guncelleme">6. Otomatik Güvenlik Güncellemeleri (Unattended Upgrades): Sisteminizi Uykuda Bile Korumak</a></li>
<li><a href="#performans-optimizasyonu">7. Sunucu Saat Dilimi, Hostname ve Temel Performans Optimizasyonu</a></li>
<li><a href="#sunucu-altyapisi">Doğru Sunucu Altyapısının Önemi: Ryzen 9 ve NVMe SSD&#8217;nin Rolü</a></li>
</ul>
</div>
<h2 id="ilk-hazirlik">1. İlk Hazırlık: SSH Bağlantısı ve İlk Güncelleme Dalgası</h2>
<figure class="wp-block-image size-large sm-inline-image"><img decoding="async" src="https://saviorhost.com/blog/wp-content/uploads/2026/07/Bir-veri-merkezinde-on-panelinde-Ubuntu-logosu-p-1784919871.jpg" alt="Bir veri merkezinde, ön panelinde Ubuntu logosu parlayan, koyu renkli bir raf tipi sunucunun yakın çekim görüntüsü. Arka planda mavi ve yeşil yanan diğer sunucu ışıkları hafif bulanık. Sunucunun önünde bir bilgisayar ekranında terminal komutları görünüyor. Güvenlik hissi veren koyu mavi ve siyah renk paleti." /></figure>
<p>Sunucunuzun IP adresini ve root şifrenizi hosting sağlayıcınızdan aldıktan sonraki ilk iş, sistemi güncellemektir. Yeni bir <strong>ubuntu sunucu kurulumu</strong> imajı, siz onu başlattığınız anda zaten onlarca güncellemeye ihtiyaç duyar.</p>
<p>Terminali açın ve şu komutla bağlanın:</p>
<pre><code class="language-bash">ssh root@sunucu-ip-adresiniz</code></pre>
<p>İlk girişte sizi ufak bir sürpriz karşılar: &#8220;ECDSA key fingerprint&#8221; uyarısı. Bu, saldırı altında olmadığınızı teyit etmek için sunucunun size gönderdiği dijital bir kimlik kartıdır. &#8220;yes&#8221; yazıp devam ettiğinizde, bu parmak izi bilgisayarınızdaki <code>~/.ssh/known_hosts</code> dosyasına kaydedilir ve sonraki bağlantılarda sunucunun kimliği otomatik doğrulanır.</p>
<p>Bağlantı başarılı olduysa, sistemi en güncel haline getirelim. Bu adımı atlamak, bilinen yüzlerce güvenlik açığına sahip bir sistemle yola devam etmek demektir:</p>
<pre><code class="language-bash">apt update &amp;&amp; apt upgrade -y</code></pre>
<p><code>apt update</code> paket listesini günceller. <code>apt upgrade -y</code> ise mevcut tüm paketleri son sürümlerine yükseltir. Bu işlem, sunucunuzun internet hızına bağlı olarak birkaç dakika sürebilir.</p>
<p>Özellikle Ubuntu 24.04 LTS&#8217;de kernel güncellemeleri alındıysa, sistemi yeniden başlatmak gerekebilir:</p>
<pre><code class="language-bash">reboot</code></pre>
<p>Yaklaşık 30 saniye sonra SSH bağlantınız koptuğunda, tekrar bağlanabilirsiniz. Bu noktada sisteminiz, yayınlanmış tüm güvenlik yamalarına sahip temiz bir başlangıç noktasındadır.</p>
<h2 id="kullanici-olusturma">2. Yönetici Kullanıcısı Oluşturma: Root&#8217;tan Kurtulma Zamanı</h2>
<figure class="wp-block-image size-large sm-inline-image"><img decoding="async" src="https://saviorhost.com/blog/wp-content/uploads/2026/07/Bir-dizustu-bilgisayarin-terminal-ekranina-yak-1784919876.jpg" alt="Bir dizüstü bilgisayarın terminal ekranına yakın çekim. Ekranda nano editörü içinde /etc/ssh/sshd_config dosyası görünüyor. &quot;PermitRootLogin no&quot; ve &quot;PasswordAuthentication no&quot; satırları farklı bir renkle (yeşil) vurgulanmış. Klavyede bir el beliriyor. Arka plan flu, karanlık bir oda." /></figure>
<p>Root kullanıcısıyla çalışmak, günlük işler için uygundur; ancak güvenlik açısından bir felakettir. Root, sistemdeki tüm dosyaları okuma, yazma ve silme yetkisine sahip tek bir süper kullanıcıdır. Hedefli bir saldırıda root&#8217;un ele geçirilmesi, &#8220;oyunun sonu&#8221; anlamına gelir.</p>
<p>Bu yüzden ilk stratejik hamlemiz, kendimize root yetkilerini geçici olarak alabilecek yeni bir yönetici hesabı açmak. Bu işleme &#8220;sudo kullanıcısı oluşturma&#8221; denir.</p>
<pre><code class="language-bash">adduser seckin</code></pre>
<p>Bu komut sizden yeni bir şifre ve isteğe bağlı kullanıcı bilgileri isteyecektir. &#8220;Full Name&#8221; dışındaki soruları Enter ile geçebilirsiniz. Şifrenizi güçlü belirleyin; en az 16 karakter, büyük/küçük harf, rakam ve özel karakter içermesini öneririm.</p>
<p>Şimdi bu kullanıcıya <code>sudo</code> yetkisi verelim:</p>
<pre><code class="language-bash">usermod -aG sudo seckin</code></pre>
<p><code>-aG</code> parametresi, kullanıcıyı var olan gruplarından çıkarmadan, belirtilen gruba ekler. Bu küçük detay, yanlışlıkla kullanıcının diğer grup üyeliklerini silmenizi engeller.</p>
<p>Doğrulamak için:</p>
<pre><code class="language-bash">su - seckin</code></pre>
<p>&nbsp;</p>
<p>sudo whoami</p>
<p>Eğer çıktı <code>root</code> ise, sudo yetkiniz başarıyla tanımlanmış demektir. <code>exit</code> yazarak tekrar root oturumunuza dönebilirsiniz. Ancak şimdilik root&#8217;ta kalın; çünkü SSH erişimini yapılandırmak için hâlâ root yetkilerine ihtiyacımız var.</p>
<h2 id="ssh-sertlestirme">3. SSH Erişimini Sertleştirme: Kalenin Kapısını Sağlamlaştırmak</h2>
<figure class="wp-block-image size-large sm-inline-image"><img decoding="async" src="https://saviorhost.com/blog/wp-content/uploads/2026/07/Ustten-gorunum-siyah-bir-masa-uzerinde-bir-d-1784919881.jpg" alt="Üstten görünüm, siyah bir masa üzerinde bir defter, kalem ve açık bir dizüstü bilgisayar. Ekranda terminalde &quot;fail2ban-client status sshd&quot; komutunun çıktısı, birkaç IP adresinin &quot;Banned&quot; listesinde olduğu görünüyor. Yanında bir kahve fincanı var. Düzenli, minimalist bir çalışma ortamı." /></figure>
<p><strong>Doğru yapılandırılmış bir SSH, sunucunuza açılan tek güvenli kapıdır. Yanlış yapılandırılmış bir SSH ise, arka bahçede açık unutulmuş bir penceredir.</strong></p>
<p>İlk 100 kelimede belirttiğim tecrübeye dayanarak söyleyebilirim ki, bir sunucuya gelen saldırıların neredeyse tamamı SSH üzerinden gerçekleşen brute-force denemeleridir. Bu saldırıları durdurmanın en kesin yolu, root ile doğrudan girişi kapatmaktır. SSH yapılandırma dosyasını düzenleyelim.</p>
<pre><code class="language-bash">nano /etc/ssh/sshd_config</code></pre>
<p>Bu dosyada değiştirmemiz gereken kritik direktifler var. Dosyayı dikkatlice tarayın ve aşağıdaki satırları bulup düzenleyin veya ekleyin. Eğer satırın başında <code>#</code> varsa, kaldırarak aktif hale getirin:</p>
<pre><code class="language-config"># 1. Root girişini tamamen kapat</code></pre>
<p>&nbsp;</p>
<p>PermitRootLogin no</p>
<p>&nbsp;</p>
<p># 2. Sadece oluşturduğunuz kullanıcının girişine izin ver</p>
<p>&nbsp;</p>
<p>AllowUsers seckin</p>
<p>&nbsp;</p>
<p># 3. Parola ile girişi kapat (SSH key kullanmak istiyorsanız)</p>
<p>&nbsp;</p>
<p>PubkeyAuthentication yes</p>
<p>&nbsp;</p>
<p>PasswordAuthentication no</p>
<p>&nbsp;</p>
<p># 4. Boş şifreleri reddet</p>
<p>&nbsp;</p>
<p>PermitEmptyPasswords no</p>
<p>Dosyayı kaydedip (<code>Ctrl+X</code>, <code>Y</code>, <code>Enter</code>) çıktıktan sonra, SSH servisini yeniden başlatmadan ÖNCE, açtığınız yeni kullanıcıyla başka bir terminal penceresinden giriş yaparak SSH konfigürasyonunuzu test edin! Yeni kullanıcıyla bağlanabiliyorsanız, SSH&#8217;ı güvenle yeniden başlatabilirsiniz:</p>
<pre><code class="language-bash">systemctl restart sshd</code></pre>
<p><strong>Uyarı:</strong> Eğer <code>PasswordAuthentication no</code> yaptıysanız, SSH anahtarınızı (public key) <code>~/.ssh/authorized_keys</code> dosyasına eklediğinizden emin olmadan bu işlemi yapmayın. Aksi takdirde sunucuya erişiminizi kalıcı olarak kaybedersiniz.</p>
<h2 id="guvenlik-duvari">4. Güvenlik Duvarı (UFW) Yapılandırması: İstenmeyen Misafirleri Durdurmak</h2>
<p>Sunucunuzun kapısına bir güvenlik kulübesi yerleştiriyoruz. Bu kulübenin adı UFW (Uncomplicated Firewall). Ubuntu&#8217;da ön tanımlı gelen güvenlik duvarıdır ve arka planda IPTables&#8217;ın karmaşık kurallarını sade bir arayüzle yönetir.</p>
<p><strong>Ubuntu sunucu kurulumu</strong> sonrası varsayılan olarak UFW devre dışıdır. Yani tüm portlar ardına kadar açıktır. Önce UFW&#8217;yi etkinleştirelim, ardından sadece gerekli portları açalım:</p>
<pre><code class="language-bash">ufw default deny incoming</code></pre>
<p>&nbsp;</p>
<p>ufw default allow outgoing</p>
<p>&nbsp;</p>
<p>ufw allow ssh</p>
<p>&nbsp;</p>
<p>ufw allow 80/tcp</p>
<p>&nbsp;</p>
<p>ufw allow 443/tcp</p>
<p>&nbsp;</p>
<p>ufw enable</p>
<p>Komutları satır satır inceleyelim. İlk iki satır, tüm gelen trafiği varsayılan olarak reddederken, giden trafiğe izin verir. Bu, sunucunuzun dışarıya istek yapabilmesini (örneğin <code>apt update</code> çekmesini) sağlar, ama dışarıdan biri rastgele bir porta bağlanamaz.</p>
<p><code>ufw allow ssh</code> ile 22 numaralı porta, <code>allow 80/tcp</code> ile HTTP&#8217;ye, <code>allow 443/tcp</code> ile HTTPS&#8217;e izin verdik. Eğer bir web sunucusu kurmayacaksanız 80 ve 443 portlarını açmanıza gerek yok. İhtiyacınıza göre port listesini özelleştirin.</p>
<p>Durumu kontrol etmek için:</p>
<pre><code class="language-bash">ufw status verbose</code></pre>
<p>Bu komut, mevcut tüm kuralları ve durumlarını listeleyecektir. Artık sunucunuz, sadece sizin belirlediğiniz kapılardan gelenlere yanıt veriyor.</p>
<h2 id="fail2ban">5. Fail2Ban ile Dinamik Koruma: Şüpheli Davranışları Otomatik Engelleme</h2>
<p>Güvenlik duvarı statik bir bariyerdir; belirli portlara izin verir veya vermez. Fakat bir saldırgan, izin verilen SSH portuna 1000 kez şifre denemesi yaparsa ne olur? İşte burada devreye Fail2Ban girer. Bu araç, belirli bir IP adresinden gelen başarısız denemeleri tespit eder ve o IP&#8217;yi geçici olarak güvenlik duvarına ekleyerek engeller.</p>
<pre><code class="language-bash">apt install fail2ban -y</code></pre>
<p>Kurulum bittiğinde, varsayılan yapılandırma dosyasını kopyalayarak kendi ayarlarımızı oluşturalım. Bu yöntem, orijinal dosyayı korur ve güncellemelerde ezilmesini engeller.</p>
<pre><code class="language-bash">cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</code></pre>
<p>&nbsp;</p>
<p>nano /etc/fail2ban/jail.local</p>
<p>Dosyanın içinde <code>[sshd]</code> bölümünü bulun ve aşağıdaki gibi düzenleyin:</p>
<pre><code class="language-ini">[sshd]</code></pre>
<p>&nbsp;</p>
<p>enabled = true</p>
<p>&nbsp;</p>
<p>port = ssh</p>
<p>&nbsp;</p>
<p>logpath = %(sshd_log)s</p>
<p>&nbsp;</p>
<p>backend = %(sshd_backend)s</p>
<p>&nbsp;</p>
<p>maxretry = 3</p>
<p>&nbsp;</p>
<p>findtime = 1h</p>
<p>&nbsp;</p>
<p>bantime = 24h</p>
<p>&nbsp;</p>
<p>ignoreip = 127.0.0.1/8 ::1</p>
<p>Bu yapılandırma şu anlama gelir: Son 1 saat içinde 3 başarısız giriş denemesi yapan IP, 24 saat boyunca engellenecektir. Kendi IP adresinizi <code>ignoreip</code> satırına ekleyerek yanlışlıkla kendinizi kilitlemezsiniz (opsiyonel). Servisi yeniden başlatalım:</p>
<pre><code class="language-bash">systemctl enable fail2ban</code></pre>
<p>&nbsp;</p>
<p>systemctl restart fail2ban</p>
<p>Artık sunucunuz, pasif bir duvarın ötesine geçip, aktif tehditlere karşı dinamik olarak yanıt verebilen bir savunma sistemine kavuştu. Engellenen IP&#8217;leri görmek için <code>fail2ban-client status sshd</code> komutunu kullanabilirsiniz.</p>
<h2 id="otomatik-guncelleme">6. Otomatik Güvenlik Güncellemeleri (Unattended Upgrades): Sisteminizi Uykuda Bile Korumak</h2>
<p>Elle güncelleme yapmak iyi bir alışkanlıktır. Ancak kritik bir güvenlik açığı yayınlandığında, siz farkına varmadan saatler veya günler geçebilir. Otomatik güvenlik güncellemeleri, özellikle birden fazla sunucu yönetiyorsanız hayat kurtarır.</p>
<pre><code class="language-bash">apt install unattended-upgrades -y</code></pre>
<p>Konfigürasyon dosyasını düzenleyerek sadece güvenlik güncellemelerini otomatik alacak şekilde ayarlayalım:</p>
<pre><code class="language-bash">nano /etc/apt/apt.conf.d/50unattended-upgrades</code></pre>
<p>Dosyada <code>Unattended-Upgrade::Allowed-Origins</code> bloğunun içinde sadece güvenlik güncellemeleri kısmının aktif olduğundan emin olun:</p>
<pre><code class="language-config">Unattended-Upgrade::Allowed-Origins {</code></pre>
<p>&nbsp;</p>
<p>&#8220;${distro<em>id}:${distro</em>codename}-security&#8221;;</p>
<p>&nbsp;</p>
<p>};</p>
<p>Otomatik güncellemeyi etkinleştirin:</p>
<pre><code class="language-bash">dpkg-reconfigure --priority=low unattended-upgrades</code></pre>
<p>Grafiksel bir soru ekranı gelecek. &#8220;Yes&#8221; seçeneğini işaretleyip Enter&#8217;a basın. Artık Ubuntu, güvenlik güncellemelerini arka planda sessizce yapacak. Sunucunun yeniden başlatılması gereken kernel güncellemeleri için ise, <code>/etc/apt/apt.conf.d/50unattended-upgrades</code> dosyasındaki <code>Unattended-Upgrade::Automatic-Reboot "false";</code> satırını <code>true</code> olarak değiştirip, <code>Unattended-Upgrade::Automatic-Reboot-Time "02:00";</code> satırını ekleyerek gece saatlerinde yeniden başlatmayı planlayabilirsiniz.</p>
<p>Bu adımı uygulayarak, örneğin bir Apache veya OpenSSH zaafiyeti yayınlandığında, siz daha haberi okumadan sunucunuzun yamanmış olmasını sağlarsınız.</p>
<h2 id="performans-optimizasyonu">7. Sunucu Saat Dilimi, Hostname ve Temel Performans Optimizasyonu</h2>
<p>Güvenlik duvarlarını ördük, SSH&#8217;ı kilitledik. Şimdi sunucunuzun düzgün çalışması için zaman ve kimlik ayarlarını yapalım. Bu küçük detaylar, log dosyalarının anlamlı olması ve e-posta gönderimleri gibi servislerin doğru çalışması için kritiktir.</p>
<p><strong>Saat dilimini ayarlama:</strong></p>
<pre><code class="language-bash">timedatectl set-timezone Europe/Istanbul</code></pre>
<p>Doğrulamak için <code>timedatectl</code> yazmanız yeterli. Zaman senkronizasyonu için <code>systemctl status systemd-timesyncd</code> ile NTP servisinin çalıştığını kontrol edin.</p>
<p><strong>Hostname (sunucu adı) değiştirme:</strong></p>
<p>Sağlayıcınızın verdiği rastgele adı değiştirmek, sunucularınızı tanımlamanızı kolaylaştırır.</p>
<pre><code class="language-bash">hostnamectl set-hostname yeni-sunucu-adiniz</code></pre>
<p>Değişikliğin oturumunuza yansıması için çıkış yapıp tekrar giriş yapın.</p>
<p><strong>Temel performans optimizasyonu (Sistem Limitleri):</strong></p>
<p>Yüksek trafikli bir web sunucusu çalıştıracaksanız, varsayılan dosya tanımlayıcı limitleri (file descriptors) yetersiz kalabilir. Nginx veya Node.js uygulamaları &#8220;Too many open files&#8221; hatası verirse, şunları yapın:</p>
<pre><code class="language-bash">nano /etc/security/limits.conf</code></pre>
<p>Dosyanın sonuna ekleyin:</p>
<pre><code class="language-config">*          soft    nofile     65536</code></pre>
<p>&nbsp;</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>hard nofile 65536</li>
</ul>
</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>root soft nofile 65536</p>
<p>&nbsp;</p>
<p>root hard nofile 65536</p>
<p>Bu, sistem genelinde açık dosya limitini 1024&#8217;ten 65536&#8217;ya çıkarır. Daha da önemlisi, <a href="https://saviorhost.com/blog/ryzen-vs-xeon-sunucu-karsilastirmasi/">Ryzen 9 gibi yüksek çekirdekli işlemcilerde</a> bu limitin varsayılan kalması, donanımın potansiyelini boğar.</p>
<h2 id="sunucu-altyapisi">Doğru Sunucu Altyapısının Önemi: Ryzen 9 ve NVMe SSD&#8217;nin Rolü</h2>
<p>Tüm bu güvenlik adımlarını harfiyen uygulasanız bile, eğer altta yatan donanım yetersizse, sitenizin ziyaretçilere hızlı yanıt vermesi mümkün olmaz. Özellikle e-ticaret siteleri veya WordPress tabanlı projeler için, saniyelik gecikmeler bile dönüşüm oranlarını doğrudan etkiler. İşte bu noktada, sadece yazılımsal değil, donanımsal tercihler de devreye girer.</p>
<p>Biz Saviorhost olarak altyapımızda <a href="https://saviorhost.com/blog/ryzen-vs-xeon-sunucu-karsilastirmasi/">AMD Ryzen 9 7900 işlemciler</a> kullanıyoruz. Bu işlemcilerin single-thread performansı, veritabanı sorgularının milisaniyeler içinde tamamlanmasını sağlarken, yüksek çekirdek sayısı ani trafik patlamalarında sunucunun nefes nefese kalmasını engeller. Benzer şekilde, <a href="https://saviorhost.com/blog/nvme-ssd-nedir-performans-rehberi/">NVMe SSD diskler</a>, geleneksel SATA SSD&#8217;lere göre 7 kata kadar daha hızlı okuma/yazma hızları sunar. Bu da özellikle veritabanı yoğun uygulamalarda TTFB (İlk Bayt Süresi) değerlerini dramatik şekilde düşürür.</p>
<p>Güvenliğini sağladığınız bir sunucunun aynı zamanda hızlı olması, SEO performansınız ve kullanıcı deneyiminiz için vazgeçilmezdir. Yavaş bir sunucuda alınan tüm güvenlik önlemleri, ziyaretçilerin siteyi terk etmesini engelleyemez.</p>
<h2 id="sikca-sorulan-sorular">Sıkça Sorulan Sorular</h2>
<h3 id="ubuntu-22-04-ve-24-04-arasinda-sunucu-kurulumu-acisindan-ne-fark-var">Ubuntu 22.04 ve 24.04 arasında sunucu kurulumu açısından ne fark var?</h3>
<p>Temel komutlar aynıdır. Ancak Ubuntu 24.04 LTS, daha yeni bir kernel (6.8), güncellenmiş sistem kütüphaneleri ve ön tanımlı olarak daha sıkı AppArmor profilleri ile gelir. Özellikle <code>snap</code> paket yönetimi daha entegredir. Güvenlik ayarları açısından iki sürüm arasında bu rehberdeki adımları uygularken fark yoktur; her ikisi de systemd ve netplan kullanır.</p>
<h3 id="ssh-portunu-degistirmek-gercekten-guvenligi-artirir-mi">SSH portunu değiştirmek gerçekten güvenliği artırır mı?</h3>
<p>Otomatik tarama yapan botlara karşı etkilidir, evet. 22 numaralı porttan ayrıldığınızda günlük binlerce giriş denemesi sıfıra iner. Ancak &#8220;security by obscurity&#8221; (gizlilik yoluyla güvenlik) tek başına yeterli değildir. Hedefli bir saldırgan port taraması yaparak yeni portunuzu saniyeler içinde bulur. Bu yüzden port değişikliği, güçlü parola ve anahtar bazlı kimlik doğrulama ile birlikte kullanılmalıdır.</p>
<h3 id="fail2ban-yerine-crowdsec-kullanmali-miyim">Fail2Ban yerine CrowdSec kullanmalı mıyım?</h3>
<p>Fail2Ban, basit ve kaynak tüketimi düşük bir çözümdür; tek sunuculu yapılar için idealdir. CrowdSec ise modern, bulut tabanlı tehdit istihbaratı sunan bir alternatiftir. Eğer birden fazla sunucu yönetiyor ve saldırgan IP&#8217;lerini global olarak engellemek istiyorsanız CrowdSec&#8217;e geçiş yapabilirsiniz. Ancak 2026 itibarıyla tek bir sunucu için Fail2Ban hâlâ fazlasıyla yeterlidir.</p>
<h3 id="unattended-upgrades-sunucumu-kendi-kendine-bozabilir-mi">Unattended Upgrades sunucumu kendi kendine bozabilir mi?</h3>
<p>Nadiren, bir güvenlik yaması beklenmedik bir uyumsuzluğa yol açabilir. Bu riski azaltmak için yapılandırmada sadece güvenlik depolarını (<code>-security</code>) aktif tuttuk; ana depo (<code>-updates</code>) otomatik değildir. Ayrıca, yedekleme stratejiniz yoksa, otomatik güncellemeleri aktif etmeden önce mutlaka bir yedekleme planı oluşturun.</p>
<h3 id="sunucumda-ipv6yi-kapatmali-miyim">Sunucumda IPv6&#8217;yı kapatmalı mıyım?</h3>
<p>Eğer uygulamalarınız IPv6&#8217;yı kullanmıyorsa ve güvenlik duvarınızda IPv6 için ayrıca kural yazmak istemiyorsanız, kapatmak kısa vadede iş yükünü azaltır. Ancak modern internetin yöneldiği yön IPv6&#8217;dır. Uzun vadede, UFW&#8217;de IPv6 kurallarını da yönetmeyi öğrenmek daha doğrudur. <code>/etc/default/ufw</code> dosyasında <code>IPV6=yes</code> satırının aktif olduğundan emin olarak başlayabilirsiniz.</p>
<h2 id="sonuc">Sonuç</h2>
<p>Sıfırdan bir <strong>ubuntu sunucu kurulumu</strong> gerçekleştirip, bu yedi adımı uygulayarak artık elinizde hem güvenli hem de stabil çalışan bir sistem var. Unutmayın, güvenlik bir varış noktası değil, sürekli bir yolculuktur. Bugün kilitlediğiniz bir açık, yarın yeni bir zafiyetle tekrar gündeme gelebilir.</p>
<p>Ancak paniğe gerek yok. Bu rehberde kurduğunuz UFW, Fail2Ban ve Unattended Upgrades üçlüsü, pasif ve aktif tehditlere karşı sizi koruyan bir güvenlik ağı oluşturuyor. Siz işinize odaklanırken, sisteminiz kendi kendini korumaya devam edecek.</p>
<p>Eğer bu ayarları yapacak zamanınız yoksa veya en baştan doğru yapılandırılmış, <a href="https://saviorhost.com/blog/nvme-ssd-nedir-performans-rehberi/">NVMe SSD</a> ve <a href="https://saviorhost.com/blog/ryzen-vs-xeon-sunucu-karsilastirmasi/">Ryzen 9</a> gibi üst düzey donanımlarla desteklenen bir altyapı arıyorsanız, Saviorhost&#8217;un optimize edilmiş sunucu çözümlerine göz atabilirsiniz. Teknik detaylarla uğraşmadan, saniyeler içinde hazır ve güvenli bir sunucuya kavuşmanın farkını yaşayın.</p>
<p>Şimdi sıra sizde. Terminali açın ve ilk adımı atın.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://saviorhost.com/blog/ubuntu-sunucu-kurulumu-guvenlik-ayarlari-2026/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Linux Sunucularda Kullanıcı Başına CPU Limiti Nasıl Ayarlanır? (Ubuntu &#038; CentOS)</title>
		<link>https://saviorhost.com/blog/linux-sunucularda-kullanici-basina-cpu-limiti-nasil-ayarlanir-ubuntu-centos/</link>
					<comments>https://saviorhost.com/blog/linux-sunucularda-kullanici-basina-cpu-limiti-nasil-ayarlanir-ubuntu-centos/#respond</comments>
		
		<dc:creator><![CDATA[admincim]]></dc:creator>
		<pubDate>Wed, 22 Apr 2026 14:03:32 +0000</pubDate>
				<category><![CDATA[Centos 7]]></category>
		<category><![CDATA[Keyhelp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<guid isPermaLink="false">https://saviorhost.com/blog/?p=2206</guid>

					<description><![CDATA[Paylaşımlı bir sunucuda (Shared Hosting), tek bir kullanıcının hatalı yazdığı bir kod veya yoğun trafik alan bir uygulaması tüm sunucunun işlemcisini (CPU) tüketebilir. Özellikle PHP-FPM dışında, doğrudan çekirdek üzerinde çalışan Node.js veya Python uygulamaları sunucuyu kolayca kilitleyebilir. Bu makalede, Ubuntu ve CentOS sunucularda systemd ve cgroups (Control Groups) mimarisini kullanarak kullanıcılara nasıl "vCPU" sınırı koyacağınızı adım adım anlatıyoruz.]]></description>
										<content:encoded><![CDATA[<p data-path-to-node="9">Sunucu yöneticilerinin en büyük kabuslarından biri <b data-path-to-node="9" data-index-in-node="51">&#8220;Gürültülü Komşu&#8221; (Noisy Neighbor)</b> sorunudur. Bir hosting müşteriniz, yazdığı Node.js uygulamasında sonsuz bir döngüye (infinite loop) girdiğinde veya saldırı aldığında, uygulamanın işlemci kullanımı saniyeler içinde %100&#8217;e vurabilir.</p>
<p data-path-to-node="10">Cpanel, KeyHelp veya Plesk gibi paneller RAM limitlerini yönetmekte başarılı olsa da, doğrudan terminal (SSH) üzerinden başlatılan işlemlere (Örn: PM2 ile başlatılan Node.js) müdahale edemezler. İşte tam bu noktada imdadımıza Linux&#8217;un kalbinde yatan <b data-path-to-node="10" data-index-in-node="250">systemd</b> ve <b data-path-to-node="10" data-index-in-node="261">cgroups</b> yetişiyor.</p>
<h3 data-path-to-node="11" id="cpuquota-mantigi-nasil-calisir">CPUQuota Mantığı Nasıl Çalışır?</h3>
<p data-path-to-node="12">Linux çekirdeğinde işlemci gücü yüzdelik dilimlerle hesaplanır. Formül oldukça basittir: <b data-path-to-node="12" data-index-in-node="89">1 Tam Çekirdek (1 vCPU) = %100 CPUQuota</b></p>
<p data-path-to-node="13">Yani sunucunuzda 16 çekirdek varsa ve siz bir kullanıcıya <code data-path-to-node="13" data-index-in-node="58">%200</code> limit verirseniz, o kullanıcı sistemin sadece 2 çekirdek gücü kadarını kullanabilir. Kalan 14 çekirdek diğer müşterileriniz için güvende kalır.</p>
<hr data-path-to-node="14" />
<h3 data-path-to-node="15" id="adim-adim-cpu-limiti-ayarlama-ubuntu-debian-centos-7-8-almalinux">Adım Adım CPU Limiti Ayarlama (Ubuntu, Debian, CentOS 7/8, AlmaLinux)</h3>
<p data-path-to-node="16">Modern Linux dağıtımlarının neredeyse tamamı servis yöneticisi olarak <code data-path-to-node="16" data-index-in-node="70">systemd</code> kullanır. Bu nedenle anlatacağımız yöntem hem <b data-path-to-node="16" data-index-in-node="124">Ubuntu/Debian</b> ailesinde hem de <b data-path-to-node="16" data-index-in-node="155">CentOS/RHEL/AlmaLinux</b> ailesinde kusursuz çalışır.</p>
<h4 data-path-to-node="17" id="1-kullanicinin-uid-user-id-degerini-bulun">1. Kullanıcının UID (User ID) Değerini Bulun</h4>
<p data-path-to-node="18">Limitlendirme işlemini kullanıcı adı (username) üzerinden değil, kullanıcının Linux ID&#8217;si (UID) üzerinden yapacağız. Örneğin, <code data-path-to-node="18" data-index-in-node="126">ornekuser</code> isimli müşterinin UID&#8217;sini bulmak için SSH üzerinden şu komutu yazın:</p>
<div class="code-block ng-tns-c3006272665-526 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ4QM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-526 ng-star-inserted">
<p><span class="ng-tns-c3006272665-526">Bash</span></p>
<div class="buttons ng-tns-c3006272665-526 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-526">
<div class="animated-opacity ng-tns-c3006272665-526">
<pre class="ng-tns-c3006272665-526"><code class="code-container formatted ng-tns-c3006272665-526" role="text" data-test-id="code-content">id -u ornekuser
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="20"><i data-path-to-node="20" data-index-in-node="0">Bu komut size <code data-path-to-node="20" data-index-in-node="14">1005</code> gibi bir sayı döndürecektir.</i></p>
<h4 data-path-to-node="21" id="2-limiti-uygulayin">2. Limiti Uygulayın</h4>
<p data-path-to-node="22">Bulduğunuz UID değerini kullanarak kullanıcıya limit atayın. Aşağıdaki komut, <code data-path-to-node="22" data-index-in-node="78">ornekuser</code> isimli müşterinin sunucuda çalıştıracağı tüm işlemleri (Web sitesi, Cron görevleri, PM2 vb.) toplamda <b data-path-to-node="22" data-index-in-node="190">1 Çekirdek (1 vCPU)</b> ile sınırlandırır:</p>
<div class="code-block ng-tns-c3006272665-527 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ4gM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-527 ng-star-inserted">
<p><span class="ng-tns-c3006272665-527">Bash</span></p>
<div class="buttons ng-tns-c3006272665-527 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-527">
<div class="animated-opacity ng-tns-c3006272665-527">
<pre class="ng-tns-c3006272665-527"><code class="code-container formatted ng-tns-c3006272665-527" role="text" data-test-id="code-content">systemctl set-property user-1005.slice CPUQuota=100%
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="24">Eğer başlangıç seviyesi bir paket sunuyorsanız ve yarım çekirdek (0.5 vCPU) vermek isterseniz:</p>
<div class="code-block ng-tns-c3006272665-528 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ4wM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-528 ng-star-inserted">
<p><span class="ng-tns-c3006272665-528">Bash</span></p>
<div class="buttons ng-tns-c3006272665-528 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-528">
<div class="animated-opacity ng-tns-c3006272665-528">
<pre class="ng-tns-c3006272665-528"><code class="code-container formatted ng-tns-c3006272665-528" role="text" data-test-id="code-content">systemctl set-property user-1005.slice CPUQuota=50%
</code></pre>
</div>
</div>
</div>
<h4 data-path-to-node="26" id="3-mevcut-siniri-kontrol-etmek">3. Mevcut Sınırı Kontrol Etmek</h4>
<p data-path-to-node="27">Bir müşteriye daha önce ne kadar limit verdiğinizi görmek isterseniz şu komutu kullanabilirsiniz:</p>
<div class="code-block ng-tns-c3006272665-529 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ5AM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-529 ng-star-inserted">
<p><span class="ng-tns-c3006272665-529">Bash</span></p>
<div class="buttons ng-tns-c3006272665-529 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-529">
<div class="animated-opacity ng-tns-c3006272665-529">
<pre class="ng-tns-c3006272665-529"><code class="code-container formatted ng-tns-c3006272665-529" role="text" data-test-id="code-content">systemctl show user-1005.slice -p CPUQuota
</code></pre>
</div>
</div>
</div>
<p data-path-to-node="29"><i data-path-to-node="29" data-index-in-node="0">Çıktı <code data-path-to-node="29" data-index-in-node="6">CPUQuota=100%</code> şeklindeyse işlem başarılıdır. Eğer <code data-path-to-node="29" data-index-in-node="56">[not set]</code> yazıyorsa o kullanıcının bir sınırı yoktur ve tüm işlemciyi kullanabilir.</i></p>
<h4 data-path-to-node="30" id="4-limiti-tamamen-kaldirmak-sinirsiz-yapmak">4. Limiti Tamamen Kaldırmak (Sınırsız Yapmak)</h4>
<p data-path-to-node="31">Kullanıcı daha üst bir pakete geçtiğinde veya sınırı kaldırmak istediğinizde, eşittir (<code data-path-to-node="31" data-index-in-node="87">=</code>) işaretinden sonrasını boş bırakarak komutu tekrar çalıştırın:</p>
<div class="code-block ng-tns-c3006272665-530 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ5QM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-530 ng-star-inserted">
<p><span class="ng-tns-c3006272665-530">Bash</span></p>
<div class="buttons ng-tns-c3006272665-530 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-530">
<div class="animated-opacity ng-tns-c3006272665-530">
<pre class="ng-tns-c3006272665-530"><code class="code-container formatted ng-tns-c3006272665-530" role="text" data-test-id="code-content">systemctl set-property user-1005.slice CPUQuota=
</code></pre>
</div>
</div>
</div>
<hr data-path-to-node="33" />
<h3 data-path-to-node="34" id="bonus-tum-keyhelp-kullanicilarina-tek-seferde-limit-koymak-otomasyon">Bonus: Tüm KeyHelp Kullanıcılarına Tek Seferde Limit Koymak (Otomasyon)</h3>
<p data-path-to-node="35">Eğer halihazırda KeyHelp, cPanel veya benzeri bir sistem kullanıyorsanız ve sunucunuzdaki <b data-path-to-node="35" data-index-in-node="90">mevcut tüm müşterilere</b> tek seferde 1 vCPU (1 Çekirdek) sınırı koymak istiyorsanız, SSH üzerinden root yetkisiyle aşağıdaki basit <i data-path-to-node="35" data-index-in-node="219">bash</i> döngüsünü çalıştırabilirsiniz.</p>
<p data-path-to-node="36"><i data-path-to-node="36" data-index-in-node="0">(Not: Aşağıdaki script, kullanıcı dizinlerinin <code data-path-to-node="36" data-index-in-node="47">/home/users/</code> altında olduğu KeyHelp mimarisine göre yazılmıştır. cPanel için dizini <code data-path-to-node="36" data-index-in-node="131">/home/</code> olarak değiştirebilirsiniz).</i></p>
<div class="code-block ng-tns-c3006272665-531 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiu8puuyf6TAxUAAAAAHQAAAAAQ5gM">
<div class="code-block-decoration header-formatted gds-title-s ng-tns-c3006272665-531 ng-star-inserted">
<p><span class="ng-tns-c3006272665-531">Bash</span></p>
<div class="buttons ng-tns-c3006272665-531 ng-star-inserted"></div>
</div>
<div class="formatted-code-block-internal-container ng-tns-c3006272665-531">
<div class="animated-opacity ng-tns-c3006272665-531">
<pre class="ng-tns-c3006272665-531"><code class="code-container formatted ng-tns-c3006272665-531" role="text" data-test-id="code-content"><span class="hljs-keyword">for</span> d <span class="hljs-keyword">in</span> /home/users/*; <span class="hljs-keyword">do</span>
    kullanici=$(basename <span class="hljs-string">"<span class="hljs-variable">$d</span>"</span>)
    uid=$(id -u <span class="hljs-string">"<span class="hljs-variable">$kullanici</span>"</span> 2&gt;/dev/null)
    
    <span class="hljs-keyword">if</span> [ -n <span class="hljs-string">"<span class="hljs-variable">$uid</span>"</span> ]; <span class="hljs-keyword">then</span>
        <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">$kullanici</span> (UID: <span class="hljs-variable">$uid</span>) için 1 vCPU sınırı ayarlanıyor..."</span>
        systemctl set-property user-<span class="hljs-variable">$uid</span>.slice CPUQuota=100%
    <span class="hljs-keyword">fi</span>
<span class="hljs-keyword">done</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"İşlem Tamamlandı! Tüm mevcut müşteriler sınırlandırıldı."</span>
</code></pre>
</div>
</div>
</div>
<h3 data-path-to-node="38" id="sonuc">Sonuç</h3>
<p data-path-to-node="39">Bu basit ama güçlü yöntem sayesinde paylaşımlı sunucularınızı modern bir bulut altyapısına (PaaS) dönüştürebilir, &#8220;kaynak sattıkça kazanç sağlayan&#8221; bir iş modeli kurabilirsiniz. İşlemci sömüren hesapları engellemek, diğer müşterilerinizin hız ve performans kalitesini anında artıracaktır.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://saviorhost.com/blog/linux-sunucularda-kullanici-basina-cpu-limiti-nasil-ayarlanir-ubuntu-centos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
