Kuinka varmistaa, että aika sinänsä ei valehtele, jos sinulla on miljoona suurta ja pientä laitetta, jotka kommunikoivat TCP/IP:n kautta? Loppujen lopuksi jokaisessa heistä on kello, ja ajan on oltava oikea. Tätä ongelmaa ei voi kiertää ilman ntp:tä.
Kuvitellaan hetki, että teollisuuden IT-infrastruktuurin yhdessä segmentissä on vaikeuksia synkronoida palveluita ajan mittaan. Välittömästi Enterprise-ohjelmistoklusteripino alkaa epäonnistua, toimialueet hajoavat, master- ja Standby-solmut yrittävät palauttaa status quon tuloksetta.
On myös mahdollista, että hyökkääjä yrittää tahallisesti häiritä aikaa MiTM- tai DDOS-hyökkäyksellä. Tällaisessa tilanteessa voi tapahtua mitä tahansa:
- Käyttäjätilien salasanat vanhenevat;
- X.509-varmenteet vanhenevat;
- Kaksivaiheinen TOTP-todennus lakkaa toimimasta;
- varmuuskopiot vanhentuvat ja järjestelmä poistaa ne;
- DNSSec katkeaa.
On selvää, että jokainen IT-osasto on kiinnostunut aikasynkronointipalvelujen luotettavasta toiminnasta ja olisi mukavaa, jos ne olisivat luotettavia ja turvallisia teollisessa käytössä.
Riko NTP 25 minuutissa
Verkkoprotokollat - milleniaaleilla on yksi erikoisuus, he ovat olleet eivätkä kelpaa enää mihinkään, mutta niiden korvaaminen ei ole niin helppoa edes silloin, kun harrastajia ja rahoitusta kertyy kriittinen massa.
Suurin valitus klassisesta NTP:stä on luotettavien mekanismien puute suojautua tunkeilijoiden hyökkäyksiltä. Tämän ongelman ratkaisemiseksi on tehty useita yrityksiä. Tämän saavuttamiseksi otimme ensin käyttöön ennalta jaetun avaimen (PSK) mekanismin symmetristen avainten vaihtamiseksi.
Valitettavasti tämä menetelmä ei kannattanut yksinkertaisesta syystä - se ei skaalaudu hyvin. Manuaalinen määritys vaaditaan asiakaspuolella palvelimesta riippuen. Tämä tarkoittaa, että et yksinkertaisesti voi lisätä toista asiakasta samalla tavalla. Jos jotain muuttuu NTP-palvelimessa, kaikki asiakkaat on määritettävä uudelleen.
Sitten he keksivät AutoKeyn, mutta he löysivät heti useita vakavia haavoittuvuuksia itse algoritmin suunnittelussa ja heidän oli hylättävä se. Asia on siinä, että siemen sisältää vain 32 bittiä, se on liian pieni eikä sisällä tarpeeksi laskennallista monimutkaisuutta frontaalihyökkäykseen.
- Key ID - symmetrinen 32-bittinen avain;
- MAC (viestin todennuskoodi) - NTP-paketin tarkistussumma;
Autokey lasketaan seuraavasti.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)Missä H() on kryptografinen hajautusfunktio.
Samaa funktiota käytetään pakettien tarkistussumman laskemiseen.
MAC=H(Autokey||NTP packet)Osoittautuu, että pakkausten tarkistusten koko eheys riippuu evästeiden aitoudesta. Kun sinulla on ne, voit palauttaa automaattisen avaimen ja sitten huijata MAC:n. NTP-palvelin kuitenkin käyttää siementä luodessaan niitä. Tässä on saalis.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))Funktio MSB_32 leikkaa pois 5 tärkeintä bittiä md32-hajautuslaskelman tuloksesta. Asiakaseväste ei muutu niin kauan kuin palvelimen parametrit pysyvät muuttumattomina. Sitten hyökkääjä voi palauttaa vain alkuperäisen numeron ja pystyä luomaan itsenäisesti evästeitä.
Ensin sinun on muodostettava yhteys NTP-palvelimeen asiakkaana ja vastaanotettava evästeitä. Tämän jälkeen hyökkääjä palauttaa alkuperäisen numeron raa'alla voimalla käyttämällä yksinkertaista algoritmia.
Algoritmi hyökätä alkuluvun laskemiseen brute-force-menetelmällä.
for i=0:2^32 − 1 do
Ci=H(Server-IP||Client-IP||0||i)
if Ci=Cookie then
return i
end if
end forIP-osoitteet ovat tiedossa, joten jäljellä on vain luoda 2^32 tiivistettä, kunnes luotu eväste vastaa NTP-palvelimelta saatua evästettä. Tavallisella kotiasemalla, jossa on Intel Core i5, tämä kestää 25 minuuttia.
NTS - uusi Autokey
Tällaisia tietoturva-aukkoja Autokeyssa oli mahdotonta sietää, ja vuonna 2012 se ilmestyi protokollaa. Nimen vaarantamiseksi he päättivät brändätä uudelleen, joten Autokey v.2 nimettiin Network Time Securityksi.
NTS-protokolla on NTP-suojauksen laajennus ja tukee tällä hetkellä vain unicast-tilaa. Se tarjoaa vahvan salaussuojan pakettien manipulointia vastaan, estää nuuskimisen, skaalautuu hyvin, kestää verkkopakettien katoamista ja aiheuttaa vähiten yhteyden suojauksen aikana syntyvää tarkkuutta.
NTS-yhteys koostuu kahdesta vaiheesta, jotka käyttävät alemman kerroksen protokollia. Päällä ensimmäinen Tässä vaiheessa asiakas ja palvelin sopivat erilaisista yhteysparametreista ja vaihtavat avaimia sisältäviä evästeitä kaiken mukana olevan tietojoukon kanssa. Päällä toinen Tässä vaiheessa varsinainen suojattu NTS-istunto tapahtuu asiakkaan ja NTP-palvelimen välillä.

NTS koostuu kahdesta alemman kerroksen protokollasta: Network Time Security Key Exchange (NTS-KE), joka aloittaa suojatun yhteyden TLS:n kautta, ja NTPv4, NTP-protokollan uusin inkarnaatio. Tästä hieman lisää alla.
Ensimmäinen vaihe - NTS KE
Tässä vaiheessa NTP-asiakas aloittaa TLS 1.2/1.3 -istunnon erillisen TCP-yhteyden kautta NTS KE -palvelimen kanssa. Tämän istunnon aikana tapahtuu seuraavaa.
- Osapuolet määrittävät parametrit algoritmi toista vaihetta varten.
- Osapuolet määrittelevät toisen alemman kerroksen protokollan, mutta tällä hetkellä tuetaan vain NTPv4:ää.
- Osapuolet määrittävät NTP-palvelimen IP-osoitteen ja portin.
- NTS KE -palvelin lähettää evästeitä NTPv4:n alla.
- Osapuolet poimivat evästemateriaalista parin symmetrisiä avaimia (C2S ja S2C).
Tällä lähestymistavalla on se suuri etu, että koko yhteysparametreja koskevan salaisen tiedon lähettämisen taakka laskee todistetulle ja luotettavalle TLS-protokollalle. Tämä poistaa tarpeen keksiä omaa pyörääsi uudelleen turvalliseen NTP-kättelyyn.
Toinen vaihe - NTP NTS-suojauksessa
Toisessa vaiheessa asiakas synkronoi ajan turvallisesti NTP-palvelimen kanssa. Tätä tarkoitusta varten se lähettää neljä erikoislaajennusta (laajennuskenttää) NTPv4-pakettirakenteessa.
- Unique Identifier Extension -laajennus sisältää satunnaisen merkin, joka estää uusintahyökkäykset.
- NTS Cookie Extension sisältää yhden asiakkaan käytettävissä olevista NTP-evästeistä. Koska vain asiakkaalla on symmetriset AAED C2S- ja S2C-avaimet, NTP-palvelimen on purettava ne evästemateriaalista.
- NTS Cookie Placeholder Extension on tapa, jolla asiakas voi pyytää lisäevästeitä palvelimelta. Tämä laajennus on välttämätön sen varmistamiseksi, että NTP-palvelimen vastaus ei ole paljon pyyntöä pidempi. Tämä auttaa estämään vahvistushyökkäykset.
- NTS Authenticator ja Encrypted Extension Fields Extension sisältää AAED-salauksen, jossa on C2S-avain, NTP-otsikko, aikaleimat ja yllä oleva EF mukana tulevana tietona. Ilman tätä laajennusta on mahdollista huijata aikaleimoja.

Saatuaan pyynnön asiakkaalta palvelin tarkistaa NTP-paketin aitouden. Tätä varten hänen on purettava evästeiden salaus, purettava AAED-algoritmi ja avaimet. Kun NTP-paketin kelpoisuus on tarkistettu onnistuneesti, palvelin vastaa asiakkaalle seuraavassa muodossa.
- Unique Identifier Extension on asiakaspyynnön peilikopio, joka on toimenpide uusintahyökkäyksiä vastaan.
- NTS Cookie Extension lisää evästeitä jatkaaksesi istuntoa.
- NTS Authenticator ja Encrypted Extension Fields Extension sisältää AEAD-salauksen S2C-avaimella.
Toinen kättely voidaan toistaa monta kertaa, ohittaen ensimmäisen vaiheen, koska jokainen pyyntö ja vastaus antaa asiakkaalle lisäevästeitä. Tällä on se etu, että suhteellisen resurssiintensiiviset PKI-datan laskemisen ja lähettämisen TLS-toiminnot jaetaan toistuvien pyyntöjen lukumäärällä. Tämä on erityisen kätevää erikoistuneille FPGA-ajanottajille, kun kaikki päätoiminnot voidaan pakata useisiin toimintoihin symmetrisen kryptografian alalta siirtäen koko TLS-pinon toiselle laitteelle.
NTPSec
Mitä erityistä NTP:ssä on? Huolimatta siitä, että projektin kirjoittaja Dave Mills yritti dokumentoida koodinsa mahdollisimman hyvin, se on harvinainen ohjelmoija, joka pystyy ymmärtämään 35 vuotta vanhojen aikasynkronointialgoritmien monimutkaisuudet. Osa koodista kirjoitettiin ennen POSIX-aikakautta, ja Unix API oli silloin hyvin erilainen kuin nykyään. Lisäksi tarvitaan tilastotietoa signaalin poistamiseksi häiriöistä kohinaisilla linjoilla.
NTS ei ollut ensimmäinen yritys korjata NTP. Kun hyökkääjät oppivat hyödyntämään NTP-haavoittuvuuksia DDoS-hyökkäyksiä voimistaakseen, kävi selväksi, että radikaaleja muutoksia tarvittiin. Ja samalla kun NTS-luonnoksia valmisteltiin ja viimeisteltiin, Yhdysvaltain kansallinen tiedesäätiö myönsi vuoden 2014 lopussa kiireellisesti apurahan NTP:n modernisointiin.
Työryhmää ei johtanut kuka tahansa, vaan - yksi Open Source -yhteisön perustajista ja pilareista ja kirjan kirjoittaja . Ensimmäinen asia, jonka Eric ja hänen ystävänsä yrittivät tehdä, oli siirtää NTP-koodi BitKeeper-alustalta gitiin, mutta se ei toiminut niin. Projektijohtaja Harlan Stenn vastusti päätöstä ja neuvottelut pysähtyivät. Sitten päätettiin haaroittaa projektikoodi, ja NTPSec syntyi.
Vankka kokemus, mukaan lukien työ GPSD:n parissa, matemaattinen tausta ja maaginen taito lukea muinaista koodia – Eric Raymond oli juuri se hakkeri, joka pystyi toteuttamaan tällaisen projektin. Tiimi löysi koodinsiirtoasiantuntijan ja vain 10 viikossa NTP:n GitLabissa. Työ oli täydessä vauhdissa.
Eric Raymondin tiimi suoritti tehtävän samalla tavalla kuin Auguste Rodin teki kivipalkan kanssa. Poistamalla 175 KLOC vanhaa koodia he pystyivät vähentämään merkittävästi hyökkäyspintaa ja sulkemaan monia tietoturva-aukkoja.
Tässä on epätäydellinen luettelo jakeluun sisältyvistä:
- Dokumentoimaton, vanhentunut, vanhentunut tai rikki.
- Käyttämätön ICS-kirjasto.
- libopts/autogen.
- Vanha koodi Windowsille.
- ntpdc.
- Automaattinen avain.
- Ntpq C -koodi on kirjoitettu uudelleen Pythonissa.
- Sntp/ntpdig C -koodi on kirjoitettu uudelleen Pythonissa.
Koodin puhdistamisen lisäksi projektilla oli muita tehtäviä. Tässä on osittainen luettelo saavutuksista:
- Koodisuojausta puskurin ylivuotoa vastaan on parannettu merkittävästi. Puskurin ylivuodon estämiseksi kaikki vaaralliset merkkijonofunktiot (strcpy/strcat/strtok/sprintf/vsprintf/gets) on korvattu turvallisilla versioilla, jotka toteuttavat puskurin kokorajoituksia.
- Lisätty NTS-tuki.
- Parempi aika-askeltarkkuus kymmenkertaiseksi yhdistämällä fyysiset laitteet. Tämä johtuu siitä, että nykyaikaisista tietokonekelloista on tullut paljon tarkempia kuin NTP:n syntymän aikaan. Suurimmat hyötyjät tästä olivat GPSDO ja erityisaikaradiot.
- Ohjelmointikielten määrä on vähennetty kahteen. Perl-, awk- ja jopa S-skriptien sijaan se on nyt kaikki Python. Tämän ansiosta koodin uudelleenkäyttöön on enemmän mahdollisuuksia.
- Autotools-skriptien nuudelien sijaan projektissa alettiin käyttää ohjelmiston rakennusjärjestelmää .
- Päivitetty ja uusittu projektidokumentaatio. Ristiriitaisesta ja joskus arkaaisesta dokumenttikokoelmasta he loivat varsin kelvollista dokumentaatiota. Jokaisella komentorivikytkimellä ja jokaisella konfigurointientiteetillä on nyt yksi versio totuudesta. Lisäksi man-sivut ja verkkodokumentaatio luodaan nyt samoista ydintiedostoista.
NTPSec on saatavilla useille Linux-jakeluille. Tällä hetkellä uusin vakaa versio on 1.1.8, Gentoo Linuxille se on toiseksi viimeinen.
(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]
Chrony
Oli toinen yritys korvata vanha NTP turvallisemmalla vaihtoehdolla. Chrony, toisin kuin NTPSec, on kirjoitettu alusta alkaen ja se on suunniteltu toimimaan luotettavasti useissa olosuhteissa, mukaan lukien epävakaat verkkoyhteydet, verkon osittainen käytettävyys tai ruuhkautuminen ja lämpötilan muutokset. Lisäksi kronilla on muita etuja:
- chrony voi synkronoida järjestelmän kellon nopeammin ja suuremmalla tarkkuudella;
- chrony on pienempi, kuluttaa vähemmän muistia ja käyttää CPU:ta vain tarvittaessa. Tämä on suuri plussa resurssien ja energian säästämisen kannalta;
- chrony tukee laitteiston aikaleimoja Linuxissa, mikä mahdollistaa erittäin tarkan synkronoinnin paikallisissa verkoissa.
Chronysta puuttuu kuitenkin joitain vanhoja NTP-ominaisuuksia, kuten lähetys- ja monilähetysasiakas/palvelin. Lisäksi klassinen NTP tukee suurempaa määrää käyttöjärjestelmiä ja alustoja.
Poistaaksesi palvelimen toiminnallisuuden ja NTP-pyynnöt chronyd-prosessille, kirjoita portti 0 chrony.conf-tiedostoon. Tämä tehdään tapauksissa, joissa ei ole tarvetta ylläpitää aikaa NTP-asiakkaille tai vertaisille. Versiosta 2.0 lähtien NTP-palvelinportti on avoinna vain, kun pääsy on sallittu sallimalla käskyllä tai sopivalla komennolla, tai kun NTP-vertais on määritetty tai lähetysohjetta käytetään.
Ohjelma koostuu kahdesta moduulista.
- chronyd on palvelu, joka toimii taustalla. Se vastaanottaa tietoa järjestelmän kellon ja ulkoisen aikapalvelimen välisestä erosta ja säätää paikallista aikaa. Se toteuttaa myös NTP-protokollan ja voi toimia asiakkaana tai palvelimena.
- chronyc on komentoriviohjelma ohjelmien valvontaan ja ohjaukseen. Käytetään erilaisten palveluparametrien hienosäätämiseen, esimerkiksi NTP-palvelimien lisäämiseen tai poistamiseen, kun chronyd jatkaa toimintaansa.
RedHat Linuxin versiosta 7 lähtien chrony aikasynkronointipalveluna. Paketti on saatavilla myös muille Linux-jakeluille. Uusin vakaa versio on 3.5, joka valmistautuu v4.0:n julkaisuun.
(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]
Kuinka perustaa oma Chrony-etäpalvelin Internetiin ajan synkronoimiseksi toimistoverkossa. Alla on esimerkki VPS:n asettamisesta.
Esimerkki Chronyn määrittämisestä RHEL- / CentOS-palvelussa VPS:ssä
Harjoitellaan nyt vähän ja laitetaan oma NTP-palvelin VPS:ään. Se on hyvin yksinkertaista, valitse vain sopiva tariffi RuVDS-verkkosivustolta, hanki valmis palvelin ja kirjoita tusina yksinkertaista komentoa. Meidän tarkoituksiin tämä vaihtoehto on varsin sopiva.

