時間同步如何變得安全

時間同步如何變得安全
當有數百萬個大大小小的設備透過 TCP/IP 進行通訊時,如何確保時間本身不會說謊?畢竟,他們每個人都有一塊表,所有表上的時間都必須是正確的。如果沒有 ntp,就無法規避這個問題。

讓我們想像一下,工業 IT 基礎架構的某個部分在隨著時間的推移同步服務時遇到了困難。企業軟體叢集堆疊立即開始出現故障,網域崩潰,主節點和備用節點嘗試恢復現狀但未能成功。

攻擊者也有可能故意嘗試透過 MiTM 或 DDOS 攻擊來重置時間。在這種情況下,任何事情都有可能發生:

  • 用戶帳戶密碼將會過期;
  • X.509 證書將會過期;
  • TOTP雙重認證將停止工作;
  • 備份將變得“過時”,系統將刪除它們;
  • DNSSec 將會中斷。

顯然,每個首要 IT 部門都對時間同步服務的可靠運作感興趣,如果它們在工業運作中可靠且安全,那就太好了。

25 分鐘內破解 NTP

網路協定-千禧世代有一個共同點:他們早已 過時的 並且不再有任何用處,但即使獲得大量的愛好者和資金,更換它們也不那麼容易。

對傳統 NTP 的主要抱怨是缺乏可靠的機制來防範惡意攻擊。已經進行了各種嘗試來解決這個問題。為了實現這一點,首先引入了預共享金鑰(PSK)機制來交換對稱金鑰。

不幸的是,這種方法沒有得到證實,原因很簡單——它的擴展性不好。根據伺服器的不同,客戶端需要手動設定。這意味著您不能就這樣新增另一個客戶端。如果 NTP 伺服器發生變化,則所有用戶端都需要重新配置。

隨後他們又提出了 AutoKey,但很快地他們就發現演算法設計本身有許多嚴重的漏洞,因此不得不放棄。問題在於種子只有 32 位,太小了,不包含足夠的計算複雜度來進行暴力攻擊。

  • 密鑰ID是一個對稱的32位元密鑰;
  • MAC(訊息認證碼)-NTP 封包的校驗和;

Autokey 的運算方式如下。

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

其中 H() 是加密雜湊函數。

使用相同的函數來計算資料包的校驗和。

MAC=H(Autokey||NTP packet)

事實證明,包檢查的整個完整性取決於 cookie 的真實性。一旦擁有它們,您就可以恢復自動金鑰,然後偽造 MAC。但是,NTP 伺服器在產生它們時使用種子。問題就在這裡。

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

MSB_32 函數從計算 md5 雜湊的結果中截斷 32 個最高有效位元。只要伺服器設定保持不變,客戶端 cookie 就不會改變。攻擊者剩下要做的就是恢復初始數字並獲得獨立產生cookie的能力。

首先,您需要作為客戶端連接到NTP伺服器並取得cookie。此後,攻擊者依照簡單的演算法,使用暴力手段恢復初始數字。

一種使用暴力方法攻擊初始數的演算法。

   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 個雜湊值,直到產生的 cookie 與從 NTP 伺服器收到的 cookie 相符。在配備 Intel Core i5 的典型家用工作站上,這將需要 25 分鐘。

NTS — 新型 Autokey

Autokey 不可能容忍這樣的安全漏洞,2012 年, 新版本 協定.為了妥協這個名字,他們決定重新命名,因此 Autokey v.2 被稱為網路時間安全。

NTS 協定是 NTP 的安全擴展,目前僅支援單播模式。它提供了強大的加密保護以防止資料包操縱,防止窺探,具有良好的擴展性,能夠抵禦網路資料包遺失,並且在保護連接的過程中將準確性損失降至最低。

NTS 連接由兩個階段組成,其中使用較低級別的協定。在 第一個 在此階段,用戶端和伺服器就各種連線參數達成一致,並交換包含金鑰以及所有附帶資料集的 cookie。在 第二個 在此階段,實際的安全性 NTS 會話發生在用戶端和 NTP 伺服器之間。

時間同步如何變得安全

NTS 由兩個下層協定組成:網路時間安全金鑰交換 (NTS-KE),它透過 TLS 初始化安全連接,以及 NTP 協定的最新版本 NTPv4。下文將對此進行詳細介紹。

