linux ssh公鑰免密碼登入

weixin_34321977發表於2017-04-20

ssh 無密碼登入要使用公鑰與私鑰。linux下可以用用ssh-keygen生成公鑰/私鑰對,下面我以CentOS為例。

一、SSH公鑰登入原理

在平時工作中我們經常要遠端登入伺服器,這就要用到SSH協議:

$ ssh user@host

主要有兩種登入方式:第一種為密碼口令登入,第二種為公鑰登入

密碼口令登入

  通過密碼進行登入,主要流程為:

    1、客戶端連線上伺服器之後,伺服器把自己的公鑰傳給客戶端

    2、客戶端輸入伺服器密碼通過公鑰加密之後傳給伺服器

    3、伺服器根據自己的私鑰解密登入密碼,如果正確那麼就讓客戶端登入

公鑰登入

  公鑰登入是為了解決每次登入伺服器都要輸入密碼的問題,流行使用RSA加密方案,主要流程包含:

    1、客戶端生成RSA公鑰和私鑰

    2、客戶端將自己的公鑰存放到伺服器

    3、客戶端請求連線伺服器,伺服器將一個隨機字串傳送給客戶端

    4、客戶端根據自己的私鑰加密這個隨機字串之後再傳送給伺服器

    5、伺服器接受到加密後的字串之後用公鑰解密,如果正確就讓客戶端登入,否則拒絕。這樣就不用使用密碼了。

下面主要說說RSA

  先介紹兩個概念:

    對稱加密:對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的金鑰(secret key)。對稱加密有很多種演算法,由於它效率很高,所以被廣泛使用在很多加密協議的核心當中。對稱加密通常使用的是相對較小的金鑰,一般小於256 bit。因為金鑰越大,加密越強,但加密與解密的過程越慢。如果你只用1 bit來做這個金鑰,那黑客們可以先試著用0來解密,不行的話就再用1解;但如果你的金鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。金鑰的大小既要照顧到安全性,也要照顧到效率。對稱加密的一大缺點是金鑰的管理與分配,換句話說,如何把金鑰傳送到需要解密你的訊息的人的手裡是一個問題。在傳送金鑰的過程中,金鑰有很大的風險會被黑客們攔截。現實中通常的做法是將對稱加密的金鑰進行非對稱加密,然後傳送給需要它的人。

    非對稱加密:非對稱加密為資料的加密與解密提供了一個非常安全的方法,它使用了一對金鑰,公鑰(public key)和私鑰(private key)。私鑰只能由一方安全保管,不能外洩,而公鑰則可以發給任何請求它的人。非對稱加密使用這對金鑰中的一個進行加密,而解密則需要另一個金鑰。比如,你向銀行請求公鑰,銀行將公鑰發給你,你使用公鑰對訊息加密,那麼只有私鑰的持有人--銀行才能對你的訊息解密。與對稱加密不同的是,銀行不需要將私鑰通過網路傳送出去,因此安全性大大提高。目前最常用的非對稱加密演算法是RSA演算法。雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,所以我們還是要用對稱加密來傳送訊息,但對稱加密所使用的金鑰我們可以通過非對稱加密的方式傳送出去。

  公鑰和私鑰:

一個公鑰對應一個私鑰。
金鑰對中,讓大家都知道的是公鑰,不告訴大家,只有自己知道的,是私鑰。
如果用其中一個金鑰加密資料,則只有對應的那個金鑰才可以解密。
如果用其中一個金鑰可以進行解密資料,則該資料必然是對應的那個金鑰進行的加密。
   RSA演算法的作用:
    1、加密:公鑰加密私鑰解密

        主要用於將資料資料加密不被其他人非法獲取,保證資料安全性。使用公鑰將資料資料加密,只有私鑰可以解密。即使密文在網路上被第三方獲取由於沒有私鑰則無法解密。從而保證資料安全性。     

A在自己電腦上生成RSA鑰匙檔案,一個私鑰檔案一個公鑰檔案,並將他的公鑰傳送給B。
此時B要傳送資訊給A,於是B用A的公鑰加密他的訊息,然後傳送給A。【網路上傳輸的密文,沒有A的私鑰無法解密,其他人獲取之後也沒用】
A用他的私鑰解密B的訊息。
    2、認證:私鑰加密公鑰解密

        主要用於身份驗證,判斷某個身份的真實性。使用私鑰加密之後,用對應的公鑰解密從而驗證身份真實性。

          A要驗證B是否是真實使用者

          1、B將自己公鑰給A

2、B將檔案用自己私鑰加密傳送給A

          3、A根據B的公鑰解密,如果成功則為真實身份使用者

 

SSH公鑰登入則用的是第二種功能。

安全性: 這種演算法非常可靠,金鑰越長,它就越難破解。根據已經披露的文獻,目前被破解的最長RSA金鑰是768個二進位制位。也就是說,長度超過768位的金鑰,還無法破解(至少沒人公開宣佈)。因此可以認為,1024位的RSA金鑰基本安全,2048位的金鑰極其安全。所以我們在用ssh-keygen命令時候要注意金鑰長度,具體引數為:

 

-b bits
指定金鑰長度。對於RSA金鑰,最小要求768位,預設是2048位。DSA金鑰必須恰好是1024位(FIPS 186-2 標準的要求)。

至少不能少於768。一般不用寫預設就是2048了。哈哈!

 

總結:

 公鑰與私鑰使用場景:
 (1)私鑰用來進行解密和簽名,是給自己用的。
 (2)公鑰由本人公開,用於加密和驗證簽名,是給別人用的。
(3)當該使用者傳送檔案時,用私鑰簽名,別人用他給的公鑰驗證簽名,可以保證該資訊是由他傳送的。當該使用者接受檔案時,別人用他的公鑰加密,他用私鑰解密,可以保證該資訊只能由他接收到。

二、Linux使用ssh公鑰實現免密碼登入Linux例項

ssh 無密碼登入要使用公鑰與私鑰。linux下可以用用ssh-keygen生成公鑰/私鑰對,下面我以CentOS為例。

有機器A(192.168.1.155),B(192.168.1.181)。現想A通過ssh免密碼登入到B。
首先以root賬戶登陸為例。

 

檢視是否開啟了公鑰認證和相關認證方式

在使用公鑰認證之前,先檢查一下伺服器的ssh配置檔案/etc/ssh/sshd_config

RSAAuthentication yes # 啟用 RSA 認證,預設為yes
PubkeyAuthentication yes # 啟用公鑰認證,預設為yes

AuthorizedKeysFile      .ssh/authorized_keys # 公鑰認證檔案,預設為.ssh/authorized_keys

另外,如果對伺服器安全性比較高的情況下,可以設定使用者只允許通過公鑰認證,禁止使用者用密碼方式登入,只要修改一下伺服器的配置檔案/etc/sshd/sshd_config

PasswordAuthentication no

修改完後要重啟sshd服務。

這樣使用者通過密碼方式登入時就會提示:
Permission denied (publickey,gssapi-with-mic)

有效的提高了系統的安全性。
注意:
.ssh 目錄的許可權必須是0700
.ssh/authorized_keys 檔案許可權必須是0600
否則公鑰認證不會生效。


1.在A機下生成公鑰/私鑰對。

[root@A ~]# ssh-keygen -t rsa -P ''

-P表示密碼,-P '' 就表示空密碼,也可以不用-P引數,這樣就要三車回車,用-P就一次回車。
該命令將在/root/.ssh目錄下面產生一對金鑰id_rsa和id_rsa.pub。

一般採用的ssh的rsa金鑰:
id_rsa 私鑰
id_rsa.pub 公鑰
下述命令產生不同型別的金鑰
ssh-keygen -t dsa
ssh-keygen -t rsa
ssh-keygen -t rsa1

2.把A機下的/root/.ssh/id_rsa.pub 複製到B機的 /root/.ssh/authorized_keys檔案裡,先要在B機上建立好 /root/.ssh 這個目錄,用scp複製。

[root@A ~]# scp /root/.ssh/id_rsa.pub root@192.168.1.181:/root/.ssh/authorized_keys
root@192.168.1.181's password:
id_rsa.pub 100% 223 0.2KB/s 00:00

由於還沒有免密碼登入的,所以要輸入一次B機的root密碼。

3.authorized_keys的許可權要是600!!!

[root@B ~]# chmod 600 /root/.ssh/authorized_keys

4.A機登入B機。

[root@A ~]# ssh -l root 192.168.1.181
The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
Last login: Thu Jul 3 09:53:18 2008 from root
[root@B ~]#

第一次登入是時要你輸入yes。

現在A機可以無密碼登入B機了。

小結:登入的機子可有私鑰,被登入的機子要有登入機子的公鑰。這個公鑰/私鑰對一般在私鑰宿主機產生。上面是用rsa演算法的公鑰/私鑰對,當然也可以用dsa(對應的檔案是id_dsa,id_dsa.pub)

想讓A,B機無密碼互登入,那B機以上面同樣的方式配置即可。


SSH-KeyGen 的用法

 

假設 A 為客戶機器,B為目標機;

要達到的目的:
A機器ssh登入B機器無需輸入密碼;
加密方式選 rsa|dsa均可以,預設dsa

做法:
1、登入A機器
2、ssh-keygen -t [rsa|dsa],將會生成金鑰檔案和私鑰檔案 id_rsa,id_rsa.pub或id_dsa,id_dsa.pub
3、將 .pub 檔案複製到B機器的 .ssh 目錄, 並 cat id_dsa.pub >> ~/.ssh/authorized_keys
4、大功告成,從A機器登入B機器的目標賬戶,不再需要密碼了;

ssh-keygen做密碼驗證可以使在向對方機器上ssh ,scp不用使用密碼.
具體方法如下:
ssh-keygen -t rsa
然後全部回車,採用預設值.

這樣生成了一對金鑰,存放在使用者目錄的~/.ssh下。
將公鑰考到對方機器的使用者目錄下,並拷到~/.ssh/authorized_keys中。

要保證.ssh和authorized_keys都只有使用者自己有寫許可權。否則驗證無效。(今天就是遇到這個問題,找了好久問題所在),其實仔細想想,這樣做是為了不會出現系統漏洞。

 

相關文章