在 Windows 10 OpenSSH 服务器上设置 SSH 密钥

she*_*enk 13 windows ssh openssh permissions windows-10

我已经在各种风格的 Linux 上设置了 OpenSSH 很多次。但是我一生都无法让它在 Windows 上正常运行。

这个问题似乎有两个方面。sshd/使用的权限和密钥ssh-agent

权限

我阅读的每一页都有不同的正确权限答案。有些工作,有时程序会抱怨它们。

从我了解的按键都应该为所拥有的SYSTEM,与读访问NT SERVICE\sshd和完全控制AdministratorsSYSTEM?(据我了解SYSTEMAdministrators代表 Windows 中的 root)。我在文档中读到只有在不使用ssh-add/时才需要读取访问权限ssh-agent。我还为该%USERPROFILE%/.ssh/authorized_keys文件配置了相同的权限,并添加了.pubEd25519 密钥,这是我用来尝试连接的密钥,尽管我也使用自己生成的 RSA 密钥进行了尝试。

以这种方式设置权限后,程序在向代理添加密钥或运行守护程序时不会抱怨。我改变了唯一的选择sshd_configListenAddress将其绑定至0.0.0.0,我将其设置为本地IP为SSH将只能在本地使用的机器。

钥匙

当我sshd.exe使用该-d选项运行时,我注意到它从%PROGRAMDATA%/ssh. 当我加入了ed25519.pub钥匙authorized_keys紧随其后的HOSTNAME@workstation@HOSTNAMEHOSTNAME是我的电脑的主机名。通常我会希望看到user@host. 我尝试创建自己的密钥并添加它,但是当我运行sshd.exe -d它时,它似乎从不使用默认密钥以外的任何东西。

最后,我无法连接到 OpenSSH 服务器,并且登录%PROGRAMDATA%/ssh/Logs似乎只显示服务器正在启动。总结我的问题:密钥文件的正确权限是authorized_hosts什么?authorized_keys错误的注释是否有影响?我应该将所有默认键添加.pubauthorized_hosts吗?最后,sshd在启动期间提到这些键是什么意思(见日志)?只要我将它添加到,我自己生成的密钥不应该工作authorized_hosts吗?

debug1: sshd version OpenSSH_for_Windows_7.6, LibreSSL 2.6.4
debug1: private host key #0: ssh-rsa SHA256:and12LVkEqyXJ2gr0SxFEQObaSFF+Czlcnx2uFjZaJQ
debug1: private host key #1: ssh-dss SHA256:waeLdy4Sm3NT+zbwEMIhbfl8TLe6WeQ0MuZE07CzFQU
debug1: private host key #2: ecdsa-sha2-nistp256 SHA256:G8/7y/04cSE3EezTrcmpK4lRmJ5f5I/CDPcHaPzsv4o
debug1: private host key #3: ssh-ed25519 SHA256:Jvn9UjsbdzH54L/yvGYGfCzJQVIMiIWL5RETbaL2ACA
debug1: rexec_argv[0]='C:\\WINDOWS\\System32\\OpenSSH\\sshd.exe'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on 192.168.1.144.
Server listening on 192.168.1.144 port 22.
Run Code Online (Sandbox Code Playgroud)

Utk*_*tku 18

请注意,如果您为管理员用户设置密钥,%USERPROFILE%/.ssh/authorized_keys则将公钥设置为将不起作用。您必须将公钥附加到%PROGRAMDATA%/ssh/administrators_authorized_keys

来源

并且您必须使用在 powershell admin 中运行的此脚本设置权限:

$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
$acl.SetAccessRuleProtection($true, $false)
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
$acl.SetAccessRule($administratorsRule)
$acl.SetAccessRule($systemRule)
$acl | Set-Acl
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您还必须正确设置 ACL。请参阅 https://www.concurrency.com/blog/may-2019/key-based-authentication-for-openssh-on-windows。 (9认同)
  • 我怎么强调都不过分_绝对是疯了_在 Windows 上更改文件权限是如此冗长的操作 (4认同)
  • Kurtis Rader 这句话真的很关键! (2认同)
  • 这是每个其他操作系统上的“chmod 600 ~/.ssh/authorized_keys”...唉,这有效,谢谢! (2认同)

Mar*_*ryl 12

您似乎混合了服务器主机密钥和您的帐户公钥


服务器主机密钥由 Win32-OpenSSH 在%PROGRAMDATA%/ssh第一次启动时生成。它们也被赋予了正确的权限,无需修改它们。这些是您在日志中看到作为“私有主机密钥”加载的密钥。这也表明它们具有正确的权限(否则它们将无法加载)。


您的帐户公钥转到%USERPROFILE%/.ssh/authorized_keys。该文件必须仅对它们所属的帐户具有写入权限。

authorized_keys文件应包含您的帐户密钥对的公钥部分。这与.pub来自%PROGRAMDATA%/ssh.

authorized_keys文件中的注释根本无关紧要。

authorized_keys服务器启动时不会加载文件中的密钥。它们仅在您尝试登录时加载。

另请参阅我的指南: