当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

作者:精品下载站 日期:2024-12-14 12:32:17 浏览:16 分类:玩电脑

如何在 Windows Server 上设置 OpenSSH [完整指南]


Secure Shell (SSH) 协议和 OpenSSH 项目在 Linux 上已经存在了数十年。但 Windows 上的 OpenSSH 直到最近才被 Windows 世界所接受。因此,Windows Server 通常不会预先构建并准备好运行,并且需要进行一些设置。

在本教程中,您将学习如何像 Linux 一样轻松地通过 SSH 访问 Windows Server。您将了解如何在 Windows 上安装(或更新)OpenSSH、添加适当的防火墙规则以及配置公钥、密码和基于证书的身份验证。

先决条件

为了有效地遵循本文中的示例和演示,您需要满足以下这些要求。

  • Windows Server 计算机 - 本文将使用 Windows Server 2019 Datacenter。本教程将使用的服务器将拥有一个名为 june 的用户帐户,并将通过 IP 连接到服务器地址为 40.117.77.227,主机名为 ataWindows
  • 安装了 PowerShell 7.1 的本地计算机。 PowerShell 7.1 可在 WindowsLinuxmacOS 中使用。本文中的示例在 Windows 10 中使用 PowerShell 7.1。

下载 OpenSSH

与 Linux 服务器不同,Windows 服务器没有运行开箱即用的 SSH 服务器。但微软已经发布了适用于 Windows 的 OpenSSH 开源端口。在此版本中,您现在可以在 Windows 计算机上设置 SSH 服务器。

首先,您需要下载 OpenSSH。为此,请按照以下步骤操作:

  1. 使用远程桌面 (RDP) 或您首选的桌面管理器客户端连接到 Windows Server 上的桌面。

2. 在 Windows Server 桌面上,打开提升的 Windows PowerShell 控制台。

3. 接下来,复制以下代码,将其粘贴到 PowerShell 窗口中,然后按 Enter。该脚本会将最新的 OpenSSH 版本(截至撰写本文时为 v8.1.0.0p1-Beta)下载到当前工作目录。

如果您想保存 PowerShell 代码以下载 OpenSSH,您还可以打开 Windows PowerShell ISE 或 Visual Studio Code 等代码编辑器并将其保存在其中。

## Set network connection protocol to TLS 1.2
## Define the OpenSSH latest release url
 $url = 'https://github.com/PowerShell/Win32-OpenSSH/releases/latest/'
## Create a web request to retrieve the latest release download link
 $request = [System.Net.WebRequest]::Create($url)
 $request.AllowAutoRedirect=$false
 $response=$request.GetResponse()
 $source = $([String]$response.GetResponseHeader("Location")).Replace('tag','download') + '/OpenSSH-Win64.zip'
## Download the latest OpenSSH for Windows package to the current working directory
 $webClient = [System.Net.WebClient]::new()
 $webClient.DownloadFile($source, (Get-Location).Path + '\OpenSSH-Win64.zip')

4. OpenSSH-Win64.zip 文件现在应该位于您当前的工作目录中。通过运行以下命令来验证这一点。

Get-ChildItem *.zip

如下所示,目录中存在 OpenSSH-Win64.zip 文件。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

安装 OpenSSH

下载 OpenSSH-Win64.zip 后,下一步是在服务器上安装 OpenSSH。如果您需要的话,没有安装向导。

  1. 仍在同一 PowerShell 会话中时,复制以下代码并在 PowerShell 中运行它。此代码将 OpenSSH-Win64.zip 文件内容提取到 C:\Program Files\OpenSSH
# Extract the ZIP to a temporary location
 Expand-Archive -Path .\OpenSSH-Win64.zip -DestinationPath ($env:temp) -Force
# Move the extracted ZIP contents from the temporary location to C:\Program Files\OpenSSH\
 Move-Item "$($env:temp)\OpenSSH-Win64" -Destination "C:\Program Files\OpenSSH\" -Force
# Unblock the files in C:\Program Files\OpenSSH\
 Get-ChildItem -Path "C:\Program Files\OpenSSH\" | Unblock-File

2. 解压 ZIP 文件后,在 PowerShell 中运行以下命令来执行脚本 C:\Program Files\OpenSSH\install-sshd.ps1。 该脚本将安装 OpenSSH SSH 服务器服务 (sshd)和 OpenSSH 身份验证代理服务 (sshd-agent)。

