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

2021-09-08 18:48:09 字數 4318 閱讀 4603

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

但是對於在各個 it 領域的人們,我們需要將這個事情提高乙個層面。我們需要使用像 ssh 金鑰這樣的加密秘鑰,而不只是密碼。

設想乙個場景:我有乙個執行在雲上的伺服器,用作我的主 git 庫。我有很多臺工作電腦,所有這些電腦都需要登入到這個**伺服器去做 push 與 pull 操作。這裡我設定 git 使用 ssh。當 git 使用 ssh 時,git 實際上是以 ssh 的方式登入到伺服器,就好像你通過 ssh 命令開啟乙個伺服器的命令列一樣。為了把這些配置好,我在我的 .ssh 目錄下建立乙個配置檔案,其中包含乙個有伺服器名字、主機名、登入使用者、金鑰檔案路徑等資訊的主機項。之後我可以通過輸入如下命令來測試這個配置是否正確。

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

清理

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

公鑰和私鑰之間的差異;

為什麼你不可以從公鑰生成私鑰,但是反之則可以?

authorized_keys檔案的目的以及裡面包含什麼內容;

如何使用私鑰去登入乙個你的對應公鑰儲存在其上的 authorized_keys檔案中的伺服器。

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

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

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

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

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

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

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

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

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

常規口令

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

伺服器基礎設施

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

最終,你可能會有:

需要登入的多個伺服器

多個使用者登入到不同的伺服器,每個都有自己的金鑰

每個使用者使用多個金鑰登入到不同的伺服器

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

安全方法

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

私鑰可以放在移動裝置上,但是必須包含口令;

必須有乙個可以快速地從伺服器上刪除公鑰的方法。

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

軟體

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

或者,另乙個選擇就是完全換個不同的檔位。在 docker 的世界中,你可以採取乙個不同的方式,正如關於 ssh 和 docker 部落格所描述的那樣。

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

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

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

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

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

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

加密最頭痛的問題 金鑰管理

根據ponemon institute的一項最新全球調查,大多數it專家都將金鑰管理的困難程度評為 嚴重 這項調查提供1到10的評分級別,而受訪者認為管理金鑰或證書的風險和成本至少是7,並認為造成現狀的主要原因是金鑰歸屬權的不確定性。thales e security是這項調查的贊助商,該公司的品牌...

在OS X上的WEP加密攻擊

為了在os x上破解wep,你要有kismac和aircrack ng的發現能力。kismac可以通過重新注入資料報來產生資料通訊,但它缺乏aircrack ng所具有的先進加密ptw 攻擊。這意味著你需要配置kismac以便將所有通訊資料報捕獲到pcap檔案中 kismac preferences...

apache httpd在Linux上的安裝與配置

apache httpd在linux上的安裝與配置 2.安裝pcre tar zxvf pcre 8.35.tar.gz cd pcre 8.35 configure prefix usr local pcre make make install 3.安裝apr tar zxvf apr 1.5.1...