天天看點

ssh自學筆記

Ssh自學筆記

Ssh簡介

傳統的網絡服務程式,如:ftp、pop和telnet在本質上都是不安全的,因為它們在網絡上用明文傳送密碼和資料,别有用心的人非常容易就可以截獲這些密碼和資料。而且,這些服務程式的安全驗證方式也是有其弱點的, 就是很容易受到“中間人”(man-in-the-middle)這種方式的攻擊。所謂“中間人”的攻擊方式, 就是“中間人”冒充真正的伺服器接收你傳給伺服器的資料,然後再冒充你把資料傳給真正的伺服器。伺服器和你之間的資料傳送被“中間人”一轉手做了手腳之後,就會出現很嚴重的問題。通過使用SSH,你可以把所有傳輸的資料進行加密,這樣"中間人"這種攻擊方式就不可能實作了,而且也能夠防止DNS欺騙和IP欺騙。使用SSH,還有一個額外的好處就是傳輸的資料是經過壓縮的,是以可以加快傳輸的速度。SSH有很多功能,它既可以代替Telnet,又可以為FTP、PoP、甚至為PPP提供一個安全的"通道"。

SSH的安全驗證方式

從用戶端來看,SSH提供兩種級别的安全驗證。

l  第一種級别(基于密碼的安全驗證)隻要你知道自己帳号和密碼,就可以登入到遠端主機。所有傳輸的資料都會被加密,但是不能保證你正在連接配接的伺服器就是你想連接配接的伺服器。可能會有别的伺服器在冒充真正的伺服器,也就是受到“中間人”這種方式的攻擊。

l  第二種級别(基于密匙的安全驗證)需要依靠密匙,也就是你必須為自己建立一對密匙,并把公用密匙放在需要通路的伺服器上。如果你要連接配接到SSH伺服器上,用戶端軟體就會向伺服器送出請求,請求用你的密匙進行安全驗證。伺服器收到請求之後,先在你在該伺服器的家目錄下尋找你的公用密匙,然後把它和你發送過來的公用密匙進行比較。如果兩個密匙一緻,伺服器就用公用密匙加密“質詢”(challenge)并把它發送給用戶端軟體。用戶端軟體收到“質詢”之後就可以用你的私人密匙解密再把它發送給伺服器。

  用這種方式,你必須知道自己密匙的密碼。但是,與第一種級别相比,第二種級别不需要在網絡上傳送密碼。

第二種級别不僅加密所有傳送的資料,而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登入的過程可能需要10秒。

兩種方式的機制

使用者名、密碼驗證方式
ssh自學筆記

說明:

  1. 當用戶端發起ssh請求,伺服器會把自己的公鑰發送給使用者;
  2. 使用者會根據伺服器發來的公鑰對密碼進行加密;
  3. 加密後的資訊回傳給伺服器,伺服器用自己的私鑰解密,如果密碼正确,則使用者登入成功。
公鑰認證方式
ssh自學筆記
  1. 首先在用戶端生成一對密鑰(ssh-keygen);
  2. 并将用戶端的公鑰ssh-copy-id 拷貝到服務端;
  3. 當用戶端再次發送一個連接配接請求,包括ip、使用者名;
  4. 服務端得到用戶端的請求後,會到authorized_keys中查找,如果有相應的IP和使用者,就會随機生成一個字元串,例如:qwer;
  5. 服務端将使用用戶端拷貝過來的公鑰進行加密,然後發送給用戶端;
  6. 得到服務端發來的消息後,用戶端會使用私鑰進行解密,然後将解密後的字元串發送給服務端;
  7. 服務端接受到用戶端發來的字元串後,跟之前的字元串進行對比,如果一緻,就允許免密碼登入。
個人對這兩種方法的了解

仔細對比兩種方式可以發現,第一種使用者名和密碼的驗證方式,實際上隻進行了伺服器對用戶端的驗證,而沒有用戶端對伺服器的驗證,這就存在中間人假扮伺服器的可能性。而第二種方式,公鑰認證方式,由于在伺服器中放置了用戶端的公鑰,而第5、6步實際上就是用戶端對伺服器的驗證。是以公鑰認證方式是雙向認證的,應該更加安全。

非對稱加密

對稱加密算法在加密和解密時使用的是同一個秘鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對資料進行加密,隻有用對應的私有密鑰才能解密;如果用私有密鑰對資料進行加密,那麼隻有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,是以這種算法叫作非對稱加密算法。

非對稱加密的工作過程

l  乙方生成一對密鑰(公鑰和私鑰)并将公鑰向其它方公開。

l  得到該公鑰的甲方使用該密鑰對機密資訊進行加密後再發送給乙方。

l  乙方再用自己儲存的另一把專用密鑰(私鑰)對加密後的資訊進行解密。乙方隻能用其專用密鑰(私鑰)解密由對應的公鑰加密後的資訊。

在傳輸過程中,即使攻擊者截獲了傳輸的密文,并得到了乙的公鑰,也無法破解密文,因為隻有乙的私鑰才能解密密文。

同樣,如果乙要回複加密資訊給甲,那麼需要甲先公布甲的公鑰給乙用于加密,甲自己儲存甲的私鑰用于解密。

