> 技术文档 > Linux学习应用篇——SSH远程登录(密钥连接)

Linux学习应用篇——SSH远程登录(密钥连接)

本文主要总结了如何在Windows系统下利用FinalShell通过密钥连接Linux的CentOS7.9系统,内容包括SSH概述、SSH常用命令、SSH的两种登录方式(密码登录和公钥连接)以及SSH配置文件配置,发布于此供大家交流学习。

如有侵权,请联系删除!

目录

SSH远程登录

1、SSH概述

(1)SSH基本介绍

(2)SSH安全机制

①基于口令的安全验证(密码登录)

②基于公钥的安全验证(公钥认证)

2、SSH常用命令

(1)远程登录

(2)在远程主机上执行命令

(3)创建SSH密钥对

(4)远程拷贝文件:scp命令(Secure Copy)

3、SSH的两种登录方式

(1)密码登录

①使用FinalShell

②使用OpenSSH

(2)密钥登录

①在客户端(主机)生成密钥对

Ⅰ、检查OpenSSH客户端安装状态

Ⅱ、使用命令ssh-keygen创建密钥对

②将公钥拷贝至服务器

Ⅰ、在服务器创建文件夹

Ⅱ、将公钥拷贝至对应文件

通过图形化界面

通过服务器端命令行:lrzsz命令

通过客户端命令行:scp命令

③在服务器端开启SSH服务,并设置公钥权限

Ⅰ、开启SSH服务:systemctl命令

Ⅱ、设置公钥权限

【注】若权限设置较低,具有安全风险;若权限设置较高,将无法实现公钥认证,可能会报错:SSH_MSG_DISCONNECT: 2 Too many authentication failures

④在客户端使用FinalShell进行公钥远程登录

4、SSH配置文件

(1)SSH配置文件位置

(2)常见的配置选项及其说明


SSH远程登录

1、SSH概述

(1)SSH基本介绍

SSH,全称Secure Shell,即安全外壳协议。SSH是一种用于安全远程登录和其他完全网络服务的加密协议,是由IETE(The Internet Engineering Task Force) 的网络小组所制定的、建立在应用层基础上的安全网络协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题,弥补网络中的漏洞,并加快传输速度。SSH适用于多种平台,目前已经成为Linux系统的标准配置,也是远程访问Linux服务器最常用、最安全的方式。

(2)SSH安全机制

SSH能提供高度安全的远程连接,核心在于其采用了非对称加密技术来加密所有传输的数据,确保通信的机密性和完整性。

非对称加密技术使用了一对密钥:公钥和私钥

  • 公钥 (Public Key):可以安全地放置在任何您想访问的远程服务器上;

  • 私钥 (Private Key):生成后存储在您的本地客户端机器上,必须严格保密,不可泄露。

这种加密方式的优点是提供了数据传输的安全性,因为即使公钥被公开,没有对应的私钥也无法解密数据,也因此私钥需要小心保存。

传统的网络服务协议(如FTP、Telnet、rlogin)由于采用明文传输用户名、密码和数据,极易遭受中间人攻击(MITM)。攻击者可以截获通信内容,甚至伪装成服务器或客户端,窃取敏感信息或篡改数据。

中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)是一种“间接”的入侵攻击,这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间,这台计算机就称为“中间人”。

然而,SSH的安全性并非绝对,它提供两种不同级别的验证方式,安全强度差异显著:

①基于口令的安全验证(密码登录)
  • 原理:用户输入账号和密码,SSH会对传输的数据进行加密,但无法验证服务器的真实性

  • 风险:

    • 攻击者可能伪造服务器(如DNS劫持或ARP欺骗),诱导用户连接恶意主机;

    • 密码可能被暴力破解(尤其是弱密码)。

②基于公钥的安全验证(公钥认证)
  • 原理:

    Ⅰ、用户在客户端生成密钥对(公钥 + 私钥),并将公钥拷贝至服务器;

    Ⅱ、远程访问时,客户端向服务器发起认证请求(请求 + 公钥),服务器检查公钥是否匹配;

    Ⅲ、若公钥匹配,则服务器将发送一个用公钥加密的质询(Challenge)给客户端,客户端使用私钥解密后返回给服务器;

    Ⅳ、验证两段Challenge是否相同,通过后,建立加密通道。

客户端:你当前使用的主机;服务器:你想要远程访问的目标系统。

  • 优势:

    • 无需传输密码,彻底杜绝密码泄露风险;

    • 可抵御中间人攻击,因为攻击者无法伪造私钥签名;

    • 支持完全禁用密码登录,极大提升安全性。

2、SSH常用命令

(1)远程登录

语法:ssh [选项 ] user@hostname

  • 选项:-p,指定连接到远程主机的端口号,默认是22;

  • 选项:-v,详细模式,可以显示调试信息;

  • 选项:-f,后台运行;

  • hostname:可以在Linux系统通过命令hostname查询,也可使用IP地址代替,IP地址在Linux系统通过命令ifconfig查询。

示例:ssh -v user@192.168.205.XX

说明:以详细模式远程连接IP地址为192.168.205.XX的服务器。

(2)在远程主机上执行命令

语法:ssh user@hostname command 即直接在远程登录的语法后添加要执行的命令即可。

示例:ssh user@192.168.205.XX \"ls -alh | grep root\"

说明:在IP地址为192.168.205.XX的远程主机上执行命令ls -alh | grep root,并将结果返回本地。

(3)创建SSH密钥对

语法:ssh-keygen [选项 ]

  • 选项:-t,指定密钥类型(如 rsa, ed25519, ecdsa, dsa),默认 rsa

  • 选项:-m,指定密钥转换格式(如 PEM, PKCS8, RFC4716),FinalShell要求PEM格式的密钥

  • 选项:-C,添加密钥注释(通常为邮箱或用途说明);

  • 选项:-f,指定密钥保存路径(默认 ~/.ssh/id_);

  • 选项:-b,指定密钥长度,默认 3072(RSA);

示例:ssh-keygen -m PEM -t rsa -C \"your_email@example.com\"

说明:生成一个 RSA 格式的 PEM 编码密钥对,并添加注释 \"your_email@example.com\"。

(4)远程拷贝文件:scp命令(Secure Copy)

语法:scp [选项] [源文件] [目标路径]

  • 选项:-v,显示详细的调试信息,有助于排查问题;

  • 选项:-C,启用压缩,可以加快传输速度;

  • 选项:-p,保留文件的修改时间、访问时间和权限。

  • 示例1:scp ~/.ssh/id_rsa.pub root@192.168.205.XX:~/.ssh/

说明:从本地复制文件~/.ssh/id_rsa.pub到远程服务器root用户下的~/.ssh/

  • 示例2:scp root@192.168.205.XX:~/.ssh/id_rsa.pub ~/.ssh

说明:复制远程服务器root用户下的~/.ssh/id_rsa.pub文件到本地文件夹~/.ssh

3、SSH的两种登录方式

通过上面的介绍,我们可以发现使用密钥进行远程登录才是SSH的核心,在许多情形下也要求我们使用公钥登录才更为安全;而在前面的基础学习中,我们使用了FinalShell进行远程登录,作为一款SSH终端工具,FinalShell也具有使用公钥登录的方式。

基于此,本文的主要目的是实现通过FinalShell实现使用Windows 10系统通过公钥远程登录控制Linux的CentOS7.9系统

使用Linux系统远程连接Linux系统的可以参考以下链接:SSH 连接远程服务器:从入门到实践(全指南)

(1)密码登录

①使用FinalShell

使用FinalShell进行密码登录较为简单,在Linux系统中通过命令ifconfig获取IP地址,然后在FinalShell中创建认证即可,此处不再赘述,具体可参考以下链接: FinalShell介绍,安装与应用-CSDN博客

②使用OpenSSH

