如何使用SSH Keygen:安全连接服务器的密钥生成方法 – wiki基地

如何使用 SSH Keygen:安全连接服务器的密钥生成方法

在现代网络环境中,服务器的安全访问至关重要。传统的用户名和密码认证方式容易受到暴力破解和字典攻击,安全性较低。SSH(Secure Shell)协议提供了一种更安全的远程登录和访问服务器的方式,而 SSH 密钥对是 SSH 安全认证的核心。本文将深入探讨 SSH Keygen 的使用方法,包括密钥的生成、管理、配置以及最佳实践,帮助你建立更安全的服务器连接。

1. SSH 密钥认证:为什么比密码更安全?

在深入了解 SSH Keygen 之前,我们首先需要理解为什么 SSH 密钥认证比传统的密码认证更安全。

  • 密码认证的弱点:

    • 暴力破解: 攻击者可以使用自动化工具尝试各种可能的密码组合,直到找到正确的密码。
    • 字典攻击: 攻击者使用包含常用密码和单词的字典文件,尝试猜测密码。
    • 社会工程学: 攻击者可能通过欺骗、钓鱼等手段获取用户的密码。
    • 键盘记录器: 恶意软件可以记录用户在键盘上输入的密码。
    • 密码重用: 用户在多个网站或服务中使用相同的密码,一旦其中一个密码泄露,其他账户也会受到威胁。
  • SSH 密钥认证的优势:

    • 非对称加密: SSH 密钥认证使用非对称加密算法(如 RSA、DSA、ECDSA、Ed25519)。这意味着密钥由一对密钥组成:公钥和私钥。公钥可以公开分享,用于加密数据;私钥必须严格保密,用于解密数据。
    • 难以破解: 即使公钥被截获,攻击者也无法通过公钥推导出私钥。破解私钥需要极高的计算能力,在当前技术条件下几乎不可能实现。
    • 无需记忆: 用户无需记忆复杂的密码,只需保管好私钥文件。
    • 防止中间人攻击: SSH 客户端会验证服务器的公钥指纹,防止连接到伪造的服务器。
    • 可设置密码短语(Passphrase): 可以为私钥设置密码短语,提供额外的安全保护。即使私钥文件泄露,没有密码短语也无法使用。

2. SSH Keygen:密钥生成工具

SSH Keygen 是一个用于创建 SSH 密钥对的命令行工具,通常与 OpenSSH 软件包一起安装在大多数 Linux、macOS 和 Unix-like 系统中。Windows 系统可以通过安装 Git Bash、Windows Subsystem for Linux (WSL) 或 PuTTYgen 等工具来使用 SSH Keygen。

2.1. 基本语法

bash
ssh-keygen [选项]

2.2. 常用选项

  • -t <type>:指定密钥类型。常用的密钥类型包括:

    • rsa:(默认)Rivest-Shamir-Adleman 算法,应用广泛,兼容性好。
    • dsa:Digital Signature Algorithm,较旧的算法,安全性较低,不推荐使用。
    • ecdsa:Elliptic Curve Digital Signature Algorithm,基于椭圆曲线密码学,安全性较高,密钥长度较短。
    • ed25519:基于 Edwards 曲线数字签名算法,安全性高,密钥长度短,性能好,推荐使用。
  • -b <bits>:指定密钥长度(位数)。对于 RSA 密钥,建议至少使用 2048 位,推荐使用 4096 位。对于 ECDSA 密钥,可以使用 256、384 或 521 位。Ed25519 密钥固定为 256 位。

  • -f <filename>:指定密钥文件的保存路径和文件名。如果不指定,默认保存在 ~/.ssh/ 目录下,私钥文件名为 id_<type>,公钥文件名为 id_<type>.pub

  • -C <comment>:添加注释,用于标识密钥的用途或所有者。

  • -N <new_passphrase>:设置私钥的密码短语。强烈建议设置一个强密码短语。

  • -P <old_passphrase>:如果需要修改现有私钥的密码短语,使用此选项指定旧的密码短语。

  • -p:更改现有私钥的密码短语,而不重新生成密钥对。

2.3. 密钥生成示例

  1. 生成默认的 RSA 密钥对(不推荐):

    bash
    ssh-keygen

    这将在 ~/.ssh/ 目录下生成 id_rsa(私钥)和 id_rsa.pub(公钥)文件。系统会提示你输入密码短语(强烈建议设置)。

  2. 生成 4096 位的 RSA 密钥对(推荐):

    bash
    ssh-keygen -t rsa -b 4096 -C "[email protected]"

    这将生成更安全的 4096 位 RSA 密钥对,并添加注释。

  3. 生成 Ed25519 密钥对(强烈推荐):

    bash
    ssh-keygen -t ed25519 -C "[email protected]"

    这将生成安全性更高、性能更好的 Ed25519 密钥对。

  4. 生成密钥并指定保存路径:

    bash
    ssh-keygen -t ed25519 -f ~/.ssh/my_server_key -C "Key for My Server"

    这将在~/.ssh文件夹中创建一个名为my_server_key的私钥文件, 和一个my_server_key.pub的公钥文件

