在 Linux 上管理加密密鑰的最佳體驗

来源:http://www.cnblogs.com/linuxprobe/archive/2016/07/15/5671743.html
-Advertisement-
Play Games

但是對於在各個 IT 領域的人們,我們需要將這個事情提高一個層面。我們需要使用像 SSH 密鑰這樣的加密秘鑰,而不只是密碼。 設想一個場景:我有一個運行在雲上的伺服器,用作我的主 git 庫。我有很多台工作電腦,所有這些電腦都需要登錄到這個中央伺服器去做 push 與 pull 操作。這裡我設置 g ...


導讀 存儲 SSH 的加密秘鑰和記住密碼一直是一個讓人頭疼的問題。但是不幸的是,在當前這個充滿了惡意黑客和攻擊的世界中,基本的安全預防是必不可少的。對於許多普通用戶來說,大多數人只能是記住密碼,也可能尋找到一個好程式去存儲密碼,正如我們提醒這些用戶不要在每個網站採用相同的密碼。

秘鑰-特色

但是對於在各個 IT 領域的人們,我們需要將這個事情提高一個層面。我們需要使用像 SSH 密鑰這樣的加密秘鑰,而不只是密碼。
設想一個場景:我有一個運行在雲上的伺服器,用作我的主 git 庫。我有很多台工作電腦,所有這些電腦都需要登錄到這個中央伺服器去做 push 與 pull 操作。這裡我設置 git 使用 SSH。當 git 使用 SSH 時,git 實際上是以 SSH 的方式登錄到伺服器,就好像你通過 SSH 命令打開一個伺服器的命令行一樣。為了把這些配置好,我在我的 .ssh 目錄下創建一個配置文件,其中包含一個有伺服器名字、主機名、登錄用戶、密鑰文件路徑等信息的主機項。之後我可以通過輸入如下命令來測試這個配置是否正確。

ssh gitserver

很快我就可以訪問到伺服器的 bash shell。現在我可以配置 git 使用相同配置項以及存儲的密鑰來登錄伺服器。這很簡單,只是有一個問題:對於每一個我要用它登錄伺服器的電腦,我都需要有一個密鑰文件,那意味著需要密鑰文件會放在很多地方。我會在當前這臺電腦上存儲這些密鑰文件,我的其他電腦也都需要存儲這些。就像那些有特別多的密碼的用戶一樣,我們這些 IT 人員也被這些特別多的密鑰文件淹沒。怎麼辦呢?

清理

在我們開始幫助你管理密鑰之前,你需要有一些密鑰應該怎麼使用的基礎知識,以及明白我們下麵的提問的意義所在。同時,有個前提,也是最重要的,你應該知道你的公鑰和私鑰該放在哪裡。然後假設你應該知道:

  1. 公鑰和私鑰之間的差異;
  2. 為什麼你不可以從公鑰生成私鑰,但是反之則可以?
  3. authorized_keys文件的目的以及裡面包含什麼內容;
  4. 如何使用私鑰去登錄一個你的對應公鑰存儲在其上的 authorized_keys文件中的伺服器。

這裡有一個例子。當你在亞馬遜的網路服務上創建一個雲伺服器,你必須提供一個用於連接你的伺服器的 SSH 密鑰。每個密鑰都有一個公開的部分(公鑰)和私密的部分(私鑰)。你要想讓你的伺服器安全,乍看之下你可能應該將你的私鑰放到伺服器上,同時你自己帶著公鑰。畢竟,你不想你的伺服器被公開訪問,對嗎?但是實際上的做法正好是相反的。

在 Linux 上管理加密密鑰的最佳體驗

你應該把自己的公鑰放到 AWS 伺服器,同時你持有用於登錄伺服器的私鑰。你需要保護好私鑰,並讓它處於你的控制之中,而不是放在一些遠程伺服器上,正如上圖中所示。