& 'C:\Program Files\OpenSSH\install-sshd.ps1'

您可以在下面看到预期的结果。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

要确保 SSH 服务器自动启动,请在 PowerShell 中运行以下命令。

## changes the sshd service's startup type from manual to automatic.
 Set-Service sshd -StartupType Automatic
## starts the sshd service.
 Start-Service sshd

添加 Windows 防火墙规则以允许 SSH 流量

此过程仅适用于您的 Windows 服务器使用 Windows 防火墙的情况。对于使用第三方防火墙的服务器,请参阅防火墙文档了解如何允许端口 22。

安装 OpenSSH 不会自动创建防火墙例外规则以允许 SSH 流量。因此,您的下一个任务是手动创建防火墙规则。

创建新的 Windows 防火墙规则的最简单方法之一是使用 PowerShell 和 New-NetFirewallRule cmdlet。下面的命令创建一个名为“允许 SSH”的防火墙规则,允许所有发往端口 22 的入站 TCP 流量。

复制以下命令并在 PowerShell 中运行它。

New-NetFirewallRule -Name sshd -DisplayName 'Allow SSH' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

下面的屏幕截图显示了创建防火墙规则后 PowerShell 中的预期输出。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

使用密码身份验证与 SSH 连接

至此,您已经在 Windows 上安装了 OpenSSH 并执行了初始服务器配置。下一步是测试通过 SSH 连接是否确实有效。

要测试新配置的 SSH 服务器,现在让我们在本地计算机上运行 ssh 命令。

本节中的相同步骤也适用于连接到 Linux SSH 服务器时。

1. 这次从本地计算机打开 PowerShell。

2. 接下来,运行以下命令启动 SSH 登录过程。确保更改 Windows Server 的用户名和远程主机。

