【Tool】SSH

写在前面 / 参考链接存档

AI饭版SSH学习教程

SSH 基础概念

SSH 的定义和作用

  • SSH (Secure Shell) 是一种 安全的网络协议 ,旨在实现在不安全的网络环境中的安全远程访问和其他网络服务。

    • 它通过加密和认证机制,在客户端和服务器之间建立安全隧道,为网络服务提供安全的数据传输通道。
    • 相较于早期的Telnet和FTP等协议,SSH显著提升了远程登录和文件传输的安全性,有效解决了明文传输数据所带来的安全隐患。
  • 主要优势在于其强大的 加密功能 和灵活的 身份认证机制

    • 它不仅支持密码认证,还支持公钥认证等多种方式,大大增强了系统的安全性。
    • 此外,SSH还提供了端口转发等功能,进一步拓展了其应用场景,使其成为现代网络安全领域不可或缺的重要工具。

SSH 的工作原理

SSH的工作原理是一个复杂而精妙的过程,涉及到多种加密技术和身份验证机制。

作为一个安全的网络协议,SSH的核心目标是在不安全的网络环境中建立安全的通信通道。

为了实现这一目标,SSH采用了以下关键组件和技术:

密钥交换、数据加密、身份验证、完整性保护

密钥交换

  • SSH使用 非对称加密 来保护通信的安全性。
  • 在连接建立之初,客户端和服务器通过复杂的密钥交换算法协商出会话密钥。
  • 这个过程确保即使通信被监听,攻击者也无法获取用于解密通信的密钥。
  • 常用的密钥交换算法包括Diffie-Hellman(DH)和Elliptic Curve Diffie-Hellman(ECDH)。

数据加密

  • 一旦建立了会话密钥,SSH就开始使用 对称加密 来高效地加密和解密数据。
  • 对称加密算法如AES(AES-CTR,AES-GCM)和ChaCha20-Poly1305因其高效率而被广泛使用。
  • 这些算法能够在保证安全性的同时,提供快速的数据处理速度,适合大规模数据传输的需求。

身份验证

  • SSH提供了多种身份验证机制,其中最常见的是 密码认证公钥认证
    • 密码认证 :用户输入密码,服务器验证密码是否正确
    • 公钥认证 :用户拥有私钥,服务器存储公钥;服务器生成随机数,用公钥加密后发送给用户;用户用私钥解密并返回结果,服务器验证结果正确性
  • 公钥认证特别值得注意,因为它提供了一种更安全、更便捷的登录方式。
  • 在这种机制下,用户无需每次输入密码,只需通过私钥就能证明自己的身份。这种方法不仅提高了安全性,还能显著改善用户体验。

完整性保护

  • 为了进一步增强安全性,SSH还使用了 消息认证码(MAC) 技术。MAC算法如HMAC-SHA256用于检测数据在传输过程中是否被篡改。这确保了通信的完整性和真实性,防止了中间人攻击等威胁。

  • 通过巧妙组合这些技术,SSH成功地在不安全的网络环境中构建了一个安全的通信通道。这种多层次的安全机制使得SSH成为了远程访问和数据传输的标准协议,广泛应用于各种网络环境中。

SSH 安装和配置

在不同操作系统上安装SSH

SSH作为一种跨平台的远程访问工具,在不同操作系统上都有广泛应用。本节将详细介绍如何在Windows、Linux和macOS这三个主流平台上安装SSH。

Windows平台

Windows平台的SSH安装过程较为直观。从Windows 10开始,Microsoft已在系统中集成了OpenSSH组件,用户可通过以下步骤进行安装:

  1. 打开“设置”
  2. 选择“系统” > “可选功能”
  3. 在搜索框中输入“OpenSSH”
  4. 根据需要选择安装“OpenSSH 客户端”或“OpenSSH 服务器”

安装完成后,还需额外配置SSH服务的启动类型:

以管理员身份打开PowerShell,执行:

Set-Service -Name sshd -StartupType ‘Automatic’

Linux平台

Linux平台的SSH安装因发行版而异。以下是两种常见Linux发行版的安装方法:

发行版类型安装命令
Debian/Ubuntusudo apt-get install openssh-server
RedHat/CentOSsudo yum install openssh-server

安装完成后,需启动SSH服务:

1
sudo systemctl start ssh

为确保SSH服务随系统启动而自动运行,执行:

1
sudo systemctl enable ssh

macOS平台

macOS自带SSH客户端,但服务器组件需单独安装。可使用Homebrew包管理器安装:

1
brew install openssh

安装完成后,需在系统偏好设置中启用SSH:

  1. 打开“系统偏好设置”
  2. 选择“共享”
  3. 在服务列表中勾选“远程登录”

通过这些步骤,用户可在不同操作系统上顺利完成SSH的安装和基本配置,为后续的远程访问和文件传输奠定基础。

工具

SSH 配置文件详解

端口配置

  • 配置 SSH 服务器配置文件 /etc/ssh/sshd_config

  • SSH服务默认监听22端口,但出于安全考虑,许多管理员会选择更改这个端口。例如:

    1
    Port 2222
  • 这个配置将SSH服务的监听端口改为2222。更改端口后,客户端连接时也需要使用新的端口。

身份验证方式

  • SSH提供了多种身份验证方式,其中 公钥认证 是最安全的选择。可以通过以下配置启用公钥认证:
1
PubkeyAuthentication yes
  • 同时,为了提高安全性,通常会禁用密码认证:
1
PasswordAuthentication no
  • 这种配置强制用户使用公钥进行身份验证,大大降低了密码被暴力破解的风险。

用户访问控制

  • SSH配置文件允许管理员精确控制哪些用户可以访问SSH服务。例如,可以使用AllowUsers选项指定允许登录的用户:
1
AllowUsers alice bob
  • 这将仅允许alice和bob这两个用户通过SSH登录系统。相反,如果需要禁止特定用户登录,可以使用DenyUsers选项:
1
DenyUsers mallory

根用户登录控制

  • 出于安全考虑,通常不建议允许root用户直接通过SSH登录。可以通过以下配置禁止root登录:

    1
    PermitRootLogin no
  • 这将阻止root用户通过SSH直接登录,从而降低系统被攻击的风险。

最大认证尝试次数

  • 为了防止暴力破解,可以限制用户认证的最大尝试次数:
1
MaxAuthTries 3
  • 这个配置将最大认证尝试次数限制为3次。超过这个次数后,连接将被断开,有助于防止密码猜测攻击。

登录超时时间

  • 同样为了提高安全性,可以设置登录超时时间:
1
LoginGraceTime 60
  • 这个配置将登录超时时间设为60秒。如果用户未能在这段时间内完成身份验证,连接将被自动断开。

  • 通过合理配置这些选项,管理员可以显著提高SSH服务的安全性,同时保持必要的灵活性和可用性。记住,每次修改配置文件后都需要重启SSH服务以使更改生效:

1
sudo systemctl restart sshd
  • 用户认证:可以选择强制使用公钥认证,禁止密码认证
1
2
PasswordAuthentication no
PubkeyAuthentication yes
  • 访问控制:允许或拒绝特定用户或用户组访问 SSH 服务器
1
2
AllowUsers username
DenyUsers username
  • 日志级别:增加日志详细度以便监控和调试
1
2
SyslogFacility AUTH
LogLevel INFO
  • 配置完成后,重启 SSH 服务使配置生效
1
sudo systemctl restart ssh

旧版本系统:

sudo service ssh restart

生成 SSH 密钥对

  • 在客户端生成 SSH 密钥对
1
ssh-keygen

默认情况下,密钥对保存在 ~/.ssh/id_rsa~/.ssh/id_rsa.pub。可以根据需要修改文件名

  • 将密钥复制到远程服务器
1
ssh-copy-id username@server-address

这样以后可以从客户端免密码登陆服务器

测试 SSH 连接

  • 尝试从客户端连接到服务器
1
ssh username@server-address

连接正常后可以看到服务器的提示符$啥的

  • 退出远程会话
1
exit

SSH 基本用法

远程登录命令

基本语法
1
ssh [选项] [参数]

选项 用于指定特定的配置,而 参数 则通常是指远程服务器的地址

常用参数

SSH提供了多个实用的参数,可以帮助用户更灵活地进行远程操作:

参数描述示例
-p指定SSH服务器的端口号ssh -p 2222 user@server
-i指定用于身份验证的私钥文件ssh -i ~/.ssh/id_rsa user@server
-X启用X11转发,允许在远程会话中运行图形界面程序ssh -X user@server
-C启用数据压缩,提高低带宽环境下的传输效率ssh -C user@server
-N禁止执行远程命令,常用于端口转发ssh -N -L 8080:localhost:80 user@server
-f将SSH进程置于后台运行ssh -f user@server
远程命令执行
  • SSH的一个强大特性是可以直接在远程服务器上执行命令。语法如下:
1
ssh user@server 'command'
  • 例如,要在远程服务器上查看当前目录:
1
ssh user@server 'pwd'
  • 这种方法特别适用于需要在多个服务器上执行相同命令的场景,大大提高工作效率。

  • 通过熟练运用这些基本语法和参数,用户可以更有效地利用SSH进行远程访问和管理,提高工作效率并增强安全性。

文件传输操作

在实际应用中, scpsftp 是两个广泛使用的工具,它们都能在SSH的基础上实现安全的文件传输。

scp命令

scp命令是一个简洁而强大的文件传输工具。其基本语法如下:

1
scp [options] source_file destination

其中,source_file表示要传输的文件,destination指定接收方的位置。scp命令支持多种选项来优化传输过程:

选项功能
-r递归复制整个目录
-C启用压缩,提高传输效率
-p保留文件元数据
-i指定私钥文件

例如,要将本地的project文件夹递归复制到远程服务器的/home/user目录,可以使用:

1
scp -r project user@remote_server:/home/user/
sftp命令

sftp命令提供了更多的交互式文件管理功能。用户可以像使用本地文件系统一样浏览和操作远程服务器上的文件。sftp的基本用法如下:

1
sftp user@remote_server

连接成功后,用户可以使用一系列命令来进行文件操作:

命令功能
put上传文件
get下载文件
lcd切换本地目录
cd切换远程目录
ls列出远程目录内容
mkdir创建远程目录

sftp的优势在于其 交互性灵活性 。用户可以根据需要实时查看和管理远程文件系统,非常适合需要频繁进行文件传输和管理的场景。

通过合理使用scp和sftp命令,用户可以在保证数据安全的前提下,高效地完成各种文件传输任务。这两种工具的结合为SSH用户提供了全面而灵活的文件管理解决方案。

端口转发技巧

SSH端口转发是一种强大的网络工具,能够突破网络限制,实现安全的数据传输。在复杂的网络环境中,端口转发技巧尤为重要,尤其在企业内网和云服务架构中发挥着关键作用。

详细介绍三种主要的端口转发类型:本地端口转发远程端口转发动态端口转发

本地端口转发

本地端口转发是最常用的端口转发类型之一。它允许将本地计算机的端口映射到远程服务器的端口。这种技术在访问受限制的内网资源时尤为有用。

例如,假设需要访问一台内网服务器的MySQL数据库,但直接访问受到防火墙限制。通过本地端口转发可以轻松解决这个问题:

1
ssh -L 3306:localhost:3306 user@jumpbox

这个命令在本地计算机上创建了一个名为3306的新端口,将其映射到远程服务器(jumpbox)上的3306端口。

这样就可以通过访问本地计算机的3306端口来间接访问远程服务器的MySQL数据库,有效绕过了防火墙的限制。

远程端口转发

远程端口转发则刚好相反,它将远程服务器的端口映射到本地计算机的端口。这种技术在需要从外部网络访问内网服务时非常有用。

例如,如果希望从外部网络访问公司内部的Web服务器,可以使用以下命令:

1
ssh -R 8080:localhost:80 user@public-server

这个命令在公共服务器(public-server)上创建了一个名为8080的新端口,将其映射到内部Web服务器的80端口。这样,外部用户就可以通过访问公共服务器的8080端口来访问原本受限制的内部Web服务。

动态端口转发

动态端口转发是一种更为灵活的端口转发方式。它不像静态端口转发那样需要指定具体的端口号,而是创建一个通用的代理端口,可以转发任意类型的网络请求。

这种技术在需要访问多个不同端口的内网服务时特别有用。

例如,可以使用以下命令创建一个动态端口转发:

1
ssh -D 1080 user@proxy-server

这个命令在代理服务器(proxy-server)上创建了一个名为1080的SOCKS代理端口。通过这个端口,可以透明地访问内网的各种服务,无需为每个服务单独设置端口转发。这对于需要访问多个内网服务的场景来说,大大简化了配置过程。

通过合理运用这些端口转发技巧,可以有效克服网络限制,实现安全、高效的数据传输和访问。无论是在企业内网还是云计算环境中,这些技术都能够为用户提供灵活、可靠的网络连接方案,极大地提高了网络管理和应用部署的效率。

高级主题

1. 端口转发

自分の使用:在Linux服务器启动某个服务后显示被挂载在本机某个端口,但是由于服务器只有命令行而没有web环境,所以需要通过端口代理到本机localhost

  • 本地转发:将本地端口流量转发到远程服务器的指定端口
1
ssh -L local_port:remote_host:remote_port username@server-address
  • 远程转发:将远程服务器的端口流量转发到本地及其或其他机器的指定端口
1
ssh -R remote_port:local_host:local_port username@server-addree
  • 动态转发:通过 SSH 临时设置 SOCKS 代理,用于网络浏览等用途
1
ssh -D socks_port username@server-address

然后再浏览器中配置代理设置为本地机器的socks_port

2. X11 转发
  • 启用 X11 转发,在 SSH 连接中运行图形界面程序
1
-X 或 -Y 选项
  • 例如:
1
ssh -X username@server-address
  • 然后在远程服务器上运行图形界面程序
1
firefox
3. 脚本自动化
  • 编写简单的 Bash 脚本来封装复杂的 SSH 命令,提高效率和便捷性

  • 示例脚本sync_and_restart.sh

1
2
3
#!/bin/bash
rsync -avz ./ user@host:/home/user/
ssh user@host 'sudo systemctl restart myservice'
  • 赋予脚本执行权限
1
chmod +x sync_and_restart.sh
  • 运行脚本
1
./sync_and_restart.sh

6. 错误处理

常见错误及解决办法:

  • “Connection refused”:确保 SSH 服务在远程服务器上正在运行,并检查防火墙规则。
  • “Permission denied (publickey)”:确认公钥已正确添加到授权列表,权限设置正确,且私钥文件未被损坏或移动。
  • 超时:检查网络连通性,确保中间没有设备拦截或延缓数据包。

7. 日常维护

1. 定期更新 SSH 客户端和服务器
  • 在 Debian 系统(如 Ubuntu):

    1
    2
    sudo apt-get update
    sudo apt-get upgrade
  • 在 RPM 系统(如 Fedora 或 CentOS):

    1
    sudo yum update
  • 或者在较新的 CentOS 版本中:

    1
    sudo dnf update
2. 查看日志文件
  • 查看日志文件:

    1
    cat /var/log/auth.log
  • 或使用 lesstail 命令分页查看:

    1
    tail -f /var/log/auth.log
3. 监控 SSH 会话
  • 使用 last 命令查看当前登录会话:
1
last
  • 使用 who 命令查看当前在线用户:
1
who

SSH 密钥管理

生成和使用 SSH 密钥对

SSH密钥对是实现安全远程访问的核心机制。通过生成和使用SSH密钥对,用户可以显著提升系统的安全性,同时享受无缝登录的便利。

以下是创建、分发和使用SSH密钥对的详细指南:

创建SSH密钥对

第一步:在本地计算机上生成SSH密钥对

使用ssh-keygen命令可以轻松完成这项任务:

1
ssh-keygen -t rsa-sha2-256

这个命令将生成一个RSA-SHA2-256类型的密钥对,这是目前广泛推荐的算法。

执行后,系统会在~/.ssh/目录下创建两个文件:id_rsa(私钥)和id_rsa.pub(公钥)。

分发公钥

生成密钥对后,需要将公钥分发到目标服务器。

这一步骤通常涉及手动拷贝公钥文件或使用ssh-copy-id命令自动完成。例如:

1
ssh-copy-id user@server

这个命令会自动将本地的公钥复制到远程服务器的~/.ssh/authorized_keys文件中。

确保服务器的~/.ssh/目录和authorized_keys文件具有正确的权限设置:

1
2
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

使用私钥登录

有了公钥在服务器上,用户就可以使用私钥进行身份验证了。使用ssh命令时,可以通过-i选项指定私钥文件:

1
ssh -i ~/.ssh/id_rsa user@server

这个命令告诉SSH客户端使用指定的私钥文件进行身份验证。

如果私钥文件设置了密码保护,系统会提示输入密码。

自分の想法:就是github用ssh进行git push时候进行的验证吧!

自动化登录

为了提高效率,可以配置SSH客户端自动加载私钥。编辑~/.ssh/config文件,添加以下内容:

1
2
3
4
Host server
HostName server.example.com
User user
IdentityFile ~/.ssh/id_rsa

