如何配置 SSH AuthorizedKeys 实现免密登录 – wiki大全

如何配置 SSH AuthorizedKeys 实现免密登录

SSH (Secure Shell) 是一种加密的网络协议,用于在不安全的网络上安全地执行网络服务。它最常见的用途是远程登录到服务器,执行命令,以及在计算机之间安全地传输文件。虽然默认的 SSH 登录需要密码,但这在自动化脚本、频繁登录或安全性要求更高的场景下显得不够便捷。通过配置 authorized_keys,我们可以实现免密登录,极大地提高效率和安全性。

本文将详细介绍如何配置 SSH authorized_keys 文件,实现免密登录。

为什么选择免密登录?

  1. 安全性提升:相比于每次输入密码,使用 SSH 密钥对进行身份验证更为安全。密钥更长、更复杂,难以暴力破解。
  2. 操作便利性:无需每次输入密码,节省时间,尤其适用于需要频繁连接服务器或在自动化脚本中集成 SSH 登录的场景。
  3. 自动化友好:是实现自动化部署、持续集成/持续交付 (CI/CD) 的基础。

核心原理

免密登录的核心是基于非对称加密的密钥对认证。

  1. 密钥对:由一个私钥 (Private Key) 和一个公钥 (Public Key) 组成。
    • 私钥:保存在本地客户端,绝不能泄露
    • 公钥:存放在远程服务器的 ~/.ssh/authorized_keys 文件中。
  2. 认证过程
    • 客户端尝试连接服务器。
    • 服务器向客户端发送一个随机字符串。
    • 客户端使用其私钥对该字符串进行加密,并将加密结果发送回服务器。
    • 服务器使用预存的公钥解密客户端发回的数据。如果解密成功,证明客户端拥有对应的私钥,服务器即允许免密登录。

配置步骤

步骤 1:在本地客户端生成 SSH 密钥对

如果您还没有 SSH 密钥对,需要先生成。打开您的终端或 Git Bash (Windows),执行以下命令:

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

  • -t rsa:指定密钥类型为 RSA。
  • -b 4096:指定密钥长度为 4096 位,提供更高的安全性(默认为 2048 位)。
  • -C "[email protected]":为密钥添加注释,通常是您的邮箱,便于识别。

执行命令后,系统会提示您:

  1. Enter file in which to save the key (/home/user/.ssh/id_rsa):
    • 这是密钥的保存路径。默认路径 ~/.ssh/id_rsa 通常是最佳选择,直接按回车即可。如果您想为不同的服务器创建不同的密钥,可以指定不同的文件名,例如 ~/.ssh/id_rsa_myserver
  2. Enter passphrase (empty for no passphrase):
    • 设置私钥的密码。强烈建议设置一个强密码。即使私钥被盗,攻击者也无法直接使用。如果您想完全免密(连私钥密码都不想输入),可以留空,但安全性会降低。
  3. Enter same passphrase again:
    • 确认密码。

生成成功后,您会在 ~/.ssh/ 目录下找到两个文件:
* id_rsa (私钥)
* id_rsa.pub (公钥)

请务必保护好您的私钥 id_rsa,不要将其分享给任何人。

步骤 2:将公钥复制到远程服务器

这是实现免密登录的关键一步。有几种方法可以将公钥复制到远程服务器。

方法 A:使用 ssh-copy-id (推荐)

ssh-copy-id 是一个方便的工具,它可以自动将您的公钥复制到远程服务器的 ~/.ssh/authorized_keys 文件中,并设置正确的权限。

bash
ssh-copy-id username@remote_host

  • username:您在远程服务器上的用户名。
  • remote_host:远程服务器的 IP 地址或域名。

第一次执行时,系统可能会提示您输入远程服务器的密码。成功后,您的公钥就会被添加到服务器上。

方法 B:手动复制公钥