原因如下:如果公鑰被其他人知道了,它們不能用於登錄伺服器,因為他們沒有私鑰。進一步說,如果有人成功攻入你的伺服器,他們所能找到的只是公鑰,他們不可以從公鑰生成私鑰。同時,如果你在其他的伺服器上使用了相同的公鑰,他們不可以使用它去登錄別的電腦。

這就是為什麼你要把你自己的公鑰放到你的伺服器上以便通過 SSH 登錄這些伺服器。你持有這些私鑰,不要讓這些私鑰脫離你的控制。

但是還有一點麻煩。試想一下我 git 伺服器的例子。我需要做一些抉擇。有時我登錄架設在別的地方的開發伺服器,而在開發伺服器上,我需要連接我的 git 伺服器。如何使我的開發伺服器連接 git 伺服器?顯然是通過使用私鑰,但這樣就會有問題。在該場景中,需要我把私鑰放置到一個架設在別的地方的伺服器上,這相當危險。

一個進一步的場景:如果我要使用一個密鑰去登錄許多的伺服器,怎麼辦?如果一個入侵者得到這個私鑰,這個人就能用這個私鑰得到整個伺服器網路的許可權,這可能帶來一些嚴重的破壞,這非常糟糕。

同時,這也帶來了另外一個問題,我真的應該在這些其他伺服器上使用相同的密鑰嗎?因為我剛纔描述的,那會非常危險的。

最後,這聽起來有些混亂,但是確實有一些簡單的解決方案。讓我們有條理地組織一下。

(註意,除了登錄伺服器,還有很多地方需要私鑰密鑰,但是我提出的這個場景可以向你展示當你使用密鑰時你所面對的問題。)

常規口令

當你創建你的密鑰時,你可以選擇是否包含一個密鑰使用時的口令。有了這個口令,私鑰文件本身就會被口令所加密。例如,如果你有一個公鑰存儲在伺服器上,同時你使用私鑰去登錄伺服器的時候,你會被提示輸入該口令。沒有口令,這個密鑰是無法使用的。或者你也可以配置你的密鑰不需要口令,然後只需要密鑰文件就可以登錄伺服器了。

口令

一般來說,不使用口令對於用戶來說是更方便的,但是在很多情況下我強烈建議使用口令,原因是,如果私鑰文件被偷了,偷密鑰的人仍然不可以使用它,除非他或者她可以找到口令。在理論上,這個將節省你很多時間,因為你可以在攻擊者發現口令之前,從伺服器上刪除公鑰文件,從而保護你的系統。當然還有一些使用口令的其它原因,但是在很多場合這個原因對我來說更有價值。(舉一個例子,我的 Android 平板上有 VNC 軟體。平板上有我的密鑰。如果我的平板被偷了之後,我會馬上從伺服器上刪除公鑰,使得它的私鑰沒有作用,無論有沒有口令。)但是在一些情況下我不使用口令,是因為我正在登錄的伺服器上沒有什麼有價值的數據,這取決於情境。

伺服器基礎設施

你如何設計自己伺服器的基礎設施將會影響到你如何管理你的密鑰。例如,如果你有很多用戶登錄,你將需要決定每個用戶是否需要一個單獨的密鑰。(一般來說,應該如此;你不會想在用戶之間共用私鑰。那樣當一個用戶離開組織或者失去信任時,你可以刪除那個用戶的公鑰,而不需要必須給其他人生成新的密鑰。相似地,通過共用密鑰,他們能以其他人的身份登錄,這就更糟糕了。)但是另外一個問題是你如何配置你的伺服器。舉例來說,你是否使用像 Puppet 這樣工具配置大量的伺服器?你是否基於你自己的鏡像創建大量的伺服器?當你複製你的伺服器,是否每一個的密鑰都一樣?不同的雲伺服器軟體允許你配置如何選擇;你可以讓這些伺服器使用相同的密鑰,也可以給每一個伺服器生成一個新的密鑰。

如果你在操作這些複製的伺服器,如果用戶需要使用不同的密鑰登錄兩個不同但是大部分都一樣的系統,它可能導致混淆。但是另一方面,伺服器共用相同的密鑰會有安全風險。或者,第三,如果你的密鑰有除了登錄之外的需要(比如掛載加密的驅動),那麼你會在很多地方需要相同的密鑰。正如你所看到的,你是否需要在不同的伺服器上使用相同的密鑰不是我能為你做的決定;這其中有權衡,你需要自己去決定什麼是最好的。

最終,你可能會有:

  1. 需要登錄的多個伺服器
  2. 多個用戶登錄到不同的伺服器,每個都有自己的密鑰
  3. 每個用戶使用多個密鑰登錄到不同的伺服器

(如果你正在別的情況下使用密鑰,這個同樣的普適理論也能應用於如何使用密鑰,需要多少密鑰,它們是否共用,你如何處理公私鑰等方面。)

安全方法

瞭解你的基礎設施和特有的情況,你需要組合一個密鑰管理方案,它會指導你如何去分發和存儲你的密鑰。比如,正如我之前提到的,如果我的平板被偷了,我會從我伺服器上刪除公鑰,我希望這在平板在用於訪問伺服器之前完成。同樣的,我會在我的整體計劃中考慮以下內容:

  1. 私鑰可以放在移動設備上,但是必須包含口令;
  2. 必須有一個可以快速地從伺服器上刪除公鑰的方法。

在你的情況中,你可能決定你不想在自己經常登錄的系統上使用口令;比如,這個系統可能是一個開發者一天登錄多次的測試機器。這沒有問題,但是你需要調整一點你的規則。你可以添加一條規則:不可以通過移動設備登錄該機器。換句話說,你需要根據自己的狀況構建你的準則,不要假設某個方案放之四海而皆準。

軟體

至於軟體,令人吃驚的是,現實世界中並沒有很多好的、可靠的存儲和管理私鑰的軟體解決方案。但是應該有嗎?考慮下這個,如果你有一個程式存儲你所有伺服器的全部密鑰,並且這個程式被一個快捷的密鑰鎖住,那麼你的密鑰就真的安全了嗎?或者類似的,如果你的密鑰被放置在你的硬碟上,用於 SSH 程式快速訪問,密鑰管理軟體是否真正提供了任何保護嗎?

但是對於整體基礎設施和創建/管理公鑰來說,有許多的解決方案。我已經提到了 Puppet,在 Puppet 的世界中,你可以創建模塊以不同的方式管理你的伺服器。這個想法是伺服器是動態的,而且不需要精確地複製彼此。這裡有一個聰明的方法,在不同的伺服器上使用相同的密鑰,但是對於每一個用戶使用不同的 Puppet 模塊。這個方案可能適合你,也可能不適合你。

或者,另一個選擇就是完全換個不同的檔位。在 Docker 的世界中,你可以採取一個不同的方式,正如關於 SSH 和 Docker 博客所描述的那樣。

秘鑰

但是怎麼樣管理私鑰?如果你搜索過的話,你無法找到很多可以選擇的軟體,原因我之前提到過;私鑰存放在你的硬碟上,一個管理軟體可能無法提到更多額外的安全。但是我使用這種方法來管理我的密鑰:

首先,我的 .ssh/config 文件中有很多的主機項。我要登錄的都有一個主機項,但是有時我對於一個單獨的主機有不止一項。如果我有很多登錄方式,就會出現這種情況。對於放置我的 git 庫的伺服器來說,我有兩個不同的登錄項;一個限制於 git,另一個用於一般用途的 bash 訪問。這個為 git 設置的登錄選項在機器上有極大的限制。還記得我之前說的我存儲在遠程開發機器上的 git 密鑰嗎?好了。雖然這些密鑰可以登錄到我其中一個伺服器,但是使用的賬號是被嚴格限制的。

其次,大部分的私鑰都包含口令。(對於需要多次輸入口令的情況,考慮使用 ssh-agent。)

