Linux伺服器之間建立信任關係,ssh免密碼登入
建立信任關係的基本操作
基本場景是想從一臺Server伺服器直接登入另一臺,或者將Server伺服器的資料不需密碼驗證直接拷貝至Client伺服器,以下我們簡稱Server伺服器為S(待發送的資料檔案在這臺伺服器上),Client服務為C,信任關係的最簡單操作方法如下:
1 在S伺服器上,進入當前使用者根目錄下的隱藏目錄 .ssh,命令如下:
cd ~/.ssh
(注:目錄名前的點好”.”表示該資料夾是一個特殊的隱藏資料夾,ls命令下預設是看不到的,通過 ls –a 命令觀察到)
2 生成S伺服器的私鑰和公鑰:
ssh-keygen -t rsa
(注:rsa是一種加密演算法的名稱,此處也可以使用dsa,關於rsa和dsa演算法的介紹可見本文後半章節)ssh-keygen生成金鑰用於信任關係生成
-此時會顯示Generating public/private key pair. 並提示生成的公鑰私鑰檔案的存放路徑和檔名,預設是放在 /home/username/.ssh/id_rsa 這樣的檔案裡的,通常不用改,回車就可以
然後Enter passphrase(empty for nopassphrase): 通常直接回車,預設不需要口令
Entersame passphrase again: 也直接回車
然後會顯式金鑰fingerprint生成好的提示,並給出一個RSA加密協議的方框圖形。此時在.ssh目錄下ls,就可以看到生成好的私鑰檔案id_rsa和公鑰檔案id_rsa.pub了
以下是各種補充說明:
注1:如果此時提示id_rsaalready exists,Overwrite(y/n) 則說明之前已經有人建好了金鑰,此時選擇n 忽略本次操作就行,可以直接用之前生成好的檔案;當然選y覆蓋一下也無妨
注2:公鑰用於加密,它是向所有人公開的(pub是公開的單詞public的縮寫);私鑰用於解密,只有密文的接收者持有。
3 在Server伺服器上載入私鑰檔案
仍然在.ssh目錄下,執行命令:
ssh-add id_rsa
系統如果提示:Identity added: id_rsa (id_rsa) 就表明載入成功了
下面有幾個異常情況處理:
–如果系統提示:could not open a connection to your authentication agent
則需要執行一下命令:
ssh-agent bash
然後再執行上述的ssh-add id_rsa命令
–如果系統提示id_rsa: No such file or directory
這是系統無法找到私鑰檔案id_rsa,需要看看當前路徑是不是不在.ssh目錄,或者私鑰檔案改了名字,例如如果建立的時候改成 aa_rsa,則這邊命令中也需要相應改一下
-如果系統提示 command not found,那肯定是你命令敲錯字元了
-提示Agent admitted failure to sign using the key,私鑰沒有載入成功,重試ssh-add
-注意id_rsa/id_rsa.pub檔案不要刪除,存放在.ssh目錄下
4 把公鑰拷貝至Client伺服器上
5 ssh登入到Client伺服器上,然後在Client伺服器上,把公鑰的內容追加到authorized_keys檔案末尾(這個檔案也在隱藏資料夾.ssh下,沒有的話可以建立,沒有關係)
cat id_rsa.pub >> ~/.ssh/authorized_keys
以下是各種補充說明,遇到問題時可以參考:
注1:這裡不推薦用檔案覆蓋的方式,有些教程直接scp id_rsa.pub 到Client伺服器的authorized_keys檔案,會導致之前建的其他信任關係的資料被破壞,追加到末尾是更穩妥的方式;
注2: cat 完以後,Client伺服器上剛才拷貝過來的id_rsa.pub檔案就不需要了,可以刪除或移動到其它地方)
注3:ssh-keygen 命令通過-b引數可以指定生成的金鑰檔案的長度,如果不指定則預設為1024,如果ssh-keygen –b 4096(最長4096),則加密程度提高,但是生成和驗證時間會增加。對一般的應用來說,預設長度已經足夠勝任了。如果是rsa加密方式,那麼最短長度為768byte
注4:authorized_keys檔案的許可權問題。如果按上述步驟建立關係後,仍然要驗證密碼,並且沒有其他報錯,那麼需要檢查一下authorized_keys檔案的許可權,需要作下修改: chmod g-w authorized_keys
OK,現在試試在Server端拷貝一個檔案到Client伺服器,應該無需互動直接就傳過去了。
但是此時從Client傳資料到Server伺服器,仍然是需要密碼驗證的。如果需要兩臺伺服器間能直接互傳資料,則反過來按上述步驟操作一下就可以了
刪除伺服器間信任關係的方法
如果想取消兩臺伺服器之間的信任關係,直接刪除公鑰或私鑰是沒有用的,需要在Client伺服器上,開啟 ~/.ssh/ authorized_keys 檔案,找到對應的伺服器的公鑰欄位並刪除
每個段落的開頭是ssh-rsa字樣,段尾是Server伺服器的帳號和ip(如下圖紅框),需要細心的找一下後刪除整段
金鑰檔案內容和刪除Linux伺服器間信任關係的方法
各種可能遇到的情況和處理方法
–提示 port 22: Connection refused
可能的原因:沒有正確安裝最新的openssh-server,安裝方法如下
sudo apt-get install openssh-server
不支援apt安裝的,可以手工下載:
–關於目錄和檔案的許可權設定
.ssh目錄的許可權必須是700,同時本機的私鑰的許可權必須設定成600:
chmod 600 id_rsa
否則ssh伺服器會拒絕登入
關於RSA和DSA加密演算法
在ssh-keygen命令中,-t引數後指定的是加密演算法,可以選擇rsa或者dsa
RSA 取名自演算法的三位提出者Ron Rivest, Adi Shamir, and Leonard Adleman的姓名首字母,作為一種非對稱加密演算法,RSA的安全性基於及其困難的大整數分解(兩個素數的乘積的還原問題)。關於RSA演算法原理的文章很多,感興趣的朋友可以找來讀一讀。
DSA = Digital Signature Algorithm,基於有限域離散對數難題,是Schnorr和ElGamal簽名演算法的變種,一般用於數字簽名和認證,被美國標準局(NIST)採納為數字簽名標準DSS(Digital Signature Standard),based on discrete logarithmscomputation.
DES = Digital EncryptionStandard. Obsolete standard.
RSA演算法好在網路容易實現金鑰管理,便進行數字簽名,演算法複雜,加/解速度慢,採用非對稱加密。在實際用於信任關係建立中,這兩種方法的差異很微小,可以挑選其一使用。
關於SSH協議的介紹
SSH全稱SecureSHell,顧名思義就是非常安全的shell的意思,SSH協議是IETF(Internet Engineering Task Force)的Network Working Group所制定的一種協議。SSH的主要目的是用來取代傳統的telnet和R系列命令(rlogin,rsh,rexec等)遠端登陸和遠端執行命令的工具,實現對遠端登陸和遠端執行命令加密。防止由於網路監聽而出現的密碼洩漏,對系統構成威脅。
ssh協議目前有SSH1和SSH2,SSH2協議相容SSH1。目前實現SSH1和SSH2協議的主要軟體有OpenSSH和SSH Communications Security Corporation 公司的SSHCommunications 軟體。前者是OpenBSD組織開發的一款免費的SSH軟體,後者是商業軟體,因此在linux、FreeBSD、OpenBSD、NetBSD等免費類UNIX系統種,通暢都使用OpenSSH作為SSH協議的實現軟體。因此,本文重點介紹一下OpenSSH的使用。需要注意的是OpenSSH和SSH Communications的登陸公鑰/私鑰的格式是不同的,如果想用SSHCommunications產生的私鑰/公鑰對來登入到使用OpenSSH的linux系統需要對公鑰/私鑰進行格式轉換。
第一次登陸後,ssh就會把登陸的ssh指紋存放在使用者home目錄的.ssh目錄的know_hosts檔案中,如果遠端系統重灌過系統,ssh指紋已經改變,你需要把.ssh 目錄下的know_hosts中的相應指紋刪除,再登陸回答yes,方可登陸。請注意.ssh目錄是開頭是”.”的隱藏目錄,需要ls –a引數才能看到。而且這個目錄的許可權必須是700,並且使用者的home目錄也不能給其他使用者寫許可權,否則ssh伺服器會拒絕登陸。如果發生不能登陸的問題,請察看伺服器上的日誌檔案/var/log/secure。通常能很快找到不能登陸的原因。