在Windows 10/Server 2019上配置基于SSH密钥的身份验证
在本文中,我们将使用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隧道中的端口,运行脚本以及执行任何其他与自动化相关的任务。