再次,我有一些我想要更加小心地保護的伺服器,我不會把這些主機項放在我的 host 文件中。這更加接近於社會工程方面,密鑰文件還在,但是可能需要攻擊者花費更長的時間去找到這個密鑰文件,分析出來它們對應的機器。在這種情況下,我就需要手動打出來一條長長的 SSH 命令。(沒那麼可怕。)

同時你可以看出來我沒有使用任何特別的軟體去管理這些私鑰。

我們偶爾會在 linux.com 收到一些問題,詢問管理密鑰的好軟體的建議。但是退一步看,這個問題事實上需要重新思考,因為沒有一個普適的解決方案。你問的問題應該基於你自己的情景。你是否簡單地嘗試找到一個位置去存儲你的密鑰文件?你是否尋找一個方法去管理多用戶問題,其中每個人都需要將他們自己的公鑰插入到 authorized_keys文件中?

通過這篇文章,我已經囊括了這方面的基礎知識,希望到此你明白如何管理你的密鑰,並且,只有當你問出了正確的問題,無論你尋找任何軟體(甚至你需要另外的軟體),它都會出現。

免費提供最新Linux技術教程書籍,為開源技術愛好者努力做得更多更好:http://www.linuxprobe.com/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • nfluxDB是一個當下比較流行的時序資料庫,InfluxDB使用 Go 語言編寫,無需外部依賴,安裝配置非常方便,適合構建大型分散式系統的監控系統。 本文是一系列InfluxDB學習教程的目錄,現主要包含以下文章。 InfluxDB學習之InfluxDB的安裝和簡介 InfluxDB學習之Infl ...
  • 在ORACLE資料庫中,如果一個比較大的索引在重建過程中耗費時間比較長,那麼怎麼查看索引重建耗費的時間,以及完成了多少(比例)了呢,我們可以通過V$SESSION_LONGOPS視圖來查看索引重建的時間和進度。 官方文檔關於V$SESSION_LONGOPS的介紹如下 V$SESSION_LONGO... ...
  • 今天終於鼓起所有的勇氣,吹散了所有的懶惰去參加了一家小公司的面試,面試方向是PHP工程師,作為從二線城市過來的二線PHPer可謂是備受打擊。在以前憑藉著回答“GET和POST的區別”的面試方式以及不存在了,在整個面試過程中幾乎沒有涉及PHP的基礎知識,問的基本上都是高併發、緩存、大數據量等方面的知識 ...
  • find命令相對於locate這種非實時查找的搜索命令,大大增加了我們搜索的便捷度以及準確性;並且能夠方便的幫助我們對大文件、特定類型的文件查找與刪除,特別是有超多小碎文件的時候,更是方便至極.... -user username:查找屬主是xx的文件 -group group:查找屬組的xx文件 ...
  • 使用以下命令查看: ps -aux | sort -k4,4n ps auxw --sort=rss ps auxw --sort=%cpu linux 下的ps命令 %CPU 進程的cpu占用率 %MEM 進程的記憶體占用率 VSZ 進程所使用的虛存的大小 RSS 進程使用的駐留集大小或者是實際記憶體 ...
  • 1. Excel for Mac 的 Developer tab下沒有XML組,因此無法從xml導入或者導出到xml; 2. Excel for Mac 中沒有Mark as Finnal的功能; 3. Switch Window功能存在於頂部菜單 Window 中; Mac中變為: 4. ...
  • 出現這個錯誤,是系統的glibc版本太低了,需要更新 到http://ftp.gnu.org/gnu/glibc/下載新版本的glibc,也不用太高,我選擇glibc-2.20.tar.gz 解壓完畢後 ./congigure --prefix=/opt/glibc-2.20 make && mak ...
  • 前些天公司項目需要對上傳的圖片打水印,前端採用angularjs,後端nodejs,網上一搜,找到了一個images的庫,在本地Windows環境下試了下還不錯,然後就上傳測試伺服器(centos6.5系統)了,結果就出問題了,網上一查,發現需要gblic2.14(centos6.5系統自帶的是2. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...