这样,每次连接到server时,SSH客户端都会自动使用指定的私钥文件进行身份验证,无需每次都指定-i选项。

通过以上步骤,用户可以安全地使用SSH密钥对进行身份验证,既提高了安全性,又简化了登录过程。这种方法特别适合需要频繁访问多个服务器的用户,可以显著提高工作效率,同时降低密码泄露的风险。

密钥的安全存储和管理

在SSH密钥管理中,保护私钥的安全至关重要。

以下是几个最佳实践:

  1. 严格权限控制 :确保只有授权用户才能访问私钥文件

    使用chmod 600命令限制权限。

  2. 启用密码保护 :为私钥文件设置密码,增加额外安全层

    使用ssh-keygen -p命令重新设置私钥密码。

  3. 定期轮换密钥 :建议每3-6个月更换一次密钥对,降低长期使用带来的风险。

  4. 备份私钥 :妥善保管备份,防止意外丢失导致无法访问资源。

  5. 使用硬件令牌 :考虑将私钥存储在硬件安全模块(HSM)中,提供物理级别的保护。

通过实施这些措施,可以显著提高SSH密钥的安全性,有效防范潜在威胁。

SSH 高级应用

SSH 隧道和代理

SSH隧道是一种强大的网络工具,它不仅能实现安全的数据传输,还能突破网络限制,为用户提供灵活的网络访问方案

SSH隧道特别是在:企业内网和云服务架构中扮演着至关重要的角色

SSH隧道主要分为三种类型:本地端口转发、远程端口转发和动态端口转发。每种类型都有其独特的应用场景和优势。

三种SSH隧道类型的具体使用方式在上面

SSH隧道不仅可以用于突破网络限制,还能提供额外的安全保护

  • 通过使用SSH隧道,所有的网络流量都将被加密,有效防止了数据在网络传输过程中的泄漏。
  • 对于传输敏感信息或在不安全的网络环境中进行远程访问尤为重要

然而,使用SSH隧道时也需要注意一些安全问题。

  • 例如,如果在公共WiFi等不安全的网络环境中使用SSH隧道,虽然可以保护数据传输的安全性,但也可能暴露SSH连接本身的存在。
  • 因此,在使用SSH隧道时,应谨慎评估网络环境的安全性,并采取适当的安全措施,如使用强密码或公钥认证等

SSH自动化和脚本编写

  • 在自动化运维和脚本编写中,SSH扮演着关键角色

  • 通过巧妙利用Expect工具,可以将复杂的交互过程转化为自动化脚本,实现高效的操作流程

  • Expect命令允许将交互过程封装成脚本,实现自动化执行

    • 例如,使用spawn ssh user@host启动SSH会话,
    • 随后通过sendexpect命令模拟用户输入和系统响应,实现自动化的远程登录和操作。
  • 这种方法特别适用于:需要频繁执行的重复性任务,如批量更新服务器软件监控系统状态

  • 通过将这些操作封装成脚本,不仅可以提高效率,还能减少人为错误,确保任务的一致性和可靠性。

SSH 安全加固措施

在前文介绍了SSH的基础知识和配置后,我们现在来探讨如何进一步加强SSH服务器的安全性。以下是几种有效的SSH安全加固措施:

  1. 禁用密码认证 :通过将sshd_config文件中的PasswordAuthentication选项设置为no,可以强制用户使用密钥进行身份验证,大幅提高安全性。
  2. 限制root用户登录 :将PermitRootLogin选项设置为no可以防止root用户直接通过SSH登录,降低系统被攻击的风险。
  3. 启用密钥认证 :配置密钥登录后,确保只有授权用户能访问服务器。这需要在服务器上正确设置authorized_keys文件,并为私钥设置强密码保护。
  4. 更改默认端口 :将SSH服务端口从默认的22更改为其他较高数值的端口,可以降低被扫描和攻击的风险。
  5. 启用登录超时 :设置合理的LoginGraceTime选项,可以防止恶意用户长时间占用连接资源。

通过综合运用这些措施,可以显著提高SSH服务器的安全性,有效抵御未授权访问和潜在的攻击行为。

(未来版)人の自制饭SSH学习

  • 遇到了再补充吧
  • Copyrights © 2024-2025 brocademaple
  • 访问人数: | 浏览次数:

      请我喝杯咖啡吧~

      支付宝
      微信