SSH基本原理及linux中無密碼登陸linux
1、什麼是sshweb
1.定義算法
ssh是secure shell的縮寫,從字面意思就能夠看出就是很是安全的shell,它主要用於對加密計算機之間傳輸的文件進行加密,從而達到安全傳輸的目的。shell
2.出現的意義安全
之前的網絡傳輸協議,好比ftp、telnet在實際上都是不安全的,由於它們之間的數據都是以明文的方式傳輸的,若是有人在中間截取數據,就會致使數據的暴露。而經過ssh加密數據傳輸,即便被別人截取到,也由於是加密的而不會致使數據的暴露。服務器
使用ssh還有一個好處就是它傳輸的數據都是它傳輸的數據都是進過壓縮的,能夠提升傳輸數據的速度。網絡
3.ssh提供的兩種安全驗證的登陸方式dom
1)密碼(口令)驗證:用服務器中本地系統的用戶登陸,並進行密碼驗證。在傳輸數據的時候數據都是加密的,可是不能保證你正在鏈接的服務器就是你要鏈接的那個服務器,可能會有別的服務器冒充正真的服務器,也就是所謂的「中間人」***ssh
2)祕鑰對驗證:這種方式須要提供相匹配的祕鑰信息,一般須要在客戶端本身建立一對祕鑰,並把公鑰放在須要訪問的服務器的指定位置上。具體的過程就是若是你要鏈接到你要鏈接的服務器上,客戶端軟件就會向服務器發出請求,請求用你的密鑰進行安全驗證。服務器收到請求後,先在服務器本身上你的主目錄下尋找你的公鑰,而後把它和你發送過來的公鑰進行比較。若是兩個公鑰一致,服務器就用公鑰加密「質詢」並把它發送給客戶端軟件。客戶端軟件收到「質詢」後就能夠用你的私鑰解密再把它發送給服務器。ide
當密碼驗證和私鑰驗證都啓動時,服務器將優先使用祕鑰驗證。
2、ssh的應用
ssh是比較可靠的,利用ssh協議能夠有效的防止遠程管理和傳輸過程當中信息和數據泄漏的問題。如下應用都是我從網上找的,若是還有請你們多多指教
一、服務器間跳轉:有些時候,你可能沒法直接鏈接到某臺服務器,而須要使用一臺中間服務器進行中轉。首先確保你已經爲服務器配置了公鑰訪問,並開啓了agent forwarding。
二、省去用戶名
三、主機別名
四、省略主機名
五、鏈接中轉:有時候你可能須要從一個服務器鏈接到另一個服務器,好比在兩個服務器之間直接傳輸數據,而不用經過本地電腦中轉。
六、免密碼登陸,這是咱們今天主要說的。
七、長鏈接:若是你發現本身天天須要鏈接到同一個服務器無數次,那麼長鏈接就會頗有用。經過設置鏈接被保持的時間(ControlPersist 4h),使鏈接在設置時間內在服務其中有保存,即便在你退出服務器以後,這條鏈接依然能夠重用。所以,在你下一次(設置時間以內)登陸服務器時,你會發現以閃電般的速度創建完成,這個選項對於經過scp拷貝多個文件提速尤爲明顯,由於你不在須要爲每一個文件作單獨的認證了。
八、多鏈接共享:若是你須要在多個窗口中打開同一個服務器的鏈接,而不想每次都輸入用戶名密碼,或是等待鏈接創建,那麼你能夠配置ssh的鏈接共享選項,在本地打開你的ssh配置文件一般它們位於~/.ssh/config。而後添加下面2行:
ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
試試斷開你與服務器的鏈接,並創建一條新鏈接,而後打開一個新窗口,再建立一條鏈接,你會發現,第二條鏈接幾乎是在瞬間就創建好了。
還有好些應用,你均可以在網上找到,這裏我就很少說了。
3、無密碼登陸(公鑰登陸)
1.一般ssh密碼登陸過程通常都是
1)用戶向所要登陸的遠程主機發送登陸請求;
2)遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶;
3)用戶使用這個公鑰,將登陸密碼加密後,發送到遠程主機;
4)遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。
在linux中,若是你是第一次經過ssh登陸遠程主機,會出現下面的提示:
$ ssh user@host
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
這段話的意思是,沒法確認host主機的真實性,只知道它的公鑰指紋,問你還想繼續嗎?
所謂的「公鑰指紋」,是指公鑰長度較長(這裏採用RSA算法,長達1024位),很難比對,因此對其進行MD5計算,將他變成128位的指紋。上列中是98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.再進行比較,就容易多了。
假定通過風險衡量之後,用戶決定接受這個遠程主機的公鑰。
Are you sure you want to continue connecting (yes/no)?yes
系統會出現一句提示,表示host主機已經獲得承認。
Warning: Permanently added 'host,12.18.429.21' (RSA) to the list of known hosts.
而後,會要求輸入密碼。
Password: (enter password)
若是密碼正確,就能夠登陸了。
當遠程主機的公鑰被接受之後,它就會被保存在用戶home目錄的$HOME/.ssh/known_hosts文件之中。下次再鏈接這臺遠程主機,系統就會認出它的公鑰已經保存在本地了,從而跳過警告部分,直接提示輸入密碼。
若是遠程主機從新裝過系統或由於別的緣由,致使ssh指紋改變,你須要把.ssh目錄下的know_hosts文件中相應遠程主機IP一致的指紋刪除,再經過ssh登陸一次回答yes,從新認證一次方可登陸。注意.ssh是目錄是以「.」開頭的隱藏目錄,須要#ls -a參數才能看到。並且這個目錄的權限必須是700,而且用戶的home目錄也不能給其餘用戶寫權限,不然ssh服務器會拒絕登陸。若是發生不能登陸的問題,請查看服務器上的日誌文件/var/log/secure。一般能很快找到不能登陸的緣由。
二、公鑰登陸(免密碼登陸)
使用密碼登陸,每次都必須輸入密碼,感受會很麻煩。尤爲是在密碼超級複雜,維護的服務器又比較多的狀況下,這個時候用公鑰登陸就顯得很輕鬆了。
所謂「公鑰登陸」,原理很簡單,就是用戶將本身的公鑰儲存在遠程主機上。登陸的時候,遠程主機就會向用戶發送一段隨機字符串,用戶用本身的私鑰加密後,再發出來。遠程主機用事先儲存的公鑰進行解密,若是成功,就證實用戶是可信的,直接容許登陸shell,再也不要求密碼。
要想用公鑰登陸,用戶就必須本身建立一對祕鑰,並把公鑰放在須要訪問的服務器上。
主要的步驟爲:
1)在客戶端生成一對祕鑰
2)將公鑰傳輸至服務器端某用戶的家目錄下.ssh/authorized_keys文件中(多個公鑰須要進行追加)
3)登陸測試
第一步:客戶端生成祕鑰
這種方法要求用戶必須提供本身的公鑰,若是沒有現成的,能夠直接用ssh-keygen生成一個:
[root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
35:dd:d8:49:05:be:e9:7e:89:b7:86:e2:96:17:a0:2b root@localhost.localdomain
The key's randomart p_w_picpath is:
+--[ RSA 2048]----+
| oo.|
| . * . |
| o o = |
| . o o |
| S . . o |
| . o |
| . . = .|
| E . + = +.|
| . o.o +o.|
+-----------------+
[zbj@web ~]$ ls -l .ssh
total 8
-rw------- 1 zbj zbj 1675 Feb 14 14:29 id_rsa
-rw-r--r-- 1 zbj zbj 389 Feb 14 14:29 id_rsa.pub
運行上面的命令之後,系統就會出現一系列提示,能夠一路回車。其中有一個問題就是,要不要對私鑰設置口令(passphrase),若是擔憂私鑰的安全,這裏能夠設置一個(設置私鑰口令的目的是防止私鑰被盜用),可是設置以後利用私鑰鏈接也須要輸入密碼。
運行結束後,再$HOME/.ssh/目錄下,會生成兩個文件:id_rsa.pub和id_rsa。前者是你的公鑰,後者是你的私鑰。再一次強調用戶本身的目錄(~/.ssh)必須不能有其餘人可改寫的權限,.ssh目錄的權限必須是700,即除了用戶本身,其餘人沒有任何讀寫查看該目錄的權限。不然ssh服務器會拒絕登陸。把產生的公鑰上傳到須要登陸的服務器的對應用戶目錄的home目錄的.ssh目錄下。
ssh服務器端默認的公鑰文件是用戶home目錄下.ssh目錄下的authorized_keys文件,所以須要把產生的公鑰以這個文件名放到服務器的$HOME/.ssh/目錄下,這個文件中能夠存放多個客戶端的公鑰文件,就比如一個大門上能夠上不少鎖,能夠有不一樣的鑰匙來嘗試開鎖,只要有個鎖被打開,門就能夠開了。公鑰~/.ssh/authorized_keys必須是600權限,不然ssh服務器會拒絕用戶登陸。
第二步:將生成的公鑰文件上傳到遠程主機
$ ssh-copy-id user@host(IP)
在這以後,你登陸這臺遠程主機,就不用再輸入密碼了。
若是仍是不行,就打開遠程主機的/etc/ssh/sshd_config這個文件,檢查下面幾行前面的「#」註釋是否被取掉。
RSSAuthentication yes
pubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
而後,重啓遠程主機的ssh服務。
關於authorized_keys文件:
遠程主機將用戶的公鑰,保存在登陸後的用戶主目錄的$HOME/.ssh/authorized_keys文件中。公鑰就是一段字符串,只要把它追加在authorized_keys文件的末尾就好了。