Birkaç yıl önce kendi özel finansal hesaplayıcılarımı barındırdığım VPS’te, bir sabah loglara baktığımda SSH’a yönelik yüzlerce başarısız giriş denemesi gördüm. fail2ban devreye girmiş, birçoğunu engellemişti ama bu durum beni bir kez daha self-hosting’in getirdiği güvenlik sorumluluğuna odakladı. Tam kontrol vaadi cazip gelse de, bu kontrolle birlikte gelen güvenlik yükünü hafife almak, ciddi sorunlara yol açabiliyor.
Kendi sistemlerimi yönetirken edindiğim 20 yıllık tecrübemde, self-hosting’in hem özgürlük hem de ağır bir sorumluluk olduğunu gördüm. Başlangıçta sadece “bir şeyler çalıştırmak” niyetinde olsak da, zamanla sistemin her katmanında güvenliği düşünmek bir zorunluluk haline geliyor. Bu yazıda, self-hosting yaparken güvenlik konusunda nelere dikkat ettiğimi ve hangi pratikleri uyguladığımı anlatacağım.
Neden Self-Hosting Seçeriz ve Riskleri Nelerdir?
Self-hosting’i genellikle daha fazla kontrol, maliyet tasarrufu veya sadece öğrenme ve deneme merakı yüzünden tercih ederiz. Kendi donanımınızın veya sanal sunucunuzun her milimetresine hükmetme hissi, birçok geliştirici ve sistem yöneticisi için çekicidir. Kendi yan ürünlerimi geliştirirken veya bir müşteri projesinin özel ihtiyaçları olduğunda, esneklik çoğu zaman kritik bir faktör oluyor ve bu esnekliği bulutta her zaman aynı maliyetle bulmak zorlaşabiliyor.
Ancak bu kontrol, beraberinde ciddi riskleri de getirir. Bir bulut sağlayıcısının arka planda sizin için yönettiği birçok güvenlik katmanı (fiziksel güvenlik, ağ izolasyonu, işletim sistemi yamaları gibi) self-hosting’de tamamen sizin omuzlarınıza biner. Yanlış yapılandırılmış bir firewall, güncellenmemiş bir işletim sistemi veya zayıf bir şifre politikası, sisteminizi siber saldırılara açık hale getirebilir. Benim deneyimlerimde, genellikle ilk başta sadece uygulamanın çalışmasına odaklanıldığı için, bu temel güvenlik adımları ya atlanır ya da ertelenir; bu da zamanla büyük bir borç birikimine yol açar.
Temel Sistem Güvenliği: İşletim Sistemi ve Servisler
Kendi sunucunuzun çekirdeği olan işletim sistemi, güvenlik stratejinizin temelini oluşturur. Buradaki en küçük bir açık, tüm sistemin ele geçirilmesine neden olabilir. Bu yüzden, işletim sistemi seviyesindeki güvenlik ayarlarını asla göz ardı etmemek gerekir.
İlk olarak, işletim sistemi yamalarını düzenli olarak takip etmek ve uygulamak olmazsa olmazdır. CVE takibi bu konuda çok önemli. Örneğin, geçenlerde kritik bir kernel modülü olan algif_aead’deki bir zafiyet (CVE-2026-31431) ortaya çıktığında, ilgili modülü hemen blacklist’e alarak olası bir saldırı yüzeyini kapattım. Kendi sistemlerimde genellikle unattended-upgrades gibi araçlarla otomatik güncellemeleri aktif tutsam da, kritik yamaları elle kontrol edip hızlıca uygulamayı tercih ediyorum.
# Örnek: kernel modülünü blacklist'e alma
echo "blacklist algif_aead" | sudo tee /etc/modprobe.d/algif_aead_blacklist.conf
sudo update-initramfs -u
SSH erişimini güvence altına almak da kritik bir adımdır. Parola ile giriş yerine, sadece SSH key kullanmak ve fail2ban gibi araçlarla brute-force saldırılarını engellemek temel bir gerekliliktir. Kendi sunucularımda fail2ban için özel filtreler yazarak, sıkça karşılaştığım belirli saldırı paternlerini daha etkili bir şekilde bloke ediyorum. Ayrıca, auditd alt sistemi ile önemli dosya erişimlerini ve sistem çağrılarını izlemek, beklenmedik aktiviteleri yakalamak için iyi bir yöntemdir. SELinux veya AppArmor gibi zorunlu erişim kontrol mekanizmalarını doğru profillerle kullanmak da, bir servisin veya uygulamanın zarar görmesi durumunda yayılma alanını kısıtlar.
Ağ Güvenliği: Sınırları Belirlemek ve İzlemek
Ağ katmanı, sunucunuz ile dış dünya arasındaki ilk savunma hattıdır. Yanlış yapılandırılmış bir ağ, diğer tüm güvenlik önlemlerini anlamsız kılabilir. Bir üretim ERP’sinin backend’ini geliştirirken, uygulama sunucularının doğrudan internete açık olmasının ne kadar tehlikeli olduğunu defalarca gördüm.
graph TD;
A["İstemci (Tarayıcı/Uygulama)"] --> B["Internet"];
B --> C["Firewall / Güvenlik Duvarı"];
C --> D["Nginx (Reverse Proxy / Load Balancer)"];
D --> E["Uygulama Sunucusu (FastAPI/Node.js)"];
E --> F["Veritabanı (PostgreSQL/Redis)"];
E --> G["Diğer Servisler (MQ/Cache)"];
subgraph "Güvenlik Katmanları"
C -- "Paket Filtreleme" --> D;
D -- "Rate Limiting / WAF" --> E;
E -- "Authentication / Authorization" --> F;
E -- "Veri Doğrulama" --> G;
end
Ağ segmentasyonu, özellikle birden fazla servisi veya uygulamayı barındırıyorsanız hayati öneme sahiptir. VLAN tagging ile farklı servisleri veya ortamları izole etmek, bir segmentin ele geçirilmesi durumunda saldırının diğerlerine yayılmasını zorlaştırır. Örneğin, veritabanı sunucularını uygulama sunucularından farklı bir VLAN’a alıp, aralarında sadece gerekli portlar üzerinden iletişime izin veren firewall kuralları tanımlıyorum.
Nginx gibi bir reverse proxy kullanmak, gelen trafiği filtrelemek ve dengelemek için harika bir yoldur. Ben Nginx’i sadece SSL sonlandırma ve load balancing için değil, aynı zamanda rate limiting ve temel WAF (Web Application Firewall) özellikleri için de kullanıyorum. Böylece, doğrudan uygulama sunucularıma ulaşmadan önce kötü niyetli istekleri engellemiş oluyorum.
# Nginx ile basit bir rate limiting örneği
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=5r/s;
server {
listen 80;
server_name example.com;
location / {
limit_req zone=mylimit burst=10 nodelay;
proxy_pass http://backend_servers;
# Diğer proxy ayarları
}
}
Ayrıca, VPN veya Zero Trust Network Access (ZTNA) çözümleriyle uzaktan erişimi güvence altına almak gerekiyor. Bir şirketin iç ağlarına erişimde, ZTNA modelini kullanarak sadece belirli kullanıcıların, belirli cihazlardan ve belirli uygulamalara erişmesine izin verdim. Bu, geleneksel VPN’den çok daha granüler bir güvenlik sağlıyor. MTU/MSS mismatches gibi görünüşte küçük ağ detayları bile, bazı durumlarda tünellenmiş trafik üzerinde DoS saldırılarına yol açabileceği için dikkatli incelenmelidir. Switch’ler üzerinde DHCP snooping, Dynamic ARP Inspection (DAI) ve IP Source Guard gibi özellikleri etkinleştirerek, ağ içi saldırıları da bir nebze önleyebiliriz.
Uygulama Güvenliği: Geliştirme ve Dağıtım Süreçleri
Sistem ve ağ güvenliği temellerini attıktan sonra, sıra kendi geliştirdiğiniz veya kullandığınız uygulamaların güvenliğine gelir. Uygulama katmanındaki zafiyetler, genellikle en kolay istismar edilen ve en yıkıcı sonuçlara yol açanlardır.
Bir üretim ERP’sinde operatör ekranları tasarlarken, kullanıcıdan gelen her verinin potansiyel bir tehdit olduğunu varsayarak hareket ettim. SQL injection ve Cross-Site Scripting (XSS) gibi yaygın saldırı türlerine karşı proaktif önlemler almak şart. Gelen tüm girdileri sanitize etmek ve çıktılarda uygun kodlamayı kullanmak temel kuraldır. ORM kullanmak bu konuda bir miktar koruma sağlasa da, yine de özel sorgularda dikkatli olmak gerekir.
Kimlik doğrulama ve yetkilendirme mekanizmaları da çok önemlidir. JWT (JSON Web Token) veya OAuth2 gibi modern paternleri kullanırken, token’ların doğru şekilde imzalandığından, geçerlilik sürelerinin kısa tutulduğundan ve güvenli bir şekilde saklandığından emin olmak gerekir. Kendi yan ürünümün backend’inde, her API endpoint’ine rate limiting uygulayarak, hem brute-force saldırılarını engelliyorum hem de servisimin aşırı yüklenmesini önlüyorum.
CI/CD pipeline’larında güvenlik taramaları (statik kod analizi, bağımlılık analizi) entegre etmek, zafiyetleri geliştirme aşamasında yakalamak için iyi bir yöntemdir. Dark launch veya feature flag gibi dağıtım stratejilerini kullanırken bile, yeni özelliklerin güvenlik etkilerini gözden kaçırmamak gerekir.
Veritabanı Güvenliği ve Veri Bütünlüğü
Veritabanı, uygulamalarınızın en değerli varlığı olan verileri barındırır, bu yüzden güvenliği en üst düzeyde tutulmalıdır. Bir müşteri projesinde PostgreSQL veritabanının düzgün yapılandırılmamış connection pool’u yüzünden yetkisiz erişim riski oluştuğunu görmüştüm.
PostgreSQL özelinde, kullanıcı yetkilendirmelerini çok dikkatli yönetmek gerekiyor. Her uygulama veya servis için ayrı bir veritabanı kullanıcısı oluşturup, bu kullanıcılara sadece ihtiyaç duydukları tablolara ve operasyonlara erişim yetkisi vermek önemlidir. connection pool ayarlarını yaparken, maksimum bağlantı sayısını ve bağlantı bekleme sürelerini güvenlik ve performans dengesini gözeterek ayarlamak gerekir. Aşırıya kaçan bağlantı istekleri, bir DoS (Denial of Service) saldırısı olarak değerlendirilebilir.
Redis gibi bir in-memory veritabanı veya cache kullanıyorsanız, buradaki verilerin de güvende olduğundan emin olmalısınız. Redis’in requirepass özelliği ile parola koruması eklemek ve sadece güvenilen IP adreslerinden erişime izin vermek temel adımlardır. Ağ segmentasyonu sayesinde, Redis sunucusuna sadece uygulama sunucularının erişebilmesi, doğrudan dışarıdan gelecek saldırıları engeller.
# Redis yapılandırma dosyasında (redis.conf) örnek parola ayarı
requirepass sizin_güçlü_şifreniz
bind 127.0.0.1 192.168.1.100 # Sadece belirli IP'lerden erişime izin ver
Veri bütünlüğünü sağlamak için, file integrity monitoring (FIM) araçları kullanarak kritik veritabanı dosyalarında veya konfigürasyon dosyalarında beklenmedik değişiklikleri izlemek faydalıdır. Ayrıca, düzenli yedeklemeler yapmak ve bu yedekleri güvenli, izole bir ortamda saklamak, olası bir veri kaybı veya bozulma durumunda kurtarma şansınızı artırır. PostgreSQL’de logical replication veya physical replication gibi yöntemlerle okuma replikaları oluşturarak hem yükü dağıtırım hem de olası bir felakete karşı veri sürekliliğini sağlarım.
İzleme, Yedekleme ve Acil Durum Yönetimi
Güvenlik, sadece önlemler almakla bitmez; sürekli izleme, düzenli yedekleme ve acil durum planlaması da kritik bileşenlerdir. Sisteminiz ne kadar güvenli olursa olsun, her zaman bir şeylerin ters gitme ihtimali vardır.
Observability (gözlemlenebilirlik) prensiplerini uygulamak, sistemlerimde güvenlik açıklarını veya saldırı denemelerini erken aşamada tespit etmemi sağlıyor. Metrikler (CPU, bellek, disk I/O, ağ trafiği), loglar (uygulama logları, sistem logları, firewall logları) ve trace’ler (isteklerin sistem içindeki akışı) toplamak, bir olayın kök nedenini anlamak için vazgeçilmezdir. Anomali tabanlı izleme sistemleri kurarak, normal trafik paternlerinden sapmaları otomatik olarak algılayıp beni uyarmalarını sağlıyorum. Örneğin, belirli bir IP adresinden gelen anormal sayıda başarısız login denemesi veya yüksek veritabanı sorgu yükü, potansiyel bir saldırının işareti olabilir.
Acil durum yönetimi, bir güvenlik ihlali durumunda ne yapacağınızı belirleyen bir yol haritasıdır. Bu plan, ihlali tespit etme, izole etme, ortadan kaldırma, kurtarma ve gelecekteki benzer olayları önlemek için öğrenilen dersleri uygulama adımlarını içermelidir. Kendi sistemlerimde, bir ihlal durumunda ilk olarak hangi servisi durduracağımı, hangi logları kontrol edeceğimi ve yedeklerden nasıl döneceğimi içeren basit bir checklist’im var. CVE takibi ve yama yönetimi de bu sürecin bir parçasıdır; yeni çıkan zafiyetleri hızlıca değerlendirip sistemlerime yamasını yapmak, sürekli bir güvenlik duruşu sağlar.
Sonuç
Self-hosting, tam kontrolün cazibesini sunarken, beraberinde tam bir güvenlik sorumluluğu getirir. Bu sorumluluk, sadece bir firewall kurmaktan veya bir şifre belirlemekten çok daha fazlasını ifade eder; işletim sistemi çekirdeğinden uygulama koduna, ağ yapılandırmasından veritabanı ayarlarına kadar her katmanda sürekli bir uyanıklık ve proaktif önlemler gerektirir. Benim tecrübelerimde, bu süreçte yapılan her hata, bir sonraki adımda daha sağlam bir yapı kurmamı sağladı. Unutmayın, güvenlik tek seferlik bir işlem değil, sürekli devam eden bir yolculuktur. Kendi sistemlerinizin güvenliğini sağlamak, sadece sizin için değil, aynı zamanda sistemlerinizin etkileşimde olduğu tüm diğer unsurlar için de kritik öneme sahiptir.