اگر یک میلیون دستگاه بزرگ و کوچک دارید که از طریق TCP/IP با هم ارتباط برقرار می کنند، چگونه مطمئن شوید که زمان به خودی خود دروغ نمی گوید؟ بالاخره هر کدام از آنها یک ساعت دارند و باید ساعت برای همه آنها درست باشد. این مشکل بدون ntp قابل دور زدن نیست.
بیایید برای یک دقیقه تصور کنیم که در یک بخش از زیرساختهای فناوری اطلاعات صنعتی مشکلاتی برای همگامسازی خدمات در طول زمان وجود دارد. بلافاصله دسته خوشه ای نرم افزار Enterprise شروع به شکست می کند، دامنه ها از هم می پاشند، گره های Master و Standby ناموفق برای بازگرداندن وضعیت موجود تلاش می کنند.
همچنین ممکن است یک مهاجم عمداً سعی کند از طریق یک حمله MiTM یا DDOS زمان را مختل کند. در چنین شرایطی، هر چیزی ممکن است رخ دهد:
- رمز عبور حساب کاربری منقضی می شود.
- گواهینامه های X.509 منقضی می شوند.
- احراز هویت دو مرحله ای TOTP کار نمی کند.
- پشتیبان گیری منسوخ می شود و سیستم آنها را حذف می کند.
- DNSSec خراب می شود.
واضح است که هر بخش فناوری اطلاعات علاقه مند به بهره برداری مطمئن از خدمات همگام سازی زمان است و چه خوب است که در عملیات صنعتی قابل اعتماد و ایمن باشند.
NTP را در 25 دقیقه بشکنید
پروتکل های شبکه - هزاره ها یک ویژگی دارند، آنها بوده اند و دیگر برای هیچ کاری خوب نیستند، اما جایگزین کردن آنها حتی زمانی که توده مهمی از علاقه مندان و بودجه انباشته شده باشد، چندان آسان نیست.
شکایت اصلی در مورد NTP کلاسیک عدم وجود مکانیسم های قابل اعتماد برای محافظت در برابر حملات مزاحمان است. تلاش های مختلفی برای حل این مشکل صورت گرفته است. برای دستیابی به این هدف، ابتدا یک مکانیسم کلید مشترک (PSK) را برای تبادل کلیدهای متقارن پیاده سازی کردیم.
متأسفانه، این روش به یک دلیل ساده جواب نداد - مقیاس خوبی ندارد. پیکربندی دستی در سمت کلاینت بسته به سرور مورد نیاز است. این بدان معنی است که شما به سادگی نمی توانید مشتری دیگری را به همین شکل اضافه کنید. اگر چیزی در سرور NTP تغییر کند، همه کلاینت ها باید دوباره پیکربندی شوند.
سپس آنها با AutoKey آمدند، اما بلافاصله تعدادی آسیب پذیری جدی در طراحی خود الگوریتم کشف کردند و مجبور شدند آن را رها کنند. نکته این است که دانه فقط 32 بیت دارد، خیلی کوچک است و پیچیدگی محاسباتی کافی برای حمله از جلو ندارد.
- شناسه کلید - کلید متقارن 32 بیتی؛
- MAC (کد احراز هویت پیام) - جمع کنترلی بسته NTP.
Autokey به صورت زیر محاسبه می شود.
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 بیت مهم را از نتیجه محاسبه هش md32 قطع می کند. تا زمانی که پارامترهای سرور بدون تغییر باقی می مانند، کوکی مشتری تغییر نمی کند. سپس مهاجم فقط می تواند شماره اولیه را بازیابی کند و بتواند به طور مستقل کوکی تولید کند.
ابتدا باید به عنوان مشتری به سرور NTP متصل شوید و کوکی ها را دریافت کنید. پس از این، با استفاده از روش brute force، مهاجم با الگوریتم ساده، عدد اولیه را بازیابی می کند.
الگوریتم حمله به محاسبه عدد اولیه با استفاده از روش 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 هش ایجاد کنید تا زمانی که کوکی ایجاد شده با کوکی دریافتی از سرور NTP مطابقت داشته باشد. در یک ایستگاه خانگی معمولی با Intel Core i5، این کار 25 دقیقه طول می کشد.
NTS - کلید خودکار جدید
تحمل چنین حفره های امنیتی در Autokey غیرممکن بود و در سال 2012 ظاهر شد پروتکل به منظور به خطر انداختن نام، آنها تصمیم به تغییر نام تجاری گرفتند، بنابراین Autokey v.2 تحت عنوان Network Time Security شناخته شد.
پروتکل NTS توسعه امنیت NTP است و در حال حاضر فقط از حالت unicast پشتیبانی می کند. این محافظت رمزنگاری قوی در برابر دستکاری بسته ها را فراهم می کند، از جاسوسی جلوگیری می کند، به خوبی مقیاس می شود، در برابر از دست دادن بسته های شبکه انعطاف پذیر است و منجر به کمترین میزان تلفات دقیق در طول امنیت اتصال می شود.
یک اتصال NTS شامل دو مرحله است که از پروتکل های لایه پایین تر استفاده می کند. بر اول در این مرحله، مشتری و سرور بر روی پارامترهای مختلف اتصال به توافق می رسند و کوکی های حاوی کلید را با تمام مجموعه داده های همراه مبادله می کنند. بر دوم در این مرحله، جلسه NTS محافظت شده واقعی بین مشتری و سرور NTP انجام می شود.

