超詳細的ssh(secure shell)服務介紹、搭建、配置、實戰講解 —— 超級乾貨!


這裏是一段防爬蟲文本,請讀者忽略。
本文原創首發於CSDN,作者IDYS
博客首頁:https://blog.csdn.net/weixin_41633902/
本文鏈接:https://blog.csdn.net/weixin_41633902/article/details/105821625


- 寫在開頭的話

  • 請記住:實踐是掌握知識的最快方法
  • 如果你只是懷着看看的態度去快速瀏覽文章,而不去認認真真的把文章裏面講的任何一個知識點去實踐一遍,那麼你永遠也掌握不了它
  • 生命不息,折騰不止!

ssh的基本概念

  • ssh是secure shell的縮寫,是一個建立在應用層上的遠程安全管理協議
  • ssh是目前較爲可靠的傳輸協議,專爲遠程登錄會話和其它網絡服務提供安全性。利用ssh協議可以有效防止遠程管理過程中的信息泄露問題
  • ssh可用於大多數UNIX和類UNIX操作系統中,能夠實現字符界面的遠程登錄管理,它默認使用22端口,採用密文的形式在網絡中傳輸數據,相對於通過明文傳輸的Telnet協議,具有更高的安全性

telnet遠程終端協議傳輸的數據以明文方式傳輸,會被抓包軟件抓取到數據


ssh的登錄驗證模式

ssh 提供了基於賬戶密碼(口令)和密鑰對兩種登錄驗證方式,這兩者都是通過密文傳輸數據的


賬戶密碼驗證

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-e9QihQFT-1588124768907)(.\images\picture.jpg)]

格式

windows遠程登錄Linux主機一般使用第三方工具,比如Xshell、secureCRT、putty


密鑰對驗證

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-06fUUP5K-1588124768910)(.\images\picture02.jpg)]

  1. 首先需要在 Client 上創建一對密鑰,並且需要把公鑰放在需要訪問的 Server 上

  2. 當 Client 需要連接 Server 時,Client 端的軟件就會向 Server 端發出登錄請求,請求使用密鑰對中的的公鑰 進行安全驗證

  3. Server 收到請求之後,會在該用戶的家目錄下查詢公鑰文件,拿 Client 發送過來的公鑰和自己家目錄下的公鑰 進行比較

  4. 如果兩個公鑰一致,Server 就用公鑰加密“challenge(質疑)”,並把它發送給 Client 軟件。Client 收到加 密內容之後,使用本地的私鑰進行解密,再把解密結果發送給 Server 端,Server 端驗證成功後,允許登錄

注意:若第3個步驟對比結果失敗,則 Server 端會通知 Client 端此公鑰未在本機註冊,無法驗證登錄

在這裏插入圖片描述


ssh(secure shell)的服務搭建

Linux服務器的建立(VMware克隆形式)

  1. 搭建三臺Linux服務器,本次實驗採用的是三臺機器均爲CentOS6.10,第一臺Linux服務器採用VMware搭建的方式,後兩臺採用VMware克隆的形式。VMware安裝Linux就不過多贅述了。這裏主要講一下克隆的方式
  • 點擊[管理],然後點擊[克隆]

在這裏插入圖片描述

  • 之後點擊[鏈接克隆](因爲這樣節省硬盤空間)

  • 選擇[虛擬機設置]

在這裏插入圖片描述

  • 選擇[高級]

在這裏插入圖片描述

  • 點擊[生成]

在這裏插入圖片描述

  • 打開克隆機

  • 修改 /etc/udev/rules.d/70-persistent-net.rules文件

  • 註釋掉第8行的這個內容SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ec:96:c2", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"  (你裏面的參數可能和我不一樣,但是開頭都是以subsystem開頭的),然後再將第11行的NAME="eth1"改爲NAME="eth0",最後修改結果如下

     1  # This file was automatically generated by the /lib/udev/write_net_rules
     2  # program, run by the persistent-net-generator.rules rules file.
     3  #
     4  # You can modify it, as long as you keep each rule on a single
     5  # line, and change only the value of the NAME= key.
     6
     7  # PCI device 0x8086:0x100f (e1000)
     8  # SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ec:96:c2", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
     9
    10  # PCI device 0x8086:0x100f (e1000)
    11  SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:50:56:32:e0:eb", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
  • 註釋圖如下

在這裏插入圖片描述

  • 修改/etc/sysconfig/network-scripts/ifcfg-eth0的內容。將UUID註釋掉,將硬件地址HWADDR註釋掉,ONBOOT(開機啓動網卡選項)改爲yes,剩下如果你想把網絡改爲靜態方式的話。做這個修改BOOTPROTO=static
  • 然後再配置ip地址,網關,子網掩碼,DNS