无论是FinalShell还是XShell,都需要我们自行通过官网进行下载,但实际上Windows系统通常自带了一个轻量化的SSH工具——OpenSSH,缺点是该工具不具备图形化界面,需要使用命令行进行驱动,由于后续在客户端(主机)上生成公钥和私钥需要使用OpenSSH,因此这里也稍微提到使用OpenSSH进行远程登录的方式,具体操作可参考以下链接,本文仅作简单介绍:

在Windows系统中使用OpenSSH的方法:Windows 上的 OpenSSH:安装、配置和使用指南 - 系统极客

【注】首次使用OpenSSH远程连接Linux系统时,会出现以下内容:

The authenticity of host \'192.168.205.XX (192.168.205.XX)\'can\'t be established.ECDSA key fingerprint is SHA256:v9jXXXXXXXVCpRh/AGdqP9pgJyWXXXXXh8aSFgMNxto.Are you sure you want to continue connecting (yes/no)?

这表明:

  • 客户端从未连接过该主机,无法验证其真实性;

  • 服务器提供了一个ECDSA密钥指纹(SHA256哈希值),用于唯一标识该主机。

此时输入yes确认连接即可,客户端会将服务器指纹(fingerprint)加入本地相关配置文件中,后续连接不再提示。

(2)密钥登录

①在客户端(主机)生成密钥对

我们的目标是从Window系统上远程登录Linux系统,故需要在Window系统上生成密钥对,如果你使用的SSH软件是XShell,那么XShell中有生成密钥对的指引,具体步骤可参考以下链接:Xshell生成ssh密钥及使用_xshell密钥-CSDN博客

我们使用的是FinalShell,密钥对需要我们自行生成,这就需要用到Windows系统的OpenSSH了,具体流程如下:

Ⅰ、检查OpenSSH客户端安装状态
  • 使用快捷键win + R打开Windows运行窗口,并输入powershell,然后按Ctrl + Shift + Enter以管理员权限打开 PowerShell 命令行工具;

  • 在PowerShell命令行工具中,执行以下命令查看OpenSSH安装状态:

Get-WindowsCapability -Online | Where-Object Name -like \'OpenSSH*\'

如果返回NotPresent,表示未安装;返回Installed则表示已安装;

  • 根据需要安装 OpenSSH 客户端和服务器组件:

# 安装 OpenSSH 客户端Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0​# 安装 OpenSSH 服务器Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

【注】通过Windows远程连接Linux系统,Windows是作为客户端,故必须安装OpenSSH客户端。

Ⅱ、使用命令ssh-keygen创建密钥对
  • 通过以下命令创建适用于FinalShell的密钥对:

ssh-keygen -m PEM -t rsa -C \"your_email@example.com\"

由上图可得,在输入上述命令后,出现了三个需要填写的空白:

    • Enter file in which to save the key (C:\\Users\\用户名/.ssh/id_rsa):

这个空白是因为未使用-f选项,故需要填写密钥保存路径,此处直接回车,默认即可;

    • Enter passphrase (empty for no passphrase):

这个空白是在生成密钥时提示你设置私钥的密码(Passphrase),以增强私钥的安全性,在私钥被他人获取后,仍需要密码才可使用。此处按需求填写,本人直接回车,创建无密码的密钥;

    • Enter same passphrase again:

再次输入上面设置的私钥密码,不需要则直接回车。

  • 通过ls ~/.ssh进入密钥默认路径,检查是否创建成功(或通过图形化窗口查看路径C:\\Users\\用户名/.ssh)。

    • 公钥文件:id_rsa.pub

    • 私钥文件:id_rsa

②将公钥拷贝至服务器
Ⅰ、在服务器创建文件夹

登录Linux的CentOS7.9系统,进入root用户,检查以下两个路径的文件夹与文件是否存在,如果不存在就创建对应的文件夹与文件:

  • 普通用户:/home/user(用户名)/.ssh/authorized_keys

  • root用户:/root/.ssh/authorized_keys

