今天我了解到:如何在Windows Server 2019上使用Keypair登录启用SSH

2020-06-02 00:56:55

TL;DR-在将内容自动部署到Windows Server 2019时,Windows远程管理(Winrm)可能是首选解决方案,远程桌面(.rdp)可用于手动登录和摆弄。但是您也可以使用SSH,这对于Linux本地操作员来说可能更方便(或者至少感觉更方便)。

问题是:在Windows Server 2019上启用和配置带有密钥对访问的SSH的端到端说明很少。本教程汇集了最近几个博客的内容,展示了如何做到这一点。

此外,它还展示了如何编写脚本以便在发布时注入到基于云的Windows Server 2019虚拟机中,从而使这些虚拟机从一开始就可以通过SSH访问。这样就不需要执行以下操作:

获取并记录管理员密码(在AWS上,具有讽刺意味的是,这需要在“连接”对话框中出示您的私钥,以便解密您的密码)。

…。在进行所需的更改之前,这样您就再也不需要这样做了。

我为什么要弄清楚这件事?很高兴你这么问。在过去的几周里,为了准备Docker Enterprise Barracuda的发布,我们已经部署了很多使用每日构建和“Beta Bits”(和Bob)的演示集群。Barracuda中的一个关键特性反映了Kubernetes 1.19引入的功能,它能够使用Windows Server工作节点(既可以是普通的,也可以是配备了GPU的!)。在不同的集群中。

问题是:因为我使用的BITS还没有完全成熟,我们的标准集群部署工具(在本例中,我使用的是docker集群)还没有扩展到完全可以做我需要做的所有事情。具体地说,我可以在几分钟内使用Windows工作节点部署Docker Enterprise Barracuda(并且Docker Enterprise本身可以自动将这些节点配置为Kubernetes工作节点并实现GPU插件)。但随后我必须登录这些节点才能安装支持GPU访问的NVIDIA驱动程序和服务。

这(引用xkcd专栏的话)破坏了我的面向Linux的工作流。每次部署新集群时,我都必须离开Linux操作虚拟机,浏览到Windows桌面上的EC2,找到我在GPU实例上部署的全新Windows节点,解密并存储它们的gobbledegook密码,下载.rdp文件,然后重复导航.rdp登录以访问和重新配置实例。

SSH-(使用密钥对)从一开始就会让这件事变得更容易。在谷歌上搜索了一会儿之后,我发现了这一点。当然,让它变得更容易的是自动安装GPU驱动程序,我们现在就会这么做。在撰写本文时,BITS还在四处飞来飞去,所以它是一个移动的目标。

同时,下面介绍如何在Windows Server 2019上启用SSH以进行密钥对访问。

SSH密钥对(私钥和公钥:id_rsa和id_rsa.pub)。您的云服务可能已经让您生成了一个或多个这样的内容,并已下载。如果您需要一个新的密钥,您可以按照本DigitalOcean教程的要求,使用ssh-keygen从Linux命令行生成它。

管理凭据和一种登录方式(也许是.rdp?)。并以管理员身份打开PowerShell。

根据需要,访问安全组管理,以便您可以添加一个为SSH开放端口22的入站规则(可能只启用从您的IP地址登录,或者只启用来自私有子网IP的连接,通过您的子网内的VPN或跳箱启用SSH登录)。

这里是食谱,(我发誓)在标准的Amazon EC2 Windows Server 2019 Full AMI上,它(我发誓)在2020年5月6日对我有效。

进入PowerShell提示符后,从安装OpenSSH服务器开始。(许多食谱还建议安装OpenSSH客户端,但我们在这里不会这样做。)。

完成这些步骤后,您应该能够使用SSH和密码登录到您的Windows Server 2019计算机,如下所示。以管理员身份登录:

如果您在AWS上运行,则需要使用您的私钥从EC2控制台的连接对话框中解密密码。

