Zaman senkronizasyonu nasıl güvenli hale geldi?

Zaman senkronizasyonu nasıl güvenli hale geldi?
TCP/IP aracılığıyla iletişim kuran irili ufaklı milyonlarca cihazınız varsa, zamanın yalan söylemediğinden nasıl emin olabilirsiniz? Sonuçta her birinin bir saati var ve saatin hepsi için doğru olması gerekiyor. Bu sorun ntp olmadan çözülemez.

Bir dakikalığına endüstriyel BT altyapısının bir bölümünde hizmetlerin senkronize edilmesinde zaman içinde zorluklar yaşandığını hayal edelim. Kurumsal yazılımın küme yığını anında arızalanmaya başlar, etki alanları dağılır, ana bilgisayarlar ve Yedek düğümler başarısız bir şekilde statükoyu geri yüklemeye çalışır.

Saldırganın MiTM veya DDOS saldırısı yoluyla kasıtlı olarak zamanı bozmaya çalışması da mümkündür. Böyle bir durumda her şey olabilir:

  • Kullanıcı hesabı şifrelerinin süresi dolacaktır;
  • X.509 sertifikalarının süresi dolacak;
  • TOTP iki faktörlü kimlik doğrulama çalışmayı durduracak;
  • yedeklemeler güncelliğini yitirecek ve sistem bunları silecektir;
  • DNSSec bozulacak.

Her BT departmanının zaman senkronizasyonu hizmetlerinin güvenilir bir şekilde çalışmasıyla ilgilendiği açıktır ve endüstriyel operasyonda güvenilir ve emniyetli olmaları güzel olurdu.

NTP'yi 25 dakikada kırın

Ağ protokolleri – Y kuşağının bir özelliği var; onlar modası geçmiş ve artık hiçbir işe yaramıyor, ancak kritik bir meraklı kitlesi ve fon biriktiğinde bile bunları değiştirmek o kadar kolay değil.

Klasik NTP ile ilgili ana şikayet, davetsiz misafirlerin saldırılarına karşı koruma sağlayacak güvenilir mekanizmaların bulunmamasıdır. Bu sorunu çözmek için çeşitli girişimlerde bulunulmuştur. Bunu başarmak için öncelikle simetrik anahtarların değişimine yönelik bir ön paylaşımlı anahtar (PSK) mekanizması uyguladık.

Ne yazık ki, bu yöntem basit bir nedenden dolayı işe yaramadı; iyi ölçeklenmiyor. Sunucuya bağlı olarak istemci tarafında manuel yapılandırma gerekir. Bu, bu şekilde başka bir müşteri ekleyemeyeceğiniz anlamına gelir. NTP sunucusunda bir değişiklik olması durumunda tüm istemcilerin yeniden yapılandırılması gerekir.

Daha sonra AutoKey'i buldular, ancak hemen algoritmanın tasarımında bir takım ciddi güvenlik açıkları keşfettiler ve onu terk etmek zorunda kaldılar. Mesele şu ki, tohum yalnızca 32 bit içeriyor, çok küçük ve önden bir saldırı için yeterli hesaplama karmaşıklığı içermiyor.

  • Anahtar Kimliği - simetrik 32 bit anahtar;
  • MAC (mesaj kimlik doğrulama kodu) - NTP paket sağlama toplamı;

Otomatik anahtar aşağıdaki gibi hesaplanır.

Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)

Burada H() bir kriptografik karma işlevidir.

Paketlerin sağlama toplamını hesaplamak için aynı işlev kullanılır.

MAC=H(Autokey||NTP packet)

Paket kontrollerinin tüm bütünlüğünün çerezlerin gerçekliğine bağlı olduğu ortaya çıktı. Bunları aldıktan sonra otomatik anahtarı geri yükleyebilir ve ardından MAC'i taklit edebilirsiniz. Ancak NTP sunucusu bunları oluştururken bir tohum kullanır. İşin püf noktası da burada yatıyor.

Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))

MSB_32 işlevi, md5 karma hesaplama sonucundan en önemli 32 biti keser. Sunucu parametreleri değişmediği sürece istemci çerezi değişmez. Daha sonra saldırgan yalnızca ilk sayıyı geri yükleyebilir ve bağımsız olarak çerezler oluşturabilir.

Öncelikle NTP sunucusuna client olarak bağlanmanız ve çerezleri almanız gerekmektedir. Bundan sonra saldırgan, kaba kuvvet yöntemini kullanarak basit bir algoritma izleyerek başlangıç ​​​​sayısını geri yükler.