NTS از دو پروتکل لایه پایین تشکیل شده است: Network Time Security Exchange Key (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 ارسال می کند.
- افزونه Unique Identifier حاوی یک nonce تصادفی برای جلوگیری از حملات تکراری است.
- NTS Cookie Extension حاوی یکی از کوکی های NTP است که در دسترس مشتری است. از آنجایی که فقط مشتری دارای کلیدهای متقارن AAED C2S و S2C است، سرور NTP باید آنها را از مواد کوکی استخراج کند.
- NTS Cookie Placeholder Extension راهی برای مشتری برای درخواست کوکی های اضافی از سرور است. این افزونه برای اطمینان از اینکه پاسخ سرور NTP خیلی بیشتر از درخواست نیست ضروری است. این به جلوگیری از حملات تقویتی کمک می کند.
- NTS Authenticator و Encrypted Extension Fields Extension حاوی رمز AAED با کلید C2S، هدر NTP، مهرهای زمانی و EF فوق به عنوان داده همراه است. بدون این پسوند امکان جعل مُهرهای زمانی وجود دارد.

به محض دریافت درخواست از مشتری، سرور صحت بسته NTP را تأیید می کند. برای انجام این کار، او باید کوکی ها را رمزگشایی کند، الگوریتم AAED و کلیدها را استخراج کند. پس از بررسی موفقیت آمیز بسته NTP از نظر اعتبار، سرور با فرمت زیر به مشتری پاسخ می دهد.
- Unique Identifier Extension یک کپی آینه ای از درخواست مشتری است که اقدامی در برابر حملات تکراری است.
- NTS Cookie Extension کوکی های بیشتری برای ادامه جلسه.
- برنامه افزودنی NTS Authenticator و Encrypted Extension Fields حاوی رمز AEAD با کلید S2C است.
دست دادن دوم را می توان چندین بار تکرار کرد و مرحله اول را دور زد، زیرا هر درخواست و پاسخ کوکی های اضافی را به مشتری می دهد. این مزیت را دارد که عملیات TLS نسبتاً فشرده منابع محاسباتی و انتقال دادههای PKI بر تعداد درخواستهای مکرر تقسیم میشود. این به ویژه برای زماندارهای تخصصی FPGA راحت است، زمانی که تمام عملکردهای اصلی را میتوان در چندین عملکرد از حوزه رمزنگاری متقارن بستهبندی کرد و کل پشته TLS را به دستگاه دیگری منتقل کرد.
NTPSec
ویژگی NTP چیست؟ علیرغم این واقعیت که نویسنده پروژه، دیو میلز، تلاش کرد تا کد خود را به بهترین شکل ممکن مستند کند، برنامه نویس کمیابی است که می تواند پیچیدگی های الگوریتم های همگام سازی زمانی را که 35 سال قدمت دارند را درک کند. برخی از کدها قبل از دوره POSIX نوشته شده بودند و API یونیکس در آن زمان با آنچه امروز استفاده می شود بسیار متفاوت بود. علاوه بر این، دانش آمار برای پاکسازی سیگنال از تداخل در خطوط پر سر و صدا مورد نیاز است.
NTS اولین تلاش برای تعمیر NTP نبود. هنگامی که مهاجمان یاد گرفتند که از آسیب پذیری های NTP برای تقویت حملات DDoS سوء استفاده کنند، مشخص شد که تغییرات اساسی لازم است. و در حالی که پیش نویس های NTS در حال آماده سازی و نهایی شدن بود، بنیاد ملی علوم ایالات متحده در پایان سال 2014 فورا کمک مالی را برای نوسازی NTP اختصاص داد.
سرپرستی این کارگروه نه تنها بر عهده کسی بود - یکی از بنیانگذاران و ارکان جامعه متن باز و نویسنده کتاب . اولین کاری که اریک و دوستانش سعی کردند انجام دهند این بود که کد NTP را از پلتفرم BitKeeper به git منتقل کنند، اما اینطور نشد. رهبر پروژه هارلان استن مخالف این تصمیم بود و مذاکرات متوقف شد. سپس تصمیم به فورک کد پروژه گرفته شد و NTPSec متولد شد.
تجربه خوب، از جمله کار بر روی GPSD، پیشینه ریاضی و مهارت جادویی خواندن کدهای باستانی - اریک ریموند دقیقاً هکری بود که توانست چنین پروژه ای را انجام دهد. تیم یک متخصص انتقال کد و تنها در 10 هفته NTP پیدا کرد در GitLab کار در اوج بود.
تیم اریک ریموند همان کاری را که آگوست رودن با یک قطعه سنگ انجام داد، انجام داد. با حذف 175 KLOC کد قدیمی، آنها توانستند سطح حمله را به میزان قابل توجهی کاهش دهند و بسیاری از حفره های امنیتی را ببندند.
در اینجا یک لیست ناقص از مواردی که در توزیع گنجانده شده اند آمده است:
- بازنگری غیرمستند، قدیمی، قدیمی یا خراب.
- کتابخانه ICS استفاده نشده
- libopts/autogen.
- کدهای قدیمی برای ویندوز
- ntpdc.
- کلید خودکار.
- کد ntpq C در پایتون بازنویسی شده است.
- کد sntp/ntpdig C در پایتون بازنویسی شده است.
علاوه بر پاکسازی کد، پروژه وظایف دیگری نیز داشت. در اینجا یک لیست جزئی از دستاوردها آمده است:
- حفاظت کد در برابر سرریز بافر به طور قابل توجهی بهبود یافته است. برای جلوگیری از سرریز بافر، تمام توابع رشته ناامن (strcpy/strcat/strtok/sprintf/vsprintf/gets) با نسخههای امنی جایگزین شدهاند که محدودیتهای اندازه بافر را اجرا میکنند.
- پشتیبانی NTS اضافه شد.
- با پیوند دادن سخت افزار فیزیکی، دقت گام زمانی را ده برابر بهبود بخشید. این به این دلیل است که ساعتهای کامپیوتری مدرن بسیار دقیقتر از ساعتهای زمانی که NTP متولد شد، شدهاند. بزرگترین ذینفعان این امر GPSDO و رادیوهای اختصاصی زمان بودند.
- تعداد زبان های برنامه نویسی به دو زبان کاهش یافته است. به جای اسکریپت های Perl، awk و حتی S، اکنون تماما پایتون است. به همین دلیل، فرصت های بیشتری برای استفاده مجدد از کد وجود دارد.
- به جای نودل از اسکریپت های خودکار، پروژه شروع به استفاده از یک سیستم ساخت نرم افزار کرد .
- به روز رسانی و سازماندهی مجدد اسناد پروژه. آنها از مجموعه اسناد متناقض و گاه باستانی، اسناد کاملاً قابل قبولی را ایجاد کردند. هر سوئیچ خط فرمان و هر موجودیت پیکربندی اکنون یک نسخه از حقیقت دارد. علاوه بر این، صفحات man و اسناد وب اکنون از همان فایلهای اصلی ایجاد میشوند.
NTPSec برای تعدادی از توزیع های لینوکس در دسترس است. در حال حاضر آخرین نسخه پایدار 1.1.8 است و برای جنتو لینوکس ماقبل آخر است.
(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 کوچکتر است، حافظه کمتری مصرف می کند و تنها در صورت نیاز به CPU دسترسی دارد. این یک مزیت بزرگ برای صرفه جویی در منابع و انرژی است.
- chrony از مهرهای زمانی سخت افزاری در لینوکس پشتیبانی می کند و امکان همگام سازی بسیار دقیق در شبکه های محلی را فراهم می کند.
با این حال، chrony فاقد برخی از ویژگی های NTP قدیمی، مانند پخش و سرویس گیرنده/سرور چندپخشی است. علاوه بر این، NTP کلاسیک از تعداد بیشتری از سیستم عامل ها و پلتفرم ها پشتیبانی می کند.
برای غیرفعال کردن عملکرد سرور و درخواست های NTP در فرآیند chronyd، فقط پورت 0 را در فایل chrony.conf بنویسید. این در مواردی انجام می شود که نیازی به حفظ زمان برای کلاینت های NTP یا همتایان نباشد. از نسخه 2.0، پورت سرور NTP تنها زمانی باز است که دسترسی توسط یک دستورالعمل مجاز یا دستور مناسب مجاز باشد، یا یک همتای NTP پیکربندی شده باشد، یا از یک دستورالعمل پخش استفاده شود.
این برنامه از دو ماژول تشکیل شده است.
- chronyd سرویسی است که در پس زمینه اجرا می شود. اطلاعات مربوط به تفاوت بین ساعت سیستم و سرور ساعت خارجی را دریافت می کند و زمان محلی را تنظیم می کند. همچنین پروتکل NTP را پیاده سازی می کند و می تواند به عنوان مشتری یا سرور عمل کند.
- chronyc یک ابزار خط فرمان برای نظارت و کنترل برنامه است. برای تنظیم دقیق پارامترهای مختلف سرویس استفاده می شود، به عنوان مثال به شما امکان می دهد سرورهای NTP را اضافه یا حذف کنید در حالی که chronyd به کار خود ادامه می دهد.
از نسخه 7 لینوکس RedHat chrony به عنوان یک سرویس همگام سازی زمان. این بسته برای سایر توزیع های لینوکس نیز موجود است. آخرین نسخه پایدار 3.5 است که برای انتشار نسخه 4.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 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 کرونی است، مشخص می کند.
server my.vps.serverو در نهایت، شروع همگام سازی زمان بر روی مشتری.
[root@client ~]$ systemctl enable --now chronyd
[root@client ~]$ timedatectl set-ntp true
دفعه بعد به شما می گویم چه گزینه هایی برای همگام سازی زمان بدون اینترنت وجود دارد.
منبع: www.habr.com
