如何让你的服务器更安全(一):使用 SSH 密钥连接 Linux 服务器

我们在连接 Linux 服务器时,默认的方式是使用密码登录,这存在很明显的弊端:简单密码容易被破解,而复杂密码又难以记忆和输入,非常不便。

因此,使用 SSH 密钥进行登录成为了一种更安全、更高效的推荐方案。通过密钥认证,我们不仅可以免去记忆和输入繁琐密码的麻烦,还能极大提升服务器的安全性,有效抵御未授权的访问尝试。

我们将使用 Ed25519 格式密钥,它的公钥更简洁,是一种比 RSA 更现代、更安全的加密算法。

第一步:生成 SSH 密钥对

首先,在本地电脑上生成一对 SSH 密钥:

  1. 打开终端,运行以下命令:
    1
    ssh-keygen -t ed25519 -C "[email protected]"
  • -t ed25519:指定密钥类型为 Ed25519。
  • -C "[email protected]":为你的密钥添加一个注释,方便以后识别。
  1. 命令运行后,会提示设置保存的文件名(路径),输入文件名称或是直接回车保持默认。

    1
    Enter file in which to save the key (/home/your_username/.ssh/id_ed25519):
  2. 接下来,程序会提示你输入一个密码短语 (passphrase),选择是否为私钥设置密码,直接回车即是不使用密码。

    1
    2
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
  3. 成功生成后,你会看到类似以下的输出:

    1
    2
    Your identification has been saved in /home/your_username/.ssh/id_ed25519
    Your public key has been saved in /home/your_username/.ssh/id_ed25519.pub

此时,在 ~/.ssh/ 目录下会生成两个文件:

  • id_ed25519:私钥 (private key),请务必妥善保管,切勿泄露给任何人。
  • id_ed25519.pub:公钥 (public key),可以安全地分享给他人或上传到服务器。

第二步:上传公钥到服务器

我们已经生成了需要使用的密钥对,下一步需要将公钥复制到你的 Linux 服务器上。

  1. 使用 ssh-copy-id 命令(推荐)
    这是最简单的方法。它会自动将你的公钥复制到服务器的 ~/.ssh/authorized_keys 文件中,并自动设置正确的权限。

    运行以下命令即可:

    1
    ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip

    程序会提示你输入服务器的密码。输入密码后,公钥就会被自动上传。

  2. 手动复制
    如果 ssh-copy-id 不可用或是密码登录已经被禁用,我们可以手动添加。

    首先,在本地终端运行以下命令,查看并复制公钥内容:

    1
    cat ~/.ssh/id_ed25519.pub

    然后通过 Web Console 登录服务器的终端后,在服务器上创建 .ssh 目录(如果不存在),并设置正确的权限:

    1
    2
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh

    接着,打开或创建 authorized_keys 文件:

    1
    vim ~/.ssh/authorized_keys

    将你刚才在本地复制的公钥内容粘贴到文件中,然后保存并退出。

    1
    echo "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... [email protected]" >> ~/.ssh/authorized_keys

    最后,设置 authorized_keys 文件的权限为 600:

    1
    chmod 600 ~/.ssh/authorized_keys

第三步:测试密钥登录

在本地终端尝试使用密钥登录服务器:

1
ssh username@server_ip

如果我们更改了文件名称,不是默认的 id_ed25519,需要手动指定私钥的路径:

1
ssh username@server_ip -i ~/.ssh/your_private_key

如果成功登录,说明已经配置成功。

第四步:禁用密码登录

为了进一步提升服务器安全性,我们应该禁用密码登录,只允许密钥登录。

  1. 通过 SSH 密钥登录你的服务器。

  2. 在修改之前先备份原始配置

    1
    sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
  3. 使用你喜欢的编辑器打开 SSH 配置文件:

    1
    sudo vim /etc/ssh/sshd_config
  4. 在文件中找到以下行,并修改它们的值:
    找到 PasswordAuthentication yes,将其修改为 no

    如果需要修改 SSH 连接端口,可以找到 Port 22,将 22 设置为其他的端口

  5. 保存并退出文件。

  6. 重启 SSH 服务以应用更改:

    1
    sudo systemctl restart sshd

    如果修改了 SSH 连接端口,在断开当前链接前,一定要新开一个终端窗口进行测试能否成功连接

  7. 尝试使用密码登录服务器,测试是否可以完成登录。

第五步:使用 ~/.ssh/config 文件管理连接

如果我们的私钥文件名称不是默认名称,那么在连接服务器时需要手动指定私钥文件的路径,又或是我们更改了 SSH 链接的端口号,每次链接时也需要手动指定。

很不方便,我们可以使用 ~/.ssh/config 文件管理链接信息,它允许你为每个服务器设置一个别名和特定的连接选项。

  1. 在本地电脑上,创建或打开 ~/.ssh/config 文件。

  2. 为你的服务器添加一个配置,例如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 服务器1配置 
    Host myserver
    HostName 192.168.1.100 # 你的服务器 IP 地址或域名
    User username # 你的用户名
    Port 2222 # SSH 端口(如果不是默认的 22)
    IdentityFile ~/.ssh/id_ed25519 # 指定密钥文件路径

    # 服务器2配置
    Host webserver
    HostName example.com
    User webuser
    Port 2222
    IdentityFile ~/.ssh/webserver_key

    Host 字段是连接的别名,可以随意命名。

  3. 保存后,就可以使用别名来连接服务器了:

    1
    2
    3
    ssh myserver

    ssh webserver

故障排除

常见问题一般都是文件的权限问题

常见问题检查

1
2
3
4
5
6
7
8
# 检查.ssh目录权限
ls -l ~/.ssh/

# 检查密钥权限
ls -l ~/.ssh/id_ed25519*

# 检查authorized_keys权限
ls -l ~/.ssh/authorized_keys

正确的权限设置

  • ~/.ssh/ 目录:700 (drwx——)
  • ~/.ssh/id_ed25519 私钥:600 (-rw——-)
  • ~/.ssh/authorized_keys:600 (-rw——-)
  • ~/.ssh/config:600 (-rw——-)

SSH 调试模式

1
2
# 使用详细模式连接,查看详细信息
ssh -vvv username@server-ip