注意你修改的網絡必須和你VMware虛擬機設置的網絡在同一網段內,否則將無法連通互聯網。甚至都不能和你的物理機連通

  • 我的配置如下
[root@IDYS_02 ~]#  cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
TYPE=Ethernet
# UUID=f2b1fb29-c49e-419c-bea2-5b1887463266
# 啓動開機自啓動網絡
ONBOOT=yes
NM_CONTROLLED=yes
# 靜態方式
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"
# HWADDR=00:0C:21:EC:36:C2
PEERDNS=yes
PEERROUTES=yes
#網段必須在虛擬機設置的網段內,網關也必須是和你虛擬機設置的網關相同
IPADDR=192.168.200.137
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
DNS1=114.114.114.114
DNS2=8.8.8.8
  • 之後再重啓,重啓完成後你可以看到你的網卡配置正常,這時你便可以連通互聯網了
# 重啓命令
shutdown -r now
# -r 代表reboot的意思

ssh(secure shell)服務的搭建

安全防護的關閉

  1. 爲了方便確認,我先修改主機名
  • 三臺Linux的主機名分別爲,dayuanshuai,IDYS_01,IDYS_02

  • 臨時修改主機名的方法:

    • hostname 主機名
# 如:
hostname IDYS_01
  • 永久修改主機名的方法:
    • 編輯/etc/sysconfig/network文件,修改如下
NETWORKING=yes
HOSTNAME=IDYS_01 #此處將主機名修改爲你要想修改的主機名即可
  1. 關閉安全措施(因爲我採用的是實驗環境,所以才關閉安全措施)
  • 首先查看防火牆狀態
[root@IDYS_01 ~]# service iptables status
iptables: Firewall is not running.
  • 然後查看SELinux的狀態
# 可以看大SELinux處於開啓狀態
[root@IDYS_01 ~]# getenforce 
Enforcing
  • 臨時關閉防火牆和SELinux的方法
# 關閉防火牆服務
[root@IDYS_01 ~]# service  iptables stop
# 關閉SELinux
[root@IDYS_01 ~]# setenforce 0
  • 永久關閉防火牆的方法
# 永久關閉防火牆
[root@IDYS_01 ~]# chkconfig iptables off

# 查看防火牆處於各個模式的開啓狀態
[root@IDYS_01 ~]# chkconfig --list iptables
iptables        0:off   1:off   2:off   3:off   4:off   5:off   6:off
  • 永久關閉SElinux的方法
    • 編輯/etc/selinux/config文件,將第七行的SELINUX=enforcing改爲SELINUX=disabled
    • 可以直接通過vim修改。也可以通過如下方式修改
sed -i '7s/enforcing/disabled/' /etc/selinux/config

永久修改的方式,重啓即是生效

  • 擴展知識:
    • iptables -L 查看防火牆規則

Linux上用戶名密碼登錄ssh服務器端

查看是否安裝openssh安裝包
  • 一般來說Linux安裝時,openssh服務器端程序即會自動安裝,但是不會安裝openssh客戶端程序
# 查看安裝的openssh安裝包,可以看到沒有安裝ssh客戶端,只有服務器端
[root@IDYS_01 selinux]#  rpm -qa | grep openssh
openssh-5.3p1-123.el6_9.x86_64
openssh-server-5.3p1-123.el6_9.x86_64
  • 查看可以安裝的openssh安裝包
[root@IDYS_02 ~]# yum list | grep openssh
openssh.x86_64                             5.3p1-124.el6_10              @updates
openssh-server.x86_64                      5.3p1-124.el6_10              @updates
openssh-askpass.x86_64                     5.3p1-124.el6_10              updates
openssh-clients.x86_64                     5.3p1-124.el6_10              updates
openssh-ldap.x86_64                        5.3p1-124.el6_10              updates
  • 安裝ssh客戶端
[root@IDYS_02 ~]# yum -y install openssh-clients
  • 查看是否安裝成功
# 此時可以看到ssh客戶端安裝成功
[root@IDYS_02 ~]# rpm -qa | grep openssh
openssh-server-5.3p1-124.el6_10.x86_64
openssh-5.3p1-124.el6_10.x86_64
openssh-clients-5.3p1-124.el6_10.x86_64
  • 擴展知識:卸載命令
    • rpm -e 全名安裝包
    • yum -remove 安裝包名稱

