Windows SSH:“私钥”的权限太开放


100

我已经在Windows 7中安装了OpenSSH 7.6以进行测试。SSH客户端和服务器可以正常工作,直到我尝试从此窗口访问我的AWS EC2盒之一。

似乎我需要更改私钥文件的权限。这可以在unix / linux上使用chmod命令轻松完成。

窗户呢?

private-key.ppm是直接从AWS复制的,我想也是许可。

C:\>ssh -V
OpenSSH_7.6p1, LibreSSL 2.5.3

C:\>ver

Microsoft Windows [Version 6.1.7601]

C:\>


C:\>ssh ubuntu@192.168.0.1 -i private-key.ppk
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions for 'private-key.ppk' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "private-key.ppk": bad permissions
ubuntu@192.168.0.1: Permission denied (publickey).

C:\>
C:\>
C:\>ssh ubuntu@192.168.0.1 -i private-key.ppm
Warning: Identity file private-key.ppm not accessible: No such file or directory.
ubuntu@192.168.0.1: Permission denied (publickey).

C:\>

您是否尝试过修改ACL?
伊格纳西奥·巴斯克斯

1
您的私钥是否实际上在C:\根路径中?我可以理解为什么它抱怨,因为通常每个人都可以访问C:\中的内容。您是否尝试过将其移动到只有您自己用户才能访问的文件夹(例如C:\ Users \ username \ desktop),然后查看该消息是否仍然出现?
Darius

@Darius,是的。当您将文件从Unix / Linux复制到Windows时,权限也会被复制。我需要更改此设置,但不确定如何在Windows上执行此操作。使用chmod命令可以在unix / linux上轻松完成此操作。
Sabrina '18

@ IgnacioVazquez-Abrams,ACL?什么样的ACL?
Sabrina '18

1
@Sabrina您可以使用icacls命令更改权限,或者直接右键单击“私钥”,然后选择“属性”,然后在“安全性”选项卡下进行检查。并确保只有您/应该能够访问私钥的人才能访问它。如果“用户”具有读取访问权限-表示有权访问系统的任何人都可以读取该私钥。
Darius

Answers:


114

在Windows资源管理器中找到该文件,右键单击该文件,然后选择“属性”。导航到“安全性”选项卡,然后单击“高级”。

将所有者更改为您,禁用继承并删除所有权限。然后授予自己“完全控制权”并保存权限。现在SSH不再抱怨文件权限太开放了。

它应该最终看起来像这样:

在此处输入图片说明


2
我只想添加1)此方法在10.0.17134.191带有Cygwin ver CYGWIN_NT-10.0-WOW 2.3.1(0.291/5/3) 2015-11-14 12:42和ssh ver的Windows 10()盒中适用OpenSSH_for_Windows_7.6p1, LibreSSL 2.6.4,以及2)谢谢!@iBug!
atreyu

如果密钥文件在拇指驱动器/闪存盘上,则“安全性”选项卡不可用!
迪伦·B

@DylanB为什么将凭据放在可移动驱动器上?(实际上,该选项卡仅在NTFS文件系统上可用-您可以轻松地将驱动器格式化为NTFS)。
iBug

11
实际上,我这样做了,但它仍然抱怨0777权限过于开放。
亚伦·布拉姆森

10
为什么在Windows上这么困难,有人可以添加--ignore-stupid-rule命令选项吗?
利亚姆·米切尔

21

密钥只能由其预定的用户访问,并且不能有其他帐户,服务或组。

  • 界面:
    • [文件]属性-安全性-高级
      1. 所有者设置为密钥的用户
      2. 删除“ 权限条目”除密钥用户之外的所有用户,组和服务
      3. 将密钥的用户设置为完全控制


  • CLI:

    :: Set Variable ::
    set key="C:\Path\to\key"
    
    :: Remove Inheritance ::
    cmd /c icacls %key% /c /t /inheritance:d
    
    :: Set Ownership to Owner ::
    cmd /c icacls %key% /c /t /grant %username%:F
    
    :: Remove All Users, except for Owner ::
    cmd /c icacls %key%  /c /t /remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
    
    :: Verify ::
    cmd /c icacls %key%
    

如果所有者实际上是一个团体怎么办?就我而言,我有一个文件,network service因此Cygwin认为许可是0770而不是
0700。– hyspace

文件必须由一个用户和一个组拥有,而不仅仅是一个组。组权限是四个八进制规范中的第三个八进制[用户是第二个],并且不能对SSH密钥进行分组或其他可访问的密钥
JW0914,18年

Unix就是这种情况。在Windows中,network service可以拥有一个文件,并且它是一个组
hyspace

Cygwin在Windows上允许POSIX API功能,但是它仍在基于本机UNIX的程序的规则下运行(因此在UGO设置中具有3和4个八进制权限)。虽然您可以在Microsoft的Win32-OpenSSH的GitHub上打开问题,但由于SSH密钥必须是组密钥,其他密钥不可访问,因此可能不支持以您描述的方式拥有所有权。最好遵循程序规范,而不是尝试以[可能]不受支持的方式对其进行配置。
JW0914 '18

