适用于:✔️ Linux VM ✔️ 灵活规模集

使用安全外壳 (SSH) 密钥对,可以创建使用 SSH 密钥进行身份验证的 Linux 虚拟机。 本文介绍如何创建和使用适用于 SSH 客户端连接的 SSH RSA 公钥 - 私钥文件对。

如果想要快捷命令而不是更深入的 SSH 密钥说明,请参阅 如何为 Azure 中的 Linux VM 创建 SSH 公钥-私钥对

若要创建 SSH 密钥并使用这些密钥从 Windows 计算机连接到 Linux VM,请参阅 如何在 Azure 上将 SSH 密钥与 Windows 配合使用 。 还可使用 Azure 门户 在门户中创建和管理用于创建 VM 的 SSH 密钥。

SSH 和密钥概述

SSH 是一种加密的连接协议,利用该协议可以通过未受保护的连接进行安全登录。 虽然 SSH 提供加密连接,但是将密码用于 SSH 连接仍会使 VM 易受到暴力攻击。 建议使用公钥-私钥对(也称为“SSH 密钥”)通过 SSH 连接到 VM。

  • 公钥放置在 VM 上。

  • 私钥 仍保留在本地系统上。 请保护好私钥, 不要透露给其他人。

    当你使用 SSH 客户端连接到 VM(具有公钥)时,远程 VM 会测试客户端以确保其具有正确的私钥。 如果客户端具有私钥,则授予其访问 VM 的权限。

    根据组织的安全策略,可重复使用单个公钥-私钥对来访问多个 Azure VM 和服务。 无需对要访问的每个 VM 或服务使用单独的密钥对。

    可与任何人共享公钥;但只有你(或本地安全基础结构)才应具有对私钥的访问权限。

    受支持的 SSH 密钥格式

    Azure 目前支持最小长度为 2048 位的 SSH 协议 2 (SSH-2) RSA 公钥-私钥对。 不支持其他密钥格式(如 ED25519 和 ECDSA)。

    SSH 密钥的使用和优势

    通过指定公钥创建 Azure VM 时,Azure 将公钥(以 .pub 格式)复制到 VM 上的 ~/.ssh/authorized_keys 文件夹。 ~/.ssh/authorized_keys 中的 SSH 密钥可确保连接客户端在 SSH 连接期间提供相应私钥。 在使用 SSH 进行身份验证的 Azure Linux VM 中,Azure 会禁用 SSH 服务器的密码验证系统,并且只允许 SSH 密钥身份验证。 使用 SSH 密钥创建 Azure Linux VM 可确保 VM 部署的安全,不必进行通常在部署完后需要进行的配置步骤(即在 sshd_config 文件中禁用密码)。

    如果不希望使用 SSH 密钥,可以将 Linux VM 设置为使用密码身份验证。 如果 VM 未向 Internet 公开,使用密码可能已足够。 但是,仍然需要管理每个 Linux VM 的密码,并维护正常的密码策略和做法,例如最小密码长度和定期系统更新。

    使用 ssh-keygen 生成密钥

    若要创建密钥,首选命令是 ssh-keygen ,它可与 Azure Cloud Shell、macOS 或 Linux 主机和 Windows (10 和 11)中的 OpenSSH 实用程序配合使用。 ssh-keygen 会询问一系列问题,然后编写私钥和匹配的公钥。

    SSH 密钥默认保留在 ~/.ssh 目录中。 如果没有 ~/.ssh 目录, ssh-keygen 命令会使用正确的权限创建一个。 SSH 密钥创建为资源,并存储在 Azure 中供以后使用。

    还可使用 Azure CLI 通过 az sshkey create 命令创建密钥,如 生成和存储 SSH 密钥 中所述。

    以下 ssh-keygen 命令默认在 ~/.ssh 目录中生成 4096 位 SSH RSA 公钥和私钥文件。 如果当前位置存在 SSH 密钥对,这些文件将被覆盖。

    ssh-keygen -m PEM -t rsa -b 4096
    

    以下示例显示可用于创建 SSH RSA 密钥对的其他命令选项。 如果当前位置存在 SSH 密钥对,这些文件将被覆盖。

    ssh-keygen \
        -m PEM \
        -t rsa \
        -b 4096 \
        -C "azureuser@myserver" \
        -f ~/.ssh/mykeys/myprivatekey \
        -N mypassphrase
    

    ssh-keygen = 用于创建密钥的程序

    -m PEM = 将密钥的格式设为 PEM

    -t rsa = 要创建的密钥类型,本例中为 RSA 格式

    -b 4096 = 密钥的位数,本例中为 4096

    -C "azureuser@myserver" = 追加到公钥文件末尾以便于识别的注释。 通常以电子邮件地址用作注释,但也可以使用任何最适合你基础结构的事物。

    -f ~/.ssh/mykeys/myprivatekey = 私钥文件的文件名(如果选择不使用默认名称)。 追加了 .pub 的相应公钥文件在相同目录中生成。 该目录必须存在。

    -N mypassphrase = 用于访问私钥文件的其他密码。

    ssh-keygen 的示例

    ssh-keygen -t rsa -m PEM -b 4096 -C "azureuser@myserver"
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/azureuser/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/azureuser/.ssh/id_rsa.
    Your public key has been saved in /home/azureuser/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
    The key's randomart image is:
    +---[RSA 4096]----+
    |        .oE=*B*+ |
    |          o+o.*++|
    |           .oo++*|
    |       .    .B+.O|
    |        S   o=BO.|
    |         . .o++o |
    |        . ... .  |
    |         ..  .   |
    |           ..    |
    +----[SHA256]-----+
    

    保存的密钥文件

    Enter file in which to save the key (/home/azureuser/.ssh/id_rsa): ~/.ssh/id_rsa

    本文中的密钥对名称。 系统默认提供名为 id_rsa 的密钥对,有些工具可能要求私钥文件名为 id_rsa,因此最好使用此密钥对。 目录 ~/.ssh/ 是 SSH 密钥对和 SSH 配置文件的默认位置。 如果未使用完全路径指定,则 ssh-keygen 会在当前的工作目录(而非默认的 ~/.ssh)中创建密钥。

    ~/.ssh 目录列表

    若要查看 ~/.ssh 目录中的现有文件,请运行以下命令。 如果在目录中找不到文件或目录本身丢失,请确保所有以前的命令都已成功运行。 可能需要根访问权限,才能在某些 Linux 发行版上修改此目录中的文件。

    ls -al ~/.ssh
    -rw------- 1 azureuser staff  1675 Aug 25 18:04 id_rsa
    -rw-r--r-- 1 azureuser staff   410 Aug 25 18:04 id_rsa.pub
    

    Enter passphrase (empty for no passphrase):

    强烈建议为私钥添加密码。 如果不使用密码来保护密钥文件,任何人只要拥有该文件,就可以用它登录到拥有相应公钥的任何服务器。 添加密码可提升防护能力以防有人能够访问私钥文件,可让用户有时间更改密钥。

    部署期间自动生成密钥

    如果使用 Azure CLI 创建 VM,则可以选择性地通过运行具有 选项的 az vm create--generate-ssh-keys 命令生成 SSH 公钥和私钥文件。 密钥存储在 ~/.ssh 目录中。 请注意,如果该位置已存在密钥(例如在某些预配置的 Compute Gallery 映像中),则此命令选项不会覆盖这些密钥。

    部署 VM 时提供 SSH 公钥

    若要创建使用 SSH 密钥进行身份验证的 Linux VM,请在使用 Azure 门户、CLI、资源管理器模板或其他方法创建 VM 时提供 SSH 公钥。 使用门户时,请输入公钥本身。 如果借助现有公钥使用 Azure CLI 创建 VM,请通过运行具有 --ssh-key-value 选项的 az vm create 命令来指定此公钥的值或位置。

    如果不熟悉 SSH 公钥的格式,则可通过运行 cat 来查看公钥(如下所示),注意需将 ~/.ssh/id_rsa.pub 替换成自己的公钥文件位置:

    cat ~/.ssh/id_rsa.pub
    

    输出类似于以下内容(下面的示例采用密文形式):

    ssh-rsa XXXXXXXXXXc2EAAAADAXABAAABAXC5Am7+fGZ+5zXBGgXS6GUvmsXCLGc7tX7/rViXk3+eShZzaXnt75gUmT1I2f75zFn2hlAIDGKWf4g12KWcZxy81TniUOTjUsVlwPymXUXxESL/UfJKfbdstBhTOdy5EG9rYWA0K43SJmwPhH28BpoLfXXXXXG+/ilsXXXXXKgRLiJ2W19MzXHp8z3Lxw7r9wx3HaVlP4XiFv9U4hGcp8RMI1MP1nNesFlOBpG4pV2bJRBTXNXeY4l6F8WZ3C4kuf8XxOo08mXaTpvZ3T1841altmNTZCcPkXuMrBjYSJbA8npoXAXNwiivyoe3X2KMXXXXXdXXXXXXXXXXCXXXXX/ azureuser@myserver
    

    如果将公钥文件的内容复制粘贴到 Azure 门户或资源管理器模板,请确保不会复制额外的空格或添加额外的换行符。 例如,如果使用 macOS,则可将公钥文件(默认为 ~/.ssh/id_rsa.pub)通过管道传送到 pbcopy,以便复制内容(也可通过其他 Linux 程序执行此类操作,例如 xclip)。

    如果更喜欢使用多行格式的公钥,可以根据之前创建的公钥在“pem”容器中生成 RFC4716 格式的密钥。

    从现有的 SSH 公钥创建 RFC4716 格式的密钥:

    ssh-keygen \
    -f ~/.ssh/id_rsa.pub \
    -m RFC4716 > ~/.ssh/id_ssh2.pem
    

    使用 SSH 客户端将 SSH 连接到 VM

    凭借部署在 Azure VM 上的公钥和本地系统上的私钥,使用 VM 的 IP 地址或 DNS 名称通过 SSH 连接到 VM。 将以下命令中的 azureuser 和 myvm.westus.cloudapp.azure.com 替换为管理员用户名和完全限定的域名(或 IP 地址) :

    ssh azureuser@myvm.westus.cloudapp.azure.com
    

    如果在创建密钥对时提供的是通行短语,则在登录过程中遇到提示时,请输入该通行短语。 (服务器添加到 ~/.ssh/known_hosts 文件夹。系统不会要求再次进行连接,除非更改了 Azure VM 上的公钥,或者从 ~/.ssh/known_hosts 中删除了服务器名称。)

    如果 VM 使用的是实时访问策略,则需要先请求访问权限,然后才能连接到 VM。 有关实时策略的详细信息,请参阅使用实时策略管理虚拟机访问

    使用 ssh-agent 来存储私钥密码

    为了避免在每次 SSH 登录时键入私钥文件密码,可以使用 ssh-agent 来缓存私钥文件密码。 如果使用 Mac,macOS Keychain 在用户调用 ssh-agent 时会安全存储私钥密码。

    验证并使用 ssh-agentssh-add 将密钥文件的情况通知给 SSH 系统,这样就无需交互使用密码。

    eval "$(ssh-agent -s)"
    

    现在,使用命令 ssh-add 将私钥添加到 ssh-agent

    ssh-add ~/.ssh/id_rsa
    

    私钥密码现在存储在 ssh-agent 中。

    使用 ssh-copy-id 将密钥复制到现有 VM

    如果已创建 VM,可以使用 ssh-copy-id 将新的 SSH 公钥添加到 Linux VM。

    ssh-copy-id -i ~/.ssh/id_rsa.pub azureuser@myserver
    

    创建并配置 SSH 配置文件

    可创建并配置 SSH 配置文件 (~/.ssh/config),以便加速登录和优化 SSH 客户端行为。

    以下示例显示一个简单配置,通过此配置,你可以使用默认的 SSH 私钥以用户身份快速登录到特定 VM。

    创建文件。

    touch ~/.ssh/config
    

    编辑文件以添加新的 SSH 配置

    vim ~/.ssh/config
    

    添加适用于主机 VM 的配置设置。 在此示例中,VM 名称(主机)为 myvm,帐户名称(用户)为 azureuser,IP 地址或 FQDN(主机名)为 192.168.0.255。

    # Azure Keys
    Host myvm
      Hostname 192.168.0.255
      User azureuser
    # ./Azure Keys
    

    可为其他主机添加配置,让每台主机使用其自己的专用密钥对。 查看 SSH 配置文件获取更多高级配置选项。

    获得 SSH 密钥对和配置的 SSH 配置文件后,便可快速安全地远程访问 Linux VM。 运行以下命令时,SSH 从 SSH 配置文件的 Host myvm 块中找到所有设置并加载它们。

    ssh myvm
    

    首次使用 SSH 密钥登录到服务器时,命令会提示用户输入该密钥文件的密码。

    下一步是使用新 SSH 公钥创建 Azure Linux VM。 使用 SSH 公钥作为登录名创建的 Azure VM 受到的保护优于使用默认登录方法(即密码)创建的 VM。

  • 使用 Azure 门户创建 Linux 虚拟机
  • 使用 Azure CLI 创建 Linux 虚拟机
  • 使用 Azure 模板创建 Linux VM
  •