SSH連接的建立方式
ssh可以通過密碼和密鑰(更加安全)這兩種方式建立起客戶端與 服務端的連接。
SSH連接的實現過程(假設通過密鑰的方式連接)
- 當客戶端發起一個ssh連接請求時,它首先會告訴服務端需要使用的公鑰;
- 然后服務端會檢查它的
~/authorized_keys
文件,這個文件中包含了所有已經保存的客戶端公鑰,一個公鑰占據一行,這些公鑰所對應的客戶端可以實現免驗證登錄。 - 服務端如果在文件中找到了請求客戶端所對應的公鑰,就會生成一個隨機字符串,並使用找到的公鑰進行加密。這個加密后的信息只能被請求客戶端的私鑰所解密,然后服務端將這個加密后的字符串發送給請求客戶端,以此來驗證該客戶端是否擁有私鑰。
- 客戶端收到來自服務端的加密字符串之后,會立即使用自己的私鑰進行解密,並將解密后的隨機字符串與之前協商好的會話id結合,生成一個md5加密的hash值,並回傳給服務端。
- 由於服務端已經知道加密之前的隨機字符串和會話id,因此,服務端會在本地將這個隨機字符串和會話id進行hash,然后和客戶端傳過來的值進行比較,如果一致,則表示請求客戶端確實擁有私鑰,並允許建立連接。
生成SSH密碼對
有幾種加密算法可以用來生成SSH密鑰,例如RSA、DSA、ECDSA,默認情況下使用RSA加密算法。
使用如下命令可以生成一個默認的密鑰:
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):
這里可以指定密鑰文件的保存位置。默認是~/.ssh/id_rsa
。
點擊enter
進入下一步:
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
這里可以指定密鑰的密碼短語,即在密碼之上再加一層密碼驗證,增強密鑰的安全性。
點擊enter
進入下一步:
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:
8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| + |
| o S . |
| o . * + |
| o + = O . |
| + = = + |
| ....Eo+ |
+-----------------+
這時,你的密鑰對就算生成成功了。生成的文件如下:
~/.ssh/id_rsa
:存放你的私鑰。只能你自己知道。~/.ssh/id_rsa.pub
:存放你的公鑰,可以讓其他人知道。
使用更長的位數生成你的密鑰對
默認情況下,ssh-keyken使用2048的位長度生成密鑰對。這一默認值大多數場合已經足夠安全,但是,我們在某些特殊場景下仍然可以使用更大的位長度來增強我們服務器的安全性。
為了做到這一點,我們可以使用-b
參數來指定我們需要的位長度。
比如:
$ ssh-keygen -b 4096
如果你之前已經生成過一個密鑰對,那么這里會提示你是否需要覆蓋你之前的鍵:
Overrite(Y/n)?
如果你選擇是,那你之前的文件會被覆寫,導致你再也無法使用之前的密鑰登錄到之前的服務器,因此,一定要小心之前的密鑰是否需要保留。
移除或者修改私鑰的密碼短語(passphase)
如果你已經為你的私鑰指定了一個密碼短語,該怎么修改或者直接刪除這個密碼短語呢?
為了修改或移除密碼短語,你必須知道原來的密碼短語。如果你忘記了原來的密碼短語,你將無法再次使用該密鑰,必須重新生成新的密鑰。
通過下面的命令:
$ ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
你可以指定密鑰的位置,或者直接按Enter
接受默認的位置。
Enter old passphrase:
輸入你希望修改的舊密碼,然后你會被提示輸入一個新的密碼短語:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
至此,輸入你的新密碼短語或者按Enter
來移除密碼短語。
展示SSH密鑰的手印(Fingerprint)
每個SSH密鑰對共享一個密碼形式的“手印”,它可以被用來唯一標識密鑰對。這在有些情況下會很有用。
為了查看現有的密鑰對,你可以執行:
$ ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):
你可以直接按Enter
選擇默認的密鑰的位置,或者輸入你期望的位置。之后你會得到包含了密鑰的位長、手印和帳號以及所選主機和使用的算法的字符串:
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)
使用SSH-Copy-ID復制公鑰到服務器
通過將你的公鑰復制到服務器,可以讓你不用輸入密碼就可以通過認證,有很多方法可以實現這一點。
如果你當前有一個基於密碼的SSH遠程服務器訪問方式,並且你已經安裝了ssh-copy-id工具,那么你就可以很容易的實現這一點。而且ssh-copy-id已經預裝到了大多數的linux發行版中。
通過下面的命令可以實現這一點:
$ ssh-copy-id username@remote_host
隨后會提示你輸入當前用戶在遠程服務器上的密碼,正確輸入之后,你本地的公鑰就會被添加到服務器用戶的~/.ssh/authorized_keys
文件中,之后,你就可以不用輸入密碼也能登錄到遠程服務器了。
不通過ssh-copy-id命令將公鑰添加到遠程服務器
如果你沒有安裝ssh-copy-id命令行工具,那你應該怎么樣將你的公鑰上傳到遠程服務器呢?通過linux中的管道命令,我們可以實現這一點。
$ cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && ~/.ssh/authorized_keys"
隨后根據提示輸入遠程主機的用戶名密碼:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
demo@111.111.11.111's password:
如果添加成功,你之后的登錄將無需再次輸入密碼,而是簡單的通過如下命令:
$ ssh username@remote_ip_host
手動將你的密鑰復制到服務器
如果你沒有可用的基於密碼訪問的SSH連接,你將必須手動將你的公鑰復制到遠程服務器。
打開你的本地終端,輸入下面的命令:
$ cat ~/.ssh/id_rsa.pub
將輸出到屏幕上的公鑰復制到剪貼板,然后通過工具(一般是服務器供應商提供的web面板)連接到遠程服務器,並在遠程服務器的~/.ssh/
(如果不存在就新建)目錄下面創建authorized_keys
文件。最后將你復制的公鑰粘貼到該文件中,並保存。
基本的連接指令
接下來是針對SSH中一些比較常用的命令做個說明。
連接到指定的遠程服務器
$ ssh remote_host
這個命令會假設你當前機器的本地用戶名和遠程服務器上的用戶名是一致的。如果不一致,請使用下面的命令。
$ ssh username@remote_host
這個命令會假設你要連接的遠程服務器的端口號是22(ssh默認的端口號)。如果不是,請使用-p your_port
指定你的自定義端口號。
如果服務器正常開啟了ssh服務以及對應的監聽端口,那么你會看到如下信息:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
輸入"yes"即可接受來自遠程服務器的驗證。
如果你使用了密碼驗證,那么你會被要求輸入密碼,如果你使用了公鑰免登錄,且設置了密碼短語,那么你將同樣被要求輸入密碼短語,否則,你將自動登錄成功。
在遠程服務器上執行單次命令
如果你只是想在遠程服務器上執行單個命令,並不想開啟一次遠程會話。那么你可以通過下面的命令來完成:
$ ssh username@remote_host commander_to_run
這個命令會在連接上遠程服務器之后立即執行后面的命令,隨后便會關閉連接。
使用配置文件簡化連接輸入
在~/.ssh
目錄下新建config
文件(如果不存在的話),並輸入如下內容:
Host remote_aliss # 遠程主機別名
HostName remote_host #遠程主機
Port port_num # 端口號
User your_user # 登錄用戶
IdentityFile ~/.ssh/id_rsa # 要使用的密鑰
配置完成之后,之后的連接只需要通過輸入如下命令即可:
$ ssh remote_alias
使用SSH Agent保存密碼短語,避免重復輸入
如果你對密鑰使用了密碼短語進行加密,那么你在每次建立SSH連接會話之前都會要求輸入密碼短語,為了簡化連接過程,避免每次都要重復輸入,你可以使用SSH Agent來保存你的密碼短語。