İlk saat isteğe bağlı değildir
İnternetin IPv4 alanı, tamamını taramanın iyi finanse edilmiş bir yabancıya birkaç dakika, bir dizüstü bilgisayara ise birkaç saat alacağı kadar küçüktür. Barındırma aralıkları yayımlanır, kataloglanır ve sürekli olarak yeniden taranır; dolayısıyla yeni bir adres gizli değildir — zaten var olan bir listeye eklenen taze bir kayıttır. Pratikte, yeni önyüklenmiş bir kutuya yönelik ilk otomatik SSH giriş denemesi, siz daha hoş geldin e-postanızı okumayı bitirmeden gelir ve bunu, hepsi aynı birkaç yüz parolayı aynı birkaç kullanıcı adına karşı deneyen, birbiriyle ilgisiz kaynaklardan binlerce deneme daha izler. Bunların hiçbiri size yönelik değildir. Bu, interneti yanıt veriyor ve yanıt vermiyor diye ayıran bir makinedir ve hangi yığına düşeceğinizi belirleyen tek şey, ilk saatte yaptığınızdır.
İyi haber şu ki bu iş sıkıcı ve sonludur. Dört kontrol işin neredeyse tamamını yapar: parolalar yerine anahtarlarla kimlik doğrulamak, bilerek sunmadığınız her gelen portu reddetmek, güvenlik güncellemelerini sorulmadan uygulamak ve root olarak çalışmayı bırakmak. Her biri birkaç dakika sürer ve hiçbiri egzotik değildir. Bunu özellikle offshore, KYC'siz bir sunucu için yazmaya değer kılan şey, diğer uçtaki asimetridir — kurtarma yolu. Ana akım bir sağlayıcıda, kötü bir sshd_config bir destek talebi, bir kimlik kontrolü ve bir konsol oturumuyla sonuçlanır. Burada kontrol edilecek kayıtlı bir kimlik yoktur; bu, ürünün tüm meselesidir ve aynı zamanda dikkatsiz bir tuş vuruşunun size yirmi dakika değil, makinenin kendisine mal olmasının nedenidir. Aşağıdaki her adım bu düşünceyle yazılmıştır.
Küçük bir sunucuya gerçekte ne saldırır
Günlüklerde iki çok farklı grup ortaya çıkar ve bunları ayırmakta fayda vardır, çünkü farklı şeylerle alt edilirler. Ezici çoğunluk ayrım gözetmeyen toplu taramadır: parola kabul eden SSH, 0.0.0.0'a bağlı veritabanları, varsayılan kimlik bilgilerine sahip yönetici panelleri, unutulmuş staging kopyaları, herkese açık bir exploit'i olan yaması yapılmamış web uygulamaları arayarak adres uzayını tarayan botlar. Bu grup sunucunuzun ne işe yaradığını umursamaz. Onunla akıl yürütülemez, asla durmaz ve bu rehberdeki kontrol listesiyle tamamen alt edilir — kontrol listesi zekice olduğu için değil, botlar onu atlamış makineleri aradığı ve bu tür makinelerin bol olduğu için.
İkinci grup hedeflidir — özellikle sizin kutunuzu isteyen biri — ve nadir, pahalıdır ve neredeyse hiçbir zaman SSH üzerinden içeri girmez. Devreye aldığınız uygulama, denetlemediğiniz bir bağımlılık, yeniden kullandığınız bir kimlik bilgisi ya da sunucuya hiç dokunmadan önce ele geçirilmiş bir dizüstü bilgisayar üzerinden gelir. Sertleştirmenin güvenlik duvarında bitmemesinin nedeni de budur: asıl sorular, hizmetinizin hangi kullanıcı olarak çalıştığı, dışarıya neye ulaşabildiği ve ne kadar hızlı yama uyguladığınız haline gelir. Planlarken bilmekte fayda var: VPS planlarımız KVM tam sanallaştırmadır, yani kendi çekirdeğinizi çalıştırırsınız ve nftables, ufw, namespaces, seccomp, özel sysctl gibi tüm araç kutusu gerçekten çalışır — bu, çekirdeğin başkasına ait olduğu konteyner tabanlı "VPS" ürünleri için geçerli değildir.
SSH: anahtarlar ve tam olarak tek bir kapı
Genel bir SSH portunda parola kimlik doğrulaması, kiralık bir sunucudaki en büyük kendi kendine verilen zarardır ve onu kaldırmak bu rehberdeki en değerli beş dakikadır. Bir Ed25519 anahtar çifti oluşturun, ama kendi makinenizde — asla sunucuda değil, çünkü orada özel yarı, tam olarak korumaya çalıştığınız host'un üzerinde doğardı — bir parolayla koruyun ve bir agent'a yükleyin, böylece parola size giriş başına değil oturum başına tek bir istem maliyeti çıkarsın. Genel yarıyı yukarı kopyalayın, çalıştığını doğrulayın ve ancak o zaman parolaları kapatın. PasswordAuthentication no ve KbdInteractiveAuthentication no devredeyken, günlük binlerce tahmin bir risk olmaktan çıkıp sadece gürültüye dönüşür: tahmin edilecek bir parola yoktur, dolayısıyla deneme ilginç hale gelmeden başarısız olur.
Root kendi kararını hak eder. PermitRootLogin prohibit-password, acil durumlar için anahtar tabanlı root erişimini korur; PermitRootLogin no daha katıdır ve her oturumu sudo yetkili, isimli bir hesaptan geçmeye zorlar — birden fazla kişi kutuya dokunduğu anda istediğiniz de tam olarak budur. Bir paketin oluşturduğu başıboş bir hesabın asla bir giriş yolu olamaması için AllowUsers ekleyin. Daemon'u 22 numaralı porttan taşımak yapmaya değer, ama nedeni konusunda dürüst olun: bu bir güvenlik kontrolü değildir — adresinizi tarayan herkes yeni portu saniyeler içinde bulur — bu günlük hijyenidir ve otomatik gürültünün büyük çoğunluğunu ortadan kaldırarak auth.log'da kalan girdilerin gerçekten okumaya değer olmasını sağlar. Neyi değiştirirseniz değiştirin, yeniden yüklemeden önce sshd -t ile doğrulayın ve ikinci bir terminal başarıyla bağlanana kadar mevcut oturumunuzu açık tutun. Bu alışkanlık, bir yazım hatası ile kaybedilmiş bir sunucu arasındaki farktır.
Varsayılan reddetme ve güvenlik duvarının kimsenin yapılandırmadığı yarısı
Bir sunucudaki güvenlik duvarının tek bir işi vardır: "burada ne dinliyor?" sorusunun cevabını, bilerek yayımladığınız şeylerin listesine eşitlemek. Gelen trafiği varsayılan olarak reddedin, giden trafiğe izin verin, ardından her birine bir gerekçe iliştirerek portları teker teker açın. Tek bir kural bile yazmadan önce ss -tulpen çalıştırın ve zaten neyin bağlı olduğunu okuyun — varsayılan bir kurulum çoğu insanın beklediğinden daha fazlasını dinler ve 127.0.0.1 yerine 0.0.0.0'a bağlanan bir veritabanı ya da önbellek, küçük bir sunucunun birinin veri kümesinde son bulmasının klasik yoludur. Yerel hizmetleri önce loopback'e bağlayın; güvenlik duvarı ikinci hattınızdır, tek hattınız değil.
Sonra atlanan yarı gelir. Buradaki her plan, IPv4'ünün yanında bir /64 IPv6 bloğu ile gelir ve çoğu modern daemon her iki aileye de seve seve bağlanır. Kurallarınız yalnızca v4'ü kapsıyorsa, güvenlik duvarıyla korunduğuna inandığınız bir hizmete, adresi çözümleyen herkes v6 üzerinden ulaşabilir — bilinen bir barındırma önekinin IPv6 taraması ise tamamen rutindir. ufw her ikisini de gerçekten işler, ama yalnızca /etc/default/ufw'de IPV6=yes ayarlıysa; varsaymak yerine ufw status verbose ile doğrulayın. Docker da aynı şüpheyi hak eder: bir konteyner portunu -p ile yayımlamak, ufw'ninkinden önce değerlendirilen kendi iptables zincirine kurallar ekler, dolayısıyla korunduğunu düşündüğünüz bir konteyner çoğu zaman ardına kadar açıktır. Onu açıkça 127.0.0.1:port'a bağlayın ve önüne bir reverse proxy koyun. Her ne yapılandırırsanız yapılandırın, internette başka bir yerden test edin — yalnızca okunmuş bir kural, hiç test edilmemiş bir kuraldır.
Hatırlamanız gerekmeyen güncellemeler
Çoğu küçük sunucunun gerçekte kaybedilme şekli, yaması yapılmamış yazılımdır ve bunun nedeni teknik değil insanidir: yama uygulamak, yapmanız gereken her şeyle yarışan bir angaryadır. Güvenlik kanalını otomatikleştirin, sorun ortadan kalksın. Debian ve Ubuntu'da unattended-upgrades, güvenlik güncellemelerini bir zamanlayıcıyla uygular ve yolunuzdan çekilir; onu mevcut her yükseltmeye değil, güvenlik cebine kapsamlandırın, böylece rutin bir özellik sürümü uygulamanızı sabahın üçünde asla yeniden başlatmasın. Bu, yönetilen bir platformdan çok, kendi kendinize yönettiğiniz bir offshore kutuda daha fazla önem taşır, çünkü onu sizin için kimse yamalamaz ve kritik bir CVE hakkında size e-posta gönderecek bir hesap yöneticisi yoktur — ulaşılacak kayıtlı bir e-posta adresi de yoktur.
Çekirdek güncellemelerinin etkili olması için bir yeniden başlatma gerekir, o yüzden yeniden başlatma politikanızı sonradan keşfetmek yerine bilerek belirleyin. needrestart, hangi hizmetlerin hâlâ silinmiş kütüphanelere karşı çalıştığını size söyler ve gecenin ilerleyen saatlerinde bir Unattended-Upgrade::Automatic-Reboot penceresi, durum tutmayan bir hizmet için gayet uygundur. Önemli bir etkileşim: tam disk şifreleme rehberimizi takip ettiyseniz ve root dosya sisteminiz şifreliyse, otomatik bir yeniden başlatma bir parola isteminde durur ve onu ağ üzerinden kilidini açana kadar orada kalır. Bu makinelerde ya otomatik yeniden başlatmaları kapalı tutun ya da uzaktan kilit açmanın test edildiğinden ve o pencere için uyanık olacağınızdan emin olun. Hangisini seçerseniz seçin, yazıya dökün — yalnızca kafanızda yaşayan bir politika, tatile çıktığınız an var olmaktan çıkar.
Hız sınırlama, fail2ban ve gürültü tabanı
Parola kimlik doğrulaması kapatıldıktan sonra, SSH'a karşı kaba kuvvet saldırısı başarılı olamaz. fail2ban gibi araçların o noktadan sonra size ne kazandırdığı konusunda net olmakta fayda var: tahmine karşı bir savunma değil — bu zaten imkânsızdır — daha sakin bir günlük, boşa giden el sıkışmalara harcanan daha az CPU ve sırların hâlâ tahmin edilebilir olduğu katmanlarda gerçek bir kontrol. Onu önemli olan yerlere yöneltin: bir web uygulamasının giriş formu, bir posta sunucusunun SMTP AUTH'u, birinin numaralandırdığı bir yönetici yolu. ufw limit, hiç ek yazılım olmadan ucuz bir bağlantı hızı sınırı verir. Bir avuç çekirdek ayarı da aynı beş dakikaya değer — SYN cookie'ler açık, reverse-path filtreleme açık, ICMP broadcast yanıtları kapalı ve statik adresi olan bir sunucuda IPv6 router advertisement'ları yok sayılıyor.
Yine de host'un nerede durduğunu bilin. Bunların hiçbiri hacimsel bir saldırıya karşı ayakta kalmaz, çünkü bir trafik seli, CPU'yu zorlamadan çok önce ağ hattını doldurur: paketler nftables kurallarınıza ulaştığında, korumaya çalıştığınız bant genişliğini çoktan tüketmişlerdir. 1.5 Tbps'a kadar L3/L4 trafik temizleme bu yüzden filonun önünde yer alır ve ek ücretli bir seçenek olarak değil, her planda dahil olarak sunulur; meşru istekler gibi görünen uygulama katmanı sellerine karşı isteğe bağlı bir L7 kalkanıyla birlikte. Host güvenlik duvarınız hassasiyeti halleder; ağ ise hacmi. Birini diğerinin yerine koymaya çalışmak, insanların şaşkına döndüğü yerdir.
Buradaki asıl risk kendinizi dışarıda bırakmaktır
Bu ilk saatte yanlış gidebilecek her şey arasında, ezici biçimde en olası sonuç bir sızma değildir. Uzun bir oturumun sonunda, bozuk bir sshd_config'i yeniden yükleyen ya da izin kuralında bir yazım hatası bulunan bir güvenlik duvarını etkinleştiren ve kapının arkanızdan kapandığını fark eden sizsinizdir. Ana akım bir sağlayıcıda bu can sıkıcı bir durumdur. Burada gerçek bir saygıyı hak eder, çünkü kayıt, sekiz kurtarma kodu ve döngünün hiçbir yerinde e-posta olmadan bir kullanıcı adı ve bir paroladan ibarettir — tam olarak sızdırılacak bir kimlik olmasın diye — ve kim olduğunuzu doğrulayamayan bir sağlayıcı, sizi sunucunuza geri de alamaz. Kimse sizin için kefil olamaz. Bu özellik, ürünün tasarlandığı gibi çalışmasıdır ve aşağıdaki güvenlik önlemlerinin öneri değil alışkanlık olmasının nedeni de budur.
Bunlardan dördü hiçbir şeye mal olmaz. SSH'a ya da güvenlik duvarına dokunmadan önce bir anlık görüntü alın, böylece kötü bir yeniden yükleme yeniden inşa değil bir geri alma olsun. Farklı bir cihazdan — bir telefon, bir iş dizüstü bilgisayarı, çevrimdışı bir yedek — ikinci bir genel anahtar kaydedin, çünkü tek diskteki tek bir anahtar, dökülen bir kahveyle hiç anahtarınız kalmamasının arasında yalnızca bir adımdır. İlkini kesebilecek herhangi bir şeyi değiştirirken ikinci bir terminali bağlı tutun ve eskisini bırakmadan önce yeni yapılandırmayı her zaman taze bir bağlantıdan test edin. Ve kurtarma merdiveninin nerede bittiğini kabul edin: anlık görüntüler aynı host üzerinde yaşar ve bir yedek değil bir geri alma kolaylığıdır, dolayısıyla gerçekten özleyeceğiniz her şey host dışı depolamaya aittir — günlük şifrelenmiş yedekler ek özelliği ya da başka bir yere gönderdiğiniz kendi istemci tarafında şifrelenmiş kopyalarınız. En kötü senaryonuz, tamamen kaybolmak değil, dakikalarla ölçülen bir yeniden devreye alma ve geri yükleme olmalıdır.
SP·08Kutunun ne yaptığına bağlı olarak sırada ne var
Yukarıdaki kontrol listesi taban seviyedir ve her makine için aynıdır. Üzerine ne ekleneceği tamamen işin ne olduğuna bağlıdır. Herkese açık bir web sunucusu; TLS, onu sonlandıran bir reverse proxy, yetkisiz bir kullanıcı olarak çalışan uygulama ve loopback'te ya da tamamen başka bir kutuda bulunan bir veritabanı ister. Bir VPN uç noktası farklı bir şekildir — tek bir UDP portu, web yığını yok, hiç herkese açık hizmet yok — ve kendi WireGuard VPN'inizi kurmak rehberinde baştan sona ele alınır. Bir posta sunucusu üçü arasında en zorlu olanıdır ve her planın dahil ettiği adres üzerinde rDNS kontrolü gerektirir; offshore bir VPS'te postayı kendi barındırma rehberi teslim edilebilirlik yarısını kapsar. Bir Tor rölesi bilerek anonimliğin tam tersidir — yayımlanmış, ulaşılabilir bir hizmettir — ve bu ödünleşimler KYC'siz bir VPS'te röle çalıştırmak rehberinde ortaya konur. Durağan hâldeyken özel durum tutan her şey de şifrelenmelidir; bu, kendi arıza modlarına sahip ayrı bir kontroldür ve LUKS ve uzaktan kilit açma rehberinde ele alınır.
Sertleştirmenin daha büyük resimde nerede durduğuyla bitirmekte fayda var, çünkü bu, birbirinden bağımsız olarak başarısız olan üç katmandan yalnızca biridir. Sağlayıcının sizin hakkınızda bildikleri birincisidir ve burada bu neredeyse hiçbir şeydir: $30.00'den başlayan ön ödemeli bir kripto bakiyesiyle fonlanan bir kullanıcı adı, zincirde ne kart ne belge — barındırma için anonim ödeme yapma konusunun ta kendisi. Hangi hukukun uygulandığı ikincisidir; bu, sizin nerede olduğunuzdan değil, donanımın 6 bölgemizin hangisinde durduğundan belirlenir ve bölge bölge hangi offshore konumu seçmelisiniz? sayfasında ele alınır. Makinenin kendisinin neye izin verdiği ise üçüncüsüdür ve bu, yalnızca size aittir — hiçbir sağlayıcı bunu sizin için yapılandıramaz. $8.00/aydan başlayan bir VPS yaklaşık 15 min içinde çevrimiçi olur; bu da onu izleyen saatin, işin gerçek güvenliğinin karara bağlandığı yer olduğu anlamına gelir. Onu bilerek harcayın.
SP·09Adım adım
-
01
Devreye alın, sonra her şeyden önce içeri girin
Panelden devreye alın ve gerçekten güncel tutacağınız bir dağıtım seçin — güncel bir Debian ya da bir Ubuntu LTS, sıkıcı ama doğru cevaptır. Bir VPS yaklaşık 15 min içinde çevrimiçi olur ve root kimlik bilgileri panelinize düşer. Hemen bağlanın, sistemi tamamen güncelleyin ve sonraki günlüklerin okunabilir olması için bir hostname belirleyin. Bu adımların geri kalanı tamamlanana kadar bu kutuda başka hiçbir şey olmaz.
ssh root@203.0.113.10 apt update && apt full-upgrade -y hostnamectl set-hostname edge-01 apt install -y ufw unattended-upgrades needrestart
-
02
Root'tan uzaklaşın: isimli bir kullanıcı, bir anahtar ve sudo
Anahtar çiftini dizüstü bilgisayarınızda oluşturun, asla sunucuda değil. Ardından kutuda isimli bir hesap oluşturun, genel yarıyı onun
authorized_keysdosyasına koyun ve onasudoverin. İkinci bir terminal açın ve şimdi, başka her şeyi değiştirmeden önce, SSH üzerinden root hâlâ bir yedek seçenek olarak çalışırken, o kullanıcı olarak giriş yapın.# on your own machine ssh-keygen -t ed25519 -C "laptop" ssh-copy-id -i ~/.ssh/id_ed25519.pub root@203.0.113.10 # on the server adduser --disabled-password --gecos "" ops usermod -aG sudo ops install -d -m 700 -o ops -g ops /home/ops/.ssh cp /root/.ssh/authorized_keys /home/ops/.ssh/ chown ops:ops /home/ops/.ssh/authorized_keys chmod 600 /home/ops/.ssh/authorized_keys
-
03
SSH daemon'unu kilitleyin — ikinci bir terminal açıkken
Değişiklikleri, hazır gelen yapılandırmayı düzenlemek yerine bir drop-in dosyasına yazın, böylece bir dağıtım yükseltmesi bunları asla sessizce eski haline döndürmesin. Yeniden yüklemeden önce sözdizimini
sshd -tile doğrulayın, yeniden yükleyin, ardından mevcut olan hâlâ hayattayken bunu yepyeni bir bağlantıdan kanıtlayın. Yeni bağlantı başarısız olursa, onu geri almak için hâlâ çalışan bir oturumunuz olur. Bir dağıtım tuzağı: Ubuntu 24.04'te daemon soket üzerinden etkinleştirilir, dolayısıylasshd_config'dekiPortyok sayılır — bunun yerine portusystemctl edit ssh.socketile ayarlayın, ya da soket birimini devre dışı bırakın.cat > /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF' Port 2222 PermitRootLogin prohibit-password PasswordAuthentication no KbdInteractiveAuthentication no AllowUsers ops X11Forwarding no MaxAuthTries 3 LoginGraceTime 20 EOF sshd -t && systemctl reload ssh # new terminal, do not close the old one: ssh -p 2222 ops@203.0.113.10
-
04
Güvenlik duvarını her iki IP ailesinde de varsayılan olarak reddedin
IPv6'nın ufw'de etkin olduğunu doğrulayın, ardından gelen her şeyi reddedin ve yalnızca bilerek sunduğunuz portları açın — güvenlik duvarını etkinleştirmeden önce izin verilmesi gereken yeni SSH portu dahil. Buradayken gerçekte neyin dinlediğini kontrol edin ve yerel olması gereken her şeyi loopback'e taşıyın.
grep IPV6 /etc/default/ufw # must read IPV6=yes ufw default deny incoming ufw default allow outgoing ufw limit 2222/tcp ufw allow 80,443/tcp ufw enable ufw status verbose ss -tulpen # anything on 0.0.0.0 or :: ?
-
05
Gözetimsiz güvenlik güncellemelerini açın
Yalnızca güvenlik kanalını etkinleştirin, böylece yamalar bir özellik yükseltmesi uygulamanızı habersizce yeniden başlatmadan devreye girsin. Yeniden başlatma politikasına açıkça karar verin — ve root dosya sistemi şifreliyse ve elle kilit açma gerektiriyorsa otomatik yeniden başlatmaları kapalı bırakın.
dpkg-reconfigure -plow unattended-upgrades cat > /etc/apt/apt.conf.d/51-local <<'EOF' Unattended-Upgrade::Automatic-Reboot "false"; Unattended-Upgrade::Remove-Unused-Kernel-Packages "true"; EOF unattended-upgrade --dry-run --debug | tail -20
-
06
Gürültüyü azaltın ve çekirdek ayarlarını sıkılaştırın
Bir sırrın hâlâ tahmin edilebildiği katmanlar için
fail2banekleyin ve statik adresli, herkese açık bir sunucuda basitçe doğru olan bir avuç sysctl değerini ayarlayın. Bu ucuzdur ve günlükleri okumaya değer kılar.apt install -y fail2ban cat > /etc/sysctl.d/99-harden.conf <<'EOF' net.ipv4.tcp_syncookies = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv6.conf.all.accept_ra = 0 kernel.kptr_restrict = 2 EOF sysctl --system
-
07
Dışarıdan doğrulayın, sonra kılavuzu yazın
Kutunun içinden görünüme değil, internetten görünüme güvenin. Eski SSH portunun kaybolduğunu, beklenmedik hiçbir şeyin yanıt vermediğini ve yalnızca anahtarla girişin gerçekten zorunlu kılındığını doğrulayın. Ardından en kötü gününüzde ihtiyaç duyacağınız üç bilgiyi yazıya dökün: ikinci anahtarınızın nerede durduğu, hangi anlık görüntüyü aldığınız ve host dışı yedeğin nerede olduğu.
# from another machine ssh -p 22 ops@203.0.113.10 # must time out or be refused ssh -p 2222 -o PreferredAuthentications=password ops@203.0.113.10 # expected: Permission denied (publickey) ssh -p 2222 ops@203.0.113.10 'sudo ufw status verbose; uptime'


