AI智能
改变未来

超详细的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 提供了基于账户密码(口令)和密钥对两种登录验证方式,这两者都是通过密文传输数据的

    账户密码验证

    格式

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

    密钥对验证

    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_rules2  # 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 single5  # line, and change only the value of the NAME= key.67  # 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\"910  # 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-eth0DEVICE=eth0TYPE=Ethernet# UUID=f2b1fb29-c49e-419c-bea2-5b1887463266# 启动开机自启动网络ONBOOT=yesNM_CONTROLLED=yes# 静态方式BOOTPROTO=staticDEFROUTE=yesIPV4_FAILURE_FATAL=yesIPV6INIT=noNAME=\"System eth0\"# HWADDR=00:0C:21:EC:36:C2PEERDNS=yesPEERROUTES=yes#网段必须在虚拟机设置的网段内,网关也必须是和你虚拟机设置的网关相同IPADDR=192.168.200.137NETMASK=255.255.255.0GATEWAY=192.168.200.2DNS1=114.114.114.114DNS2=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=yesHOSTNAME=IDYS_01 #此处将主机名修改为你要想修改的主机名即可
    1. 关闭安全措施(因为我采用的是实验环境,所以才关闭安全措施)
    • 首先查看防火墙状态
    [root@IDYS_01 ~]# service iptables statusiptables: Firewall is not running.
    • 然后查看SELinux的状态
    # 可以看大SELinux处于开启状态[root@IDYS_01 ~]# getenforceEnforcing
    • 临时关闭防火墙和SELinux的方法
    # 关闭防火墙服务[root@IDYS_01 ~]# service  iptables stop# 关闭SELinux[root@IDYS_01 ~]# setenforce 0
    • 永久关闭防火墙的方法
    # 永久关闭防火墙[root@IDYS_01 ~]# chkconfig iptables off# 查看防火墙处于各个模式的开启状态[root@IDYS_01 ~]# chkconfig --list iptablesiptables        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 opensshopenssh-5.3p1-123.el6_9.x86_64openssh-server-5.3p1-123.el6_9.x86_64
    • 查看可以安装的openssh安装包
    [root@IDYS_02 ~]# yum list | grep opensshopenssh.x86_64                             5.3p1-124.el6_10              @updatesopenssh-server.x86_64                      5.3p1-124.el6_10              @updatesopenssh-askpass.x86_64                     5.3p1-124.el6_10              updatesopenssh-clients.x86_64                     5.3p1-124.el6_10              updatesopenssh-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 opensshopenssh-server-5.3p1-124.el6_10.x86_64openssh-5.3p1-124.el6_10.x86_64openssh-clients-5.3p1-124.el6_10.x86_64
    • 扩展知识:卸载命令rpm -e 全名安装包
    • yum -remove 安装包名称

    Linux上用户名密码登录ssh服务器端
    • 格式:ssh 用户名@IP地址
  • 连接过程中,服务器端会要求客户端接收服务器端的公钥,以便传输服务器端的密码时采用服务器端的公钥加密,这样就保证了安全性
  • [root@dayuanshuai ~]# ssh [email protected] 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)? yesWarning: Permanently added \'192.168.200.136\' (RSA) to the list of known [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 2048Generating 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_01The 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] 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)? yesWarning: Permanently added \'192.168.200.137\' (RSA) to the list of known [email protected]\'s password:Now try logging into the machine, with \"ssh \'[email protected]\'\", and check in:.ssh/authorized_keysto make sure we haven\'t added extra keys that you weren\'t expecting.# 查看客户端公钥[root@IDYS_01 .ssh]# cat ~/.ssh/id_rsa.pubssh-rsa ************************************************************************************************************************************************************************************************************************************Yv0w== root@IDYS_01# 查看服务器端存储的验证密钥[root@IDYS_02 .ssh]# cat ~/.ssh/authorized_keysssh-rsa **************************************************************************************************************************************************************************************************************************************************************************************************************************Yv0w== root@IDYS_01
    1. 客户端尝试登录服务器
    • ssh 用户名@服务器IP地址密钥对验证优先级大于账户密码验证
    # 因为客户端的id_rsa.pub和服务器端的authorized_keys一样,所以客户端能实现免密登录服务器端,下面为免密登录成功的过程[root@IDYS_01 .ssh]# ssh [email protected] login: Tue Apr 28 23:59:51 2020 from 192.168.200.136

    Windows使用密钥对登录Linux
    • 使用Xshell自带的密钥对生成向导生成密钥对

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

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

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

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

    • 选择【属性】

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

    • 进入服务端的
      ~/.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_configListenAddress 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 /tmp/test.txt [email protected]:/tmp/
    • -P 端口

    注意:如果要使用scp命令进行复制的话,客户端和服务器端都应该安装上openssh-clients 安装包,不然会报错。

    • 报错如下:
    [root@IDYS_01 ~]# scp /tmp/test.txt [email protected]:/tmp/bash: scp: command not foundlost connection
    • 这个时候连接上服务器端,安装上openssh-clients服务,然后重启ssh服务,最后退回客户端,然后再次使用scp实现复制就成功了.
    # 连接上服务器端[root@IDYS_01 ~]# ssh [email protected] 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 ~]# exitlogout# 再次使用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_configPort 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 /tmptest.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] to 192.168.200.137...# 查看sftp> helpAvailable commands:bye                                Quit sftpcd path                            Change remote directory to \'path\'************** #省略#使用本地shell执行whoami,在whoami前面加一个感叹号!即可执行本地客户端shell的whoamisftp> !whoamiroot# 可以看到命令前面加!执行的是本地客户端的shellsftp> !ifconfigeth0      Link encap:Ethernet  HWaddr *********inet addr:192.168.200.136  Bcast:192.168.200.255  Mask:255.255.255.0# 查看版本号sftp> versionSFTP protocol version 3# 将远程目录复制到本地目录上来(远端文件)		(本地目录)sftp> get /tmp/test.txt /tmp# 将本地目录上传至远端目录(本地文件)    (远端目录)sftp> put /tmp/IDYS01.txt /tmp/# 远程服务器端修改ssh的监听端口[root@IDYS_02 ~]# vim /etc/ssh/sshd_configPort 2222# 重启服务[root@IDYS_02 ~]# service sshd restart# 退出到本地[root@IDYS_02 ~]# exitlogout# sftp指定端口,重新连接[root@IDYS_01 tmp]# sftp -oPort=2222 [email protected] to 192.168.200.137...
    三种命令指定端口的方式
    • ssh-p指定端口
  • scp
      -P指定端口
  • sftp
      -oPort=PORT :指定端口
    • 如 -oPort=2222

    – 写在最后的话:

    • 无论每个知识点的难易程度如何,我都会尽力将它描绘得足够细致
    • 欢迎关注我的CSDN博客,IDYS’BLOG
    • 持续更新内容:运维 | 网工 | 软件技巧
    • 如果你有什么疑问,或者是难题。欢迎评论或者私信我。你若留言,我必回复!
    • 虽然我现在还很渺小,但我会做好每一篇内容。谢谢关注!

  • 赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » 超详细的ssh(secure shell)服务介绍、搭建、配置、实战讲解 —— 超级干货!