Linux上用戶名密碼登錄ssh服務器端
  • 格式:
    • ssh 用戶名@IP地址
  • 連接過程中,服務器端會要求客戶端接收服務器端的公鑰,以便傳輸服務器端的密碼時採用服務器端的公鑰加密,這樣就保證了安全性
[root@dayuanshuai ~]# ssh [email protected]
The authenticity of host '192.168.200.136 (192.168.200.136)' can't be established.
# 接收服務器端的公鑰
RSA key fingerprint is 21:09:71:ce:3c:a0:19:8e:84:f9:c9:03:8f:f2:74:b9.
# 詢問是否確定想要連接? 輸入 yes即可
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.200.136' (RSA) to the list of known hosts.
[email protected]'s password: 
Last login: Tue Apr 28 23:00:52 2020 from 192.168.200.1
# 登錄成功

Linux 主機之間的密鑰對登錄驗證
  1. 客戶端生成密鑰對文件
  • ssh-keygen -t [ rsa | dsa ] -b 密鑰對長度
    • -t 指定加密類型(rsa/dsa等)
    • -b 指定密鑰對加密長度
  • 詢問1:執行過程中會詢問保存位置,一般默認保存在當前用戶家目錄下的.ssh/目錄下
  • 詢問2:是否對密鑰文件進行加密
    • 加密:若加密,則在調用密鑰文件時需要先驗證密鑰的密碼,密碼正確才能使用密鑰文件
    • 不加密:若不加密,則密鑰文件可以直接被調用,整個登錄驗證過程無需輸入任何密碼,即爲免密登錄
  • 這裏執行的命令爲ssh-keygen -t rsa -b 2048
    • 說明:因爲rsa加密算法1024長度的密鑰,已經可以在短時間通過暴力破解方式破譯算法,所以本次採用2048位長度
[root@IDYS_01 ~]# ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
# 詢問將密鑰對文件放在什麼地方,默認放在家目錄的 .ssh/目錄下,此處直接敲擊回車
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.

# 詢問對密鑰文件的加密密碼是,敲擊回車,代表不設置私鑰文件的加密密碼
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
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:
cb:24:8f:31:b1:b6:b8:10:5f:d9:a2:01:39:49:d3:aa root@IDYS_01
The key's randomart image is:
+--[ RSA 2048]----+
|o+.              |
|.o..             |
|o ..             |
|..   +           |
|+   = = S        |
|E+ o o O .       |
|. o o . +        |
| . o .  +        |
|  o..            |
+-----------------+
  1. 將公鑰文件上傳至服務器端
  • 格式:
    • ssh-copy-id 用戶名@服務器IP地址
    • 該用戶名和要用來登錄服務器的用戶名一致
# 將公鑰傳送到服務器端,實現免密登錄
[root@IDYS_01 ~]# ssh-copy-id [email protected]
The authenticity of host '192.168.200.137 (192.168.200.137)' can't be established.
RSA key fingerprint is 24:09:71:ce:3c:a0:19:4e:84:f9:c9:03:8f:f2:74:b9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.200.137' (RSA) to the list of known hosts.
 
[email protected]'s password: 
Now try logging into the machine, with "ssh '[email protected]'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

# 查看客戶端公鑰
[root@IDYS_01 .ssh]# cat ~/.ssh/id_rsa.pub 
ssh-rsa ************************************************************************************************************************************************************************************************************************************Yv0w== root@IDYS_01

# 查看服務器端存儲的驗證密鑰
[root@IDYS_02 .ssh]# cat ~/.ssh/authorized_keys 
ssh-rsa **************************************************************************************************************************************************************************************************************************************************************************************************************************Yv0w== root@IDYS_01

  1. 客戶端嘗試登錄服務器
  • ssh 用戶名@服務器IP地址
    • 密鑰對驗證優先級大於賬戶密碼驗證
# 因爲客戶端的id_rsa.pub和服務器端的authorized_keys一樣,所以客戶端能實現免密登錄服務器端,下面爲免密登錄成功的過程
[root@IDYS_01 .ssh]# ssh [email protected]
Last login: Tue Apr 28 23:59:51 2020 from 192.168.200.136

Windows使用密鑰對登錄Linux
  • 使用Xshell自帶的密鑰對生成嚮導生成密鑰對

  • 選擇[工具] -> [新建用戶密鑰生成嚮導]

在這裏插入圖片描述

  • 選擇密鑰類型爲RSA,密鑰長度爲2048

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-jIaOpvV9-1588124768923)(.\images\picture10.png)]

  • 然後選擇下一步,下一步,最後選擇完成

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-KiuUP6bo-1588124768924)(.\images\picture11.png)]

  • 選擇工具,然後點擊用戶密鑰管理者選項

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WfyQSMYr-1588124768925)(.\images\picture12.png)]

  • 選擇【屬性】

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-1PVi1D7V-1588124768926)(.\images\picture13.png)]

  • 選擇【公鑰】,然後將公鑰內容複製

