ssh免密碼登陸及其原理

[TOC]

ssh免密碼登陸及其原理

1 示例

ssh 無密碼登錄要使用公鑰與私鑰。linux下可以用用ssh-keygen生成公鑰/私鑰對,下面以CentOS為例。有機器A(192.168.64.21),B(192.168.64.22)。
目標:A通過ssh免密碼登錄到B

  • 在A機下生成公鑰/私鑰對
$ssh-keygen -t rsa -P ''
#直接ssh-keygen然后三次回車就ok了
# -P表示密碼,-P '' 就表示空密碼;也可以不用-P參數(shù),這樣就要三車回車,用-P就一次回車。
#它在/root/下生成.ssh目錄,.ssh下有id_rsa和id_rsa.pub。
$cd /root/.ssh
$cat id_rsa.pub >> authorized_keys

特意強調(diào),使用參數(shù)可以省去生成公鑰/私鑰的回車步驟

$ssh-keygen  -t rsa -P '' -f /root/.ssh/id_rsa
#-t 指定rsa 加密算法
#-P 指定密碼,次數(shù)為空
#-f 指定key文件路徑
  • 把A機下的authorized_keys復制到B機
$scp /root/.ssh/authorized_keys root@192.168.64.22:/root/.ssh/authorized_keys
#authorized_keys的權(quán)限設(shè)置為600
$chmod 600 /root/.ssh/authorized_keys

備注:

ssh-keygen 默認使用 RSA 算法,長度為 2048 位,生成一個私鑰文件 id_rsa 和一個公鑰文件 id_rsa.pub,兩個文件默認保存在用戶的 ~/.ssh 目錄下。你可以在命令行交互過程指定密鑰文件路徑,也可以設(shè)置密鑰口令,如果設(shè)置了密鑰口令,在使用密鑰進行登錄時,需要輸入口令。

ssh-keygen 支持 -f 選項指定密鑰文件路徑,-t 選項指定加密算法,-b 選項指定密鑰長度,-N 選項指定密鑰口令,-C 選項指定注釋。
[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 密鑰
[ssh-keygen 中文手冊]
(http://www.jinbuguo.com/openssh/ssh-keygen.html)

  • A機登錄B機
#A機登錄B機
$ssh 192.168.64.22

第一次登錄需輸入yes,現(xiàn)在A機可以無密碼登錄B機了,B登陸A,也同樣,在B中生成公鑰和私鑰對,將公鑰寫入authorized_keys中,然后同步A、B中的authorized_keys,使其一致就ok了。

也即就是:登錄的機子有私鑰,被登錄的機子要有登錄機子的公鑰,這個公鑰/私鑰對一般在私鑰宿主機產(chǎn)生。上面是用rsa算法(不對稱加密算法)的公鑰/私鑰對,當然也可以用dsa(對稱加密算法:對應(yīng)的文件是id_dsa,id_dsa.pub)

2 SSH兩種級別安全驗證

SSH是為建立在應(yīng)用層和傳輸層基礎(chǔ)上的安全協(xié)議(OSI七層與TCP/IP五層網(wǎng)絡(luò)架構(gòu)詳解)。SSH 是目前較可靠,專為遠程登錄會話和其他網(wǎng)絡(luò)服務(wù)提供安全性的協(xié)議。利用SSH 協(xié)議可以有效防止遠程管理過程中的信息泄露問題。

從客戶端來看,SSH提供兩種級別的安全驗證:

2.1 基于口令的驗證

只要知道帳號和口令,就可以登錄到遠程主機。所有傳輸?shù)臄?shù)據(jù)都會被加密,但缺點是:不能保證你正在連接的服務(wù)器就是你想連接的服務(wù)器。以下是登錄驗證流程:

基于口令的驗證

? 當?shù)谝淮捂溄舆h程主機時,會提示你當前主機的”公鑰指紋”,詢問你是否繼續(xù),如果選擇繼續(xù)后就可以輸入密碼進行登錄了,當遠程的主機接受以后,該臺服務(wù)器的公鑰就會保存到~/.ssh/known_hosts文件中。

2.2 基于密鑰的驗證

這種驗證的前提是客戶端需要生成一對密鑰,將公鑰放到需訪問的遠程服務(wù)器。這種驗證比上一種的好處是,不能仿冒真正的服務(wù)器,因為要仿冒必須拿到客戶端生成的公鑰。缺點就是驗證等待過程稍長些。

基于密鑰的驗證

3 如何生成密鑰

1、在客戶端打開終端,執(zhí)行ssh-keygen,該命令會默認在~/.ssh/目錄下創(chuàng)建id_rsa、id_rsa.pub兩個文件,分別為你的公鑰和私鑰

2、將公鑰id_rsa.pub文件拷貝到服務(wù)器端的~/.ssh/authorized_keys文件中,可通過scp拷貝

4 免密碼登錄原理

ssh免密碼登錄原理圖

A要免密碼登錄到B,B首先要擁有A的公鑰,然后B要做一次加密驗證。非對稱加密,公鑰加密的密文不能公鑰解開,只能私鑰解開

5 使用ssh-agent

ssh-agent

ssh-agent是密鑰管理器,是一種控制用來保存公鑰身份驗證所使用的私鑰的程序

運行ssh-agent以后,使用ssh-add將私鑰交給ssh-agent保管,其他程序需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程

ssh-agent是管理多個ssh key的代理,受管理的私鑰通過ssh-add來添加
好處1:不用重復輸入密碼
用 ssh-add 添加私鑰時,如果私鑰有密碼的話,照例會被要求輸入一次密碼,在這之后ssh-agent可直接使用該私鑰,無需再次密碼認證。

好處2:不用到處部署私鑰
假設(shè)私鑰分別可以登錄同一內(nèi)網(wǎng)的主機 A 和主機 B,出于一些原因,不能直接登錄 B。可以通過在 A 上部署私鑰或者設(shè)置 Forwarding(轉(zhuǎn)發(fā)) 登錄 B,也可以轉(zhuǎn)發(fā)認證代理連接在 A 上面使用ssh-agent私鑰登錄 B;可以在A上直接sftp傳文件到B上。

如這邊有一臺機器是local,能通過公鑰直接登陸server1和server2。server1和server2之間無公鑰登陸。

現(xiàn)在要在server1上直接登陸server2,在local上執(zhí)行

$ssh-agent bash
$ssh-add  ~/.ssh/id_rsa

執(zhí)行了之后就將私鑰給ssh-agent保管了,server1上面登陸server2的時候,需要私鑰驗證的時候直接找ssh-agent要就可以了
接下來登陸server1,注意-A

ssh -A server1

可以發(fā)現(xiàn)server1上多了/tmp/ssh-xxxxxxxxx/agent.xxxxx的socket,之后神奇的事發(fā)生了,在 server1上可直接進server2,只需執(zhí)行如下命令,如果加了-A則可以繼續(xù)ssh forwarding(轉(zhuǎn)發(fā)) ,以至無限的機器forwarding。
ssh (-A) server2
同樣的原理可以試一下sftp, scp等基于ssh的命令。

如運行ssh-add,遇到Could not open a connection to your authentication agent.。

解決:需要ssh-agent啟動bash,或者說把bash掛到ssh-agent下面。

$ssh-agent bash --login -i
$ssh-add ~/.ssh/id_rsa

參看資料

1 ssh免密碼登陸及其原理


                             2017-11-27-Boy
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容