手动绑定密钥对实现SSH免密登录

在控制台绑定密钥时需要重启实例,但这可能影响业务连续性。如果您希望在不重启实例的情况下绑定密钥,可以参考本文进行手动操作。本文将详细介绍如何为实例手动绑定密钥对,实现免密登录。

方案概述

手动绑定密钥对并实现免密登录需要进行以下操作:

  1. 生成密钥对:其中密钥作为后续登录的凭证,由您自行保存,公钥将存储在实例内。

  2. 为实例绑定公钥:通过可靠的连接方式,将您的公钥添加到实例中。本步骤主要关注~/.ssh/authorized_keys配置文件。

  3. 开启SSH服务端的公钥认证功能:在绑定公钥后,您还需要在实例的SSH服务端开启公钥认证功能。本步骤主要关注/etc/ssh/sshd_config配置文件。

  4. 通过密钥对认证连接实例:在完成前几步操作后,可以通过SSH认证的方式连接实例,验证密钥认证功能已经配置成功。

1. 生成密钥对

您可以通过多种方式生成密钥对,不同的工具生成密钥对的步骤有所差别,本步骤以通过执行ssh-keygen命令生成密钥对为例。在命令行输入以下命令生成密钥对。

说明

您也可以在控制台创建密钥对,创建后会自动下载私钥,此时还需要使用工具获取其公钥信息,具体操作,请参见SSH密钥对SSH密钥对

ssh-keygen -t rsa -b 2048 -f id_rsa
  • -t rsa:代表密钥类型为rsa密钥对。

  • -b 2048:代表密钥长度为2048位。

  • -f id_rsa:代表生成密钥对的文件名以及保存位置。

重要

执行这条命令后,系统会提示您输入一个密码短语(passphrase),用于保护私钥。设置密码后,即使私钥被盗,攻击者也需要密码才可以使用私钥。

如果您不希望为私钥设置密码,可以直接按回车键跳过。

命令执行完成后,会在当前命令行所在目录下生成一对密钥文件:id_rsa.pub(公钥)、id_rsa(私钥),请妥善保存私钥,不要泄漏给他人

2. 为实例绑定公钥

为实例绑定公钥后,可以在连接实例时通过与其相对应的私钥作为登录凭证。

  1. 选择合适的方式连接到ECS实例,具体操作,请参见连接到Linux实例(SSH)通过会话管理连接到实例(Windows/Linux、支持免密登录)

  2. ~/.ssh/authorized_keys中配置公钥文件。

    在操作之前,您需要明确登录Linux系统的用户身份,例如使用ecs-user的身份登录实例,就需要为ecs-user配置公钥。

    设置root用户的公钥

    1. 创建authorized_keys配置文件。

      root用户的公钥配置文件在/root/.ssh/authorized_keys路径下。如果没有该文件,请输入以下命令创建.ssh文件夹和authorized_keys配置文件。

      sudo mkdir /root/.ssh
      sudo touch /root/.ssh/authorized_keys
    2. 步骤1中生成的公钥信息复制到/root/.ssh/authorized_keys配置文件中。

      您可以使用vim编辑器编辑该文件,具体操作,请参见Vim编辑器
    3. 修改该配置文件的权限。

      该文件配置过高的权限会导致SSH连接失败,请设置以下权限。

      sudo chmod 700 /root/.ssh
      sudo chmod 600 /root/.ssh/authorized_keys

    设置非root用户的公钥

    如果您要为其他系统用户绑定密钥对,请参考以下步骤。

    1. 创建authorized_keys配置文件。

      找到/home/<username>/.ssh/authorized_keys配置文件,其中<username>为您待绑定密钥对的用户。

      例如您需要给ecs-user绑定密钥对,您需要关注/home/ecs-user/.ssh/authorized_keys配置文件。

      如果没有该配置文件,请输入以下命令在对应用户的家目录下创建配置文件。

      命令中<user_name>为您待绑定公钥用户的用户名。
      sudo mkdir /home/<username>/.ssh
      sudo touch /home/<username>/.ssh/authorized_keys
    2. 步骤1中生成的公钥复制到/home/<user_name>/.ssh/authorized_keys配置文件中。该文件可以支持多行,如果要绑定多个密钥对,可以在新的一行添加新的公钥信息。

      您可以使用vim编辑器编辑该文件,具体操作,请参见Vim编辑器
    3. 修改该配置文件的权限。

      该文件配置过高的权限会导致SSH连接失败,请设置以下权限。

      命令中<username>为您待绑定公钥用户的用户名。
      sudo chmod 700 /home/<username>/.ssh
      sudo chmod 600 /home/<username>/.ssh/authorized_keys