2.4. 密钥生成过程详解

当你运行 ssh-keygen 命令时,会发生以下步骤:

  1. 选择密钥类型和长度: 根据你指定的选项(或默认值),ssh-keygen 会选择相应的密钥算法和长度。
  2. 生成随机数: ssh-keygen 会生成一个高质量的随机数,作为生成密钥的基础。随机数的质量对于密钥的安全性至关重要。
  3. 生成密钥对: 使用选定的算法和随机数,ssh-keygen 会生成一对密钥:私钥和公钥。
  4. 设置密码短语(可选): 系统会提示你输入密码短语。如果你设置了密码短语,私钥将被加密,只有输入正确的密码短语才能使用私钥。
  5. 保存密钥文件: ssh-keygen 会将私钥和公钥保存到指定的文件中(或默认的 ~/.ssh/ 目录下)。

3. 密钥管理

生成密钥对后,妥善管理密钥至关重要。以下是一些密钥管理的最佳实践:

3.1. 私钥保护

  • 严格保密: 私钥是你的数字身份,绝不能泄露给任何人。不要通过电子邮件、聊天工具或其他不安全的方式传输私钥。
  • 设置强密码短语: 为私钥设置一个强密码短语,即使私钥文件被盗,没有密码短语也无法使用。
  • 限制访问权限: 将私钥文件的权限设置为只有你自己可以读取(例如,chmod 600 ~/.ssh/id_ed25519)。
  • 安全存储: 将私钥文件存储在安全的位置,例如加密的硬盘分区、硬件安全模块(HSM)或专用的密钥管理工具中。
  • 定期备份: 定期备份私钥文件,以防硬件故障或意外删除。将备份存储在安全的地方,并确保备份的安全性。
  • 不要将私钥存储在版本控制系统(如Git)中: 私钥应该被视为敏感信息, 不应该被公开或与代码一起存储.

3.2. 公钥部署

  • 复制公钥到服务器: 将公钥的内容复制到目标服务器的 ~/.ssh/authorized_keys 文件中。你可以使用 ssh-copy-id 命令(见下文)或手动复制。
  • 设置权限: 确保 ~/.ssh/authorized_keys 文件的权限设置为只有服务器上的用户可以读取和写入(例如,chmod 600 ~/.ssh/authorized_keys)。
  • 多个公钥: 可以在 authorized_keys 文件中添加多个公钥,允许不同的用户或设备使用不同的密钥访问服务器。
  • 删除不再使用的公钥: 定期检查 authorized_keys 文件,删除不再使用的公钥,以减少潜在的安全风险。

3.3. 使用 ssh-copy-id 快速部署公钥

ssh-copy-id 是一个方便的工具,可以自动将你的公钥复制到远程服务器的 authorized_keys 文件中。

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host

  • -i 选项指定要复制的公钥文件。
  • user 是远程服务器上的用户名。
  • remote_host 是远程服务器的 IP 地址或域名。

ssh-copy-id 会提示你输入远程服务器上用户的密码,然后自动将公钥添加到 authorized_keys 文件中,并设置正确的权限。

4. SSH 客户端配置

为了使用 SSH 密钥连接到服务器,你需要在 SSH 客户端进行相应的配置。

4.1. 使用密钥连接服务器

bash
ssh -i ~/.ssh/id_ed25519 user@remote_host

  • -i 选项指定要使用的私钥文件。
  • user 是远程服务器上的用户名。
  • remote_host 是远程服务器的 IP 地址或域名。

如果私钥设置了密码短语,系统会提示你输入密码短语。

4.2. SSH 配置文件

你可以通过编辑 SSH 客户端配置文件(通常是 ~/.ssh/config)来简化 SSH 连接。

Host my_server
HostName remote_host
User user
IdentityFile ~/.ssh/id_ed25519
Port 2222

  • Host:定义一个别名,方便连接。
  • HostName:远程服务器的 IP 地址或域名。
  • User:远程服务器上的用户名。
  • IdentityFile:指定要使用的私钥文件。
  • Port: 指定SSH服务端口(如果不是默认的22端口)

保存配置文件后,你可以使用以下命令连接到服务器:

bash
ssh my_server

4.3. SSH Agent 和 ssh-add

如果你的私钥设置了密码短语,每次连接服务器时都需要输入密码短语,这可能会很麻烦。SSH Agent 是一个密钥管理器,可以缓存解密后的私钥,让你在一段时间内无需重复输入密码短语。

  1. 启动 SSH Agent:

    bash
    eval "$(ssh-agent -s)"

    或者,在某些系统上,SSH Agent 可能会自动启动。

  2. 添加私钥到 SSH Agent:

    bash
    ssh-add ~/.ssh/id_ed25519

    系统会提示你输入私钥的密码短语。

  3. 列出已添加的密钥:

    bash
    ssh-add -l

    现在, 你可以在不输入密码短语的情况下使用SSH连接到服务器了(只要SSH Agent正在运行).