如果想要密钥登录后自动为root用户,就将公钥拷贝至root用户对应的文件,如果想要密钥登录后为普通用户,就将公钥拷贝至普通用户对应的文件;下面均已拷贝到root用户下作为演示。

Ⅱ、将公钥拷贝至对应文件

有多种方式可以将公钥从客户端拷贝至服务器,这里介绍三种:

  • 通过图形化界面
    • 在Windows系统打开公钥所在文件夹C:\\Users\\用户名/.ssh,同时在FinalShell上用密码登录Linux的CentOS7.9系统的root用户,并打开至root用户对应文件夹/root/.ssh/

    • 直接拖动Windows系统的公钥文件id_rsa.pub,到FinalShell显示的文件系统中,实现公钥拷贝;

    • 在FinalShell上通过命令cat id_rsa.pub >> authorized_keys,将公钥存放至authorized_keys文件中。

  • 通过服务器端命令行:lrzsz命令
    • 在Linux的CentOS7.9系统中以root用户登录,先通过命令:yum -y install lrzsz安装;

    • 打开root用户对应文件夹/root/.ssh/,直接执行rz,在出现的本机文件系统中找到公钥文件进行下载;

    • 通过命令cat id_rsa.pub >> authorized_keys,将公钥存放至authorized_keys文件中。

  • 通过客户端命令行:scp命令
    • 在Windows的PowerShell中执行命令:

      scp ~/.ssh/id_rsa.pub root@192.168.205.XX:~/.ssh/

    • 在Linux系统上通过命令cat id_rsa.pub >> authorized_keys,将公钥存放至authorized_keys文件中。

【注】Windows系统原生不支持ssh-copy-id命令。

③在服务器端开启SSH服务,并设置公钥权限
Ⅰ、开启SSH服务:systemctl命令

在Linux系统中通过以下命令查看并开启SSH服务:

  • 查看SSH服务状态:systemctl status sshd

  • 开启SSH服务:systemctl start sshd

  • 配置SSH服务自启动:systemctl enable sshd

Ⅱ、设置公钥权限

在Linux系统中进入root用户,将存放公钥的文件夹和文件按下列命令进行权限设置:

chmod 755 /root  //755:rwxr-xr-xchmod 700 /root/.ssh //700:rwx------chmod 600 /root/.ssh/authorized_keys //600:rw-------
【注】若权限设置较低,具有安全风险;若权限设置较高,将无法实现公钥认证,可能会报错:SSH_MSG_DISCONNECT: 2 Too many authentication failures
④在客户端使用FinalShell进行公钥远程登录

4、SSH配置文件

(1)SSH配置文件位置

在Linux系统中,SSH的配置文件主要有两个:

  • 客户端配置文件:/etc/ssh/ssh_config

  • 服务端配置文件:/etc/ssh/sshd_config

在本文的案例中,Linux系统主要作为服务端,故主要查看服务端的配置文件。

(2)常见的配置选项及其说明

通过修改SSH配置文件可以提高SSH连接的安全性,比如仅允许通过密钥连接而完全禁止密码连接。以下是Linux系统作为服务端,在SSH中的常见配置说明:

# 监听端口,默认是22,可以修改为其他端口以提高安全性Port 22​# 监听地址,可以指定具体的IP地址ListenAddress 0.0.0.0​# 禁止root用户登录PermitRootLogin no​# 禁止空密码登录PermitEmptyPasswords no​# 启用公钥认证(必须启用,否则无法密钥登录)PubkeyAuthentication yes​# 完全禁用密码登录(关键安全配置!)PasswordAuthentication no​# 指定公钥文件的位置AuthorizedKeysFile .ssh/authorized_keys​# 禁用DNS反向解析,避免连接延迟UseDNS no​# 启用X11转发(非必要不建议开启)X11Forwarding yes​# 设置登录验证超时时间为2分钟LoginGraceTime 2m​# 最大认证尝试次数(建议降低至3-4次防御暴力破解)MaxAuthTries 6​