איך לוודא שהזמן כשלעצמו לא שקר אם יש לך מיליון מכשירים גדולים וקטנים שמתקשרים באמצעות TCP/IP? הרי לכל אחד מהם יש שעון, והשעה צריכה להיות נכונה עבור כולם. לא ניתן לעקוף בעיה זו ללא ntp.
בואו נדמיין לרגע שבקטע אחד של תשתית ה-IT התעשייתית יש קשיים בסנכרון שירותים לאורך זמן. מיד מחסנית האשכולות של תוכנת Enterprise מתחילה להיכשל, תחומים מתפוררים, מאסטרים וצמתי המתנה שואפים ללא הצלחה לשחזר את המצב הקיים.
ייתכן גם שתוקף מנסה בכוונה לשבש את הזמן באמצעות התקפת MiTM או DDOS. במצב כזה הכל יכול לקרות:
- תוקף סיסמאות חשבון משתמש יפוג;
- תוקף תעודות X.509 יפוג;
- אימות דו-גורמי TOTP לא יעבוד יותר;
- גיבויים יהפכו מיושנים והמערכת תמחק אותם;
- DNSSec יישבר.
ברור שכל מחלקת IT מעוניינת בתפעול אמין של שירותי סנכרון זמן, והיה נחמד אם הם יהיו אמינים ובטוחים בתפעול תעשייתי.
שבור NTP תוך 25 דקות
פרוטוקולי רשת - לבני דור המילניום יש ייחוד אחד, הם היו והם כבר לא טובים לכלום, אבל החלפתם לא כל כך קלה גם כשנצברת מסה קריטית של מתלהבים ומימון.
התלונה העיקרית לגבי NTP הקלאסי היא היעדר מנגנונים אמינים להגנה מפני התקפות של פולשים. נעשו ניסיונות שונים לפתור בעיה זו. כדי להשיג זאת, יישמנו תחילה מנגנון מפתח משותף מראש (PSK) להחלפת מפתחות סימטריים.
למרבה הצער, שיטה זו לא השתלמה מסיבה פשוטה - היא לא מתקדמת היטב. נדרשת תצורה ידנית בצד הלקוח בהתאם לשרת. זה אומר שאתה פשוט לא יכול להוסיף עוד לקוח סתם ככה. אם משהו משתנה בשרת ה-NTP, יש להגדיר מחדש את כל הלקוחות.
אחר כך הם הגיעו עם AutoKey, אבל הם גילו מיד מספר נקודות תורפה רציניות בעיצוב האלגוריתם עצמו והם נאלצו לנטוש אותו. העניין הוא שה-seed מכיל רק 32 ביט, הוא קטן מדי ואינו מכיל מספיק מורכבות חישובית להתקפה חזיתית.
- מזהה מפתח - מפתח 32 סיביות סימטרי;
- MAC (קוד אימות הודעה) - סכום בדיקת מנות NTP;
מפתח אוטומטי מחושב באופן הבא.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)כאשר H() היא פונקציית גיבוב קריפטוגרפית.
אותה פונקציה משמשת לחישוב סכום הבדיקה של מנות.
MAC=H(Autokey||NTP packet)מסתבר שכל תקינות בדיקות החבילה נשענת על האותנטיות של העוגיות. ברגע שיש לך אותם, אתה יכול לשחזר את המפתח האוטומטי ואז לזייף את ה-MAC. עם זאת, שרת NTP משתמש ב-Seed בעת יצירתם. כאן טמון המלכוד.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))הפונקציה MSB_32 מנתקת את 5 הביטים המשמעותיים ביותר מתוצאת חישוב ה-hash של md32. קובץ ה-cookie של הלקוח אינו משתנה כל עוד פרמטרי השרת נשארים ללא שינוי. אז התוקף יכול רק לשחזר את המספר הראשוני ולהיות מסוגל ליצור עוגיות באופן עצמאי.
ראשית, עליך להתחבר לשרת NTP כלקוח ולקבל עוגיות. לאחר מכן, באמצעות שיטת כוח גס, התוקף משחזר את המספר הראשוני בעקבות אלגוריתם פשוט.
אלגוריתם לתקיפת חישוב המספר ההתחלתי בשיטת ה-brute-force.
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 ידועות, אז כל מה שנותר הוא ליצור 2^32 hashes עד שהעוגייה שנוצרה תתאים לזו שהתקבלה משרת ה-NTP. בתחנת בית רגילה עם Intel Core i5, זה ייקח 25 דקות.
NTS - מפתח אוטומטי חדש
אי אפשר היה להשלים עם חורי אבטחה כאלה באוטוקי, ובשנת 2012 זה הופיע נוהל. כדי להתפשר על השם, הם החליטו למתג מחדש, אז Autokey v.2 כונה Network Time Security.
פרוטוקול NTS הוא הרחבה של אבטחת NTP וכרגע תומך במצב unicast בלבד. היא מספקת הגנה קריפטוגרפית חזקה מפני מניפולציה של מנות, מונעת חטטנות, מתרחבת היטב, עמידה בפני אובדן מנות ברשת, וגורמת לכמות הנמוכה ביותר של אובדן דיוק שנגרם במהלך אבטחת החיבור.
חיבור NTS מורכב משני שלבים המשתמשים בפרוטוקולים של שכבה נמוכה יותר. עַל הראשון בשלב זה, הלקוח והשרת מסכימים על פרמטרי חיבור שונים ומחליפים עוגיות המכילות מפתחות עם כל מערך הנתונים הנלווה. עַל השני בשלב זה, הפעלת ה-NTS המוגנת בפועל מתרחשת בין הלקוח לשרת ה-NTP.

NTS מורכב משני פרוטוקולים בשכבה נמוכה יותר: Network Time Security Key Exchange (NTS-KE), אשר יוזם חיבור מאובטח דרך TLS, ו-NTPv4, הגלגול האחרון של פרוטוקול NTP. קצת יותר על זה בהמשך.
שלב ראשון - NTS KE
בשלב זה, לקוח NTP יוזם הפעלת TLS 1.2/1.3 על חיבור TCP נפרד עם שרת NTS KE. במהלך הפגישה הזו קורה הדבר הבא.
- הצדדים קובעים את הפרמטרים אלגוריתם לשלב השני.
- הצדדים מגדירים פרוטוקול שני של שכבה נמוכה יותר, אך כרגע רק NTPv4 נתמך.
- הצדדים קובעים את כתובת ה-IP והיציאה של שרת ה-NTP.
- שרת NTS KE מנפיק קובצי Cookie תחת NTPv4.
- הצדדים מחלצים זוג מפתחות סימטריים (C2S ו-S2C) מחומר העוגיות.
לגישה זו יתרון גדול שכל הנטל של העברת מידע סודי לגבי פרמטרי חיבור נופל על פרוטוקול TLS המוכח והאמין. זה מבטל את הצורך להמציא מחדש את הגלגל שלך ללחיצת יד מאובטחת של NTP.
שלב שני - NTP בהגנת NTS
בשלב השני, הלקוח מסנכרן בצורה מאובטחת את השעה עם שרת ה-NTP. למטרה זו, הוא משדר ארבע הרחבות מיוחדות (שדות הרחבה) במבנה מנות NTPv4.
- תוסף הזיהוי הייחודי מכיל נון אקראי למניעת התקפות שידור חוזר.
- הרחבה של NTS Cookie מכילה אחת מעוגיות ה-NTP הזמינות ללקוח. מכיוון שרק ללקוח יש את מפתחות ה-AAED הסימטריים C2S ו-S2C, שרת ה-NTP חייב לחלץ אותם מחומר העוגיות.
- NTS Cookie Placeholder Extension היא דרך ללקוח לבקש עוגיות נוספות מהשרת. הרחבה זו נחוצה כדי להבטיח שתגובת שרת NTP אינה ארוכה בהרבה מהבקשה. זה עוזר למנוע התקפות הגברה.
- NTS Authenticator והרחבת שדות הרחבה מוצפנת מכילה את צופן AAED עם מפתח C2S, כותרת NTP, חותמות זמן וה-EF לעיל כנתונים נלווים. ללא הרחבה זו ניתן לזייף חותמות זמן.

עם קבלת בקשה מלקוח, השרת מאמת את האותנטיות של חבילת ה-NTP. לשם כך, עליו לפענח את העוגיות, לחלץ את אלגוריתם ה-AAED והמפתחות. לאחר בדיקת תקפות חבילת ה-NTP בהצלחה, השרת מגיב ללקוח בפורמט הבא.
- Unique Identifier Extension היא עותק מראה של בקשת הלקוח, אמצעי נגד התקפות שידור חוזר.
- NTS Cookie Extension עוגיות נוספות כדי להמשיך את ההפעלה.
- הרחבת NTS Authenticator והרחבת שדות הרחבה מוצפנת מכילה את צופן AEAD עם מפתח S2C.
ניתן לחזור על לחיצת היד השנייה פעמים רבות, תוך עקיפת השלב הראשון, שכן כל בקשה ותגובה מעניקה ללקוח עוגיות נוספות. יש לכך יתרון שפעולות TLS עתירות משאבים יחסית של מחשוב והעברת נתוני PKI מחולקות במספר הבקשות החוזרות ונשנות. זה נוח במיוחד לשומרי זמן מיוחדים של FPGA, כאשר ניתן לארוז את כל הפונקציונליות העיקרית למספר פונקציות מתחום ההצפנה הסימטרית, תוך העברת כל ערימת ה-TLS למכשיר אחר.
NTPSec
מה מיוחד ב-NTP? למרות העובדה שמחבר הפרויקט, דייב מילס, ניסה לתעד את הקוד שלו בצורה הטובה ביותר, מדובר במתכנת נדיר שיצליח להבין את נבכי אלגוריתמי סנכרון זמן בני 35 שנים. חלק מהקוד נכתב לפני עידן POSIX, ו-Unix API אז היה שונה מאוד ממה שמשתמשים בו היום. בנוסף, יש צורך בידע בסטטיסטיקה כדי לנקות את האות מהפרעות בקווים רועשים.
NTS לא היה הניסיון הראשון לתקן NTP. ברגע שתוקפים למדו לנצל פגיעויות של NTP כדי להגביר את התקפות DDoS, התברר כי נדרשים שינויים קיצוניים. ובזמן שהטיוטות של ה-NTS היו בהכנה וסופיות, הקרן הלאומית למדע של ארה"ב בסוף 2014 הקצתה בדחיפות מענק למודרניזציה של NTP.
בראש קבוצת העבודה עמד לא סתם אף אחד, אלא - אחד ממייסדי ועמודי התווך של קהילת הקוד הפתוח ומחבר הספר . הדבר הראשון שאריק וחבריו ניסו לעשות היה להעביר את קוד ה-NTP מפלטפורמת BitKeeper ל-git, אבל זה לא עבד כך. מנהיג הפרויקט הרלן סטן היה נגד החלטה זו והמשא ומתן נתקע. ואז הוחלט לחלק את קוד הפרויקט, ו-NTPSec נולד.
ניסיון מוצק, כולל עבודה על GPSD, רקע מתמטי והמיומנות הקסומה של קריאת קוד עתיק - אריק ריימונד היה בדיוק ההאקר שיכול היה להוציא פרויקט כזה. הצוות מצא מומחה להעברת קוד ובתוך 10 שבועות בלבד NTP ב-GitLab. העבודה הייתה בעיצומה.
הצוות של אריק ריימונד לקח על עצמו את המשימה באותו אופן שבו עשה אוגוסט רודן עם גוש אבן. על ידי הסרת 175 KLOC של קוד ישן, הם הצליחו לצמצם משמעותית את משטח ההתקפה על ידי סגירת חורי אבטחה רבים.
להלן רשימה חלקית של אלו הכלולים בהפצה:
- שעון חוזר לא מתועד, מיושן, מיושן או שבור.
- ספריית ICS שאינה בשימוש.
- libopts/autogen.
- קוד ישן עבור Windows.
- ntpdc.
- מפתח אוטומטי.
- קוד ntpq C נכתב מחדש ב- Python.
- קוד sntp/ntpdig C שוכתב ב- Python.
בנוסף לניקוי הקוד, לפרויקט היו משימות נוספות. להלן רשימה חלקית של הישגים:
- הגנת קוד מפני הצפת חיץ שופרה משמעותית. כדי למנוע הצפת מאגר, כל פונקציות המחרוזות הלא בטוחות (strcpy/strcat/strtok/sprintf/vsprintf/gets) הוחלפו בגרסאות בטוחות שמיישמות מגבלות גודל מאגר.
- נוספה תמיכת NTS.
- דיוק צעדי זמן משופר פי עשרה על ידי קישור חומרה פיזית. זה נובע מהעובדה ששעוני מחשב מודרניים הפכו למדויקים הרבה יותר מאלה כאשר ה-NTP נולד. המרוויחים הגדולים מכך היו GPSDO ומכשירי רדיו ייעודיים בזמן.
- מספר שפות התכנות הצטמצם לשתיים. במקום סקריפטים של Perl, awk ואפילו S, עכשיו הכל פייתון. בשל כך, יש יותר הזדמנויות לשימוש חוזר בקוד.
- במקום אטריות של סקריפטים של כלי אוטומטי, הפרויקט החל להשתמש במערכת לבניית תוכנה .
- תיעוד הפרויקט מעודכן ומאורגן מחדש. מאוסף מסמכים סותר ולעתים ארכאי, הם יצרו תיעוד סביר למדי. לכל מתג שורת פקודה ולכל ישות תצורה יש כעת גרסה אחת של אמת. בנוסף, דפי אדם ותיעוד אינטרנט נוצרים כעת מאותם קבצי ליבה.
NTPSec זמין עבור מספר הפצות לינוקס. כרגע, הגרסה היציבה האחרונה היא 1.1.8, עבור Gentoo Linux היא הלפני אחרונה.
(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]
כרוני
היה ניסיון נוסף להחליף את ה-NTP הישן בחלופה מאובטחת יותר. Chrony, בניגוד ל-NTPSec, נכתבת מהיסוד ומתוכננת לפעול בצורה אמינה במגוון רחב של תנאים, כולל חיבורי רשת לא יציבים, זמינות חלקית של הרשת או עומס ושינויי טמפרטורה. בנוסף, לכרוני יש יתרונות נוספים:
- chrony יכול לסנכרן את שעון המערכת מהר יותר עם דיוק רב יותר;
- chrony קטן יותר, צורך פחות זיכרון וניגש למעבד רק בעת הצורך. זהו יתרון גדול לחיסכון במשאבים ובאנרגיה;
- chrony תומך בחותמות זמן של חומרה בלינוקס, ומאפשר סנכרון מדויק במיוחד ברשתות מקומיות.
עם זאת, ל- chrony חסרים חלק מהתכונות של ה-NTP הישן, כגון שידור ולקוח/שרת מרובה שידור. בנוסף, NTP הקלאסי תומך במספר גדול יותר של מערכות הפעלה ופלטפורמות.
כדי להשבית את הפונקציונליות של השרת ובקשות NTP לתהליך chronyd, פשוט כתוב יציאה 0 בקובץ chrony.conf. הדבר נעשה במקרים בהם אין צורך לשמור על זמן עבור לקוחות NTP או עמיתים. מאז גרסה 2.0, יציאת שרת ה-NTP פתוחה רק כאשר הגישה מותרת על ידי הוראת allow או פקודה מתאימה, או שמוגדרת עמית NTP או שימוש בהנחיית שידור.
התוכנית מורכבת משני מודולים.
- chronyd הוא שירות שפועל ברקע. הוא מקבל מידע על ההבדל בין שעון המערכת לשרת הזמן החיצוני ומתאים את השעה המקומית. הוא גם מיישם את פרוטוקול NTP ויכול לפעול כלקוח או כשרת.
- chronyc הוא כלי שורת פקודה לניטור ובקרה של תוכניות. משמש לכוונון עדין של פרמטרי שירות שונים, למשל מאפשר לך להוסיף או להסיר שרתי NTP בזמן ש-chronyd ממשיכה לפעול.
מאז גרסה 7 של RedHat Linux chrony כשירות סנכרון זמן. החבילה זמינה גם להפצות לינוקס אחרות. הגרסה היציבה האחרונה היא 3.5, מתכוננת לשחרור של v4.0.
(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]
כיצד להגדיר שרת כרוני מרוחק משלך באינטרנט כדי לסנכרן זמן ברשת משרדית. להלן דוגמה להגדרת VPS.
דוגמה להגדרת Chrony ב-RHEL / CentOS ב-VPS
כעת נתאמן מעט ונקים שרת NTP משלנו ב-VPS. זה מאוד פשוט, פשוט בחר את התעריף המתאים באתר RuVDS, קבל שרת מוכן והקלד תריסר פקודות פשוטות. למטרותינו, אפשרות זו מתאימה למדי.

נעבור להגדרת השירות ונתקין תחילה את חבילת chrony.
[root@server ~]$ yum install chronyRHEL 8 / CentOS 8 משתמשים במנהל חבילות אחר.
[root@server ~]$ dnf install chronyלאחר התקנת chrony, עליך להפעיל ולהפעיל את השירות.
[root@server ~]$ systemctl enable chrony --nowאם תרצה, תוכל לבצע שינויים ב-/etc/chrony.conf, ולהחליף שרתי NPT בשרתי המקומיים הקרובים ביותר כדי להפחית את זמן התגובה.
# 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
לאחר מכן, הגדרנו סנכרון של שרת NTP עם צמתים מהמאגר שצוין.
[root@server ~]$ timedatectl set-ntp true
[root@server ~]$ systemctl restart chronyd.service
כמו כן, יש צורך לפתוח את יציאת ה-NTP כלפי חוץ, אחרת חומת האש תחסום חיבורים נכנסים מצמתי לקוח.
[root@server ~]$ firewall-cmd --add-service=ntp --permanent
[root@server ~]$ firewall-cmd --reload
בצד הלקוח, זה מספיק כדי להגדיר נכון את אזור הזמן.
[root@client ~]$ timedatectl set-timezone Europe/Moscowהקובץ /etc/chrony.conf מציין את ה-IP או שם המארח של שרת ה-VPS שלנו שמריץ שרת NTP chrony.
server my.vps.serverולבסוף, התחלת סנכרון זמן על הלקוח.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
בפעם הבאה אספר לכם אילו אפשרויות יש לסנכרון זמן ללא אינטרנט.
מקור: www.habr.com
