用 PGP 保護代碼完整性(一): 基本概念和工具 | Linux 中國

2021-02-14 Linux中國

在本系列文章中,我們將深度探討如何使用 PGP 確保軟體完整性。這些文章將為工作於自由軟體項目的開發者提供實用指南,並且將包含以下主題:

我們使用與「Freedom」含義相同的詞項 「Free」,但這個系列中列出的指南也可以被任何其它類型的依賴於分布式團隊開發者貢獻的軟體中。如果你編寫進入公共源倉庫的代碼,你可以從了解和遵循這篇指南中受益。

結構

每節分為兩個部分:

◈ 形式自由的考慮事項的列表,解釋這些決定取決於什麼,並伴隨著配置指令

清單優先級

每個清單中各項包含著優先級,用來幫助指導你的決定:

◈ (必要)該項一定要排在考慮事項列表的前面。如果沒有這樣做,它們將給提交到開源項目中的代碼帶來高風險。◈ (推薦)包含該項將提升整體安全性,但會影響你與工作環境的交互方式,並且可能需要學習新的習慣或者放棄舊的習慣。

記住,這些只是指導。如果你感到這些優先級不能反映你項目提交的安全,你應該根據自己的需要調整它們。

PGP 基本概念和工具

清單

☉ 理解 PGP 在自由軟體開發中的作用 (必要)☉ 理解公鑰密碼學Public Key Cryptography的基礎知識 (必要)☉ 理解 PGP 密鑰身份key identities (必要)☉ 理解 PGP 密鑰有效性key validity (必要)☉ 安裝 GnuPG 工具(版本 2.x) (必要)

考慮事項

自由軟體社區長期依賴於 PGP 確保它生產的軟體產品的真實性和完整性。你可能沒有注意到,但無論你是一個 Linux 、Mac 和 Windowas 用戶,你都曾依賴 PGP 來確保你電腦環境的完整性:

◈ Linux 發行版依賴 PGP 來確保當二進位或者原代碼包從被生產出來到被終端用戶安裝之間沒被更改過◈ 自由軟體項目通常會伴隨發行軟體的存檔提供分離的 PGP 籤名,使得下遊的項目可以在把下載的版本集成到自己的分布式下載之前,驗證下載版本的完整性。◈ 自由軟體項目通常依賴代碼本身的 PGP 籤名來跟蹤起源,並驗證項目開發者提交的代碼的完整性

這與工作於專有平臺的程式設計師使用的開發者證書或代碼籤名機制非常相似。實際上,這兩種技術背後的核心概念非常相似 —— 儘管它們在實現的技術層面和它們委託信任方式的大多不同。PGP 不依賴於集中式認證機構,而是讓每個用戶為每個證書賦予自己的信任。

我們的目標是使你的項目通過使用 PGP 來進行代碼起源和完整性追蹤,遵循最佳實踐並遵守基本的安全預防措施。

極其基本的 PGP 操作概括

你不需要知道 PGP 如何工作的具體細節 —— 理解核心概念足以成功地達到我們的目的。PGP 依賴於公鑰密碼學來將明文轉換為密文。這個過程需要兩種不同的密鑰:

加密

對加密來說,PGP 使用擁有者的公鑰創造一條只能通過擁有者私鑰解密的消息:

☉ 發送者向接收者發送加密後的內容和加密後的會話密鑰

要解密:

籤名

為了創建籤名,PGP 私鑰或公鑰會以相反的方式使用:

要驗證籤名:

☉ 驗證者使用籤名者的 PGP 公鑰來解密提供的校檢和

結合使用

通常,加密消息也被發送者自己的 PGP 密鑰籤名。無論何時使用加密消息,這應當是默認的,因為沒有認證的加密沒有很大意義(除非你是一個告密者或秘密代理並且需要可行的可否認性)

理解密鑰身份

每個 PGP 密鑰必須有一個或多個與之關聯的身份。通常,「身份Identity」指的是以下格式中的人物全名和郵件地址:

Alice Engineer <alice.engineer@example.com>

有時也會在括號中包含說明,來告訴終端用戶關於該特定密鑰的更多信息:

Bob Designer (obsolete 1024-bit key) <bob.designer@example.com>

由於人們可以和多個職業和個人實體相關聯,因此在同一密鑰上可以有多個身份:

Alice Engineer <alice.engineer@example.com>

Alice Engineer <aengineer@personalmail.example.org>

Alice Engineer <webmaster@girlswhocode.example.net>

當使用多個身份時,其中之一將被標記為「primary identity主要身份」來讓檢索更簡單。

理解密鑰有效性

為了能使用其他人的公鑰來加密或驗證,你需要確保它確實屬於正確的人(Alice)而不屬於冒牌的(Eve)。在 PGP 中,這被稱為「密鑰有效性」:

◈ 有效性:完全full -- 意味著非常確認該密鑰屬於 Alice◈ 有效性:臨界marginal -- 意味著大致確認該密鑰屬於 Alice◈ 有效性:未知unknown -- 意味著不確認該密鑰是否屬於 Alice

Web of Trust (WOT) 與 Trust on First Use (TOFU)

PGP 使用了一種信任委託機制叫「Web of Trust」。它的核心是嘗試替代 HTTPS/TLS 世界中對集中式認證機構的需求。PGP 把這個責任交給了每個用戶,而不是各種軟體開發商來決定誰應該是你的可信認證實體。

不幸的是,很少有人理解 Web of Trust 的是如何工作的,能使用它的人更少。它仍然是 OpenPGP 規範的一個重要方面,但 GnuPG 的近期版本(2.2 及以上)已經實現了一種替代機制叫「Trust on First Use」(TOFU)。

你可以把 TOFU 當作類似 SSH 的信任方式。使用 SSH,當你第一次連接到遠程系統,它的密鑰指紋會被記錄和保存。如果將來密鑰改變,SSH 客戶端將會提醒你並拒絕連接,迫使你決定是否信任已改變的的密鑰。

同樣,當你第一次導入某人的 PGP 密鑰,它被假定可信。如果在將來的任何時候,GnuPG 碰巧發現另一同樣身份的密鑰,過去導入的密鑰和新密鑰都將被標記為無效,並且你需要手動指出保留哪個。

安裝 OpenPGP 軟體

首先,理解 PGP、OpenPGP、GnuPG 和 gpg 之間的不同很重要:

◈ PGP (「Pretty Good Privacy」) 是最初商業軟體的名字◈ OpenPGP 是與最初 PGP 工具兼容的 IETF 標準◈ GnuPG (「Gnu Privacy Guard」)是實現了 OpenPGP 標準的自由軟體

今天,「PGP」這個詞幾乎被普遍用來表示開放的 OpenPGP 標準,而不是最初的商業軟體,因此「PGP」和「OpenPGP」是可以互換的。「GnuPG」和「pgp」這兩個詞應該僅在提及工具時使用,而不用於它們產生的輸出或它們實現的 OpenPGP 功能。舉例:

◈ PGP(而非 GnuPG 或 GPG)密鑰伺服器

理解這一點應該可以保護你免受來自你遇到的其他 PGP 用戶「實際上」不可避免的迂腐。

安裝 GnuPG

如果你正在使用 Linux,你應該已經安裝過了 GnuPG。在 Mac 上,你應該安裝 GPG-Suite[1],或者使用 brew 安裝 gnupg2。在 Windows 上,你應該安裝 GPG4Win[2],並且為了可以工作,你可能需要調整指南中的部分命令,除非你設置了類似 Unix 的環境。對其他平臺來說,你需要自行查找正確的地址來下載和安裝 GnuPG。

GnuPG 1 vs. 2

GnuPG v.1 和 GnuPG v.2 都實現了同樣的標準,但它們提供不兼容的庫和命令行工具,所以許多發行版都帶有了舊的版本 1 和最新的版本 2。你需要確保你總是使用 GnuPG v.2。

首先,運行:

$ gpg --version | head -n1

如果你看到 gpg (GnuPG) 1.4.x,說明你正使用 GnuPG v.1。嘗試下 gpg2 命令:

$ gpg2 --version | head -n1

如果你看到 gpg (GnuPG) 2.x.x,說明你可以繼續了。這篇指南將假設你使用 GnuPG 2.2 版本(或更新)。如果你正使用 GnuPG 的 2.0 版本,本指南中某些命令可能無效,你應該考慮安裝 GnuPG 最新的 2.2 版本

確保你總是使用 GnuPG v.2

