如何實現伺服器之間的免密登錄
⑴ ssh免密碼登陸及其原理
[TOC]
ssh 無密碼登錄要使用公鑰與私鑰。linux下可以用用ssh-keygen生成公鑰/私鑰對,下面以CentOS為例。有機器A(192.168.64.21),B(192.168.64.22)。
目標:A通過ssh免密碼登錄到B
特意強調,使用參數可以省去生成公鑰/私鑰的回車步驟昌純
備註:
第一次登錄需輸入yes,現在A機可以無密碼登錄B機了,B登陸A,也同樣,在B中生成公鑰和私鑰對,將公鑰寫入authorized_keys中,然後同步A、B中的authorized_keys,使其一致就ok了。
也即就是:登錄的機子有私鑰,被登錄的機子要有登錄機子的公鑰,這個公鑰/私鑰對一般在私鑰宿主機產生。上面是用rsa演算法(不對稱加密演算法)的公鑰/私鑰對,當然也可以用dsa(對稱加密演算法:對應的文件是id_dsa,id_dsa.pub)
SSH是為建立在應用層和傳輸層基礎上的安全協議( OSI七層與TCP/IP五層網路架構詳解 )。SSH 是目前較可靠,專為遠程登錄會話和其他網路服務提供安全性的協議。利用SSH 協議可以有效防止遠程管世迅知理過程中的信息泄露問題。
從客戶端來看,SSH提供兩種級別的安全驗證:
只要知道帳號和口令,就可以登錄到遠程主機。所有傳輸的數據都會被加密,但缺點是:不能保證你正在連接的伺服器就是你想連接的伺服器。以下是登錄驗證流程:
當第一次鏈接遠程主機時,會提示你當前主機的」公鑰指紋」,詢問你是否繼續,如果選擇繼續後就可以輸入密碼進行登錄了,當遠程的主機接受以後,該台伺服器的公鑰就會保存到~/.ssh/known_hosts文件中。
這種驗證的前提是客戶端需要生成一對密鑰,將公鑰放到需訪問的遠程伺服器。這種驗證比上一種的好處是,不能仿冒真正的伺服器,因為要仿冒必須拿到客戶端生成的公鑰。缺點就是驗證等待過程稍長些。
1、在客戶端打開終端,執行 ssh-keygen ,該命令會默認在 ~/.ssh/ 目錄下創建 id_rsa 、 id_rsa.pub 兩個文件,分別為你的公鑰和私鑰
2、將公鑰 id_rsa.pub 文件拷貝到伺服器端的 ~/.ssh/authorized_keys 文件中,可通過scp拷貝
A要免密碼登錄到B,B首先要擁有A的公鑰,然後B要做一次加搜消密驗證。非對稱加密,公鑰加密的密文不能公鑰解開,只能私鑰解開
ssh-agent
ssh-agent是密鑰管理器,是一種控制用來保存公鑰身份驗證所使用的私鑰的程序
運行ssh-agent以後,使用ssh-add將私鑰交給ssh-agent保管,其他程序需要身份驗證的時候可以將驗證申請交給ssh-agent來完成整個認證過程
ssh-agent是管理多個ssh key的代理,受管理的私鑰通過ssh-add來添加
好處1:不用重復輸入密碼
用 ssh-add 添加私鑰時,如果私鑰有密碼的話,照例會被要求輸入一次密碼,在這之後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保管了,server1上面登陸server2的時候,需要私鑰驗證的時候直接找ssh-agent要就可以了
接下來登陸server1,注意-A
可以發現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下面。
1 ssh免密碼登陸及其原理
⑵ windows Openssh-server(服務端-免密登陸設置)
windows10(其它版本請自行網路)
一、win10 安裝spenssh
1、服務端切換到C:ProgramDatassh下(首次啟動sshd後會生成該文件夾),打開sshd_config文件
2、修改 sshd_config 配置文件參數
3、重啟ssh-server服務
三、服務端設置完成, 設置做哪客戶端鏈接
1、客戶端生成ssh密瞎胡正鑰文件:
注: -d 4096 是設置加密位數(可不要磨悔); -t 任意字元 必須設置
2、需要將客戶端(celient)生成的 id_rsa.pub 文件密鑰, 追加 到服務端的 authorized_keys 文件中,[authorized_keys 文件路徑: windows系統在 C:UsersAdministrator.ssh 目錄下,沒有可新建]
四、測試ssh免密鏈接, 首次需要輸入密碼
⑶ ssh PublicKey免密登錄伺服器
建立PublicKey登陸步驟其實非常簡單,總結來說就是將客戶端生成的的ssh public key添加到伺服器的 ~/.ssh/authorized_keys 文件中,即可實現ssh的免密碼登錄。
在客戶端生成公鑰密鑰 附一篇 ssh-keygen 基本用法
然後一路回車, 使用默認值即可
使用 ls 命令可以看到當前目錄下的文件,有了個 id_rsa 和 id_rsa.pub ,前者是密鑰,後者是公鑰。
查看公鑰
復制公鑰
先嘗試進入 .ssh 看看目錄是否存在
若不存在則新建一個
然後修改許可權
接著再進入.ssh,然後修改將公鑰添加到authorized_keys
按 i ,然後將剛剛復制的密鑰粘貼到這里,按 esc ,再按 : ,輸入 wq 保存並退出
接著修改許可權
做好配置之後,通過ssh可以直接登錄了。
我們可以利用ssh的配置文件來簡化我們登陸的操作
配置文件在 ~/.ssh/config
我們可以修改這個文件(如果不存在則新建一個)
YourName可以改成任意名字
如果修改了埠則需要加上 Port 參數
還有各種各樣的參數可以查看幫助
配置完後可以這樣登陸伺服器
Enjoy it~
⑷ ssh 雙機互信:免密碼登錄設置步驟及常見問題
在 linux 系統管理中,設置免密碼登錄,進行機器的批量管理是最常用的一個方法。比如針對幾十甚至上百台線上機器,通常我們會設置一台「發布機」作為中央控制機對其它線上機器免密碼登錄,然後進行軟體、配置文件的分發、更新、部署。當然了,針對上面的問題,解決方案並非最優且唯一,比如你也可以用 expect 模擬自動輸入來完成自動登錄驗證這一過程,或者用現在一些開源的軟體自動化配置和部署工具,比如 Puppet,但這都不在本文的討論范疇,今天咱們要說的就是這種最原始、最有效、最直接的方式:免密碼登錄。
(1)問題:
假設:現有2台機器
1、個人機192.168.1.110
2、伺服器192.168.1.112
要使110無需密碼通過ssh登入112
(2)步驟
1、創建密鑰
2、復制公密到伺服器
3、添加公密到192.168.112的信任區域
註: 2,3兩步可由命令ssh--id一步到位
4、測試
此時整個步驟已經完成,你可以嘗試 ssh ip 或者 /etc/hosts 中的主機名試試。
(3)可能遇到的問題
1、在使用 ssh--id 錯誤提示
表現:
公鑰,私鑰已經生成,執行上述命令完畢出現如下錯誤:
$ ssh--id remote-machine
/usr/bin/ssh--id: ERROR: No identities found
解決方法:
g 之發現缺少公鑰路徑,通過 -i 加上即可:
2、ssh ip 可以成功登錄,ssh hostname 卻失敗
表現:
ssh hostname
ssh: connect to host localhost port 22: Connection refused
解決方法:
看下對方的主機名是不是在 /etc/hosts 文件中和 ip 做了映射,沒有就加上即可。
3、ssh 的配置目錄許可權問題
由於 ssh 的許可權直接關繫到伺服器的安全問題,因此 ssh 每次讀取配置都會校驗相關文件夾和文件的許可權,以防止許可權過大對外暴露。
表現:
設置了.ssh目錄,在authorized_keys設置了key後登錄還提示需要輸入密碼。
解決方法:
注意許可權,.ssh許可權700,authorized_keys許可權600,就KO啦!
chmod 700 ~/.ssh/
chmod 600 ~/.ssh/authorized_keys
4、ssh localhost:publickey 授權失敗
註:ssh可同時支持publickey和password兩種授權方式,publickey默認不開啟,需要配置為yes。
如果客戶端不存在.ssh/id_rsa,則使用password授權;存在則使用publickey授權;
如果publickey授權失敗,依然會繼續使用password授權。
不要設置 PasswordAuthentication no ,它的意思是禁止密碼登錄,這樣就只能本機登錄了!
5、ssh localhost:Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
最後重啟你的 linux 執行 ssh localhost
6、ssh localhost:需要密碼
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
7、ssh ip 或 hostname 均提示:connection refused
目標主機的ssh server端程序是否安裝、服務是否啟動,是否在偵聽22埠;
是否允許該用戶登錄;
本機是否設置了iptables規則,禁止了ssh的連入/連出;
具體請參考: http://hi..com/leejun_2005/item/bfc0ded296cb8ebf32db907e
(4)最後的問題
本文介紹的建立基於免密碼登錄,雙機互信的管理方式簡單、直接,但是安全就是個問題了,稍有不慎容易被一鍋端,建議加上防火牆的埠、ip 策略,有條件的話試試動態口令,這樣會更穩妥些。再有就是當機器規模達到上百、上千台的時候,如果對文件數據、機器狀態的實時同步、一致性的要求很高的時候,這種管理方式的弊端就出來了。
(5)Refer:
http://blogread.cn/it/article/6103?f=wb ssh--id幫你建立信任
http://www.lvtao.net/server/54.html ssh無密碼登入設置 ssh-keygen ssh--id
http://hi..com/leejun_2005/item/bfc0ded296cb8ebf32db907e SSH的安裝及登錄提示:connection refused的解決辦法
http://www.cnblogs.com/qcly/archive/2013/07/27/3219535.html 一次由SELinux引起的ssh公鑰認證失敗問題
⑸ 如何實現安全的免密碼ssh登錄
創建ssh公私鑰
首先你需要放棄使用的密碼登錄的方式,因為那種方式實在太讓人崩潰了. 下面我們開始使用一種被稱為「公私鑰「認證的方式來進行ssh登錄. 「公私鑰「認證方式簡單的解釋是
你需要創建一對公私鑰
然後把公鑰放到伺服器上, 自己保留好私鑰
當ssh登錄時,ssh程序會發送私鑰去和伺服器上的公鑰做匹配.如果匹配成功就可以登錄了
我們現在來點實際的, 我們有兩台機器: qian.jianingy.com(這是我們的伺服器, 實際上它是我的), nby.jianingy.com(這是我的筆記本). 首先,使用ssh-keygen程序在筆記本上創建公私鑰對
生成公私鑰
jianingy@nby:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jianingy/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa.
Your public key has been saved in id_rsa.pub.
The key fingerprint is:
15:c6:44:59:bf:6f:7a:11:eb:cb:02:d4:aa:33:e0:ae jianingy@nby
ssh-keygen程序會尋問你把公私鑰文件存放在哪裡.根據傳統我們會把它放在~/.ssh裡面.如果你不想
追隨這個傳統, 你可能給花些時間游說那些ssh程序.至於公私鑰的名字, 用默認的id_rsa吧,道理是一樣的.
接下來輸入一個口令,用來保護這個私鑰. 我強烈建議你輸入這個口令而不是讓它為空(稍後我會解釋的). 現在公私鑰生成好了,
私鑰(identification)被保存成了id_rsa, 公鑰(public key)被保存成id_rsa.pub. 注意:
一定要保護好你的私鑰,他就像你家裡存家底的保險櫃的鑰匙一樣重要.
現在把doggy.pub拷貝到伺服器上去, 並且將其內孫帆容追加到一個叫~/.ssh/authorized_keys的文件里去
jianingy@nby:~$ cat /home/jianingy/.ssh/doggy.pub | ssh 192.168.1.9 "cat - >> ~/.ssh/authorized_keys"
好現在試試看ssh登錄吧. 如果你想了解更多可以試試看用ssh -v登錄.
使用密鑰登錄
jianingy@nby:~$ ssh qian.jianingy.com
Enter passphrase for key '/home/jianingy/.ssh/id_rsa':
現在輸入你的passphrase, 然後就能成功登錄了.的確, 到現在我們還不能無密碼登錄,
請再耐心點. 有個特例是, 如果你使用了空的passphrase,
那麼現在已經可以無密碼登錄了.但是我也必須提醒你這是很不安全的做法,一銷正旦有人復制了你的passphrase, 它就真的成了機房「任虧凱悔我行「了.
使用ssh-agent提供私鑰
接
下來是最關鍵的部分. 前面我們把輸入密碼變成了輸入passphrase,
這沒有帶來任何方便.但是,要知道有個傢伙能幫助我們自動輸入這個passphrase(只是看起來像是自動輸入而已).
我們只要輸入一次passphrase, 以後的工作就可以交給那傢伙了. 它就是ssh-agent(據我所知他和agent
smith沒有太多關系). 運行ssh-agent吧
jianingy@nby:~$ eval `ssh-agent`
jianingy@nby:~$ ssh-add
運行ssh-add添加密鑰
jianingy@nby:~$ ssh-add
Enter passphrase for /home/jianingy/.ssh/id_rsa:
Identity added: /home/jianingy/.ssh/id_rsa (/home/jianingy/.ssh/id_rsa)
好了,現在再次登錄伺服器, 我們已經沒有密碼的煩惱了.至於為什麼要用這么奇怪的方式運行ssh-agent, 你可以試著在命令行上輸入一個ssh-agent回車, 看看輸出什麼你就會明白了.
復用已經存在的ssh-agent
如
果你看了上面直接運行ssh-agent的輸出,你應該已經明白了ssh和ssh-agent是如何相互了解的. 沒錯,
通過環境變數ssh知道了與ssh-agent通信的unix
socket在哪裡.然而當我們打開一個新的終端時我們必須要重新設置這個環境變數.做為一個慵懶的系統管理員,這是不可忍受的.所以我用perl寫了這
個腳本, 他可以找到以前的ssh-agent.
view sourceprint?
01.#!/usr/bin/env perl
02.# author: jianingy
03.# 2007/06/24
04.
05.use strict;
06.my $exist;
07.my @dirs = grep {-r $_} glob "/tmp/ssh-*";
08.foreach (@dirs) {
09. my @socks = glob("{$_}/agent.*");
10. next unless (@socks);
11. foreach (@socks) {
12. $exist = $_;
13. # check agent
14. unless (system "SSH_AUTH_SOCK=$_ ssh-add -l >/dev/null 2>&1") {
15. print "export SSH_AUTH_SOCK=$_\n";
16. exit 0;
17. }
18. }
19.}
20.
21.if ($exist) {
22. system "SSH_AUTH_SOCK=$exist ssh-add";
23. print "export SSH_AUTH_SOCK=$exist\n";
24.} else {
25. system "ssh-agent";
26. exec $0;
27.}
現在只需要在.bashrc里加入
eval `ssh-attach`
便可以在每次啟動終端的時候就能復用ssh-agent了.到了這里我們已經實現了免密碼的ssh登錄(當然至少要輸入一次passphrase, 但是相對於無數次的密碼輸入相信你不會在乎這一次的:P).