在Windows 10/Server 2019上配置基于SSH密钥的身份验证

时间:2020-01-09 10:47:06  来源:igfitidea点击:

在本文中,我们将使用Windows上的RSA密钥配置SSH身份验证,以安全地访问远程服务器/计算机。很好地展示如何在Windows上生成RSA密钥(证书)并在Windows 10/Windows Server 2019上配置内置的OpenSSH服务器以进行基于密钥的身份验证(允许在没有密码的远程主机上进行身份验证)。

基于SSH密钥的身份验证在Linux世界中已被广泛使用,但是在Windows中它却是最近才出现的。这个想法是将客户端的公钥添加到SSH服务器上,并且当客户端尝试连接到它时,服务器会检查客户端是否具有相应的私钥。

在Windows上生成SSH(RSA)

我们必须在用于连接到运行OpenSSH的远程Windows服务器的客户端计算机上生成两个RSA密钥(公共和私有密钥)。私钥存储在客户端(请勿将其传递给任何人!),并且公钥添加到SSH服务器上的authorized_keys文件中。要在Windows客户端上生成RSA密钥,必须安装OpenSSH客户端。

在Windows 10 1809(及更高版本)和Windows Server 2019中,OpenSSH客户端作为单独的功能安装:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

在以前的Windows版本中,我们可以从GitHub安装Win32-OpenSSH端口(请参阅有关在Windows上设置SFTP(SSH FTP)服务器的文章中的示例)。

运行标准(非特权)PowerShell会话,并使用以下命令生成一对RSA 2048密钥:

ssh-keygen

系统将提示我们输入密码以保护私钥。如果指定密码,则每次使用此密钥进行SSH身份验证时都必须输入密码。我没有输入任何密码(不推荐)。

Ssh-keygen将在当前Windows用户的配置文件(C:\Users\your_username)中创建.ssh目录,并其中放置2个文件:

  • id_rsa私钥
  • id_rsa.pub公钥

创建RSA密钥后,可以将私钥添加到" SSH代理"服务,该服务可以方便地管理私钥并将其用于身份验证。 SSH代理存储私钥,并在当前用户的安全上下文中提供私钥。运行ssh-agent服务并将其配置为使用PowerShell服务管理命令自动启动:

set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent

将私钥添加到ssh-agent数据库:

ssh-add "C:\Users\youruser\.ssh\id_rsa"

或者如下:

ssh-add.exe $ENV:UserProfile\.ssh\id_rsa

在Windows上配置OpenSSH服务器以使用SSH密钥进行身份验证

然后将在客户端上生成的公钥复制到SSH服务器(在此示例中,这是运行Windows 10 1903并配置了OpenSSH的远程计算机)。

我们已经详细讨论了如何在Windows中配置OpenSSH服务器。

id_rsa.pub文件复制到我们将用于连接SSH服务器的用户配置文件中的.ssh目录中。例如,我在Windows 10中有一个admin用户,因此必须将密钥复制到C:\Users\admin.ssh\authorized_keys。

我们可以使用SCP将公钥复制到SSH服务器:

scp C:\Users\youruser\.ssh\id_rsa.pub [email protected]:c:\users\admin\.ssh\authorized_keys

现在,我们无需密码即可连接到Windows SSH服务器。如果尚未设置私钥的密码(密码),则将自动连接到远程Windows主机。

要使用本地SSH客户端连接到远程主机,我们将需要以下命令:

ssh (username)@(SSH server name or IP address)

例如:

ssh [email protected]

这意味着我们要使用管理员帐户连接到IP地址为192.168.1.15的远程SSH服务器。 SSH代理将自动尝试使用之前保存的私钥进行身份验证。

如果我们不想使用ssh-agent服务来管理SSH密钥,则可以指定用于SSH身份验证的私钥文件的路径:

ssh [email protected] -i "C:\Users\youruser\.ssh\id_rsa"

如果我们无法使用RSA密钥连接到SSH服务器,并且仍然提示我们输入密码,则我们尝试连接的用户帐户可能是本地服务器管理员组(组SID)的成员是S-1-5-32-544)。我们将在后面讨论。

如何在本地管理员下使用SSH密钥登录Windows?

OpenSSH为具有Windows本地管理员特权的用户使用特殊的基于密钥的访问设置。

首先,使用密钥文件C:\ProgramData\ssh \administrators_authorized_key代替用户配置文件中的" authorized_keys"文件。我们必须将SSH密钥添加到此文本文件(出于安全目的,只有Administrators组和SYSTEM才有权读取此文件)。

为了从用户配置文件中使用authorized_keys文件,而不是将公钥数据移动到administrators_authorized_keys文件,可以在OpenSSH配置文件(C:\ProgramData\ssh \sshd_config)中注释相关行。

注释这些行:

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

允许使用sshd_config文件中的RSA密钥访问Windows:

PubkeyAuthentication yes

并禁用ssh密码登录:

PasswordAuthentication no

将更改保存在sshd_config中后,不要忘记重新启动sshd服务。

restart-service sshd

这是另一件事。在早期的OpenSSH版本中,我们必须授予NT Service\sshd对authorized_keys文件的读取权限。

为此,我们必须执行以下任一操作:

  • 安装OpenSSHUtils模块
Install-Module -Force OpenSSHUtils -Scope AllUsers

。要更改文件许可权,请运行以下命令:R

epair-AuthorizedKeyPermission -FilePath C:\Users\admin\.ssh\authorized_keys
  • 使用NTFSSecurity模块或者icacls更改文件的NTFS权限;
  • 或者我们可以在sshd_config文件中禁用StrictModes。默认情况下,如果未很好地保护公用密钥和专用密钥,则启用此模式并阻止基于密钥的身份验证。取消注释行
#StrictModes yes

,并将其更改为

StrictModes no

因此,我们已经在Windows上使用公共RSA密钥(证书)配置了SSH身份验证。现在,我们可以使用此身份验证方法安全地访问远程服务器,自动转发SSH隧道中的端口,运行脚本以及执行任何其他与自动化相关的任务。