如果你 gpg 和 gpg2 命令都有,你應該確保總是使用 GnuPG v.2,而不是舊的版本。你可以通過設置別名來確保這一點:

$ alias gpg=gpg2

你可以把它放在你的 .bashrc 中,以確保它在你使用 gpg 命令時總是被加載。

在本系列的第 2 部分中,我們將介紹生成和保護你的 PGP 主密鑰的基本步驟。

通過 Linux 基金會和 edX 的免費「Introduction to Linux」 [3]課程了解關於 Linux 的更多信息。

via: https://www.linux.com/blog/learn/2018/2/protecting-code-integrity-pgp-part-1-basic-pgp-concepts-and-tools

作者:Konstantin Ryabitsev[5] 譯者:kimii 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出

相關焦點

  • 用 PGP 保護代碼完整性(二):生成你的主密鑰 | Linux 中國
    在前一篇文章中,我們介紹了基本工具和概念[1]。在本文中,我們將展示如何生成和保護你的 PGP 主密鑰。清單☉ 生成一個 4096 位的 RSA 主密鑰 (必要)☉ 使用 paperkey 備份你的 RSA 主密鑰 (必要)考慮事項理解「主」(認證)密鑰在本節和下一節中,我們將討論「主密鑰」和「子密鑰」。
  • 信號完整性和射頻知識基本概念和術語
    一.信號完整性的一些基本概念 1
  • 淺談 Android 的安全啟動和完整性保護
    Secure BootSecure Boot 顧名思義就是安全啟動,確保設備啟動之後所加載執行的代碼都是可信的。其中涉及的主要概念有兩個:信任鏈和信任根。前者保障執行流程的可靠交接,後者則保障初始信任代碼的可信。Chain Of Trust可信啟動的一個核心思路就是在當前啟動代碼加載下一級代碼之前,對所加載的代碼進行完整性校驗,並且使用PKI公鑰基礎設施進行核實。
  • 淺談國密算法在Linux內核文件完整性保護上的實踐
    目前Linux內核的完整性子系統支持EVM和IMA,前者用於保護文件的擴展屬性。這篇文章討論的是後者。能夠對正在加載中的kernel模塊和固件進行完整性評估所謂的完整性評估指的是對內核對文件客體在執行特定的內核操作時,會主動對文件的內容進行完整性檢查。
  • 淺談Android應用保護(一):Android應用逆向的基本方法
    筆者基於日常的學習和整理,寫了一系列關於Android應用安全和保護的文章,主要關注客戶端代碼和數據保護,介紹了幾種針對Android應用的逆向分析
  • EFAIL: PGP/GPG 和 S/MIME漏洞分析
    」; ,和 Content-Type: text/html 。這樣在解析顯示的時候會達到和第一種方法相同的攻擊效果。 漏洞演示漏洞有許多攻擊場景,例如中間人攻擊。 漏洞影響面漏洞影響包括window,linux, 安卓,IOS等在內的多平臺多應用,具體影響範圍如下圖所示:
  • Ubuntu上安裝Kali Linux的工具
    Kali-Linux同Ubuntu一樣,基於Debian,無奈本人覺得Kali-Linux看起來有些醜,尤其字體渲染不能忍,另外自己的Ubuntu虛擬機已經配置好很多可用的東西了,再搞一個虛擬機來覺得麻煩,想繼續基於Ubuntu的環境使用Kali-Linux上的滲透測試工具。於是有了此文,大致記錄一下步驟,自備後用;也分享一下,給需要的人。
  • EFAIL:PGP/GPG 和 S/MIME漏洞預警
    0x01 事件描述日前,360-CERT監測到歐洲安全研究人員公布的一系列影響PGP/GPG 和 S/MIME的漏洞預警,並將2處漏洞命名為
  • 使用 Let's Encrypt 保護你的網站 | Linux 中國
    未加密的 HTTP 會話暴露於濫用之中,用 Let's Encrypt 把它們保護起來。曾幾何時,通過證書授權機構搭建基本的 HTTPS 網站需要每年花費數百美元,而且搭建的過程複雜且容易出錯。現在我們免費使用 Let's Encrypt[1],而且搭建過程也只需要幾分鐘。為何進行加密?為什麼要加密網站呢?
  • 如何用 Rust 編寫一個 Linux 內核模塊 | Linux 中國
    :sum 類型、模式匹配、泛型、RAII、生命周期、共享及專屬引用、模塊與可見性等等;◈ 集成的開箱可用工具:文檔生成、代碼格式化、linter 等,這些都基於編譯器本身。克隆最新的 Rust for Linux 代碼:git clone https://github.com/Rust-for-Linux/linux.git7.
  • 在 Linux 下使用 RAID(一):介紹 RAID 的級別和概念
    將至少兩個磁碟連接到一個 RAID 控制器,而成為一個邏輯卷,也可以將多個驅動器放在一個組中。一組磁碟只能使用一個 RAID 級別。使用 RAID 可以提高伺服器的性能。不同 RAID 的級別,性能會有所不同。它通過容錯和高可用性來保存我們的數據。
  • 代碼完整性檢查導致應用崩潰
    代碼完整性檢查是系統安全中重要的功能,在 Windows 10 中加強了代碼完整性的檢查,譬如瀏覽器 Edge 中完全禁止了加載未通過微軟認證的模塊
  • PGP的十八般武藝
    這玩意它能幹啥PGP 全稱是 Pretty Good Privacy,是一個被設計用來加密信息,保護隱私的軟體。事實上,此前有過不少關於偽造git commit的新聞,而有了PGP就可以有效防範被冒充了!
  • 在 Linux 上用密碼加密和解密文件 | Linux 中國
    導讀:age 是一個簡單的、易於使用的工具,允許你用一個密碼來加密和解密文件。
  • 嵌入式Linux內核安全防禦技術和挑戰
    內核代碼段和常量數據只讀保護。在內核3.4開始,linux內核就提供了mark_rodata_ro的編譯宏定義。廠家可以在自己的內核裡實現相應的內核代碼段和常量數據的只讀保護。通過這個只讀保護,可以防止攻擊者向內核注入rootkit或是修改系統調用表。
  • Web的26項基本概念和技術
    今天,本文向初學者介紹一些 Web 開發中的基本概念和用到的技術,從A到Z總共26項,每項對應一個概念或者技術。F — FirebugFirebug 是網頁瀏覽器 Mozilla Firefox 的一個擴展,是一個除錯工具。用戶可以利用它除錯、編輯、甚至刪改任何網站的 CSS、HTML、DOM、與 JavaScript 代碼。Firebug 也有提供其他網頁開發工具,例如 Yahoo! 的網頁速度優化建議工具YSlow。
  • Linux 開發的五大必備工具 | Linux 中國
    Linux 上的開發工具如此之多,以至於會擔心找不到恰好適合你的。Linux 已經成為工作、娛樂和個人生活等多個領域的支柱,人們已經越來越離不開它。在 Linux 的幫助下,技術的變革速度超出了人們的想像,Linux 開發的速度也以指數規模增長。因此,越來越多的開發者也不斷地加入開源和學習 Linux 開發地潮流當中。
  • 實戰基本的Linux sed命令
    想要修改文件而不覆蓋原始文件的Linux管理員有很多選擇,但最有效的工具之一是流編輯器 - sed。流編輯器是大多數Linux發行版的默認部分。它使您能夠使用Linux sed命令在作業系統中執行文本文件操作。與大多數Linux應用程式一樣,sed可以處理管道輸入,這使它成為一種有效的腳本工具。
  • WDL教程-基本概念篇
    從開發者及開發者賦予的名字中,我們就能看出WDL是一個面向生物信息/基因組學領域的專業的工具。那麼它到底好不好學,好不好用呢?目前來說WDL的中文資料還是比較少的,網上有寥寥幾篇入門,這從某種程度上阻礙了大家對它的學習與認識,這個教程就希望把我在學習過程中的心得系統性地總結下來,供大家參考。
  • 無代碼工具的自動化概念概述
    幾乎所有正規的無代碼工具都應該具備某種程度的自動化能力。自動化是高效系統的基礎,它可以幫助人們提高生產力。系統的第一階段肯定是數據收集,而第二階段就是自動化。我們正在考慮在 Fibery(https://fibery.io/)中實現自動化,因為 Fibery 中的數據收集問題似乎已接近完善。但是,創建自動化操作是非常困難的,因為它非常接近編程的形態。