超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!

文章目录

  • - 写在开头的话
    • ssh的基本概念
    • ssh的登录验证模式
      • 账户密码验证
        • 格式
      • 密钥对验证
    • ssh(secure shell)的服务搭建
      • Linux服务器的建立(VMware克隆形式)
      • ssh(secure shell)服务的搭建
        • 安全防护的关闭
        • Linux上用户名密码登录ssh服务器端
          • 查看是否安装openssh安装包
          • Linux上用户名密码登录ssh服务器端
          • Linux 主机之间的密钥对登录验证
          • Windows使用密钥对登录Linux
      • ssh(secure shell)服务的配置文件说明
        • 禁止使用密码登录
        • 禁止使用 root 远程登录
        • 修改默认端口、限制 ssh 监听 IP
          • 修改默认端口
          • 限制ssh监听IP:
      • ssh服务相关命令
        • scp:安全的远程文件复制命令
        • sftp:安全的文件传输协议
          • 三种命令指定端口的方式
    • - 写在最后的话:


这里是一段防爬虫文本,请读者忽略。
本文原创首发于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 提供了基于账户密码(口令)和密钥对两种登录验证方式,这两者都是通过密文传输数据的


账户密码验证

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第1张图片

格式

windows远程登录Linux主机一般使用第三方工具,比如Xshell、secureCRT、putty


密钥对验证

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第2张图片

  1. 首先需要在 Client 上创建一对密钥,并且需要把公钥放在需要访问的 Server 上

  2. 当 Client 需要连接 Server 时,Client 端的软件就会向 Server 端发出登录请求,请求使用密钥对中的的公钥 进行安全验证

  3. Server 收到请求之后,会在该用户的家目录下查询公钥文件,拿 Client 发送过来的公钥和自己家目录下的公钥 进行比较

  4. 如果两个公钥一致,Server 就用公钥加密“challenge(质疑)”,并把它发送给 Client 软件。Client 收到加 密内容之后,使用本地的私钥进行解密,再把解密结果发送给 Server 端,Server 端验证成功后,允许登录

注意:若第3个步骤对比结果失败,则 Server 端会通知 Client 端此公钥未在本机注册,无法验证登录

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第3张图片


ssh(secure shell)的服务搭建

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

  1. 搭建三台Linux服务器,本次实验采用的是三台机器均为CentOS6.10,第一台Linux服务器采用VMware搭建的方式,后两台采用VMware克隆的形式。VMware安装Linux就不过多赘述了。这里主要讲一下克隆的方式
  • 点击[管理],然后点击[克隆]

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第4张图片

  • 之后点击[链接克隆](因为这样节省硬盘空间)

  • 选择[虚拟机设置]

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第5张图片

  • 选择[高级]

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第6张图片

  • 点击[生成]

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第7张图片

  • 打开克隆机

  • 修改 /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"
  • 注释图如下

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第8张图片

  • 修改/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自带的密钥对生成向导生成密钥对

  • 选择[工具] -> [新建用户密钥生成向导]

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第9张图片

  • 选择密钥类型为RSA,密钥长度为2048

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第10张图片

  • 然后选择下一步,下一步,最后选择完成

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第11张图片

  • 选择工具,然后点击用户密钥管理者选项

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第12张图片

  • 选择【属性】

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第13张图片

  • 选择【公钥】,然后将公钥内容复制

超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!_第14张图片

  • 进入服务端的~/.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
  • 持续更新内容运维 | 网工 | 软件技巧
  • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
  • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

你可能感兴趣的:(运维笔记)