一、SSH 原理圖
二、SSH 原理描述
2.1:什么是SSH
SSH是專門為了遠程登錄會話和其他網絡服務提供的安全性協議,使用SSH協議可以有效的防止遠程連接會話的時候出現信息泄密,在數據傳輸的時候SSH會先對聯機的數據包通過加密技術進行加密處理,加密后在進行數據的傳輸,確保了傳輸中的安全性,SSH服務主要提供兩個服務功能:一個是遠程聯機的SSH服務,一個是借助SSH協議來傳輸數據的SFTP服務
2.2:SSH原理闡述
① 服務端開啟ssh服務監聽22端口
② 客戶端發送聯機請求(攜帶IP和端口)
③ 客戶端服務端進行聯機加密認證
④ 認證通過聯機成功
2.3:SSH的兩種認證方式
① 基於密碼口令的認證
② 基於秘鑰的安全認證
2.4:SSH認證類型闡述
基於密碼口令的方式:
基於密碼的安全認證就是我們一直在用的,只要知道服務器的SSH連接賬號和密碼(當然也要知道服務器的IP和端口(默認22)),就可以通過客戶端遠程登錄到主機了,所以的傳輸過程都是加密的
基於秘鑰的安全認證:
① 運行SSH服務,生成密鑰對
② 客戶端發送公鑰到服務端(通過ssh-copy-id或者其他的方式)
③ 客戶端發送連接請求
④ 服務端進行對密鑰的驗證
⑤ 驗證成功服務端將用公鑰加密質詢,發送給客戶端
⑥ 客戶端用自己的私鑰解密質詢
⑦ 客戶端將解密后的質詢發送給服務端
⑧ 服務端驗證質詢
⑨ 驗證通過,建立連接
2.5:SSH聯機加密過程原理闡述
① SSH服務端先生成一個1024-bit的公鑰
② 客戶端發送請求
③ 服務端把公鑰發給客戶端
④ 客戶端生成256-bit的私鑰,並且和服務端發過來的公鑰進行整合
⑤ 客戶端把整合的秘鑰對發給服務端
⑥ 使用秘鑰對進行聯機
PS:SSH2版本中為了修補SSH1中不驗證整合秘鑰對的漏洞,加入了一個確認聯機正確性的Diffie-Hellman機制(每次聯機都會進行秘鑰對的校驗)
三、SSH 搭建部署
安裝ssh服務 yum -y install openssh openssl 啟動服務 systemctl start sshd 配置文件 tree /etc/ssh/ /etc/ssh/ ├── moduli ├── ssh_config 客戶端配置文件 ├── sshd_config 服務端配置文件 ├── ssh_host_ecdsa_key ├── ssh_host_ecdsa_key.pub ├── ssh_host_ed25519_key ├── ssh_host_ed25519_key.pub ├── ssh_host_rsa_key └── ssh_host_rsa_key.pub 使用 基於密碼的連接 ssh root@192.168.163.129 也可以之家連接執行命令 ssh root@192.168.163.130 ifconfig ens33
四、SSH 企業級優化
在SSH 配置文件中有很多項是可以做優化的 vim /etc/sshd_config Port #默認22端口,修改其他端口 ListenAddress # 指定特定的監聽地址 PermitEmptyPasswords # 是否允許密碼為空的用戶遠程登錄,默認為no PermitRootLogin # 是否允許root登錄,默認yes,改為no安全些 UseDNS # dns解析,默認yes 要改為no 提高速度 GSSAPIAuthentication # 解決linux之間使用遠程連接慢的問題 快速更改優化方法使用sed命令 \cp /etc/ssh/sshd_config{,.bak} sed -i 's%#Port 22%Port 56666%' /etc/ssh/sshd_config sed -i 's%#PermitEmptyPasswords no%PermitEmptyPasswords no%' /etc/ssh/sshd_config sed -i 's%#PermitRootLogin yes%PermitRootLogin no%' /etc/ssh/sshd_config sed -i 's%#UseDNS yes%UseDNS no%' /etc/ssh/sshd_config sed -i 's%GSSAPIAuthentication yes%GSSAPIAuthentication no%' /etc/ssh/sshd_config a=$(ifconfig | awk -F [" ":]+ 'NR==2{print $3}') | sed -i 's%#ListenAddress 0.0.0.0%ListenAddress '$a' %' /etc/ssh/sshd_config egrep "UseDNS|GSSAPIAuthentication|PermitRootLogin|PermitEmptyPasswords|ListenAddress|Port" /etc/ssh/sshd_config 一條命令搞定 a=$(ifconfig | awk -F [" ":]+ 'NR==2{print $3}') | sed -ir '13 iPort 56666\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no\nListenAddress '$a'' /etc/ssh/sshd_config 重啟服務 systemctl restart sshd
五、SSH 擴展(非交互式功能)
5.1:expect
5.2:sshpass
5.3:pssh
六、SSH 總結
① SSH是安全加密協議,用於遠程連接linux服務器
② SSH默認端口是22,安全協議版本是SSH2,除了SSH2還有SSH1,但是1有漏洞
③ SSH服務端只要包含兩個服務,一個是SSH一個是SFTP
④ Linux SSH 客戶端包含ssh遠程連接命令,以及遠程scp命令等
⑤ SSH配置文件的優化很重要,可以提高服務器的安全性,也可以提高遠程連接的速度
七、SSH 錯誤及解決辦法
首先、確保server端的ssh服務是開的(service shhd start) 然后在client端輸入: ssh usrname@serverip (遠程登錄) scp filename usrname@serverip:/URL (遠程傳輸) 常出現的問題: 問題一 ssh登錄的時候鏈接端口失敗 提示(1): # ssh 192.168.***.** ssh: connect to host 192.168.***.** port 22: No route to host 這由於server端沒有開機或是網絡不通(這個原因很多,最簡單的是網線沒有插。還有就是可能會是網卡down了等)如果是網卡down了ifup相應的網卡再試試 提示(2): # ssh zhou@192.168.***.** ssh: connect to host 192.168.***.** port 22: Connection refused 這是由於對方server的ssh服務沒有開。這個server端開啟服務即可。 如何開啟ssh服務呢? 首先確保要登錄的主機安裝了openssh-client(ubuntu有默認安裝,如果沒有則sudo apt-get install openssh-client),如果要使本機開放SSH服務就需要安裝 openssh-server sudo apt-get install openssh-server 然后確認sshserver是否啟動了: ps -e |grep ssh 如果看到sshd那說明ssh-server已經啟動了。 如果沒有則可以這樣啟動:sudo /etc/init.d/ssh start ssh-server配置文件位於/ etc/ssh/sshd_config,在這里可以定義SSH的服務端口,默認端口是22,你可以自己定義成其他端口號,如222。 然后重啟SSH服務: sudo /etc/init.d/ssh stop sudo /etc/init.d/ssh start 然后使用以下方式登陸SSH: ssh zhou@192.168.***.** zhou為192.168.***.**機器上的用戶,需要輸入密碼。 斷開連接:exit 問題二、 ssh到server上的時候密碼是對的但是報如下信息: # ssh 192.168.***.** root@192.168.***.**'s password: Permission denied, please try again. 這個是由於如果不輸入用戶名的時候默認的是root用戶,但是安全期間ssh服務默認沒有開root用戶的ssh權限 解決方法: 要修改root的ssh權限,即修改 /etc/ssh/sshd_config文件中 PermitRootLogin no 改為 PermitRootLogin yes 問題三 登錄是出現如下提示: ssh root@192.168.***.** @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is 76:fb:b3:70:14:48:19:d6:29:f9:ba:42:46:be:fb:77. Please contact your system administrator. Add correct host key in /home/fante/.ssh/known_hosts to get rid of this message. Offending key in /home/fante/.ssh/known_hosts:68 RSA host key for 192.168.***.** has changed and you have requested strict checking. Host key verification failed. server端密碼或是其他發生改變的時候。 解決方法一般就需要刪除~/.ssh/known_hosts的東西,然后再登錄即可。