ÖğRETICILER
Yeni bir VPS nasıl güvenli hale getirilir: ilk on dakika
Yeni bir sunucu, bir IP adresi aldığı anda en savunmasız hâlindedir. Otomatik tarayıcılar tüm IPv4 uzayını aralıksız tarar; bu yüzden bir dakika önce dağıtılan bir kutuya yönelik ilk giriş denemeleri, genellikle siz karşılama mesajını okumayı bitirmeden gelir. Bunların hiçbiri size özel değildir — bu bir arka plan radyasyonudur ve root'ta parolası bulunan, sıkılaştırılmamış bir sunucunun aylar değil saatler içinde ele geçirilmesinin nedeni de tam olarak budur. İyi haber şu ki bunu kapatmak kısa bir iştir: sıralı on dakikalık adımlar, fırsatçı riskin neredeyse tamamını ortadan kaldırır. Bu rehber söz konusu kontrol listesini, kendinizi dışarıda bırakmaktan kaçınan sırayı ve çoğu sıkılaştırma öğreticisinin hiç bahsetmediği bir şeyi ele alır — varsayılan bir kurulumun, sizinle ilişkilendirilmesin diye özellikle kiraladığınız bir makineye sessizce yazdığı kişisel ayrıntıları.
Sıkılaştırma sizi gerçekte neye karşı korur
Sıkılaştırma, faydaları dar ve gerçek olduğu için tam olarak yapmaya değer. Sınırın nerede olduğu konusunda net olmak, dokunmadığı alanlarda sahte bir güvenlik hissine kapılmanızı engeller.
- Fırsatçı saldırganı tamamen ortadan kaldırır. Kimlik bilgisi doldurma (credential-stuffing) botları, SSH'a yönelik kaba kuvvet (brute force) saldırıları ve açıkta kalan yönetici panellerini arayan taramalar, yalnızca anahtarla kimlik doğrulama ve varsayılan olarak reddeden bir güvenlik duvarı karşısında başarısız olur.
- Çalıştırdığınız bir şeyde açık çıktığında yayılan hasarı sınırlar. Kapalı bir portun arkasında, yalnızca localhost'a bağlı bir servise, CVE'si yayımlandığı gün bile bir yabancı ulaşamaz.
- Bir hatanın bedelini azaltır. Ayrıcalıksız kullanıcılar, ayrı anahtarlar ve otomatik yamalar, tek bir kötü kararın makinenin tamamını teslim etmesini önler.
- Sunucuyu barındırıcınızdan gizlemez. Hipervizöre erişimi olan herkes prensipte çalışan bir makinenin belleğini okuyabilir — bu, güvenlik duvarı kurallarınızla değil, kimden kiraladığınızla ilgili bir sorudur.
- Sizi anonim yapmaz. Sıkılaştırma kutuyu korur; kutunun isminize bağlı olup olmadığı, siz ilk kez oturum açmadan çok önce, kayıt ve ödeme sırasında belirlenir.
İnsanların tersine çevirdiği ayrım tam olarak bu sonuncusudur. Yasal isminizle, kredi kartıyla satın alınmış, kusursuzca sıkılaştırılmış bir sunucu yine de yasal isminize kayıtlı bir sunucudur. İki katman birbirini tamamlar: KYC'siz barındırma ve kriptoyla finanse edilen bir bakiye, makinenin kağıt üzerinde kime ait olduğunu belirler; aşağıdaki on dakika ise ona kimin girebileceğini belirler.
Kendinizi dışarıda bırakmanızı engelleyen sıra
Neredeyse her sıkılaştırma korku hikâyesi aynı hikâyedir: biri, anahtarının çalıştığını doğrulamadan parola ile kimlik doğrulamayı kapatır ya da kuralları arasında SSH bulunmayan bir güvenlik duvarını etkinleştirir ve artık ulaşamadığı bir makinenin dışında kalır. Sıralama tam olarak bunu imkânsız kılmak için vardır. Önce anahtarı kurun ve ikinci bir pencerede çalıştığını kanıtlayın. Parolaları ancak ondan sonra kapatın. SSH için güvenlik duvarı kuralını, güvenlik duvarını etkinleştirmeden önce ekleyin, asla sonra değil.
İhtiyaç duymadan önce kurtarma yolunuzun ne olduğunu bilmekte de fayda var. Yalnızca SSH üzerinden ulaşabildiğiniz bir VPS'in tek bir kapısı vardır; bu yüzden sağlayıcı panelinizdeki konsol, dışarıda kalmayı yeniden kurulum yerine sıradan bir sıkıntıya dönüştüren yedek çözümdür. Her şey hâlâ çalışırken onu açabildiğinizi kontrol edin.
Adım adım: yeni bir kutuda ilk on dakika
- 01Paket dizinini ve kurulu paketleri güncelleyinYeni bir imaj, oluşturulduğu andan kalma bir anlık görüntüdür. Onu güncel hâle getirmek, listedeki en yüksek değerli tek eylemdir ve bir dakikadan az sürer.
- 02Sudo yetkisine sahip, ayrıcalıksız bir kullanıcı oluşturunHer zaman root olarak çalışmak, her yazım hatasının ve her sürecin tam yetkiyle çalışması demektir. Normal bir kullanıcı oluşturun, onu sudo veya wheel grubuna ekleyin ve bundan sonra onu kullanın.
- 03Genel anahtarınızı bu kullanıcıya kopyalayınElinizde yoksa kendi makinenizde bir ed25519 anahtarı oluşturun, ardından genel yarısını ssh-copy-id ile gönderin. Özel anahtar dizüstü bilgisayarınızdan asla çıkmaz.
- 04İkinci bir terminal açın ve anahtarla girişin çalıştığını doğrulayınBunu atlamayın. Kimlik doğrulamayla ilgili herhangi bir şeyi değiştirmeden önce, yeni bir pencerede, anahtarla yeni kullanıcı olarak oturum açın.
- 05Parola ile kimlik doğrulamayı ve root girişini kapatınPasswordAuthentication no ve PermitRootLogin prohibit-password ayarlarını yapın, ardından sshd'yi yeniden yükleyin. Kutuya yönelik kaba kuvvet saldırılarının artık tahmin edecek hiçbir şeyi kalmaz.
- 06SSH'a izin veren, varsayılan olarak reddeden bir güvenlik duvarı etkinleştirinTüm gelen trafiği reddedin, SSH portunuza izin verin, ardından etkinleştirin. Kendi servislerinizin ihtiyaç duyduğu portları daha sonra, birer birer ekleyin.
- 07Otomatik güvenlik güncellemelerini açınDebian ve Ubuntu'da unattended-upgrades, RHEL ailesinde dnf-automatic. Altıncı ayda artık dikkat etmediğinizde makineyi güvende tutan şey budur.
- 08Neyin dinlemede olduğunu listeleyin ve olmaması gerekeni kapatınTek bir ss -tulpn komutu size her açık soketi bildirir. Kasıtlı olarak koymadığınız her şey kaldırılmalı veya localhost'a bağlanmalıdır.
SSH: yalnızca anahtarlar ve önemli olan ayarlar
Genel anahtar kimlik doğrulaması, SSH sıkılaştırmasının tamamıdır. Parolalar kapatıldığında, bir saldırganın elinde olmayan bir özel anahtara ihtiyacı olur ve hiçbir tahmin miktarı onu üretmez. ed25519 anahtarları oluşturun — kısa, hızlı ve modern varsayılandır — ve anahtara bir parola cümlesi (passphrase) verin, böylece çalınan bir dizüstü bilgisayar çalınan bir sunucu anlamına gelmesin. sshd_config'teki geri kalan her şey, bu tek kararın üzerine eklenen bir incelmedir.
- PasswordAuthentication no — kaba kuvveti sona erdiren ayar. Önce, ikinci bir oturumda anahtarınızın çalıştığını doğrulayın.
- PermitRootLogin prohibit-password — root'a kurtarma amacıyla hâlâ anahtarla ulaşılabilir, ama asla parolayla değil. Sudo kullanıcınız kanıtlandıktan sonra bunu no olarak ayarlayın.
- AllowUsers veya AllowGroups — kimin oturum açabileceğine dair açık bir izin listesi, böylece bir paketin oluşturduğu bir servis hesabı asla bir SSH giriş noktası olamaz.
- KbdInteractiveAuthentication no — bazı dağıtımlarda parola istemlerini sessizce yeniden etkinleştirebilen diğer etkileşimli yolu kapatır.
- Tek bir özel anahtarı her yere kopyalamak yerine, ikinci bir cihaz için ikinci bir anahtar kullanın. Bir telefonu kaybetmek, authorized_keys'ten tek bir satırı silmek anlamına gelmeli, her şeyi değiştirmek değil.
- SSH'ı port 22'den taşımak günlük hacminizi büyük ölçüde azaltır, ama bunu güvenlik değil gürültü azaltma olarak görün — IP'nize gerçekten bakan biri için hiçbir şeyi değiştirmez.
Anahtarların ötesine geçmek isterseniz, en güçlü düzenleme SSH'ı hiç herkese açık şekilde göstermemektir: makineyi bir WireGuard tünelinin arkasına koyun ve yalnızca tünel adresinden gelen bağlantıları kabul etsin diye port 22'yi güvenlik duvarıyla kapatın. Bu, SSH daemon'ınızı internetin göremediği bir şeye dönüştürür ki bu, açıkta duran birinde yapılacak her türlü yapılandırma sıkılaştırmasından daha iyi bir sonuçtur.
Güvenlik duvarı: önce varsayılan reddet, sonra tam olarak kullandığınızı açın
Bir güvenlik duvarı, yalnızca varsayılanı reddetmekse anlamlıdır. Önce her şeye izin verip sonra bilinen kötü portları engellemek tam tersidir: sonunda hatırladığınız servisleri korur, unuttuklarınızı ise açıkta bırakırsınız. Tüm gelen trafiği reddedin, giden trafiğe izin verin, ardından ihtiyaç duyan şeyleri dağıttıkça portları teker teker açın. Modern Linux, altyapıda nftables kullanır; ufw veya firewalld ise bunun için gayet iyi ön yüzlerdir — araç, varsayılandan çok daha az önemlidir.
- SSH'a, güvenlik duvarını etkinleştirmeden önce izin verin, sonra değil. Bu, kendinizi dışarıda bırakmanın en yaygın ikinci yoludur.
- Yalnızca bir servisin dışarıdan gerçekten ihtiyaç duyduğu portları açın. Bir web sunucusu 80 ve 443 ister; bir veritabanı ise neredeyse hiçbir şey istemez.
- Yalnızca yerel olan servisleri 0.0.0.0 yerine 127.0.0.1'e bağlayın. Kapalı bir port ile herkese açık olarak asla dinlemeyen bir servis, birbirinden bağımsız iki korumadır ve ikisini de istersiniz.
- IPv4 kadar IPv6 kuralları da yazın. Çift yığınlı bir kutuda yalnızca v4'ü kapsayan bir kural kümesi, aynı servisi v6 adresinde ardına kadar açık bırakır.
- Mümkün olduğunda yönetim portlarını kaynak adrese göre kısıtlayın. Yönetim her zaman tek bir VPN uç noktasından geliyorsa, bunu kuralda belirtin.
- Bir servis ekledikten sonra kuralları yeniden okuyun. O zamandan beri kaldırdığınız bir şey için açılmış portlar, temiz bir başlangıcı sessizce bozan birikimdir.
Bazı iş yükleri bu mantığı tersine çevirir ve kasıtlı olarak ardına kadar açık bir port ister — bir Tor relayı, her yerden gelen bağlantıları kabul etmek zorundadır ve bir Bitcoin tam düğümü, yalnızca 8333 erişilebilir olduğunda eşlere hizmet verir. Bu sorun değil. Kural "hiçbir şey açma" değil, "kasıtlı olarak aç"tır ve herkese açık olacak şekilde tasarlanmış bir servis, kasıtlı bir tercihtir.
fail2ban ve düşündüğünüzden neden daha az önemli olduğu
fail2ban günlüklerinizi izler ve kimlik doğrulamayı tekrar tekrar başaramayan adresleri yasaklar. Gerçekten faydalıdır, ama parola ile kimlik doğrulamayı zaten kapattıktan sonra ne yaptığı konusunda dürüst olmakta fayda var: bu noktada artık kimse tahmin ederek başaramaz, yani fail2ban artık bir sızmayı önlemiyordur. Önlediği şey, günde binlerce anlamsız günlük satırı, bu bağlantı denemelerinin tükettiği CPU ve gerçek bir olayın, aylar önce okumayı bıraktığınız gürültünün içinde gömülü kalması riskidir.
Yine de on saniyelik kurulumuna değer ve parola kabul eden bir şey çalıştırdığınız anda gerçekten koruyucu hâle gelir — bir web uygulaması girişi, bir posta sunucusu, bir kontrol paneli. Onu yalnızca sshd'ye değil, bu günlüklere de yönlendirin. Yasaklama süresini dakikalar yerine saatler olarak ayarlayın ve kendi adresinizi yoksayma listesine ekleyin; böylece beceriksizce yazılmış bir parola sizi kendi makinenizden dışarıda bırakmaz.
Hatırlamanız gerekmeyen güncellemeler
İyi yapılandırılmış bir sunucu için gerçekçi tehdit, birinin SSH anahtarlarınızı yenmesi değildir. Kurup unuttuğunuz bir şey için yayımlanmış ve siz başka işlerle uğraşırken üç gün sonra bir tarayıcı tarafından istismar edilen bir güvenlik açığıdır. Otomatik güvenlik güncellemeleri bunun cevabıdır; Debian veya Ubuntu'da bu, güvenlik paketini kurmak üzere yapılandırılmış unattended-upgrades'tir; Fedora, Rocky veya Alma'da ise dnf-automatic'tir. Bunu ilk on dakikada açın ve makine, dikkatiniz başka yere kaydıktan çok sonra bile kendini yamamaya devam etsin.
Çekirdek (kernel) ve libc güncellemeleri hâlâ sizi gerektiren istisnadır: yalnızca bir yeniden başlatmadan sonra etkili olurlar, bu yüzden dört yüz gündür açık kalan bir sunucu neredeyse kesinlikle bir yıl önce diskte yamalanmış kodu çalıştırıyordur. Debian'ın needrestart'ı size hangi servislerin silinmiş kütüphanelere karşı çalıştığını söyler ve zamanlanmış bir yeniden başlatma penceresi — ayda bir olsa bile — kurulu yamalarla uygulanmış yamalar arasındaki farktır. Zaten çalıştırdığınız her şey beklenmedik bir yeniden başlatmayı atlatabilmelidir; atlatamıyorsa bu, düzeltmeye değer ayrı bir sorundur.
Bir sıkılaştırma kontrol listesinin atladığı kimlik sızıntıları
Bilerek offshore, KYC'siz bir barındırıcı seçtiyseniz önemli olan bölüm burasıdır. Standart bir sıkılaştırma rehberi, sahibi kamuya açık bir kayıt meselesi olan bir şirket sunucusu için yazılır; bu yüzden varsayılan yapılandırmanın sizin hakkınızda ne yazdığını hiç sormaz. Anonim olarak kiraladığınız bir makinede, bu varsayılanlardan birkaçı isminizi sessizce ona yeniden bağlar.
- SSH genel anahtarınız bir yorum taşır — varsayılan olarak yerel kullanıcı adınız ve dizüstü bilgisayarınızın ana bilgisayar adı, alex@alex-macbook gibi bir şey — ve bu yorum sunucuda authorized_keys içinde harfiyen saklanır. Anahtarı oluştururken -C bayrağıyla ayarlayın veya kopyaladıktan sonra satırı düzenleyin.
- Seçtiğiniz sunucu ana bilgisayar adı; günlüklerde, posta başlıklarında, izleme çıktısında ve bazen servis bannerlarında karşınıza çıkar. Jenerik bir ana bilgisayar adı hiçbir şey ifşa etmez; ama isminiz veya şirketinizinki eder.
- Sistem saat dilimi. Bulut imajları varsayılan olarak, kimseye hiçbir şey söylemeyen UTC kullanır. Onu kendi yerel diliminize ayarlamak nerede olduğunuzu daraltır ve ardından her günlükteki zaman damgaları çalışma saatlerinizi doğrular.
- Kutuya kopyalanan Git yapılandırması, commit attığınız isim ve e-posta adresini taşır. Kabuk (shell) geçmiş dosyaları, iş istasyonunuzdan senkronize edilen dotfile'lar ve aceleyle yapılan bir test sırasında önbelleğe alınmış herhangi bir kimlik bilgisi de aynısını yapar.
- Sertifika verme sırasında Let's Encrypt'e verdiğiniz e-posta adresi, o sertifika için kamuya açık kaydın bir parçası olur. Kimliğinize bağlı olmayan bir adres kullanın.
- Web sunucusu sürüm bannerları ve X-Powered-By başlıkları, artı makineden bir hesap tanımlayıcısı ekli şekilde eve telefon açan (phone home) herhangi bir analitik, çökme raporlayıcı veya tedarikçi izleme ajanı.
Katmanları birbirinden ayrı tutmakta fayda var. Sıkılaştırma, yabancıları makineden uzak tutar. Bu ayrıntılar ise makinenin, ona zaten bakan kişiye sizi anlatmasını engeller. Ödeme katmanı ise hiç bulunacak bir isim olup olmadığını belirler — bu konu, Bitcoin ile VPS satın almanın gerçekten anonim olup olmadığı rehberinde dürüstçe ele alınır ve Monero ile bakiye yüklemek ile daha da ileri götürülür. Her katman tek başına başarısız olabilir; birlikte dayanırlar.
Yedekler: sıkılaştırmanın sizin için yapamadığı kısım
Hiçbir güvenlik duvarı kuralı, silinmiş bir veritabanına, arızalanmış bir diske veya o an mantıklı görünen bir yapılandırma değişikliğine karşı korumaz. Yedekler, sizi kendi yaptığınız hatalardan kurtaran tek kontroldür; istatistiksel olarak iyi güvenlikli bir makinede veri kaybetmenin en olası yolu da budur. Sunucudan çıkmadan önce onları şifreleyin, en az bir kopyayı sunucunun kendisinin ulaşamayacağı bir yerde tutun ve hatırladığınızda değil, bir zaman çizelgesinde çalışacak şekilde ayarlayın.
Bu son nokta, kulağa geldiğinden daha önemlidir: sunucunun üzerine yazabildiği bir yedekleme süreci, sunucuda root yetkisine sahip herhangi bir şeyin yok edebileceği bir yedektir. Şifrelenmiş arşivleri ayrı bir depolama sunucusuna göndermek — ya da kimlik bilgilerinin yedeklenen makinenin dışında yaşaması için onları oradan çekmek — size makineden sağ çıkan bir kopya verir. Ve geri yüklemeyi, hiçbir şey yanlış gitmemişken, bilerek bir kez deneyin. Test edilmemiş bir yedek, bir güvenlik ağı değil bir varsayımdır.
İşi sessizce boşa çıkaran hatalar
- Anahtarı test etmeden parola ile kimlik doğrulamayı kapatmak, ardından hatayı artık oturum açamayan bir dizüstü bilgisayardan keşfetmek.
- SSH'a izin vermeden önce güvenlik duvarını etkinleştirmek — diğer yönden ulaşılan aynı dışarıda kalma durumu.
- Yalnızca IPv4 kuralları yazmak ve her servisi kutunun IPv6 adresinde erişilebilir bırakmak.
- İlk gün özenle sıkılaştırma yapmak, ardından her biri sorulmadan kendi portunu açan bir kontrol paneli, bir veritabanı ve bir izleme yığını kurmak.
- Bir sudo'dan kurtulmak için her şeyi root olarak çalıştırmak; böylece bunlardan herhangi birindeki ilk açık, tam bir ele geçirilmeye dönüşür.
- fail2ban'ı anahtarların yerine geçen bir şey olarak görmek; bu da yalnızca daha yavaş işleyen bir parola tahmin oyununu çalışır durumda bırakır.
- Kiralık bir sunucunun, diski şifreleyerek barındırıcısından gizlenebileceğini varsaymak — tam disk şifrelemesi çalışan bir makineyi değil, çalınmış bir sürücüyü korur.
- Hiç yeniden başlatmamak; böylece aylarca kurulu kalan çekirdek yamaları diskte beklerken eski çekirdek çalışmaya devam eder.
Bunların hiçbiri zor değildir ve hiçbiri uzun sürmez. Sırayla yapın, devam etmeden önce her adımı ikinci bir terminalden kanıtlayın; birkaç dakika önce dağıttığınız makine, adres uzayını tarayan herkes için bir fırsat olmaktan çıkar. Ardından buraya asıl çalıştırmak için geldiğiniz şeyi dağıtın — bir web sitesi, bir düğüm, bir tünel, özel bir model uç noktası — hakkında akıl yürütebileceğiniz bir taban üzerinde.