现在,就像Linux一样,我们需要将公钥写入服务器上的已知地址,以便sshd可以将其与我们的SSH客户端在登录时提供的私钥相匹配。默认情况下,sshd希望在名为的文件中看到管理员组成员密钥(即您,管理员。

作为Linux用户,您可能会考虑使用echo<;keytext>;filename来执行此操作。但在PowerShell上,这不是一个好主意,因为像“>;”这样的操作符使用OpenSSH(Sshd)无法读取的16位Unicode编码。请参阅这篇关于Windows和PowerShell字符编码规范以及PowerShell核心最新更新的精彩StackOverflow帖子。

如果您已经犯了这个错误(相信我,我先试了一下ECHO),您会注意到一个可接受编码的RSA公钥文件大约有400个字节长,而Unicode(不可读)版本大约是800个字节。只需取消“扩展混合”,获取一个新密钥副本,并将其粘贴到脚本中,如下所示,该脚本使用Set-Content Commandlet(默认情况下输出ANSI)。高级用户、非美国用户和其他可能使用全局配置为使用Unicode(例如)的基于云的Windows服务器和PowerShell环境的用户可能仍需要在此处设置显式编码。

在Windows中,我们可以通过以下方式手动完成此操作:右键单击文件,选择属性,单击安全选项卡,按标记为禁用继承的按钮,手动删除除管理员和管理员之外的用户,并确保管理员和管理员都具有完全控制权限。

$acl=Get-acl C:\ProgramData\ssh\administrators_authorized_keys#获取访问控制列表$acl.SetAccessRuleProtection($TRUE,$FALSE)#消除继承$acl.Access|%{$acl.RemoveAccessRule($_)}#删除所有用户和权限$AdminatorRule=新建-Object#为管理员system.security.accesscontrol.filesystemaccessrule(";Administrator";,";FullControl";,";Allow";构建完全控制规则。)$acl.SetAccessRule($administatorRule)$administatorsRule=新-管理员的对象号同上(system.security.accesscontrol.filesystemaccessrule(";Administrators";,";FullControl&34;,";Allow";)$acl.SetAccessRule($administatorsRule)(Get-Item';C:\ProgramData\ssh\administrators_authorized_keys';).SetAccessControl($acl)。

最后一行将修改后的ACL强加回文件。使用SetAccessControl避免了set-acl中的一个小错误,这似乎也造成了一些痛苦。

作为最后一步,我们可以(可选)将管理员的默认登录shell设置为PowerShell,而不是老式的命令shell。

此时,您应该能够使用您的私钥从任何SSH登录到您的Windows Server 2019机器(如顶部所示),并最终进入PowerShell。如果您想使用PuTTY,您可能需要使用PuttyGen将您的私钥转换为RSA格式,如本食谱中所述。

如果您使用的是基于云的Windows Server VM,则当您启动新计算机时,此脚本(在大多数情况下)也可以作为用户数据脚本运行。例如,在AWS EC2中,当从EC2控制台启动新实例时,您只需选择以下脚本(以及所需的<;Powershell&><;/Powershell&>;标记)并将其直接放入EC2 WebUI,或将其复制到由AWS CLI运行实例命令调用的文件中即可。

<;Powershell&>Add-WindowsCapability-Online-Name OpenSSH.Server~0.0.1.0 Set-Service-Name sshd-StartupType‘Automatic’Start-Service sshd$key=";<;在此处粘贴公钥>;";$Key|Set-Content C:\ProgramData\ssh\administrators_authorized_keys$acl=Get-acl C:\ProgramData\ssh\administrators_authorized_keys$acl.SetAccessRuleProtection($True,$False)$acl.Access|%{$acl.RemoveAccessRule($_)}#剥离所有内容$AdminatorRule=新对象规则";完全控制";,";允许";)$acl.SetAccessRule($AdminatorRule)$AdminatorsRule=新对象规则。Administrators";,";完全控制";,";允许";)$acl.SetAccessRule($AdminatorsRule)(Get-Item';C:\ProgramData\ssh\administrators_authorized_keys';).SetAccessControl($acl)New-ItemProperty-Path";HKLM:\SOFTWARE\OpenSSH&34;-Name DefaultShell-Value";C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe";-PropertyType String-Force Restart-service sshd<;/Powershell>;

让实例启动,您应该能够通过SSH和您的私钥从您的终端直接登录到它。