第一階段 - NTS KE

在此階段,NTP 用戶端透過單獨的 TCP 連線與 NTS KE 伺服器啟動 TLS 1.2/1.3 會話。在此會話期間,發生以下情況。

  • 雙方確定參數 AEAD 第二階段的演算法。
  • 各方正在定義第二個低階協議,但目前僅支援NTPv4。
  • 雙方確定NTP伺服器的IP位址和連接埠。
  • NTS KE 伺服器在 NTPv4 下發出 cookie。
  • 雙方從 cookie 材料中提取一對對稱金鑰(C2S 和 S2C)。

這種方法的一大優點是,傳輸秘密連接參數資訊的整個負擔都落在經過驗證的可靠的 TLS 協定上。這樣就無需為了安全 NTP 握手而重新發明輪子了。

第 2 階段 - NTS 保護下的 NTP

第二階段,客戶端安全地與NTP伺服器同步時間。為此,它在NTPv4資料包結構中攜帶了四個特殊的擴充字段。

  • 唯一識別碼擴充包含一個隨機數以防止重播攻擊。
  • NTS Cookie 擴充包含 NTP 用戶端可用的 cookie 之一。由於只有客戶端具有對稱 AAED 金鑰 C2S 和 S2C,因此 NTP 伺服器必須從 cookie 材料中提取它們。
  • NTS Cookie 佔位符擴充是客戶端向伺服器要求額外 Cookie 的一種方式。此擴充功能是必要的,以確保 NTP 伺服器回應不會比請求長太多。這有助於防止放大攻擊。
  • NTS 驗證器和加密擴充欄位擴充功能包含帶有 C2S 金鑰的 AAED 演算法密碼、NTP 標頭、時間戳記和上面提到的 EF 作為附帶資料。如果沒有此擴展,就有可能偽造時間戳記。

時間同步如何變得安全

伺服器收到客戶端的請求後,檢查NTP封包的真實性。為此,他必須解密 cookie,提取 AAED 演算法和金鑰。成功檢查NTP封包的有效性後,伺服器會依照以下格式回應客戶端。

  • 唯一識別碼擴展客戶端請求的鏡像副本,一種防止重播攻擊的措施。
  • NTS Cookie 擴展更多 cookie 以繼續會話。
  • NTS 身份驗證器和加密擴充欄位擴充功能包含帶有 S2C 金鑰的 AEAD 密碼。

第二次握手可以重複多次,繞過第一階段,因為每個請求和回應都會為客戶端提供額外的 cookie。這樣做的好處是,相對資源密集的 TLS 計算和 PKI 資料傳輸操作被分成多個重複的請求。這對於專門的 FPGA 計時器來說尤其方便,因為所有主要功能都可以打包成對稱加密領域的幾個函數,將整個 TLS 堆疊轉移到另一個裝置。

網路安全協定

NTP 有何特別之處?儘管該專案的作者戴夫·米爾斯 (Dave Mills) 試圖盡可能詳細地記錄他的程式碼,但很少有程式設計師能夠理解 35 年前的時間同步演算法的複雜性。部分程式碼是在 POSIX 時代之前編寫的,Unix API 與今天使用的程式碼有很大不同。此外,還需要統計知識來清除雜訊線路上的干擾訊號。

NTS 並不是第一次修復 NTP 的嘗試。在攻擊者學會利用 NTP 漏洞來擴大 DDoS 攻擊後,顯然需要徹底的改變。而在NTS草案準備和定稿期間,美國國家科學基金會於2014年底緊急撥付一筆撥款用於NTP的現代化建設。

這個工作小組的負責人正是 艾瑞克史蒂文雷蒙德 — 開源社群的創始人和支柱之一,也是本書的作者 大教堂和集市。 Eric 和他的戰友們做的第一件事就是嘗試將 NTP 程式碼從 BitKeeper 平台移到 git 上,但並沒有成功。計畫負責人哈蘭史坦 (Harlan Stenn) 反對這項決定,談判陷入僵局。隨後我們決定分叉專案程式碼,這就是 NTPSec 的誕生。