Başlangıç ​​sayısının hesaplanmasına kaba kuvvet yöntemini kullanarak saldırmak için kullanılan algoritma.

   for i=0:2^32 − 1 do
        Ci=H(Server-IP||Client-IP||0||i)
        if Ci=Cookie then
            return i
        end if 
    end for

IP adresleri biliniyor, bu nedenle geriye kalan tek şey, oluşturulan çerez NTP sunucusundan alınan çerezle eşleşene kadar 2^32 karma oluşturmaktır. Intel Core i5'e sahip normal bir ana istasyonda bu işlem 25 dakika sürecektir.

NTS - yeni Otomatik Anahtar

Autokey'de bu tür güvenlik açıklarına katlanmak imkansızdı ve 2012'de ortaya çıktı yeni bir versiyon protokol. Adı tehlikeye atmak için yeniden markalaşmaya karar verdiler ve Autokey v.2'ye Ağ Zaman Güvenliği adı verildi.

NTS protokolü, NTP güvenliğinin bir uzantısıdır ve şu anda yalnızca tek noktaya yayın modunu desteklemektedir. Paket manipülasyonuna karşı güçlü kriptografik koruma sağlar, gözetlemeyi önler, iyi ölçeklenir, ağ paket kaybına karşı dayanıklıdır ve bağlantı güvenliği sırasında en az düzeyde hassasiyet kaybına neden olur.

Bir NTS bağlantısı, alt katman protokollerini kullanan iki aşamadan oluşur. Açık ilk Bu aşamada, istemci ve sunucu çeşitli bağlantı parametreleri üzerinde anlaşırlar ve anahtarları içeren çerezleri beraberindeki tüm veri seti ile paylaşırlar. Açık ikinci Bu aşamada istemci ile NTP sunucusu arasında gerçek korumalı NTS oturumu gerçekleşir.

Zaman senkronizasyonu nasıl güvenli hale geldi?

NTS iki alt katman protokolünden oluşur: TLS üzerinden güvenli bir bağlantı başlatan Ağ Zaman Güvenliği Anahtar Değişimi (NTS-KE) ve NTP protokolünün en son versiyonu olan NTPv4. Aşağıda bunun hakkında biraz daha fazla bilgi bulacaksınız.

İlk aşama - NTS KE

Bu aşamada NTP istemcisi, NTS KE sunucusuyla ayrı bir TCP bağlantısı üzerinden TLS 1.2/1.3 oturumu başlatır. Bu oturum sırasında aşağıdakiler gerçekleşir.

  • Parametreleri taraflar belirliyor AEAD İkinci aşama için algoritma.
  • Taraflar ikinci bir alt katman protokolü tanımlıyor ancak şu anda yalnızca NTPv4 destekleniyor.
  • Taraflar NTP sunucusunun IP adresini ve portunu belirler.
  • NTS KE sunucusu, NTPv4 kapsamında çerezler yayınlar.
  • Taraflar, çerez materyalinden bir çift simetrik anahtar (C2S ve S2C) çıkarırlar.

Bu yaklaşımın büyük avantajı vardır; bağlantı parametreleriyle ilgili gizli bilgilerin iletilmesi yükünün tamamı kanıtlanmış ve güvenilir TLS protokolüne aittir. Bu, güvenli bir NTP anlaşması için kendi tekerleğinizi yeniden icat etme ihtiyacını ortadan kaldırır.

İkinci aşama - NTS koruması altında NTP

İkinci adımda istemci, saati NTP sunucusuyla güvenli bir şekilde senkronize eder. Bu amaçla NTPv4 paket yapısında dört özel uzantıyı (uzantı alanları) iletir.

  • Benzersiz Tanımlayıcı Uzantısı, tekrar saldırılarını önlemek için rastgele bir tek seferlik içerir.
  • NTS Çerez Uzantısı, istemcinin kullanabileceği NTP çerezlerinden birini içerir. Yalnızca istemci C2S ve S2C simetrik AAED anahtarlarına sahip olduğundan, NTP sunucusunun bunları çerez materyalinden çıkarması gerekir.
  • NTS Çerez Yer Tutucu Uzantısı, istemcinin sunucudan ek çerezler istemesinin bir yoludur. Bu uzantı, NTP sunucusu yanıtının istekten çok daha uzun olmamasını sağlamak için gereklidir. Bu, amplifikasyon saldırılarının önlenmesine yardımcı olur.
  • NTS Kimlik Doğrulayıcı ve Şifrelenmiş Uzantı Alanları Uzantısı, eşlik eden veriler olarak C2S anahtarı, NTP başlığı, zaman damgaları ve yukarıdaki EF ile birlikte AAED şifresini içerir. Bu uzantı olmadan zaman damgalarını taklit etmek mümkündür.

