免密
下框中在管理機上運行:
[root@master ~]# ssh-keygen -t rsa #它在/root/.ssh下生成id_rsa和id_rsa.pub兩個文件 [root@master ~]# ssh-copy-id root@192.168.1.128 #將公鑰發給被管理端 #或者手動把生成的秘鑰存放到要遠程的機器的/root/.ssh/目錄下權限必須設置為600 [root@master ~]# ssh root@192.168.1.128 [root@master ~]# ssh-agent bash #私鑰交給ssh-agent保管 [root@master ~]# ssh-add ~/.ssh/id_rsa #向ssh-agent添加公鑰身份驗證
$ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
#-t 指定rsa 加密算法 #-P 指定密碼,次數為空 #-f 指定key文件路徑
ssh -i ~/.ssh/id_rsa_test2 root@10.1.0.3 #指定對應私鑰文件連接遠程用戶
啟動ssh-agent 如下兩種方式均可啟動ssh-gent 方式一:創建子shell,在子shell中運行ssh-agent進程,退出子shell自動結束代理。 ssh-agent $SHELL 方式二:單獨啟動一個代理進程,退出當前shell時最好使用ssh-agent -k關閉對應代理 eval `ssh-agent` 關閉ssh-agent ssh-agent -k 將私鑰添加到ssh代理 ssh-add ~/.ssh/key_name 查看代理中的私鑰 ssh-add -l 查看代理中的私鑰對應的公鑰 ssh-add -L 移除指定的私鑰 ssh-add -d /path/of/key/key_name 移除代理中的所有私鑰 ssh-add -D 鎖定ssh代理 鎖定時需要指定鎖定密碼,鎖定后的ssh代理暫時不能幫助我們管理私鑰 ssh-add -x 解鎖ssh代理 解鎖時需要輸入創建鎖時設定的密碼,解鎖后ssh代理可正常工作 ssh-add -X
5 使用ssh-agent
ssh-agent是密鑰管理器
運行ssh-agent以后,使用ssh-add將私鑰交給ssh-agent保管,其他程序需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程
好處1:不用重復輸入密碼
如果私鑰有密碼的話,照例會被要求輸入一次密碼,在這之后ssh-agent可直接使用該私鑰,無需再次密碼認證。
好處2:不用到處部署私鑰
假設私鑰分別可以登錄同一內網的主機 A 和主機 B,出於一些原因,不能直接登錄 B。可以通過在 A 上部署私鑰或者設置 Forwarding(轉發) 登錄 B,也可以轉發認證代理連接在 A 上面使用ssh-agent私鑰登錄 B;可以在A上直接sftp傳文件到B上。
如這邊有一台機器是local,能通過公鑰直接登陸server1和server2。server1和server2之間無公鑰登陸。
現在要在server1上直接登陸server2,在local上執行
$ssh-agent bash $ssh-add ~/.ssh/id_rsa
執行了之后就將私鑰給ssh-agent保管了,server1上面登陸server2的時候,需要私鑰驗證的時候直接找ssh-agent要就可以了
接下來登陸server1,注意-A
ssh -A server1
可以發現server1上多了/tmp/ssh-xxxxxxxxx/agent.xxxxx的socket,之后神奇的事發生了,在 server1上可直接進server2,只需執行如下命令,如果加了-A則可以繼續ssh forwarding(轉發) ,以至無限的機器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的高級應用
使用遠程主機不中斷的跑程序
當我們利用ssh在遠程主機上跑程序的時候,只要關閉了終端就會中斷ssh連接,然后遠程主機上正在跑的程序或者服務就會自動停止運行。我們可以利用 nohup + 需要運行的程序 使運行的程序在切斷ssh連接的時候仍然能夠繼續在遠程主機中運行。nohup即no hang up(不掛起)。
除此之外還有很多遠程操作應用,包括 數據傳輸、端口操作(將不加密的網絡連接綁定到ssh端口實現間接加密) 等等,可以參考柚子皮大神的博客:https://blog.csdn.net/pipisorry/article/details/52269785
-------------------
原理介紹:
SSH 為建立在應用層和傳輸層基礎上的安全協議。SSH 是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用SSH 協議可以有效防止遠程管理過程中的信息泄露問題。
從客戶端來看,SSH提供兩種級別的安全驗證:
1、基於口令的驗證
只要知道帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但缺點是:不能保證你正在連接的服務器就是你想連接的服務器。以下是我畫了的登錄驗證流程:
當第一次鏈接遠程主機時,會提示您當前主機的”公鑰指紋”,詢問您是否繼續,如果選擇繼續后就可以輸入密碼進行登錄了,當遠程的主機接受以后,該台服務器的公鑰就會保存到~/.ssh/known_hosts文件中。
2、基於密鑰的驗證
這種驗證的前提是客戶端需要生成一對密鑰,將公鑰放到需訪問的遠程服務器。這種驗證比上一種的好處是,不能仿冒真正的服務器,因為要仿冒必須拿到客戶端生成的公鑰。缺點就是驗證等待過程稍長些。
如何生成密鑰:
1、在客戶端打開終端,執行ssh-keygen,該命令會默認在~/.ssh/目錄下創建id_rsa、id_rsa.pub兩個文件,分別為您的公鑰和私鑰。
2、將公鑰id_rsa.pub文件拷貝到服務器端的~/.ssh/authorized_keys文件中,有三種方法:
- 通過scp拷貝:
- 例:scp -P 22 ~/.ssh/id_rsa.pub user@host:~/authorized_keys #可選參數-P代表指定用端口號22
- 通過ssh-copyid程序:
- 例:ssh-copy-id user@host #此種方式簡單,不需追加改文件名,但不能指定端口號,默認以22端口
- 通過cat方法:
- 例:cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host ‘cat >> ~/.ssh/authorized_keys’
----------------------------------------------------------------------------------------------------
免密碼登錄原理
圖解,server A免登錄到server B:
1.在A上生成公鑰私鑰。
2.將公鑰拷貝給server B,要重命名成authorized_keys(從英文名就知道含義了)
3.Server A向Server B發送一個連接請求。
4.Server B得到Server A的信息后,在authorized_key中查找,如果有相應的用戶名和IP,則隨機生成一個字符串,並用Server A的公鑰加密,發送給Server A。
5.Server A得到Server B發來的消息后,使用私鑰進行解密,然后將解密后的字符串發送給Server B。Server B進行和生成的對比,如果一致,則允許免登錄。
總之:A要免密碼登錄到B,B首先要擁有A的公鑰,然后B要做一次加密驗證。對於非對稱加密,公鑰加密的密文不能公鑰解開,只能私鑰解開。