详细步骤:创建和管理 Azure 中的 Linux VM 用于身份验证的 SSH 密钥

适用于:✔️ 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 目前支持以下密钥类型:

  • SSH 协议 2 (SSH-2) RSA(Rivest、Shamir、Adleman),最小长度为 2048 位
  • ED25519 密钥,固定长度为 256 位

目前不支持其他密钥格式,例如椭圆曲线 Diffie–Hellman (ECDH) 和椭圆曲线数字签名算法 (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 本地 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-keygen 命令默认在 ~/.ssh 目录中生成 256 位 ED25519 公钥和私钥文件。 如果当前位置存在 SSH 密钥对,这些文件将被覆盖。

ssh-keygen -m PEM -t ed25519

详细示例

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

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

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

ssh-keygen \
    -m PEM \
    -t ed25519 \
    -C "azureuser@myserver" \
    -f ~/.ssh/mykeys/myedprivatekey \
    -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 示例 (RSA)

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]-----+

ssh-keygen 示例 (ED25519)

ssh-keygen -t ed25519 -m PEM -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_ed25519.
Your public key has been saved in /home/azureuser/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:vFfHHrpSGQBd/oNdvNiX0sG9Vh+wROlZBktNZw9AUjA azureuser@myserver
The key's randomart image is:
+---[ED25519 256]----+
|                 |
|..  .            |
|o+.o       .     |
|*=o o   o + +    |
|*+o+   oSB + o   |
|**++o.+oo = .    |
|=+*..*.o E       |
|..  o o..        |
|     .o.         |
+----[SHA256]-----+

保存的密钥文件

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

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

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

~/.ssh 目录列表

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

RSA 密钥对:

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

ED25519 密钥对:

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

密钥密码

Enter passphrase (empty for no passphrase):

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

部署期间自动生成密钥

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

基本示例

创建简单的 Ubuntu Linux VM 以及 Ed25519 SSH 密钥对。

az vm create -n MyVm -g MyResourceGroup --image Ubuntu2204 --generate-ssh-keys --ssh-key-type ed25519

部署 VM 时提供 SSH 公钥

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

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

RSA 密钥对

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 \
-e \
-m RFC4716 > ~/.ssh/id_ssh2.pem

ED25519 密钥对

cat ~/.ssh/id_ed25519.pub

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

ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIP6I5JuhGq3RidMNpxrplIQwEfc4Rh7UyV8JYYH2U2xA azureuser@myserver

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

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

若要基于现有的 SSH 公钥创建 PEM 格式的密钥,请执行以下操作:

ssh-keygen \
-f ~/.ssh/id_ed25519.pub \
-e \
-m RFC4716 > ~/.ssh/id_edssh.pem

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

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

ssh azureuser@myvm.chinanorth.cloudapp.chinacloudapi.cn

如果在创建密钥对时提供的是通行短语,则在登录过程中遇到提示时,请输入该通行短语。 (服务器添加到 ~/.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-add ~/.ssh/id_ed25519

私钥密码现在存储在 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。