Zaman senkronizasyonu nasıl güvenli hale geldi?

İstemciden bir istek alındığında sunucu, NTP paketinin orijinalliğini doğrular. Bunu yapmak için çerezlerin şifresini çözmesi, AAED algoritmasını ve anahtarlarını çıkarması gerekir. NTP paketinin geçerliliği başarıyla kontrol edildikten sonra sunucu, istemciye aşağıdaki formatta yanıt verir.

  • Benzersiz Tanımlayıcı Uzantısı, tekrarlama saldırılarına karşı bir önlem olan istemci isteğinin ayna kopyasıdır.
  • Oturuma devam etmek için NTS Çerez Uzantısı daha fazla çerez.
  • NTS Kimlik Doğrulayıcı ve Şifreli Uzantı Alanları Uzantısı, S2C anahtarına sahip AEAD şifresini içerir.

Her istek ve yanıt müşteriye ek çerezler sağladığından, ikinci el sıkışma ilk adımı atlayarak birçok kez tekrarlanabilir. Bunun avantajı, PKI verilerinin hesaplanması ve iletilmesi gibi nispeten kaynak yoğun TLS işlemlerinin tekrarlanan taleplerin sayısına bölünmesidir. Bu, özellikle tüm ana işlevlerin simetrik kriptografi alanından çeşitli işlevler halinde paketlenebildiği ve tüm TLS yığınının başka bir cihaza aktarıldığı özel FPGA zaman tutucuları için kullanışlıdır.

NTPSec

NTP'yi özel kılan şey nedir? Projenin yazarı Dave Mills, kodunu mümkün olan en iyi şekilde belgelemeye çalışsa da, 35 yıllık zaman senkronizasyonu algoritmalarının inceliklerini anlayabilen nadir programcıdır. Kodun bir kısmı POSIX döneminden önce yazılmıştı ve o zamanki Unix API'si bugün kullanılandan çok farklıydı. Ek olarak, sinyalin gürültülü hatlardaki parazitlerden temizlenmesi için istatistik bilgisine ihtiyaç vardır.

NTS, NTP'yi düzeltmeye yönelik ilk girişim değildi. Saldırganlar, DDoS saldırılarını güçlendirmek için NTP'nin güvenlik açıklarından yararlanmayı öğrendiğinde, radikal değişikliklerin gerekli olduğu ortaya çıktı. NTS taslakları hazırlanıp sonuçlandırılırken, ABD Ulusal Bilim Vakfı 2014 yılı sonunda NTP'nin modernizasyonu için acilen bir hibe tahsis etti.

Çalışma grubuna herhangi bir kişi başkanlık etmiyordu; Eric Steven Raymond - Açık Kaynak topluluğunun kurucularından ve temel direklerinden biri ve kitabın yazarı Katedral ve Çarşı. Eric ve arkadaşlarının yapmaya çalıştığı ilk şey, NTP kodunu BitKeeper platformundan git'e taşımaktı ancak işler bu şekilde yürümedi. Proje lideri Harlan Stenn bu karara karşı çıktı ve müzakereler durdu. Daha sonra proje kodunun çatallanmasına karar verildi ve NTPSec doğdu.

GPSD üzerinde çalışma, matematiksel bir altyapı ve eski kodları okumanın sihirli becerisi dahil olmak üzere sağlam bir deneyim - Eric Raymond tam da böyle bir projeyi başarabilecek hackerdı. Ekip bir kod taşıma uzmanı buldu ve yalnızca 10 hafta içinde NTP yerleşmişGitLab'da. Çalışmalar tüm hızıyla sürüyordu.

Eric Raymond'un ekibi görevi Auguste Rodin'in bir taş bloğuyla yaptığı gibi üstlendi. 175 KLOC eski kodu kaldırarak birçok güvenlik açığını kapatarak saldırı yüzeyini önemli ölçüde azaltmayı başardılar.