埃里克·雷蒙德 (Eric Raymond) 擁有紮實的背景,包括 GPSD 工作經驗、數學背景以及閱讀古代密碼的神奇能力,是完成此類專案的駭客。團隊找到了一位代碼遷移專家,僅用 10 週時間,NTP 安頓下來在 GitLab 上。工作開始沸騰起來。

埃里克·雷蒙德 (Eric Raymond) 的團隊處理這項任務的方式與奧古斯特·羅丹 (Auguste Rodin) 處理一塊石頭的方式相同。透過刪除 175 KLOC 舊程式碼,他們能夠大幅減少攻擊面,修補許多安全漏洞。

以下是受影響人員的不完整名單:

  • 未記錄的、廢棄的、過期的或損壞的參考時鐘。
  • 未使用的 ICS 庫。
  • libopts/autogen。
  • Windows 的舊程式碼。
  • ntpdc。
  • 自動鍵。
  • 用 Python 重寫的 C 程式碼 ntpq。
  • 用 Python 重寫的 C 程式碼 sntp/ntpdig。

除了程式碼清理之外,該專案還有其他任務。以下是部分成就清單:

  • 顯著加強了對緩衝區溢位的程式碼保護。為了防止緩衝區溢出,所有不安全的字串函數(strcpy/strcat/strtok/sprintf/vsprintf/gets)都已被替換為實現緩衝區大小限制的安全版本。
  • 增加了NTS支援。
  • 透過使用實體硬體綁定,時間步長精度提高了十倍。這是因為現代電腦時鐘比 NTP 首次發明時的時鐘精確得多。其中最大的受益者是GPSDO和專用無線電計時站。
  • 程式語言的數量減少到了兩種。現在全部都是 Python,而不是 Perl、awk 甚至 S 腳本。這為程式碼重用提供了更多的機會。
  • 該專案不再使用自動工具腳本,而是開始使用軟體建置系統 WAF.
  • 更新並重新組織了專案文件。他們從一堆互相矛盾、有些地方陳舊的文獻中,整理出了相當過得去的文獻。每個命令列開關和每個配置實體現在都有一個真實版本。此外,手冊頁和 Web 文件現在由相同的核心文件產生。

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。與 NTPSec 不同,Chrony 是從頭編寫的,旨在在各種條件下可靠運行,包括不穩定的網路連接、部分或超載的網路可用性以及溫度變化。此外,chrony還有其他優點:

  • chrony 可以更快、更準確地同步系統時鐘;
  • chrony 較小,佔用較少的內存,並且僅在需要時存取處理器。這對於節省資源和能源來說是一個很大的優勢;
  • chrony 支援 Linux 中的硬體時間戳,允許透過本地網路實現極其精確的同步。

然而,chrony 缺少一些舊的 NTP 功能,例如廣播和多播客戶端/伺服器。此外,經典NTP支援更廣泛的作業系統和平台。

若要停用伺服器功能和對 chronyd 進程的 NTP 請求,只需在 chrony.conf 檔案中輸入連接埠 0。在不需要為 NTP 用戶端或對等方維護時間的情況下完成此操作。自 2.0 版本開始,只有在透過 allow 指令或對應指令允許存取、設定了 NTP 對等體或使用了廣播指令時,NTP 伺服器連接埠才會開放。

該計劃由兩個模組組成。

  • chronyd 是一個在背景運行的服務。它接收有關係統時鐘和外部時間伺服器之間的差異的資訊並調整本地時間。它還實作了 NTP 協議,可以充當客戶端或伺服器。
  • chronyc 是一個用於監視和控製程式的命令列實用程式。用於微調各種服務參數,例如允許您在 chronyd 繼續運行時新增或刪除 NTP 伺服器。

從 RedHat Linux 版本 7 開始 用途 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 上設定的範例。

在 VPS 上的 RHEL / CentOS 上設定 Chrony 的範例

現在讓我們稍微練習一下並在 VPS 上設定我們自己的 NTP 伺服器。非常簡單,只需在 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 中,指定執行 NTP 伺服器 chrony 的 VPS 伺服器的 IP 或主機名稱。

server my.vps.server

最後,在客戶端啟動時間同步。

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

下次我將告訴您在沒有網路的情況下同步時間有哪些選項。

時間同步如何變得安全

時間同步如何變得安全

來源: www.habr.com

添加評論