在這裏插入圖片描述

  • 進入服務端的~/.ssh/目錄下,創建authorized_keys文件,然後編輯文件將公鑰複製進去,操作如下,最後設置權限爲600
[root@dayuanshuai .ssh]# touch authorized_keys
[root@dayuanshuai .ssh]# vim authorized_keys 
********************************************************************************************************************************************************************************************************************************************************== rsa 2048-042820
[root@dayuanshuai .ssh]# chmod 600 authorized_keys

ssh(secure shell)服務的配置文件說明

禁止使用密碼登錄

  • 當我們學會了使用密鑰對進行驗證後,建議生產環境下將賬戶密碼登錄功能關掉
  • 配置文件:/etc/ssh/sshd_config
    • /etc/ssh/ssh_config爲客戶端配置文件
    • /etc/ssh/sshd_config爲服務器端配置文件
  • 選項:
    • PasswordAuthentication no

注意:ssh的配置文件中,並不是註釋掉的就是不生效的,有些是默認生效,需要修改時一定要取消註釋再修改


禁止使用 root 遠程登錄

  • root 在系統中是一個可以爲所欲爲的角色,我們可以在平時的操作中用普通用戶操作,在有需要修改一些系統設置的 時候再從普通用戶切換到 root 用戶,這樣可以最大限度的避免因爲誤操作而對系統造成破壞,同時也可以避免黑客在 暴力破解後直接使用 root 用戶登錄系統,一般在遠程登錄管理上我們會禁止直接使用 root 用戶登錄
  • 配置文件:/etc/ssh/sshd_config
    • 選項:
    • PermitRootLogin no

修改默認端口、限制 ssh 監聽 IP

修改默認端口
  • ssh 作爲一個用來遠程管理服務器的工具,需要特別的安全,默認情況下使用TCP的22端口,若不進行 修改,很容易被利用遭到攻擊,所以我們一般都會修改端口,儘量修改一個高位端口(範圍1-65535)
  • 配置文件
    • /etc/ssh/sshd_config
    • 選項:
    • Port 59527
    • ssh -p 端口 用戶名@服務器IP
# 如果端口號變了 xshell登錄的命令可爲
					(此選項爲ssh目錄端監聽的端口號)
ssh [email protected] 54321
  • 查看已經開啓的服務中的端口
[root@dayuanshuai .ssh]#  netstat -antp
限制ssh監聽IP:
  • 有些服務器則安全級別更高一些,不允許使用外網直接登錄,只有通過局域網才能登錄,我們可以在 機房裏設置其中一臺能夠被外網遠程連接,其他的主機都通過這個機器進行遠程連接即可
  • 配置文件:
    • /etc/ssh/sshd_config
  • 選項:
    • ListenAddress 192.168.88.100

簡單來說就是服務器端設置自己監聽的ip地址,遠程想通過ssh服務連接該主機,就必須是連接的該IP才行

# 修改配置文件
[root@dayuanshuai .ssh]# vim /etc/ssh/sshd_config 
ListenAddress 192.168.200.20

# 設置虛擬網卡爲192.168.200.20,以後ssh客戶端只能連接192.168.200.20 這個IP才能連接ssh服務器端
[root@dayuanshuai .ssh]# ifconfig eth0:0 192.168.200.20

ssh服務相關命令

scp:安全的遠程文件複製命令

  • scp是secure copy的簡寫,用於在Linux下進行遠程拷貝文件的命令,類似於命令有cp,scp傳輸是加密的,所以可能 會稍微影響一點速度。另外,scp還非常不佔資源,不會提高多少系統負荷
  • 格式:
  • scp 本地文件 用戶名@服務器IP:目錄

注意:如果要使用scp命令進行復制的話,客戶端和服務器端都應該安裝上openssh-clients 安裝包,不然會報錯。

  • 報錯如下:
[root@IDYS_01 ~]# scp /tmp/test.txt [email protected]:/tmp/
bash: scp: command not found
lost connection
  • 這個時候連接上服務器端,安裝上openssh-clients服務,然後重啓ssh服務,最後退回客戶端,然後再次使用scp實現複製就成功了.
# 連接上服務器端
[root@IDYS_01 ~]# ssh [email protected]
Last login: Wed Apr 29 03:40:09 2020 from 192.168.200.136