İşte dağıtıma dahil olanların tamamlanmamış bir listesi:

  • Belgelenmemiş, güncelliğini yitirmiş, geçerliliğini yitirmiş veya bozuk yeniden saat.
  • Kullanılmayan ICS kütüphanesi.
  • libopts/otojen.
  • Windows için eski kod.
  • ntpdc.
  • Otomatik anahtar.
  • Ntpq C kodu Python'da yeniden yazıldı.
  • Sntp/ntpdig C kodu Python'da yeniden yazıldı.

Kodu temizlemenin yanı sıra projenin başka görevleri de vardı. Başarıların kısmi bir listesi:

  • Arabellek taşmasına karşı kod koruması önemli ölçüde iyileştirildi. Arabellek taşmalarını önlemek için, tüm güvenli olmayan dize işlevleri (strcpy/strcat/strtok/sprintf/vsprintf/gets), arabellek boyutu sınırlarını uygulayan güvenli sürümlerle değiştirildi.
  • NTS desteği eklendi.
  • Fiziksel donanımın bağlanmasıyla zaman adımı doğruluğu on kat artırıldı. Bunun nedeni, modern bilgisayar saatlerinin NTP'nin doğduğu zamana göre çok daha doğru hale gelmesidir. Bundan en büyük yararlananlar GPSDO ve özel zamanlı radyolardı.
  • Programlama dillerinin sayısı ikiye düşürüldü. Perl, awk ve hatta S betikleri yerine artık tamamı Python. Bu nedenle kodun yeniden kullanımı için daha fazla fırsat vardır.
  • Proje, otomatik araç komut dosyaları yerine bir yazılım oluşturma sistemi kullanmaya başladı WAF.
  • Proje dokümantasyonu güncellendi ve yeniden düzenlendi. Çelişkili ve bazen de arkaik bir belge koleksiyonundan oldukça makul belgeler yarattılar. Her komut satırı anahtarı ve her konfigürasyon varlığı artık tek bir doğruluk sürümüne sahiptir. Ayrıca kılavuz sayfaları ve web belgeleri artık aynı çekirdek dosyalardan oluşturulmaktadır.

NTPSec bir dizi Linux dağıtımı için mevcuttur. Şu anda en son kararlı sürüm 1.1.8'dir ve Gentoo Linux için sondan bir önceki sürümdür.

(1:696)$ sudo emerge -av ntpsec
These are the packages that would be merged, in order:
Calculating dependencies... done!
[ebuild   R    ] net-misc/ntpsec-1.1.7-r1::gentoo  USE="samba seccomp -debug -doc -early -gdb -heat -libbsd -nist -ntpviz -rclock_arbiter -rclock_generic -rclock_gpsd -rclock_hpgps -rclock_jjy -rclock_local -rclock_modem -rclock_neoclock -rclock_nmea -rclock_oncore -rclock_pps -rclock_shm -rclock_spectracom -rclock_trimble -rclock_truetime -rclock_zyfer -smear -tests" PYTHON_TARGETS="python3_6" 0 KiB
Total: 1 package (1 reinstall), Size of downloads: 0 KiB
Would you like to merge these packages? [Yes/No]

kroni

Eski NTP'yi daha güvenli bir alternatifle değiştirmek için başka bir girişimde bulunuldu. Chrony, NTPSec'in aksine sıfırdan yazılmıştır ve dengesiz ağ bağlantıları, kısmi ağ kullanılabilirliği veya tıkanıklığı ve sıcaklık değişiklikleri dahil olmak üzere çok çeşitli koşullar altında güvenilir şekilde çalışacak şekilde tasarlanmıştır. Ayrıca chrony'nin başka avantajları da vardır:

  • chrony, sistem saatini daha hızlı ve daha yüksek doğrulukla senkronize edebilir;
  • chrony daha küçüktür, daha az bellek tüketir ve CPU'ya yalnızca gerektiğinde erişir. Bu, kaynak ve enerji tasarrufu açısından büyük bir artı;
  • Chrony, Linux'ta donanım zaman damgalarını destekleyerek yerel ağlarda son derece hassas senkronizasyona olanak tanır.

Ancak chrony, eski NTP'nin yayın ve çok noktaya yayın istemcisi/sunucusu gibi bazı özelliklerinden yoksundur. Ayrıca klasik NTP, daha fazla sayıda işletim sistemini ve platformu destekler.

