SSH是一種網絡協議,用於計算機之間的加密登陸。javascript
$ ssh user@host (能夠在config中配置,使用 ssh 別名,不須要用戶名和主機ip. config配置見五) $ ssh host 若是本地用戶名與遠程用戶名一致,登陸時能夠省略用戶名SSH的默認端口是22,登陸請求會送進遠程主機的22端口,使用p參數,能夠修改這個端口。html
$ ssh -p 2222 user@host
(1)遠程主機收到用戶的登陸請求,把本身的公鑰發給用戶。
(2)用戶使用這個公鑰,將登陸密碼加密後,發送回來。
(3)遠程主機用本身的私鑰,解密登陸密碼,若是密碼正確,就贊成用戶登陸。
首次登陸時,系統提示:沒法確認主機真實性,只知道它的公鑰指紋(公鑰1024位,經過MD5計算,變成128位的指紋),是否鏈接?
當遠程主機的公鑰被接受之後,它就會和ip一塊兒被保存在文件$HOME/.ssh/known_hosts之中。再次登陸時,主機發來的公鑰直接與known_hosts文件中的對應iP的公鑰做對比,從而跳過警告部分,直接提示輸入密碼。java
風險: 若是攻擊者插在用戶與遠程主機之間(好比在公共的wifi區域),用僞造的公鑰,獲取用戶的登陸密碼。再用這個密碼登陸遠程主機,那麼SSH的安全機制就蕩然無存了。這種風險就是著名的"中間人攻擊"(Man-in-the-middle attack)。git
每一個SSH用戶都有本身的獨立的known_hosts文件,此外系統也有一個這樣的文件,一般在/etc/ssh/ssh_known_hosts,保存一些對全部用戶均可信賴的遠程主機的公鑰。github
SSH還提供了公鑰登陸,能夠省去輸入密碼的步驟。shell
(1)用戶本地生成密鑰對,一個私鑰一個公鑰。 (也能夠遠程生成一對,把私鑰下載到本地)
(2)登陸前,上傳本身的公鑰到服務器 .ssh/authorized_keys中,注意文件夾和文件的權限。
(3)客戶端向服務器發出請求,請求用你的密匙進行安全驗證;
(4)服務器收到請求以後,先在該服務器上尋找你的公鑰,而後把它和你發送過來的公用密匙進行比較。若是兩個密匙一致,服務器就用這個公鑰加密一個隨機字符串並把它發送給客戶端;
(5)本地收到後,使用私鑰進行解密,若是生成密鑰時,加了密碼,此時須要密碼,而後將解密後的字符串發送給服務端;
(6)遠程主機獲得的解密字符串與最初發送的一致,就證實用戶是可信的,直接容許登陸shell,再也不要求密碼。
這種方式的好處是其餘機器沒法仿冒真正的服務器,由於必須拿到客戶端的公鑰。這就要求用戶必須提供本身的公鑰。使用這種方法的步驟
:ubuntu
$ ssh-keygen $ ssh-keygen -b 1024 -t rsa -P '' -f ~/.ssh/id_rsa
參數說明:安全
-b:採用長度爲1024字節的公鑰/私鑰對,最長4096字節,通常1024或2048,rsa方式最短不能小於768字節長度。 -t:指定生成密鑰類型(rsa、dsa、ecdsa等),默認爲SSH-2 的rsa類型; -P:指定passphrase,用於確保私鑰的安全 -f:指定存放密鑰的文件
運行上面的命令之後,系統會出現一系列提示,能夠一路回車。其中有一個問題是,要不要對私鑰設置口令(passphrase),若是擔憂私鑰的安全,這裏能夠設置一個。運行結束之後,在$HOME/.ssh/目錄下,會新生成兩個文件:id_rsa.pub和id_rsa。前者是你的公鑰,後者是你的私鑰。服務器
再一次強調用戶本身的目錄(~/.ssh)必須不能有其餘人可寫的權限,不然ssh服務器會拒絕登陸。網絡
//~/.ssh 目錄的必須是700權限 $ chmod 700 ~/.ssh
// ~/.ssh/authorized_keys 必須是600權限,, 不然ssh服務器會拒絕用戶登錄 $ chmod 600 ~/.ssh/authorized_keys
$ scp -P 22 ~/.ssh/id_rsa.pub user@host:~/authorized_keys #可選參數-P $ ssh-copy-id user@host #此種方式簡單,不需追加改文件名,但不能指定端口號,默認以22端口 $ cat ~/.ssh/id_rsa.pub | ssh -p 22 user@host 'cat >> ~/.ssh/authorized_keys'
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
另外,請留意 root 用戶可否經過 SSH 登陸:
PermitRootLogin yes
當你完成所有設置,並以密鑰方式登陸成功後,再禁用密碼登陸:
PasswordAuthentication no
而後,重啓遠程主機的ssh服務。
// ubuntu系統 service ssh restart // debian系統 /etc/init.d/ssh restart
known_hosts, 首次登陸遠程主機時,確認後,遠程主機發來的公鑰(是固定的,不是隨機改變的,由於是公鑰,可公開),以後登陸就再也不須要確認了。authorized_keys, 遠程主機$HOME/.ssh/authorized_keys中,保存登陸用戶的公鑰。用於密鑰登陸(免密碼登陸)。公鑰就是一段字符串,只要把它追加在authorized_keys文件的末尾就好了。
這裏不使用上面的ssh-copy-id命令,改用下面的命令,解釋公鑰的保存過程:
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
這條命令由多個語句組成,依次分解開來看:
寫入authorized_keys文件後,公鑰登陸的設置就完成了。
5、config文件
ssh client有兩個配置文件,/etc/ssh/ssh_config和~/.ssh/config,前者是對全部用戶,後者是針對某個用戶,不存在能夠建立一個,兩個文件的格式是同樣的。
ssh默認使用~/.ssh/id_rsa這個密鑰,想使用指定密鑰的兩種方法:
Host server1 HostName server.com User username IdentifyFile path/to/id_rsa
使用 ssh server1。server1 就是個別名,能夠任意取名,不取也能夠
Host *github.com* User git IdentityFile ~/.ssh/id_rsa_github
示例: 有兩個github帳號,一臺電腦上都要訪問這兩個帳號,都使用ssh key認證方式
Host github-user1 HostName github.com User git IdentityFile ~/.ssh/id_rsa1 Host github-user2 HostName github.com User git IdentityFile ~/.ssh/id_rsa2
使用git clone時就用以下命令:
$ git clone github-user1:user1/repo.git $ git clone github-user2:user2/repo.git
指定哪一個用戶登陸哪一個主機,使用哪一個私鑰,權限 rw--r--r。 (ly:指定的是私鑰,因此用於公鑰/密鑰/免密碼登陸時。密碼登陸不須要私鑰。)
ssh_config和sshd_config都是ssh服務器的配置文件,兩者區別在於,前者是針對客戶端的配置文件,後者則是針對服務端的配置文件。兩個配置文件都容許你經過設置不一樣的選項來改變客戶端程序的運行方式。