详细步骤:创建和管理 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 密钥。
注意
Linux VM 对 ED25519 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 密钥的支持目前处于预览状态,不支持 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_rsa
和 id_ed25519
;有些工具可能要求私钥文件名为 id_rsa
或 id_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 公钥和私钥文件。 密钥存储在 ~/.ssh 目录中。 请注意,如果该位置已存在密钥(例如在某些预配置的 Compute Gallery 映像中),则此命令选项不会覆盖这些密钥。
注意
az sshkey create 命令默认使用 RSA 加密,不能用于生成 ED25519 密钥对,但可以按照上述说明使用 ssh-keygen 创建 ED25519 密钥对,然后使用该公钥创建 VM。
部署 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。 将以下命令中的 azureuser 和 myvm.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-agent
和 ssh-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。