كيف تتأكد من أن الوقت في حد ذاته لا يكذب إذا كان لديك مليون جهاز كبير وصغير يتصل عبر TCP/IP؟ ففي النهاية، كل واحد منهم لديه ساعة، ويجب أن يكون الوقت صحيحًا بالنسبة لهم جميعًا. لا يمكن التحايل على هذه المشكلة بدون NTP.
دعونا نتخيل للحظة أنه في أحد قطاعات البنية التحتية لتكنولوجيا المعلومات الصناعية توجد صعوبات في مزامنة الخدمات مع مرور الوقت. على الفور، تبدأ مجموعة برامج Enterprise بالفشل، وتتفكك المجالات، وتسعى العقد الرئيسية والعقد الاحتياطية دون جدوى لاستعادة الوضع الراهن.
ومن الممكن أيضًا أن يحاول أحد المهاجمين عمدًا تعطيل الوقت من خلال هجوم MiTM أو DDOS. في مثل هذه الحالة يمكن أن يحدث أي شيء:
- ستنتهي صلاحية كلمات مرور حساب المستخدم؛
- ستنتهي صلاحية شهادات X.509؛
- ستتوقف مصادقة TOTP الثنائية عن العمل؛
- ستصبح النسخ الاحتياطية قديمة وسيقوم النظام بحذفها؛
- سوف ينقطع DNSSec.
من الواضح أن كل قسم من أقسام تكنولوجيا المعلومات مهتم بالتشغيل الموثوق لخدمات مزامنة الوقت، وسيكون من الرائع لو كانت موثوقة وآمنة في التشغيل الصناعي.
كسر NTP في 25 دقيقة
بروتوكولات الشبكة - يتمتع جيل الألفية بخصوصية واحدة، وهي كذلك ولم تعد صالحة لأي شيء، لكن استبدالها ليس بالأمر السهل حتى مع تراكم كتلة حرجة من المتحمسين والتمويل.
الشكوى الرئيسية بشأن NTP الكلاسيكي هي عدم وجود آليات موثوقة للحماية من هجمات المتسللين. وقد بذلت محاولات مختلفة لحل هذه المشكلة. ولتحقيق ذلك، قمنا أولاً بتنفيذ آلية المفتاح المشترك مسبقًا (PSK) لتبادل المفاتيح المتماثلة.
لسوء الحظ، لم تؤت هذه الطريقة ثمارها لسبب بسيط - فهي لا تتوسع بشكل جيد. التكوين اليدوي مطلوب من جانب العميل اعتمادًا على الخادم. هذا يعني أنه لا يمكنك ببساطة إضافة عميل آخر بهذه الطريقة. إذا تغير شيء ما على خادم NTP، فيجب إعادة تكوين جميع العملاء.
ثم توصلوا إلى AutoKey، لكنهم اكتشفوا على الفور عددًا من نقاط الضعف الخطيرة في تصميم الخوارزمية نفسها وكان عليهم التخلي عنها. الشيء هو أن البذرة تحتوي على 32 بت فقط، وهي صغيرة جدًا ولا تحتوي على تعقيد حسابي كافٍ لهجوم أمامي.
- معرف المفتاح - مفتاح متماثل 32 بت؛
- MAC (رمز مصادقة الرسالة) - المجموع الاختباري لحزمة NTP؛
يتم حساب المفتاح التلقائي على النحو التالي.
Autokey=H(Sender-IP||Receiver-IP||KeyID||Cookie)حيث H() هي دالة تجزئة مشفرة.
يتم استخدام نفس الوظيفة لحساب المجموع الاختباري للحزم.
MAC=H(Autokey||NTP packet)اتضح أن سلامة عمليات فحص الحزمة بالكامل تعتمد على صحة ملفات تعريف الارتباط. بمجرد حصولك عليها، يمكنك استعادة المفتاح التلقائي ومن ثم محاكاة جهاز MAC. ومع ذلك، يستخدم خادم NTP بذرة عند إنشائها. هذا هو المكان الذي يكمن فيه المصيد.
Cookie=MSB_32(H(Client IP||Server IP||0||Server Seed))تقوم الدالة MSB_32 بقطع الـ 5 بت الأكثر أهمية من نتيجة حساب تجزئة md32. لا يتغير ملف تعريف ارتباط العميل طالما ظلت معلمات الخادم دون تغيير. بعد ذلك، يمكن للمهاجم فقط استعادة الرقم الأولي ويكون قادرًا على إنشاء ملفات تعريف الارتباط بشكل مستقل.
أولاً، تحتاج إلى الاتصال بخادم NTP كعميل وتلقي ملفات تعريف الارتباط. بعد ذلك، وباستخدام طريقة القوة الغاشمة، يستعيد المهاجم الرقم الأولي باتباع خوارزمية بسيطة.
خوارزمية مهاجمة حساب الرقم الأولي باستخدام طريقة القوة الغاشمة.
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 تجزئة حتى يتطابق ملف تعريف الارتباط الذي تم إنشاؤه مع الملف المستلم من خادم NTP. على محطة منزلية عادية مع Intel Core i5، سيستغرق ذلك 25 دقيقة.
NTS - مفتاح تلقائي جديد
كان من المستحيل تحمل مثل هذه الثغرات الأمنية في Autokey، وفي عام 2012 ظهرت بروتوكول. من أجل التنازل عن الاسم، قرروا تغيير العلامة التجارية، لذلك أطلق على Autokey v.2 اسم Network Time Security.
يعد بروتوكول NTS امتدادًا لأمان NTP ويدعم حاليًا وضع البث الأحادي فقط. فهو يوفر حماية تشفير قوية ضد التلاعب بالحزم، ويمنع التطفل، ويقيس بشكل جيد، ويتمتع بالمرونة في مواجهة فقدان حزم الشبكة، وينتج عنه أقل قدر من فقدان الدقة أثناء أمان الاتصال.
يتكون اتصال 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 ملفات تعريف الارتباط ضمن NTPv4.
- يقوم الطرفان باستخراج زوج من المفاتيح المتماثلة (C2S وS2C) من مادة ملف تعريف الارتباط.
يتمتع هذا الأسلوب بميزة كبيرة تتمثل في أن العبء الكامل لنقل المعلومات السرية فيما يتعلق بمعلمات الاتصال يقع على عاتق بروتوكول TLS الذي أثبت كفاءته وموثوقيته. وهذا يلغي الحاجة إلى إعادة اختراع العجلة الخاصة بك للحصول على مصافحة NTP آمنة.
المرحلة الثانية - NTP تحت حماية NTS
في الخطوة الثانية، يقوم العميل بمزامنة الوقت بشكل آمن مع خادم NTP. ولهذا الغرض، فإنه ينقل أربعة امتدادات خاصة (حقول ملحقة) في بنية حزمة NTPv4.
- يحتوي ملحق المعرف الفريد على رقم عشوائي لمنع هجمات إعادة التشغيل.
- يحتوي ملحق ملفات تعريف الارتباط NTS على أحد ملفات تعريف الارتباط NTP المتاحة للعميل. نظرًا لأن العميل فقط لديه مفاتيح AAED C2S وS2C المتماثلة، فيجب على خادم NTP استخراجها من مادة ملف تعريف الارتباط.
- يعد NTS Cookie Placeholder Extension وسيلة للعميل لطلب ملفات تعريف ارتباط إضافية من الخادم. يعد هذا الامتداد ضروريًا للتأكد من أن استجابة خادم NTP ليست أطول بكثير من الطلب. وهذا يساعد على منع هجمات التضخيم.
- يحتوي NTS Authenticator وEncrypted Extension Fields Extension على تشفير AAED مع مفتاح C2S ورأس NTP والطوابع الزمنية وEF أعلاه كبيانات مصاحبة. بدون هذا الامتداد من الممكن تزييف الطوابع الزمنية.