如果您的本地系统没有 ssh-copy-id 工具,或者您更喜欢手动操作,可以使用 sshscp 命令。

  1. 使用 ssh 命令
    bash
    cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

    这个命令的解释:

    • cat ~/.ssh/id_rsa.pub:在本地显示公钥内容。
    • |:管道操作符,将 cat 的输出作为下一个命令的输入。
    • ssh username@remote_host:通过 SSH 连接到远程服务器。
    • "...":在远程服务器上执行的命令字符串。
      • mkdir -p ~/.ssh:如果 ~/.ssh 目录不存在,则创建它。
      • chmod 700 ~/.ssh:设置 ~/.ssh 目录的权限为 rwx------ (只有所有者有读、写、执行权限),这是 SSH 安全要求。
      • cat >> ~/.ssh/authorized_keys:将通过管道传输过来的公钥内容追加到 ~/.ssh/authorized_keys 文件中。如果文件不存在,则创建。
      • chmod 600 ~/.ssh/authorized_keys:设置 authorized_keys 文件的权限为 rw------- (只有所有者有读写权限),这也是 SSH 安全要求。
  2. 使用 scp 命令
    bash
    scp ~/.ssh/id_rsa.pub username@remote_host:~/.ssh/authorized_keys_temp

    这会将公钥文件复制到远程服务器的主目录下的一个临时文件。然后,您需要通过 SSH 连接到服务器,并手动将其添加到 authorized_keys 文件中并设置权限:
    bash
    ssh username@remote_host
    # 在远程服务器上执行以下命令
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    cat authorized_keys_temp >> ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    rm authorized_keys_temp
    exit

步骤 3:验证免密登录

复制公钥后,尝试从本地客户端连接到远程服务器:

bash
ssh username@remote_host

如果一切配置正确,您应该能够直接登录到远程服务器,而无需输入密码(如果您的私钥设置了密码,则只需输入私钥密码)。

步骤 4 (可选):配置 SSH 客户端 (config 文件)

为了更方便地管理多个 SSH 连接,您可以在本地客户端配置 ~/.ssh/config 文件。

创建或编辑 ~/.ssh/config 文件:

Host myserver
HostName remote_host_ip_or_domain
User username
Port 22 # 如果SSH端口不是22,请指定
IdentityFile ~/.ssh/id_rsa # 如果您为特定服务器使用了非默认私钥,请指定路径
# AddKeysToAgent yes # 自动将密钥添加到ssh-agent
# ForwardAgent yes # 转发认证代理连接

保存后,您就可以通过 ssh myserver 命令连接到服务器了。

步骤 5 (可选):禁用密码登录 (提高安全性)

一旦您确认免密登录工作正常,为了进一步提高服务器安全性,您可以在远程服务器上禁用密码登录。

  1. 通过 SSH 连接到远程服务器。
  2. 编辑 SSH 配置文件 /etc/ssh/sshd_config (需要 root 权限):
    bash
    sudo nano /etc/ssh/sshd_config
  3. 找到并修改以下行(如果被注释,请取消注释并修改):
    #PasswordAuthentication yes
    PasswordAuthentication no
  4. 保存文件并退出。
  5. 重启 SSH 服务以应用更改:
    • 对于大多数基于 Systemd 的系统 (如 Ubuntu 16.04+, CentOS 7+):
      bash
      sudo systemctl restart sshd
    • 对于旧版本系统 (如 Debian 8-, Ubuntu 14.04-):
      bash
      sudo service ssh restart

重要提示: 在禁用密码登录之前,请务必确认您的 SSH 密钥登录已经完全正常工作,并且您能够成功登录。否则,一旦禁用密码登录,您将无法通过密码登录服务器,可能会导致无法访问。

故障排除

  • 权限问题
    • ~/.ssh 目录权限必须是 700 (drwx------)。
    • ~/.ssh/authorized_keys 文件权限必须是 600 (-rw-------)。
    • 检查这些权限:ls -ld ~/.sshls -l ~/.ssh/authorized_keys
    • 如果权限不正确,请使用 chmod 命令修复。
  • 公钥内容错误:确保 authorized_keys 文件中的公钥内容是完整的、正确的,没有多余的空格或换行符。
  • 私钥密码:如果您为私钥设置了密码,在登录时需要输入私钥密码,而不是服务器密码。
  • SSH 服务未运行:确保远程服务器上的 SSH 服务 (sshd) 正在运行。
  • 防火墙:检查服务器和客户端的防火墙设置,确保 SSH 端口 (默认为 22) 是开放的。

通过以上步骤,您就可以成功配置 SSH 免密登录,享受更安全、更便捷的远程访问体验。

滚动至顶部