适用于:✔️ 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 或服务使用单独的密钥对。
可与任何人共享公钥;但只有你(或本地安全基础结构)才应具有对私钥的访问权限。
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-agent
和 ssh-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/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