告别密码:Ubuntu 服务器 SSH 密钥登录完全配置指南

本文是一份面向开发者和系统管理员的实践指南,详细阐述了如何在 Ubuntu 服务器上设置和使用 SSH 密钥认证,彻底替代传统的密码登录。内容涵盖从生成 Ed25519 密钥对、部署公钥,到禁用密码登录、加固服务器安全,以及 SSH Agent 和配置文件等进阶技巧。

阅读时长: 5 分钟
共 2342字
作者: eimoon.com

如果你还在用密码登录你的远程服务器,是时候停下来了。密码登录不仅麻烦,而且在今天这个自动化攻击猖獗的时代,简直就是在给服务器安全“开盲盒”。使用 SSH 密钥对进行身份验证,是一个根本性的安全飞跃的,也是每个开发者和系统管理员都应该掌握的基本功。

这篇指南会带你走完整个流程,从在你自己的电脑上生成密钥,到把它部署到 Ubuntu 服务器,最后彻底关掉密码登录的大门。我会用最直接、最推荐的方式来讲解,确保你一次就能配置成功。

SSH 密钥工作的基本原理

不想听长篇大论的密码学理论?没问题,你只需要记住这几点:

SSH 密钥认证基于非对称加密。你会在你的本地电脑上生成一对密钥:

  1. 私钥 (Private Key): 这是你的秘密,必须妥善保管,绝对不能泄露。它相当于你的唯一身份证明。
  2. 公钥 (Public Key): 这是可以公开分享的“锁”。你可以把它放到任何你想要访问的服务器上。

当你尝试连接服务器时,服务器会用你放在上面的公钥(锁)生成一个“挑战”,发给你的电脑。你的电脑用私钥(钥匙)来解开这个挑战,并把答案发回给服务器。服务器一看答案正确,就知道是你本人,于是就放你进去了。整个过程,你的私钥从未离开过你的电脑,非常安全。

为什么推荐 Ed25519 算法?

你可能会看到很多旧教程还在用 RSA 算法。但在今天,Ed25519 是更好的选择。它更现代、更安全,而且性能(尤其在生成和验证签名时)比 RSA 快得多。除非你需要兼容一些非常古老的系统,否则直接用 Ed25519 就对了。

第一步:在本地电脑生成密钥对

打开你本地电脑(无论是 macOS、Linux 还是 Windows 的 WSL)的终端,输入以下命令:

ssh-keygen -t ed25519

这个命令会启动密钥生成程序。

  1. 保存位置: 程序会问你把密钥保存在哪里。直接按回车键接受默认路径 (~/.ssh/id_ed25519) 就行。如果你已经有同名密钥,它会提示你是否覆盖,请小心操作。

    > Generating public/private ed25519 key pair.
    > Enter file in which to save the key (/home/your_user/.ssh/id_ed25519):
    
  2. 设置密码短语 (Passphrase): 接下来,它会提示你输入一个密码短语。强烈建议你设置一个!

    > Enter passphrase (empty for no passphrase):
    > Enter same passphrase again:
    

    这个密码短语是给你的私钥文件上的一道额外保险。即使你的电脑被黑,私钥文件被偷了,黑客没有这个密码短语也无法使用它。虽然每次连接需要多输入一次,但后面我们会讲到如何用 ssh-agent 来解决这个小麻烦。

完成后,你的 ~/.ssh 目录下就会多出两个文件:id_ed25519 (私钥) 和 id_ed25519.pub (公钥)。

第二步:将公钥部署到服务器

现在,我们需要把公钥 (id_ed25519.pub) 的内容放到服务器上。最简单、最不容易出错的方法是使用 ssh-copy-id 命令。

假设你的服务器 IP 地址是 123.45.67.89,你在服务器上的用户名是 sammy,执行:

ssh-copy-id sammy@123.45.67.89

这个工具会自动完成所有事情:

  • 通过 SSH 连接到你的服务器(这时会要求你最后一次输入 sammy 用户的密码)。
  • 在服务器上创建 ~/.ssh 目录和 authorized_keys 文件(如果不存在的话)。
  • 将你的公钥内容追加到 authorized_keys 文件中。
  • 设置正确的目录和文件权限(这是手动操作时最容易出错的地方)。