5. 服务器端 SSH 配置

为了提高服务器的安全性,你可以在服务器端进行一些 SSH 配置。

5.1. 修改 SSH 配置文件

SSH 服务器的配置文件通常是 /etc/ssh/sshd_config。你可以使用文本编辑器(如 nanovim)打开并编辑此文件。

5.2. 禁用密码认证

为了强制使用密钥认证,你可以禁用密码认证。在 sshd_config 文件中找到以下行:

“`

PasswordAuthentication yes

“`

将其修改为:

PasswordAuthentication no

5.3. 禁用 root 登录

为了防止攻击者直接以 root 用户身份登录,建议禁用 root 登录。在 sshd_config 文件中找到以下行:

“`

PermitRootLogin yes

将其修改为:
PermitRootLogin no
或者, 更推荐的方式是允许root用户通过密钥登录, 但禁止root用户通过密码登录:
PermitRootLogin prohibit-password
“`

5.4. 更改 SSH 端口

默认的 SSH 端口是 22,攻击者可能会扫描此端口。更改 SSH 端口可以增加安全性。在 sshd_config 文件中找到以下行:

“`

Port 22

“`

将其修改为:

Port 2222 # 或其他未使用的端口号
重要提示: 更改端口后, 需要在防火墙中开放新端口.

5.5. 限制登录尝试次数

为了防止暴力破解攻击,可以限制登录尝试次数。在 sshd_config 文件中找到以下行:

“`

MaxAuthTries 6

“`
根据需要修改尝试次数.

5.6. 启用公钥认证

确保 sshd_config 文件中启用了公钥认证:

PubkeyAuthentication yes

5.7. 重启 SSH 服务

修改 sshd_config 文件后,需要重启 SSH 服务才能使更改生效。

bash
sudo systemctl restart sshd # 对于使用 systemd 的系统

bash
sudo service ssh restart # 对于使用 SysVinit 的系统

6. SSH 密钥的最佳实践

  • 使用强密码短语: 为私钥设置一个强密码短语,包含大小写字母、数字和符号。
  • 定期更换密钥: 定期更换密钥,以减少密钥泄露的风险。
  • 使用不同密钥: 为不同的服务器或服务使用不同的密钥对,避免一个密钥泄露导致所有服务器受到威胁。
  • 使用硬件安全模块(HSM): 如果需要更高的安全性,可以使用 HSM 来存储和管理私钥。
  • 审计 SSH 日志: 定期审查 SSH 日志,检查是否有异常登录尝试。
  • 使用防火墙: 配置防火墙,只允许来自可信 IP 地址的 SSH 连接。
  • 使用两步验证(2FA): 结合 SSH 密钥和两步验证(如 Google Authenticator、Authy 等),提供更高级别的安全保护。

7. 常见问题解答

  • 忘记私钥密码短语怎么办?
    如果你忘记了私钥的密码短语,你将无法使用该私钥。唯一的解决办法是重新生成一个新的密钥对,并将新公钥部署到服务器上。

  • 如何撤销一个 SSH 密钥?
    如果你怀疑某个密钥已被泄露,或者不再需要使用该密钥,你应该立即从服务器的 authorized_keys 文件中删除相应的公钥。

  • 如何在 Windows 上使用 SSH Keygen?
    在 Windows 上,你可以使用以下方法生成 SSH 密钥:

    • Git Bash: 安装 Git for Windows,它包含 Git Bash,其中包含 SSH Keygen。
    • Windows Subsystem for Linux (WSL): 安装 WSL,然后在 WSL 中使用 SSH Keygen。
    • PuTTYgen: PuTTYgen 是一个图形化的密钥生成工具,可以生成 SSH 密钥对。
  • .pub文件是做什么用的?
    .pub文件包含的是公钥, 用于放在服务器端, 验证客户端的身份. 它是公开的, 可以安全地分享.

  • 我可以将同一个私钥用于多个服务器吗?
    技术上可行, 但不推荐. 这样做会增加风险: 如果私钥泄露, 所有使用该私钥的服务器都会受到威胁. 最佳实践是为每个服务器使用不同的密钥对.

8. 总结

SSH 密钥认证是一种安全、可靠的远程服务器访问方式。通过理解 SSH Keygen 的使用方法、密钥管理、客户端和服务器端配置以及最佳实践,你可以建立更安全的服务器连接,保护你的服务器免受未经授权的访问。记住,密钥安全的关键在于私钥的保护,务必妥善保管你的私钥,并采取适当的安全措施。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部