大多時候我們都會使用 ssh 來配置伺服器。本期內容介紹了 SSH 的通訊原理,不對稱加密以及如何設定免密碼登入。

如何安全的通訊

所謂安全的通訊,一方面是指通訊的內容不被篡改,另一方面是指通訊雙方身份不被篡改。

我們可以透過加密來確保通訊的安全。但這裡有個問題,就是如何安全地傳遞金鑰。

這就需要提到“不對稱加密”了。

所謂不對稱加密,就是有一對完全不同的金鑰,假設為 A 和 B,A 和 B 之間沒有任何聯絡,既不可以透過 A 來推算出 B,也不可以透過 B 來推算出 A。你可以使用 A 來加密資訊,但是解密只能透過 B。或者使用 B 來加密,但解密只能透過 A。

因為這個特性,我們就可以公開一個金鑰,但是不會破壞加密的安全性。

因此呢,A 和 B 會有一個金鑰公開給對方作為公鑰,另一個金鑰自己儲存作為私鑰。

有了不對稱加密,就可以非常容易的實現安全通訊。比如:

假設有甲乙二人,甲有一對金鑰 A(私鑰)和 B(公鑰),乙有一對金鑰 C(私鑰)和 D(公鑰)。

甲乙就可以非常簡單的實現安全通訊。

甲可以使用乙的公鑰 D 來加密資訊傳送給乙,乙收到後用自己的私鑰 C 解密獲取資訊, 之後乙可以使用甲的公鑰 B 來加密資訊回覆給甲,甲收到資訊後,使用自己的金鑰 A 來解密獲取資訊。 如此往復。

完美,不但解決了通訊的內容不被篡改,而且通訊雙方的身份也完成了認證。公鑰本身就是對對方身份認證。因為只有持有公鑰對應的私鑰,才可以解密資訊。

但是現實卻不會這樣通訊,因為不對稱加密的開銷非常大,計算成本很高, 用不對稱加密來加密大量資料效率非常的低下。 因此,不對稱加密主要是用來身份認證以及傳遞另外的非常高效的一個臨時的隨機的對稱加密金鑰,姑且稱為臨時金鑰,傳遞好金鑰之後雙方使用臨時金鑰進行加解密資訊。

簡單說下 SSH 的通訊過程:

  1. 客戶端 C 向伺服器端 S 傳送連線請求
  2. S 傳送其公鑰 SPub 給到 C
  3. C 登記/驗證 SPub,確定 SPub 確實是 C 的公鑰。
  4. C 生成一個臨時金鑰 X,使用 SPub 來加密並傳遞給 S
  5. S 透過自己的私鑰 SPri 來解密獲得臨時金鑰 X
  6. 注意上述兩個步驟實際情況會更復雜些。臨時金鑰 X 事實上不是 C 單方決定的,而是雙方共同商議的結果,而且過程中除了商議確認金鑰也會商議確認對稱加密演算法,這裡不做細表。
  7. 雙方使用金鑰 X 來完成雙方的通訊。
  8. 到此為止,S 的身份已經透過 SPub 認證過了,但是 C 的身份並沒有認證過。因此 C 還需要傳送使用者名稱密碼給 S 認證身份。
  9. 當然 C 也可以使用公鑰來驗證自己的身份。C 傳送其公鑰 CPub 給 S。
  10. S 在其資料庫中驗證使用者和 CPub,並生成一個隨機數並使用 CPub 加密,並傳送給 C。
  11. C 使用私鑰解密並將這個隨機數傳送給 S。
  12. S 收到這串數字並跟之前的隨機數做比較以確認 C 的身份。確認通過後進行通訊。

配置 ssh

每次 ssh 輸入密碼都很麻煩,我們可以利用金鑰來省略輸入密碼。

Client:

#!/bin/sh
#
# 首先生成金鑰對
ssh-keygen
# press enter for saving in default location
#     private key: ~/.ssh/id_rsa
#     public key:  ~/.ssh/id_rsa.pub
# press enter unless you need a password
#
# 將公鑰傳至伺服器
# scp -r ~/.ssh/id_rsa.pub [email protected]:~/terry.pub
ssh-copy-id [email protected]
#
# 在客戶端的ssh配置中,指定私鑰的位置,如果私鑰檔案為~/.ssh/id_rsa,這句可省略。
echo "IdentityFile ~/.ssh/id_rsa" >> /etc/ssh/ssh_config

Server:


#!/bin/sh
#
# cat ~/terry.pub >> ~/.ssh/authorized_keys
#
#
sed -i '' -e "s/^#*PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
# sed -i '' -e "s/^#RSAAuthentication.*/RSAAuthentication yes/g" /etc/ssh/sshd_config
sed -i '' -e "s/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/g" /etc/ssh/sshd_config
sed -i '' -e "s/^#*AuthorizedKeysFile.*/AuthorizedKeysFile .ssh\/authorized_keys/g" /etc/ssh/sshd_config

禁用 sendmail

一般來說,sendmail 是一個只有在 mail server 上使用的服務,一般可以禁用。 /etc/rc.conf 中新增

sendmail_enable="NONE"

升級 FreeBSD

freebsd-upgrade fetch
freebsd-upgrade install

在 /etc/crontab 中加入以下條目:

@daily                                  root    freebsd-update cron

每天執行一次 freebsd-update 工具。 用這種方法, 使用了 cron 引數, freebsd-update 僅檢查是否存在更新。 如果有了新的補丁,就會自動下載到本地的磁碟, 但不會自動給系統打上。root 會收到一封電子郵件告知需手動安裝補丁。

如果出現了錯誤,可以使用下面的 freebsd-update 命令回退到上一次的修改:

freebsd-update rollback

老張說:

支援我們

如果您喜欢这篇文章,您可以分享给您的朋友,分享到您的社交账号比如:

或者 点击这个链接 观看广告支持我【广告内容与我们无关,请不要轻易相信并打开弹出的广告】。
若您经济宽裕,更欢迎通过下面的方式小额赞助以支持我们的创作。