ssh [email 

3. 由于您是第一次连接服务器,您会看到一个提示,无法确定主机的真实性。该消息意味着您的计算机尚未识别远程主机。输入 yes 并按 Enter 继续。

4. 当提示输入密码时,输入您的帐户密码并按 Enter 键。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

5. 登录后,如下面的屏幕截图所示,您将到达远程主机的命令提示符。假设您想确认您已进入远程主机上的会话。为此,请输入主机名,然后按 Enter。该命令应返回远程计算机名称。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

将 OpenSSH 的默认 Shell 更改为 PowerShell

当您第一次登录 Windows SSH 服务器时,您会注意到默认的 shell 或命令解释器是 CMD。将 CMD 作为默认 SSH shell 很好,但如果您更喜欢使用 PowerShell 作为默认 shell,请按照以下步骤操作。

要将默认 OpenSSH shell 从 CMD 更改为 PowerShell:

首先,如果您尚未打开 Windows Server 上的 PowerShell 窗口,请打开该窗口。

接下来,在注册表项 HKLM:\SOFTWARE\OpenSSH 中创建一个名为 DefaultShell 的新注册表字符串值。 将 DefaultShell 字符串 数据设置为 Windows PowerShell 路径C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe。

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

下面的屏幕截图显示了该命令的预期结果。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

配置公钥认证

在前面的部分中,您使用用户名和密码进行连接。这是可行的,但使用 SSH 服务器进行身份验证的更安全方法是使用密钥对

简而言之,密钥对由称为公钥私钥的两个密钥组成,它们构成了一组证明您身份的安全凭证。

公钥存储在服务器上,而私钥则保留在本地计算机上。您必须像对待密码一样对待私钥。如果私钥被泄露,任何人都可以使用它来访问您的 SSH 服务器。

准备administrators_authorized_keys 文件

公钥必须位于服务器上。但是哪里?对于 Windows 上的 OpenSSH,SSH 服务器从 C:\ProgramData\ssh\administrators_authorized_keys 文件中读取公钥。但这个文件默认不存在。您必须先创建一个。

请按照以下步骤创建administrators_authorized_keys文件并设置其正确的访问控制列表(ACL)。

在 Windows 服务器上:

1. 打开提升的 Windows PowerShell 控制台(如果尚未)。

2. 复制以下命令并在 PowerShell 中运行。此命令使用 New-Item cmdlet 创建 administrators_authorized_keys 文件。

New-Item -Type File -Path C:\ProgramData\ssh\administrators_authorized_keys

您应该看到类似于下面的屏幕截图的结果。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

3. 接下来,获取当前分配给ssh_host_dsa_key 文件的ACL,并将该ACL 复制到administrators_authorized_keys 文件。为此,请运行以下命令。

get-acl C:\ProgramData\ssh\ssh_host_dsa_key | set-acl C:\ProgramData\ssh\administrators_authorized_keys

OpenSSH 服务要求只有Administrators 组和SYSTEM 帐户有权访问administrators_authorized_keys 文件。将 ssh_host_dsa_key 的 ACL 复制到administrators_authorized_keys 是有意义的,因为 ACL 已经设置。

4. 现在打开 Windows 资源管理器。

5. 导航至C:\ProgramData\ssh\ 文件夹。

6. 右键单击administrators_authorized_keys 文件,然后单击属性。

7. 在属性页面上,单击安全选项卡,然后单击高级

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

8.然后确认权限是否如下图所示。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

生成新的 SSH 密钥对

要生成新的 SSH 密钥对,请使用 ssh-keygen 命令,该命令是 Windows 10(及更高版本)和大多数 Linux 操作系统内置的 OpenSSH 客户端工具的一部分。

本节中显示的示例适用于 Windows 和 Linux 计算机。

在本地计算机上的 PowerShell 控制台中:

1. 通过运行以下命令导航到主文件夹的 .ssh 目录。

cd ~/.ssh

2. 接下来,输入命令 ssh-keygen 并按 Enter。当要求输入文件位置来保存您生成的密钥时,请保留默认位置并按 Enter 键。这样做可以让您的 SSH 客户端在自动身份验证时找到您的 SSH 密钥。

在 Windows 中,默认密钥文件为 C:\Users\.ssh\id_rsa。

3. 在出现下一个提示时,将密码保留为空。此时,您不必使用密码进行测试。

向您的私钥添加密码可显着提高其安全性。密码充当您私钥的第二因素身份验证 (2FA)。

您会注意到该命令创建了两个文件; id_rsa(私钥)和id_rsa.pub(公钥)。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

将公钥部署到 Windows SSH 服务器

现在您已经生成了私钥-公钥对,下一步是将公钥复制到 SSH 服务器上的 C:\ProgramData\ssh\administrators_authorized_keys 文件中。

在本地计算机上的 PowerShell 控制台中:

1. 复制以下代码并在 PowerShell 中运行。确保首先更改用户名和 IP 地址。你可以参考每个命令上面的注释来了解每个命令的作用。

# Read the public key
 $public_key = Get-Content ~/.ssh/id_rsa.pub
# Append the public key to the administrators_authorized_keys on the server using ssh.
 ssh [email  "'$($public_key)' | Out-File C:\ProgramData\ssh\administrators_authorized_keys -Encoding UTF8 -Append"

2. 出现提示时输入密码,ssh 将继续复制公钥。您将看到类似的结果,如下所示。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

使用公钥身份验证与 SSH 连接

现在您已将公钥复制到 SSH 服务器,不再需要使用密码进行身份验证。如下所示,ssh 没有提示输入密码。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

配置证书认证

与公钥身份验证一样,证书身份验证是无密码或受密码保护的。要启用证书登录,请按照生成密钥对的相同过程进行操作,无需将公钥部署到 SSH 服务器。

您不需要将公钥映射到 SSH 服务器上的authorized_keys 或administrators_authorized_keys 文件。相反,公钥是使用证书颁发机构 (CA) 密钥进行签名的。

创建证书颁发机构 (CA) 密钥

生成用于签名的 CA 密钥与生成本文前面所做的用户密钥对类似。只是这一次,您需要为新 CA 密钥指定文件名。为此,请在 Windows Server 上的 PowerShell 控制台中执行以下操作:

执行 ssh-keygen 命令,如下所示。此命令在C:\ProgramData\ssh\ca_userkeys中创建 CA 密钥,但您可以随意使用不同的文件名。使用不同的文件名不会影响 CA 密钥功能。

当要求输入密码时,将密码留空并按 Enter。

ssh-keygen -f C:\ProgramData\ssh\ca_userkeys

您可以在下面看到该命令创建了两个文件。 ca_userkeys 是私钥,ca_userkeys.pub 是公钥。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

现在您已经生成了 CA 密钥,请告诉 SSH 服务器信任该 CA 以及在哪里可以找到 CA 密钥。为此,请将新行 TrustedUserCAKeys path/to/ca_userkeys.pub 添加到服务器上的 C:\ProgramData\ssh\sshd_config 文件中。

运行以下命令将配置项附加到文件sshd_config中。

# If the SSH server is Windows
 echo TrustedUserCAKeys C:\ProgramData\ssh\ca_userkeys.pub>> C:\ProgramData\ssh\sshd_config

签署用户的公钥

此时,您已生成 CA 密钥并将 SSH 服务器配置为信任 CA 公钥文件。现在剩下的就是签署您的用户公钥。

在本地计算机上的 PowerShell 控制台中:

1. 使用 SCP 命令将 id_rsa.pub 文件复制到 SSH 服务器上的主驱动器。确保将用户名和 IP 地址更改为正确的值。

scp ((Resolve-Path ~/.ssh/id_rsa.pub).Path) [email :id_rsa.pub

2. 使用 ssh 登录到 Windows Server。登录后,运行 ssh-keygen 来签署用户的公钥。您会注意到下面的命令使用了多个参数。让我们把它们分解一下。

  • -s C:\ProgramData\ssh\ca_userkeys - 指定用于签署公钥的 CA 密钥位置。在此示例中,CA 密钥是您生成的密钥。
  • -I id_username - 指定要分配给签名用户公钥的 ID。将 id_username 值更改为您想要的任何名称。
  • -V +4w - 该参数指定签名密钥的有效期。在此示例中,+4w 表示签名的用户密钥的有效期为四个星期。您可以将此值更改为您首选的有效期。
  • -n username - 这是拥有签名公钥的用户名。
  • - 这是要签名的用户公钥的位置 (Windows)。
ssh-keygen -s C:\ProgramData\ssh\ca_userkeys -I id_username -V +4w -n username ~/id_rsa.pub

在 SSH 会话中运行该命令后,您应该会得到类似的输出,如下所示。如您所见,该命令生成了一个名为 id_rsa-cert.pub 的新文件,它是签名的用户证书。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

3. 现在,导航回本地计算机 PowerShell 会话,并将 id_rsa-cert.pub 文件从服务器复制到本地计算机。运行该命令之前,请先将用户名和IP地址更改为正确的值。

scp [email :id_rsa-cert.pub ((Resolve-Path ~/.ssh/).Path)

复制完成后,您将在主文件夹中找到签名的用户证书,如下所示。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

使用证书身份验证与 SSH 连接

您已经配置了证书身份验证,现在您拥有了用户证书。您现在应该测试是否可以通过证书身份验证连接 SSH 服务器。

使用证书连接到 SSH 的命令与使用密码或公钥相同。但是,如果您之前启用了公钥身份验证,请先将其禁用。否则,ssh 将继续使用您的密钥对而不是您的证书。

要禁用您的密钥对,请从 administrators_authorized_keys 文件中删除您的公钥。为此,请按照以下步骤操作。

请注意,后续命令将清空整个administrators_authorized_keys 文件,从而有效删除所有映射的公钥。如果您不想清除所有映射的公钥,请使用文本编辑器手动从每个文件中删除选定的公钥。

通过 SSH 连接到 Windows Server 时:

1. 在 PowerShell 中运行以下代码以清空 administrators_authorized_keys 文件。

# Clear the administrators_authorized_keys file
 $NULL > C:\ProgramData\ssh\administrators_authorized_keys
# Confirm that the administrators_authorized_keys is empty
 Get-Content C:\ProgramData\ssh\administrators_authorized_keys

2. 此时,authorized_keys 和administrators_authorized_keys 文件为空,如下面的屏幕截图所示。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

3. 输入 exit 并按 Enter 键以断开与 SSH 会话的连接。您将返回 PowerShell 会话。

4. 删除公钥后,您的下一次 ssh 登录尝试将使用证书身份验证。登录体验将与公钥身份验证相同。

[玩转系统] 如何在 Windows Server 上设置 OpenSSH [完整指南]

结论

您现在已经从头开始设置了 OpenSSH Windows Server,一直探索和设置各种身份验证方式。您现在可以像使用 Linux 一样连接到 Windows 服务器!

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