عند تلقي طلب من العميل، يتحقق الخادم من صحة حزمة NTP. للقيام بذلك، يجب عليه فك تشفير ملفات تعريف الارتباط، واستخراج خوارزمية ومفاتيح AAED. بعد التحقق من صلاحية حزمة NTP بنجاح، يستجيب الخادم للعميل بالتنسيق التالي.
- ملحق المعرف الفريد هو نسخة طبق الأصل من طلب العميل، وهو إجراء ضد هجمات إعادة التشغيل.
- NTS Cookie Extension المزيد من ملفات تعريف الارتباط لمواصلة الجلسة.
- يحتوي NTS Authenticator وEncrypted Extension Fields Extension على تشفير AEAD مع مفتاح S2C.
يمكن تكرار المصافحة الثانية عدة مرات، متجاوزة الخطوة الأولى، حيث أن كل طلب واستجابة يمنح العميل ملفات تعريف ارتباط إضافية. ويتميز هذا بأن عمليات TLS كثيفة الموارد نسبيًا لحساب ونقل بيانات PKI مقسمة على عدد الطلبات المتكررة. يعد هذا مناسبًا بشكل خاص لأجهزة ضبط الوقت المتخصصة في FPGA، حيث يمكن تجميع جميع الوظائف الرئيسية في عدة وظائف من مجال التشفير المتماثل، ونقل مكدس TLS بالكامل إلى جهاز آخر.
NTPSec
ما هو المميز في NTP؟ على الرغم من أن مؤلف المشروع، ديف ميلز، حاول توثيق الكود الخاص به قدر الإمكان، إلا أنه مبرمج نادر سيكون قادرًا على فهم تعقيدات خوارزميات مزامنة الوقت التي يبلغ عمرها 35 عامًا. تمت كتابة بعض التعليمات البرمجية قبل عصر POSIX، وكانت واجهة برمجة تطبيقات Unix مختلفة تمامًا عما هو مستخدم اليوم. بالإضافة إلى ذلك، هناك حاجة إلى معرفة الإحصائيات لمسح الإشارة من التداخل على الخطوط المزعجة.
لم تكن NTS هي المحاولة الأولى لإصلاح NTP. بمجرد أن تعلم المهاجمون كيفية استغلال ثغرات NTP لتضخيم هجمات DDoS، أصبح من الواضح أن هناك حاجة إلى تغييرات جذرية. وبينما كان يجري إعداد مسودات NTS ووضع اللمسات النهائية عليها، خصصت مؤسسة العلوم الوطنية الأمريكية في نهاية عام 2014 على وجه السرعة منحة لتحديث NTP.
ولم يكن يرأس مجموعة العمل أي شخص فحسب، بل كان يرأسها - أحد مؤسسي وأركان مجتمع المصادر المفتوحة ومؤلف الكتاب . أول شيء حاول إريك وأصدقاؤه القيام به هو نقل كود NTP من منصة BitKeeper إلى git، لكن الأمر لم ينجح بهذه الطريقة. كان قائد المشروع هارلان ستين ضد هذا القرار وتوقفت المفاوضات. ثم تقرر تفرع كود المشروع، وولد NTPSec.
خبرة قوية، بما في ذلك العمل على GPSD، وخلفية رياضية ومهارة سحرية في قراءة التعليمات البرمجية القديمة - كان إريك ريموند هو بالضبط المتسلل الذي يمكنه تنفيذ مثل هذا المشروع. عثر الفريق على متخصص في ترحيل التعليمات البرمجية وفي غضون 10 أسابيع فقط من NTP على جيتلاب. وكان العمل على قدم وساق.
تولى فريق إريك ريموند المهمة بنفس الطريقة التي قام بها أوغست رودين باستخدام كتلة من الحجر. ومن خلال إزالة 175 KLOC من الكود القديم، تمكنوا من تقليل سطح الهجوم بشكل كبير عن طريق إغلاق العديد من الثغرات الأمنية.
فيما يلي قائمة غير كاملة بتلك المدرجة في التوزيع:
- refclock غير موثقة أو قديمة أو قديمة أو مكسورة.
- مكتبة ICS غير المستخدمة.
- ليبوبتس/autogen.
- الكود القديم لنظام التشغيل Windows.
- ntpdc.
- المفتاح التلقائي.
- تمت إعادة كتابة كود ntpq C بلغة بايثون.
- تمت إعادة كتابة كود sntp/ntpdig C بلغة بايثون.
بالإضافة إلى تنظيف التعليمات البرمجية، كان للمشروع مهام أخرى. فيما يلي قائمة جزئية بالإنجازات:
- تم تحسين حماية التعليمات البرمجية ضد تجاوز سعة المخزن المؤقت بشكل ملحوظ. لمنع تجاوز سعة المخزن المؤقت، تم استبدال جميع وظائف السلسلة غير الآمنة (strcpy/strcat/strtok/sprintf/vsprintf/gets) بإصدارات آمنة تطبق حدود حجم المخزن المؤقت.
- تمت إضافة دعم NTS.
- تحسين دقة الخطوة الزمنية عشرة أضعاف عن طريق ربط الأجهزة المادية. ويرجع ذلك إلى حقيقة أن ساعات الكمبيوتر الحديثة أصبحت أكثر دقة من تلك التي ظهرت عند ولادة NTP. وكان أكبر المستفيدين من ذلك هو GPSDO وأجهزة الراديو المخصصة للوقت.
- تم تخفيض عدد لغات البرمجة إلى اثنتين. بدلاً من نصوص Perl وawk وحتى S، أصبحت الآن كلها لغة Python. ونتيجة لهذا، هناك المزيد من الفرص لإعادة استخدام التعليمات البرمجية.
- بدلاً من نصوص نصوص الأدوات التلقائية، بدأ المشروع في استخدام نظام بناء البرامج .
- تحديث وإعادة تنظيم وثائق المشروع. من مجموعة وثائق متناقضة وقديمة في بعض الأحيان، قاموا بإنشاء وثائق مقبولة تمامًا. كل محول سطر أوامر وكل كيان تكوين لديه الآن نسخة واحدة من الحقيقة. بالإضافة إلى ذلك، يتم الآن إنشاء صفحات الدليل ووثائق الويب من نفس الملفات الأساسية.
NTPSec متاح لعدد من توزيعات Linux. في الوقت الحالي، أحدث إصدار ثابت هو 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 الطوابع الزمنية للأجهزة على Linux، مما يسمح بمزامنة دقيقة للغاية على الشبكات المحلية.
ومع ذلك، يفتقر chrony إلى بعض ميزات NTP القديمة، مثل عميل/خادم البث والبث المتعدد. بالإضافة إلى ذلك، يدعم NTP الكلاسيكي عددًا أكبر من أنظمة التشغيل والمنصات.
لتعطيل وظائف الخادم وطلبات NTP لعملية chronyd، ما عليك سوى كتابة المنفذ 0 في ملف chrony.conf. يتم ذلك في الحالات التي لا تكون فيها هناك حاجة للحفاظ على الوقت لعملاء NTP أو أقرانهم. منذ الإصدار 2.0، أصبح منفذ خادم NTP مفتوحًا فقط عندما يتم السماح بالوصول بواسطة أمر السماح أو الأمر المناسب، أو عندما يتم تكوين نظير NTP، أو يتم استخدام توجيه البث.
يتكون البرنامج من وحدتين.
- chronyd هي خدمة تعمل في الخلفية. يتلقى معلومات حول الفرق بين ساعة النظام وخادم الوقت الخارجي ويضبط التوقيت المحلي. كما أنه يطبق بروتوكول NTP ويمكنه العمل كعميل أو خادم.
- chronyc هي أداة مساعدة لسطر الأوامر لمراقبة البرامج والتحكم فيها. يستخدم لضبط معلمات الخدمة المختلفة، على سبيل المثال السماح لك بإضافة أو إزالة خوادم NTP أثناء استمرار تشغيل chronyd.
منذ الإصدار 7 من RedHat Linux chrony كخدمة مزامنة الوقت. الحزمة متاحة أيضًا لتوزيعات Linux الأخرى. أحدث إصدار ثابت هو 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]
كيفية إعداد خادم chrony البعيد الخاص بك على الإنترنت لمزامنة الوقت على شبكة المكتب. فيما يلي مثال لإعداد VPS.
مثال لإعداد Chrony على RHEL / CentOS على VPS
دعونا الآن نتدرب قليلًا ونقوم بإعداد خادم NTP الخاص بنا على VPS. الأمر بسيط للغاية، ما عليك سوى اختيار التعريفة المناسبة على موقع RuVDS، والحصول على خادم جاهز واكتب عشرات الأوامر البسيطة. لأغراضنا، هذا الخيار مناسب تماما.

دعنا ننتقل إلى إعداد الخدمة وتثبيت حزمة chrony أولاً.
[root@server ~]$ yum install chronyيستخدم RHEL 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