1
这应该是正确的答案。感谢CLI选项。GUI在Windows情况下总是很糟糕。
shyammakwana.me

10

除了ibug提供的答案。由于我在Windows内部使用ubuntu系统来运行ssh命令。它仍然无法正常工作。所以我做了

sudo ssh ...

然后它起作用了


sudo不应利用它来打开SSH会话,因为它存在安全风险。至少(我至少知道) root用户帐户用于打开SSH会话的唯一时间是在单用户系统上(即通常在路由器OS的[OpenWrt,DD-WRT等]和其他嵌入式系统上找到) )。SSH密钥必须仅由其所针对的用户访问,并且其他帐户,服务或组均不可访问。
JW0914

@ JW0914大声笑我有一个单用户Debian服务器,唯一的(登录)用户是root。我认为额外的非root用户没有好处,因为这是我的个人服务器,并且仅在执行维护工作时才登录。
iBug

@iBug请重新阅读我的评论,因为您似乎完全错过了第二句话...
JW0914

5

我遇到了同样的问题,它似乎与您正在运行的SSH版本有关。

如果我输入

where ssh

我知道了

C:\Windows\System32\OpenSSH\ssh.exe
C:\Program Files\Git\usr\bin\ssh.exe

当我ssh -V在两个地方跑步时,我都会

OpenSSH_7.5p1, without OpenSSL
OpenSSH_7.3p1, OpenSSL 1.0.2k  26 Jan 2017

...分别

因此,当我ssh从git / bin目录运行时,它可以正常工作,并且不会抱怨权限,但是使用以前的SSH安装程序运行相同的命令行,它会随之返回。

Load key "t:\\mykeys\\rich-private.ppk": invalid format
banana@127.0.0.127: Permission denied (publickey).

ps。文件上的权限仅是我自己的完全访问权限,而没有其他权限。


出于整个主机的原因,不应将OpenSSH安装到Windows目录,从安全性到极大的不便之处,是一个人需要通过DISM或使用Reset选项修复损坏的Windows目录的问题(已改进为使用WinSxS目录与恢复原始版本相比install.esd
JW0914 '18年

这就是帮助我的原因,在这种情况下,我从来没有使用过Windows ssh版本,只有Git的:(
cudacoder

这也是我的解决方法。看来Windows 10 Pro现在捆绑了受过专业教育的openssh版本。我被迫删除C:\ Windows \ System32 \ OpenSSH文件夹,并将git的ssh.exe添加到PATH。
Shukri Adams

这种“固定”对我来说,使用C:\ Program Files文件\的Git的\ usr \ BIN \ ssh.exe作品为C:\ WINDOWS \ SYSTEM32 \ OpenSSH的\ ssh.exe不
smartins


2

我遇到了类似的问题,但是我正在工作,并且无法更改工作计算机上的文件权限。您需要做的是安装WSL,然后将您的密钥复制到WSL中的隐藏ssh目录中:

cp <path to your key> ~/.ssh/<name of your key>

现在,您应该能够正常修改权限了。

sudo chmod 600 ~/.ssh/<your key's name>

然后使用WSL进行ssh:

ssh -i ~/.ssh/<name of your key> <username>@<ip address>


2

在键盘上使用以下命令在Windows上可以使用

icacls .\private.key /inheritance:r
icacls .\private.key /grant:r "%username%":"(R)"

1

您可以在Windows中使用icacls而不是chmod来调整文件权限。要授予当前用户读取权限并删除其他所有内容,

icacls <file name> /inheritance:r
icacls <file name> /grant:r "%username%":"(R)"

0

这只是@ JW0914的CLI答案的脚本版本,因此首先要投票给他。另外,这是我的第一个PowerShell脚本,因此欢迎提出建议。

# DO the following in powerhsell if not already done:
# Set-ExecutionPolicy RemoteSigned


# NOTE: edit the path in this command if needed
$sshFiles=Get-ChildItem -Path C:\DevContainerHome\.ssh -Force

$sshFiles | % {
  $key = $_
  & icacls $key /c /t /inheritance:d
  & icacls $key /c /t /grant %username%:F
  & icacls $key  /c /t /remove Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
}

# Verify:
$sshFiles | % {
  icacls $_
}


-1

iBug的回答很好!您可以按照该说明解决此问题。

但是当我在设置权限时遇到问题时,有几件事需要清除,而我花了几分钟才弄清楚问题!

按照iBug的答案,您将删除所有权限,但是如何为自己设置“完全控制”权限?那是我起初卡住的地方,因为我不知道该怎么做。

禁用继承后,您将能够删除所有允许的用户或组。

完成后,

点击Add然后点击Set a Principal然后输入System,并Administratorsyour email addredd在底部的字段中,然后点击check names

如果用户存在,它将加载名称。然后,单击OK>类型Allow>基本Permisisons Full Control>Okay

这将设置对系统,管理员和您的用户的完全控制权限。

之后,尝试使用该密钥进行ssh。现在应该解决。

我遇到了同样的问题,并使用此方法解决了该问题。如果有任何具有该名称的用户或组,则将其加载。

-屏幕截图-

权限条目 选择一个主体/选择用户或组

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.