SSH-遠程登陸

SSH是一種網絡協議,用於計算機之間的加密登陸。javascript

1、客戶端登陸基本用法
$ ssh user@host (能夠在config中配置,使用 ssh 別名,不須要用戶名和主機ip. config配置見五)
$ ssh host    若是本地用戶名與遠程用戶名一致,登陸時能夠省略用戶名

SSH的默認端口是22,登陸請求會送進遠程主機的22端口,使用p參數,能夠修改這個端口。html

$ ssh -p 2222 user@host
2、口令登陸(密碼登陸)--使用遠程主機公鑰加密密碼,遠程私鑰解密
過程:
(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

3、公鑰登陸(密鑰登陸)--本地使用私鑰加密遠程主機發送的隨機字符

SSH還提供了公鑰登陸,能夠省去輸入密碼的步驟。shell

過程:
(1)用戶本地生成密鑰對,一個私鑰一個公鑰。 (也能夠遠程生成一對,把私鑰下載到本地)
(2)登陸前,上傳本身的公鑰到服務器 .ssh/authorized_keys中,注意文件夾和文件的權限。
(3)客戶端向服務器發出請求,請求用你的密匙進行安全驗證;
(4)服務器收到請求以後,先在該服務器上尋找你的公鑰,而後把它和你發送過來的公用密匙進行比較。若是兩個密匙一致,服務器就用這個公鑰加密一個隨機字符串並把它發送給客戶端;
(5)本地收到後,使用私鑰進行解密,若是生成密鑰時,加了密碼,此時須要密碼,而後將解密後的字符串發送給服務端;
(6)遠程主機獲得的解密字符串與最初發送的一致,就證實用戶是可信的,直接容許登陸shell,再也不要求密碼。

這種方式的好處是其餘機器沒法仿冒真正的服務器,由於必須拿到客戶端的公鑰。這就要求用戶必須提供本身的公鑰。使用這種方法的步驟ubuntu

1.若是沒有,能夠直接用ssh-keygen生成一個,ssh-keygen是用於生產密鑰的工具:
$ 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。前者是你的公鑰,後者是你的私鑰。服務器

2.最關鍵的是要留意遠程服務器上的文件和目錄的權限問題

再一次強調用戶本身的目錄(~/.ssh)必須不能有其餘人可寫的權限,不然ssh服務器會拒絕登陸。網絡

//~/.ssh 目錄的必須是700權限
$ chmod 700 ~/.ssh
// ~/.ssh/authorized_keys 必須是600權限,, 不然ssh服務器會拒絕用戶登錄
$ chmod 600 ~/.ssh/authorized_keys
3.將公鑰傳送到遠程主機host上面的3種方法:
$ 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'
4.若是鏈接不成功,打開遠程主機的/etc/ssh/sshd_config這個文件,打開密鑰登陸功能。檢查下面幾行前面"#"註釋是否取掉。
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
4、known_hosts、authorized_keys文件
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

這條命令由多個語句組成,依次分解開來看:

  1. "$ ssh user@host",表示登陸遠程主機;
  2. 單引號中的mkdir .ssh && cat >> .ssh/authorized_keys,表示登陸後在遠程shell上執行的命令:
  3. "$ mkdir -p .ssh"的做用是,若是用戶主目錄中的.ssh目錄不存在,就建立一個;
  4. 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub的做用是,將本地的公鑰文件~/.ssh/id_rsa.pub,重定向追加到遠程文件authorized_keys的末尾。

寫入authorized_keys文件後,公鑰登陸的設置就完成了。

5、config文件

ssh client有兩個配置文件,/etc/ssh/ssh_config和~/.ssh/config,前者是對全部用戶,後者是針對某個用戶,不存在能夠建立一個,兩個文件的格式是同樣的。

ssh默認使用~/.ssh/id_rsa這個密鑰,想使用指定密鑰的兩種方法:

1.ssh -i path/to/id_rsa username@server.com
2.能夠在~/.ssh/config中配置IdentifyFile,同時也能夠配置用戶名、服務器地址
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:指定的是私鑰,因此用於公鑰/密鑰/免密碼登陸時。密碼登陸不須要私鑰。)

6、ssh配置文件ssh_config和sshd_config區別(參考:www.cnblogs.com/xiaochina/p/5802008.html

ssh_config和sshd_config都是ssh服務器的配置文件,兩者區別在於,前者是針對客戶端的配置文件,後者則是針對服務端的配置文件。兩個配置文件都容許你經過設置不一樣的選項來改變客戶端程序的運行方式。

相關文章
相關標籤/搜索