Sunucunun işlevselliğini ve chronyd işlemine yönelik NTP isteklerini devre dışı bırakmak için chrony.conf dosyasına bağlantı noktası 0'ı yazmanız yeterlidir. Bu, NTP istemcileri veya eşleri için zaman ayırmaya gerek olmadığı durumlarda yapılır. Sürüm 2.0'dan bu yana, NTP sunucusu bağlantı noktası yalnızca bir izin verme yönergesi veya uygun komutla erişime izin verildiğinde veya bir NTP eşi yapılandırıldığında veya bir yayın yönergesi kullanıldığında açıktır.

Program iki modülden oluşmaktadır.

  • chronyd arka planda çalışan bir hizmettir. Sistem saati ile harici zaman sunucusu arasındaki fark hakkında bilgi alır ve yerel saati ayarlar. Aynı zamanda NTP protokolünü de uygular ve istemci veya sunucu görevi görebilir.
  • chronyc, program izleme ve kontrolü için bir komut satırı yardımcı programıdır. Çeşitli hizmet parametrelerine ince ayar yapmak için kullanılır; örneğin chronyd çalışmaya devam ederken NTP sunucularını eklemenize veya kaldırmanıza olanak tanır.

RedHat Linux'un 7. sürümünden bu yana использует Bir zaman senkronizasyon hizmeti olarak chrony. Paket aynı zamanda diğer Linux dağıtımları için de mevcuttur. En son kararlı sürüm 3.5 olup v4.0'ın yayınlanmasına hazırlanıyor.

(1:712)$ sudo emerge -av chrony
These are the packages that would be merged, in order:
Calculating dependencies... done!
[binary  N     ] net-misc/chrony-3.5-r2::gentoo  USE="adns caps cmdmon ipv6 ntp phc readline refclock rtc seccomp (-html) -libedit -pps (-selinux)" 246 KiB
Total: 1 package (1 new, 1 binary), Size of downloads: 246 KiB
Would you like to merge these packages? [Yes/No]

Bir ofis ağındaki zamanı senkronize etmek için İnternet'te kendi uzak krony sunucunuzu nasıl kurarsınız? Aşağıda bir VPS kurulumu örneği verilmiştir.

Chrony'yi RHEL'de / VPS'de CentOS'ta kurma örneği

Şimdi biraz pratik yapalım ve bir VPS üzerinde kendi NTP sunucumuzu kuralım. Çok basit, sadece RuVDS web sitesinde uygun tarifeyi seçin, hazır bir sunucu edinin ve bir düzine basit komut yazın. Amacımız açısından bu seçenek oldukça uygundur.

Zaman senkronizasyonu nasıl güvenli hale geldi?

Servis kurulumuna geçelim ve ilk olarak chrony paketini kuralım.

[root@server ~]$ yum install chrony

RHEL 8 / CentOS 8 farklı bir paket yöneticisi kullanır.

[root@server ~]$ dnf install chrony

Chrony'yi yükledikten sonra hizmeti başlatıp etkinleştirmeniz gerekir.

[root@server ~]$ systemctl enable chrony --now

İstenirse, yanıt süresini azaltmak için /etc/chrony.conf dosyasında NPT sunucularını en yakın yerel sunucularla değiştirerek değişiklik yapabilirsiniz.

# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.ru.pool.ntp.org iburst
server 1.ru.pool.ntp.org iburst
server 2.ru.pool.ntp.org iburst
server 3.ru.pool.ntp.org iburst

Daha sonra NTP sunucusunun belirtilen havuzdaki düğümlerle senkronizasyonunu ayarlıyoruz.

[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service

Ayrıca NTP bağlantı noktasını dışarıya açmak da gereklidir, aksi takdirde güvenlik duvarı istemci düğümlerinden gelen bağlantıları engelleyecektir.

[root@server ~]$ firewall-cmd --add-service=ntp --permanent 
[root@server ~]$ firewall-cmd --reload

İstemci tarafında saat dilimini doğru ayarlamak yeterlidir.

[root@client ~]$ timedatectl set-timezone Europe/Moscow

/etc/chrony.conf dosyası, NTP sunucu chrony'sini çalıştıran VPS sunucumuzun IP'sini veya ana bilgisayar adını belirtir.

server my.vps.server

Ve son olarak istemcide zaman senkronizasyonunu başlatıyoruz.

[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true

Bir dahaki sefere size İnternet olmadan zamanı senkronize etmek için hangi seçeneklerin olduğunu anlatacağım.

Zaman senkronizasyonu nasıl güvenli hale geldi?

Zaman senkronizasyonu nasıl güvenli hale geldi?

Kaynak: habr.com

Yorum ekle