經過ssh,能夠相對很安全的操做遠程服務器。使用的軟件包 openssh 是該協議的開源實現。php
虛擬機arch linux 執行: #sudo pacman -S openssh
linux
詳細說下這部分。 我操做的兩種認證過程: 用戶名+密碼認證和公鑰認證。算法
關於公鑰和密鑰: 他們是成對出現的,信息通過公鑰加密, 只有配對的密鑰才能解密。公鑰是能夠任意分發的,私鑰必須本身持有,確保本身能惟一解密信息。shell
訪問步驟:緩存
用戶第一次訪問遠程服務器的時候,服務器把本身 public key 發送到客戶端安全
客戶端用服務器的 public key 加密本身的密碼,併發送到服務器服務器
服務器用本身的 private key 解密信息。而後進行驗證信息是否有錯。
這個過程當中,只涉及到了服務器端的公私密鑰對。併發
優勢:密碼是安全的,由於只有服務器端的私鑰才能解密。這點比傳統的 telnet、ftp用的明文傳遞安全。ssh
缺點:不能避免中間人攻擊。把上述過程當中的服務器替換成攻擊者的服務器,流程也是沒有問題的。攻擊者欺騙客戶端,把本身的 public key發給客戶端。攻擊者再用本身的私鑰解密密碼,垂手可得的拿到客戶端的密碼。而後再僞裝成客戶端請求真正的服務器ide
這種方式用到了兩組密鑰對。客戶端和服務端都有本身的公私密鑰對。
提早準備:
將客戶端的公鑰上傳到服務器。(這步必須確保安全傳到正確的服務器,能夠用 usb、#ssh-copy-id user@host
命令)
服務器將該公鑰寫入到 ~/.ssh/authorized_keys
文件。該文件一行存放一個 public key。
訪問步驟:
客戶端請求訪問服務器
服務器生成一個會話用的公私密鑰對,並將會話公鑰用該客戶端對應的 public key 加密,返回給客戶端
客戶端用private key 解密會話公鑰。並用該會話公鑰加密發給服務器的信息
服務器用會話私鑰解密客戶端的信息
接下來的客戶端-服務器的通訊,都經過對方的公鑰加密信息,發給對方的消息,只有對方的私鑰能解密。這個過程涉及到了兩組公私密鑰對。
優勢:不須要使用密碼,提升了安全性。即便有中間人攻擊,中間人也沒法拿到客戶端的私鑰解密信息,也不能拿到會話私鑰解密服務端的消息。確保了信息安全。
具體涉及的命令:
生成密鑰對。xshell中能夠生成的密鑰對,只是公鑰格式好像有問題,不能直接使用。在虛擬機裏執行#ssh-keygen -t rsa
生成一組公私密鑰對,該指令默認生成 2048位的 rsa 算法類型的密鑰對。命令執行過程以下
Generating public/private rsa key pair. Enter file in which to save the key (/home/test/.ssh/id_rsa): /home/test/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/test/.ssh/id_rsa. Your public key has been saved in /home/test/.ssh/id_rsa.pub. The key fingerprint is: f2:75:41:ad:c7:4d:38:0c:d2:aa:d5:aa:9a:f5:84:86 test@hostname.com
第一步是提示輸入保存密鑰文件的路徑,輸入enter默認便可。(測試機生成過一次覆蓋便可)。
第二步提示提示輸入 passphrase,這個至關於給密鑰加了個密碼。建議在要求更加安全的狀況下使用, 通常輸入 enter 默認爲空便可。
id_rsa 文件保存的是私鑰, 公鑰的文件命名是private_key_filename.pub
。
生成完畢後,將公鑰copy到服務器~/.ssh/authorized_keys
。我是虛擬機,直接複製粘貼了 :),你也可使用命令:#cat yourpubkeyfile >> ~/.ssh/authorized_keys
客戶端是 xshell,經過 工具->用戶私鑰管理,導入該私鑰。便可創建對服務端的訪問。對於遠程服務器初次安裝 key 能夠經過 ssh-copy-id -i ~/.ssh/your_key root@remote_ip
命令,執行命令後會提示輸入密碼,輸入完畢後,便公鑰導入成功。
/etc/ssh/sshd_config
是ssh服務端配置文件/etc/ssh/ssh_config
是ssh客戶端的配置文件。 在個人環境中,使用xhell,使用不到這個文件。
/etc/ssh/sshd_config
中添加 AllowUsers userA userB
該指令限制僅userA、userB 能夠經過ssh鏈接。新添加用戶經過空格分隔,每次修改後 sudo systemctl restart sshd
重啓 sshd守護進程
~/.ssh/known_hosts
和 ~/.ssh/authorized_keys
分別是客戶端和服務端管理公鑰的文件。
服務端每增長一個客戶端的公鑰,都要寫入服務端的 ~/.ssh/authorized_keys
文件
客戶端也常常須要鏈接多個服務端,每一個服務端的host與對應的 public key關係保存在客戶端 know_hosts
他們的詳細格式請查閱手冊
#man sshd
;
當遠程主機IP變化、重裝系統等, 會致使known_hosts
緩存的信息失效,更新便可
Arch Linux Wiki:SSH 配置#.E8.BF.9E.E6.8E.A5.E5.88.B0.E6.9C.8D.E5.8A.A1.E5.99.A8)