Siirrytään palvelun määrittämiseen ja asenna ensin Chrony-paketti.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 käyttävät eri paketinhallintaa.
[root@server ~]$ dnf install chronyKun olet asentanut chronyn, sinun on käynnistettävä ja aktivoitava palvelu.
[root@server ~]$ systemctl enable chrony --nowHalutessasi voit tehdä muutoksia tiedostoon /etc/chrony.conf ja korvata NPT-palvelimet lähimmillä paikallisilla lyhentäen vasteaikaa.
# 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
Seuraavaksi määritämme NTP-palvelimen synkronoinnin määritetyn poolin solmujen kanssa.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
On myös välttämätöntä avata NTP-portti ulos, muuten palomuuri estää saapuvat yhteydet asiakassolmuista.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
Asiakaspuolella riittää, että aikavyöhyke asetetaan oikein.
[root@client ~]$ timedatectl set-timezone Europe/Moscow/etc/chrony.conf-tiedosto määrittää VPS-palvelimemme IP-osoitteen tai isäntänimen, joka käyttää NTP-palvelinta chrony.
server my.vps.serverJa lopuksi aikasynkronoinnin aloitus asiakkaalla.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
Seuraavalla kerralla kerron, mitä vaihtoehtoja on ajan synkronointiin ilman Internetiä.
Lähde: will.com