如果你的本地电脑上没有 ssh-copy-id 命令(比如某些版本的 Windows),也可以手动操作:

  1. 先在本地电脑上获取公钥内容:

    cat ~/.ssh/id_ed25519.pub
    

    复制输出的整行内容。

  2. 用密码登录到你的服务器。

  3. 在服务其上执行以下命令,把刚刚复制的公钥内容粘贴进去:

    mkdir -p ~/.ssh && chmod 700 ~/.ssh
    echo "在这里粘贴你复制的公钥字符串" >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    

    注意 >> 是追加,不要写成 >,否则会覆盖掉文件里已有的其他密钥。

第三步:测试并彻底禁用密码登录

公钥部署好后,是时候验证一下了。在你的本地终端里,重新连接服务器:

ssh sammy@123.45.67.89
  • 如果你设置了密码短语,系统会提示你输入它。
  • 如果没有设置,你应该能直接登录成功,不需要输入任何密码。

确认密钥登录没问题后,我们就可以执行最关键的安全步骤:在服务器上禁用密码登录

  1. 登录到你的服务器。

  2. sudo 编辑 SSH 服务的配置文件:

    sudo nano /etc/ssh/sshd_config
    
  3. 找到 PasswordAuthentication 这一行,把它修改为 no。它可能被注释掉了(前面有 #),记得把 # 去掉。

    # ...
    PasswordAuthentication no
    # ...
    
  4. 同时,最好也禁止 root 用户直接通过 SSH 登录。找到 PermitRootLogin 并确保它的值是 no

    PermitRootLogin no
    
  5. 保存文件并退出 (Ctrl+X,然后按 Y,再按回车)。

  6. 重启 SSH 服务使配置生效:

    sudo systemctl restart ssh
    

【重要警告】: 在你断开当前的 SSH 连接之前,务必打开一个新的终端窗口,尝试用 SSH 密钥再次登录服务器。确保你还能连上!否则,错误的配置可能会让你被锁在服务器外面。确认新连接没问题后,你就可以放心地关闭所有连接了。从现在起,这台服务器只认你的密钥,不认密码。

SSH 进阶技巧:让工作更流畅

使用 SSH Agent 管理密码短语

每次连接都要输入密码短语确实有点烦。ssh-agent 就是为了解决这个问题而生的。它是一个在后台运行的程序,可以安全地缓存你解密后的私钥。

  1. 启动 agent:

    eval "$(ssh-agent -s)"
    
  2. 将你的私钥添加到 agent(只需要在每次开机后做一次):

    ssh-add ~/.ssh/id_ed25519
    

    输入你的密码短语后,在当前终端会话中,你所有后续的 SSH 连接都将自动使用这个密钥,在也不会要求你输入密码短语了。

简化连接:配置 ~/.ssh/config

如果你管理多台服务器,每次都输入 ssh username@long-ip-address 也很低效。你可以在本地电脑的 ~/.ssh/ 目录下创建一个 config 文件来管理所有连接。

touch ~/.ssh/config
nano ~/.ssh/config

在文件里,你可以这样设置别名:

# 我的主力开发服务器
Host dev-server
    HostName 123.45.67.89
    User sammy
    IdentityFile ~/.ssh/id_ed25519

# 公司的跳板机
Host bastion
    HostName bastion.mycompany.com
    User myuser
    IdentityFile ~/.ssh/work_key

保存后,你只需要输入 ssh dev-server 就可以连接到你的开发服务器了,非常方便。

疑难解答

  • 错误: Permission denied (publickey)

    • 最常见的原因是服务器上 ~/.ssh 目录或 authorized_keys 文件的权限不对。SSH 对权限要求很严格。请在服务器上运行 chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys 来修复。
    • 也可能是你本地的私钥文件权限过于开放。运行 chmod 600 ~/.ssh/id_ed25519
  • 还是提示我输入密码

    • 这说明服务器没有成功识别你的密钥。检查一下你的公钥内容是否完整、正确地复制到了服务器的 authorized_keys 文件中,确保没有换行或缺失字符。
  • 万能调试工具

    • 如果遇到任何连接问题,使用 -v (verbose) 参数,它会打印出详细的连接过程,能帮你快速定位问题所在。
    ssh -v sammy@123.45.67.89
    

    如果信息不够,可以用 -vv 甚至 -vvv 获取更详细的输出。

配置 SSH 密钥登录是一个一劳永逸的过程。花上几分钟,你就能大大提升服务器的安全性和自己的工作效率。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
```
使用 Hugo 构建
主题 StackJimmy 设计