3. 开启SSH服务的公钥认证功能

在实例内配置公钥之后,需要开启SSH服务的公钥认证功能,否则无法使用密钥对连接实例。

  1. 修改SSH的配置文件/etc/ssh/sshd_config中的PubkeyAuthentication参数为yes,代表开启公钥认证功能。

    重要

    您可以使用vim编辑器编辑该文件,具体操作,请参见Vim编辑器。建议修改前备份该配置文件,防止误操作导致的SSH服务启动失败。

  2. 输入命令,重启SSH服务,使配置生效。

    以Alibaba Cloud Linux 3为例,输入以下命令重启SSH服务。

    部分操作系统(Ubuntu/Debian)的SSH服务名为ssh而非sshd,请根据实际情况调整。
    sudo systemctl restart sshd
    重要

    如果您是通过SSH的方式连接到实例,重启服务时您的连接可能会发生中断,等待SSH服务重启完成后,您可以重新连接到该实例。

4. 通过密钥对认证实现免密登录

在配置完成密钥对之后,您可以使用密钥对认证的方式连接到Linux实例,不同的工具使用步骤不同,本文以通过命令行和阿里云控制台的Workbench为例,为您介绍如何通过密钥对认证的方式登录Linux实例。

命令行

在完成前面的配置操作之后,您可以在命令行输入以下命令连接Linux实例。

ssh -i <identity_file_path> -p <ssh_port> <username>@<server_ip>

该命令中各个参数说明如下:

  • <identity_file_path>:私钥文件位置。

  • <ssh_port>:SSH服务的端口,默认为22。

  • <username>: 通过指定用户的身份登录实例。

  • <server_ip>:实例的IP地址(如果是本地远程连接ECS实例,需要填写实例的公网IP地址,若是在内网互通的其他云服务器上,可使用私网IP地址)。

Workbench

在使用Workbench通过公网IP或私网IP(SSH方式)连接到Linux实例时,可以选择通过密钥对认证的方式登录实例。具体操作,请参见通过密码或密钥认证登录Linux实例

image

更多操作

为同一用户绑定多个密钥对(公钥)

用户家目录下的.ssh/authorized_keys文件支持多行配置,每行添加一个公钥,即可让多个密钥对使用同一用户身份登录。

手动解绑密钥对(公钥)

您可以通过编辑用户家目录下的.ssh/authorized_keys文件,直接删除特定的公钥条目。删除后,对应的私钥将无法用于该用户的实例连接。

通过~/.ssh/config配置文件简化ssh连接命令

如果您经常连接到多个不同的实例,您可以使用本机~/.ssh/config配置文件简化命令,无需每次登录都输入完整的命令。具体配置方式如下。

  • 实现效果

    简化前:

    ssh -i <identity_file_path> -p <ssh_port> <username>@<server_ip>

    简化后:

    ssh <server_name>
  • 配置流程

    1. 在您的本机编辑或创建~/.ssh/config配置文件。

    2. 在该配置文件下添加以下内容:

      Host <server_name>
        HostName: <server_ip>
        User <username>
        IdentityFile <identity_file_path>
        Port <ssh_port>

      该配置文件中各个参数说明如下:

      • <server_name>:自定义服务器别名。

      • <server_ip>:实例的IP地址。

      • <username>: 通过指定用户的身份登录实例。

      • <identity_file_path>:私钥文件位置。

      • <ssh_port>:SSH服务的端口,默认为22。

    3. 配置后使用简化命令。<server_name>为您在~/.ssh/config配置文件中设置的服务器别名。

      ssh <server_name>