非對稱加密的優缺點

非對稱加密與對稱加密相比,其安全性更好:對稱加密的通信雙方使用相同的秘鑰,如果一方的秘鑰遭洩露,那麼整個通信就會被破解。而非對稱加密使用一對秘鑰,一個用來加密,一個用來解密,而且公鑰是公開的,秘鑰是自己儲存的,不需要像對稱加密那樣在通信之前要先同步秘鑰(同步秘鑰,也就意味着要再網絡上傳送秘鑰,而這很可能會被惡意監聽)。

非對稱加密的缺點是加密和解密花費時間長、速度慢,隻适合對少量資料進行加密。

在非對稱加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等。

公鑰加密與公鑰認證

加密與認證

首先我們需要區分加密和認證這兩個基本概念。

加密是将資料資料加密,使得非法使用者即使取得加密過的資料,也無法擷取正确的資料内容,是以資料加密可以保護資料,防止監聽攻擊。其重點在于資料的安全性。身份認證是用來判斷某個身份的真實性,确認身份後,系統才可以依不同的身份給予不同的權限。其重點在于使用者的真實性。兩者的側重點是不同的。

個人了解:加密是為了保證内容的安全性,認證則隻需要驗證私鑰正确即可。

公鑰加密過程:

比如有兩個使用者Alice和Bob,Alice想把一段明文通過雙鑰加密的技術發送給Bob,Bob有一對公鑰和私鑰,那麼加密解密的過程如下:

l  Bob将他的公開密鑰傳送給Alice。

l  Alice用Bob的公開密鑰加密她的消息,然後傳送給Bob。

l  Bob用他的私人密鑰解密Alice的消息。

注意,加密時使用的秘鑰是對方的公鑰,不能使用自己的私鑰,因為自己的公鑰是公開的,任何人都可以擷取自己的公鑰,如果用自己的私鑰加密,那麼任何人都可以進行解密了。

公鑰認證過程:

身份認證和加密就不同了,主要使用者鑒别使用者的真僞。這裡我們隻要能夠鑒别一個使用者的私鑰是正确的,就可以鑒别這個使用者的真僞。

還是Alice和Bob這兩個使用者,Alice想讓Bob知道自己是真實的Alice,而不是假冒的,是以Alice隻要使用私鑰密碼,對檔案簽名,發送給Bob,Bob使用Alice的公鑰對檔案進行解密,如果可以解密成功,則證明Alice的私鑰是正确的,因而就完成了對Alice的身份鑒别。整個身份認證的過程如下:

l  Alice用她的私人密鑰對檔案加密,進而對檔案簽名。

l  Alice将簽名的檔案傳送給Bob。

l  Bob用Alice的公鑰解密檔案,進而驗證簽名。

個人了解:公鑰人認證過程是用自己的私鑰對檔案進行加密,在這裡叫對檔案簽名更合理一些,因為雖然這裡我們對檔案進行了加密,但是我們的目的并不在于對檔案的内容進行保護,我們的目的在于用公鑰驗證私鑰的正确性。用自己的私鑰對檔案進行加密意味着,任何人都可以對該檔案進行解密,因為自己的公鑰是公開的。但是這并沒有影響,因為我們并不是再為檔案加密,并不是在保護檔案的内容,而是在讓對方驗證自己私鑰的正确性,以便對方确認自己的身份。

另外在網上看到了一個很精辟的總結:

總結:公鑰和私鑰是成對的,它們互相解密。

公鑰加密,私鑰解密。

私鑰數字簽名,公鑰驗證。

SSH秘鑰生成和免密碼登入

使用ssh-keygen指令。該指令的manpage說明是

authentication key generation, management and conversion

認證秘鑰的生成、管理和轉換

常用參數

-t    type 指定密鑰類型,有兩種可供選擇:RSA和DSA,預設為RSA

實際中使用ssh-keygen指令(不帶任何參數),然後按三下回車,就會在家目錄下生成.ssh檔案,.ssh檔案中有兩個檔案:id_rsa和id_rsa.pub,分别對應私鑰和公鑰。然後将公鑰的内容拷貝到服務端的~/.ssh/authorized_keys檔案中即可。但是要注意本地的.shh目錄和服務端的.ssh目錄的權限都是700,服務端authorized_keys的權限為600才可以。拷貝公鑰的内容到服務端,可以使用scp指令複制id_rsa.pub到服務端,然後将内容添加在authorized_keys的後面即可。也可以使用ssh-copy-id指令。ssh-copy-id 的-i選項可以指定要拷貝的公鑰檔案,預設就是使用家目錄下.shh中的id_rsa.pub。然後跟上ssh的位址,如,ssh-copy-id [email protected]就會把公鑰拷貝到服務端的家目錄下.ssh的authorized_key中。

上面的這種方法針對的是兩台Linux電腦。如果要用Linux電腦ssh到Openwrt的無線路由器中這樣是無效的,因為在OpenWrt中使用的是dropbear作為ssh協定的實作,而不是open ssh。這個時候,我們應該講authorized_key放到/etc/dropbear/目錄中,而不是家目錄下的.shh目錄中,這一點要注意。

繼續閱讀