# 在服務器端安裝上opensssh-client這個安裝包
[root@IDYS_02 ~]# yum -y install openssh-clients

# 重啓ssh服務
[root@IDYS_02 ~]# service sshd restart

# 退出到客戶端
[root@IDYS_02 ~]# exit
logout

# 再次使用scp複製
[root@IDYS_01 ~]# scp /tmp/test.txt [email protected]:/tmp/

# 刪除文件
[root@IDYS_01 tmp]# rm test.txt 

# 再從遠程服務器端複製到本地
[root@IDYS_01 tmp]# scp [email protected]:/tmp/test.txt /tmp
  • 服務器端換端口後重新實現複製
# 在服務器端修改連接端口,連接端口改爲2222
[root@IDYS_02 ~]# vi /etc/ssh/sshd_config 
Port 2222

# 在客戶端再次連接時需要指定端口2222,才能連接上ssh服務
[root@IDYS_01 tmp]# ssh -p 2222 192.168.200.137

# 這時再要通過scp複製文件時,需要通過大P指定ssh端口,才能實現複製
[root@IDYS_01 tmp]# scp -P 2222 [email protected]:/tmp/test.txt /tmp 
test.txt                                                        100%    0     0.0KB/s   00:00 

sftp:安全的文件傳輸協議

  • sftp是Secure FileTransferProtocol的縮寫,安全文件傳送協議。sftp與ftp有着幾乎一樣的語法和功能。由於這種 傳輸方式使用了加密/解密技術,所以sftp比ftp更安全一些,但傳輸效率比普通的FTP要低得多
  • 格式:
  • sftp 用戶名@服務器IP
  • -oPort=端口
    • 若端口不是默認22,則需要使用此格式指定端口
  • 交互命令:
    • help:查看在交互模式下支持哪些命令
    • pwd / lpwd:pwd是查看服務器所在路徑;lpwd是查看客戶端所在路徑
    • ls / lls:ls是查看服務器當前目錄下的文件列表;lls是查看客戶機當前所在路徑的所有文件列表
    • lcd / cd: cd切換遠程服務器端目錄, lcd切換本地客戶端目錄
    • put:將客戶機中的指定文件上傳到服務器端
    • get:將服務器端的指定文件下載到客戶機的當前所在目錄
    • rm:刪除掉服務器端的指定文件
    • quit:退出sftp的交互模式,斷開和服務器之間的連接
    • !COMMAND
      • 在你需要使用的命令前加一個感嘆號!,即可使用本地客戶端shell命令
    • version
      • 查看版本號
# 連接上服務器端
[root@IDYS_01 tmp]# sftp [email protected]
Connecting to 192.168.200.137...

# 查看
sftp> help
Available commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
************** #省略

#使用本地shell執行whoami,在whoami前面加一個感嘆號!即可執行本地客戶端shell的whoami
sftp> !whoami
root

# 可以看到命令前面加!執行的是本地客戶端的shell
sftp> !ifconfig
eth0      Link encap:Ethernet  HWaddr *********
          inet addr:192.168.200.136  Bcast:192.168.200.255  Mask:255.255.255.0

# 查看版本號
sftp> version
SFTP protocol version 3

# 將遠程目錄複製到本地目錄上來
	  	(遠端文件)		(本地目錄)
sftp> get /tmp/test.txt /tmp

# 將本地目錄上傳至遠端目錄
		  (本地文件)    (遠端目錄)
sftp> put /tmp/IDYS01.txt /tmp/

# 遠程服務器端修改ssh的監聽端口
[root@IDYS_02 ~]# vim /etc/ssh/sshd_config 
Port 2222

# 重啓服務 
[root@IDYS_02 ~]# service sshd restart

# 退出到本地
[root@IDYS_02 ~]# exit
logout

# sftp指定端口,重新連接
[root@IDYS_01 tmp]# sftp -oPort=2222 [email protected]
Connecting to 192.168.200.137...
三種命令指定端口的方式
  • ssh
    • -p指定端口
  • scp
    • -P指定端口
  • sftp
    • -oPort=PORT :指定端口
    • 如 -oPort=2222


- 寫在最後的話:

  • 無論每個知識點的難易程度如何,我都會盡力將它描繪得足夠細緻
  • 歡迎關注我的CSDN博客,IDYS’BLOG
  • 持續更新內容運維 | 網工 | 軟件技巧
  • 如果你有什麼疑問,或者是難題。歡迎評論或者私信我。你若留言,我必回覆!
  • 雖然我現在還很渺小,但我會做好每一篇內容。謝謝關注!

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章