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

Sab*_*ina 273 windows ssh openssh permissions private-key

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

看来我需要更改私钥文件的权限。这可以通过chmod命令在 unix/linux 上轻松完成。

窗户呢?

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:\>
Run Code Online (Sandbox Code Playgroud)

iBu*_*Bug 329

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

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

它最终应该是这样的:

在此处输入图片说明

  • 为什么这在 Windows 上如此困难,有人可以添加一个 --ignore-stupid-rule 命令选项吗? (53认同)
  • 实际上,我这样做了,但它仍然抱怨 0777 权限太开放了。 (32认同)
  • 我只想添加 **1)** 这种方法适用于我的 Windows 10 (`10.0.17134.191`) 盒子 w/Cygwin ver `CYGWIN_NT-10.0-WOW 2.3.1(0.291/5/3) 2015- 11-14 12:42` 和 ssh 版本 `OpenSSH_for_Windows_7.6p1、LibreSSL 2.6.4` 和 **2)** 谢谢!@iBug! (4认同)
  • 我仍然得到:`权限 0770 太开放` (2认同)

JW0*_*914 84

密钥只能由它们的目标用户访问,其他帐户、服务或组不能访问。

  • GUI:
    [文件]属性安全先进的
    1. 所有者:密钥的用户
    2. 权限条目:删除除密钥用户之外的所有条目
    3. 将密钥的用户设置为完全控制

  • Cmd
    ::# Set Key File Variable:
        Set Key="%UserProfile%\.ssh\id_rsa"
    
    ::# Remove Inheritance:
        Icacls %Key% /c /t /Inheritance:d
    
    ::# Set Ownership to Owner:
        :: # Key's within %UserProfile%:
             Icacls %Key% /c /t /Grant %UserName%:F
    
        :: # Key's outside of %UserProfile%:
             TakeOwn /F %Key%
             Icacls %Key% /c /t /Grant:r %UserName%:F
    
    ::# Remove All Users, except for Owner:
        Icacls %Key% /c /t /Remove:g "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
    
    ::# Verify:
        Icacls %Key%
    
    ::# Remove Variable:
        set "Key="
    
    Run Code Online (Sandbox Code Playgroud)
  • PowerShell
    # Set Key File Variable:
      New-Variable -Name Key -Value "$env:UserProfile\.ssh\id_rsa"
    
    # Remove Inheritance:
      Icacls $Key /c /t /Inheritance:d
    
    # Set Ownership to Owner:
      # Key's within $env:UserProfile:
        Icacls $Key /c /t /Grant ${env:UserName}:F
    
       # Key's outside of $env:UserProfile:
         TakeOwn /F $Key
         Icacls $Key /c /t /Grant:r ${env:UserName}:F
    
    # Remove All Users, except for Owner:
      Icacls $Key /c /t /Remove:g Administrator "Authenticated Users" BUILTIN\Administrators BUILTIN Everyone System Users
    
    # Verify:
      Icacls $Key
    
    # Remove Variable:
      Remove-Variable -Name Key
    
    Run Code Online (Sandbox Code Playgroud)

  • 这应该是正确答案。感谢 CLI 选项。GUI 在 Windows 情况下总是很糟糕。 (5认同)
  • 在 Windows10 上,我得到 `无效参数 "/grant"` 我必须添加 :r ** 带空格** `Icacls $Key /c /t /grant :r $env:UserName:F` (2认同)

小智 47

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

sudo ssh ...
Run Code Online (Sandbox Code Playgroud)

然后它起作用了

  • 最佳答案。在 Windows 上使用 ubuntu shell 时,关于 root 访问安全的建议完全无关紧要 (5认同)
  • 这对我有用。我做了上述解决方案,仍然收到 0077 警告,但这修复了它。 (4认同)
  • @DmitryTorba 请解释一下,因为这毫无意义,而且实际上是不准确的。 (3认同)
  • @TimotheeLegros 那是因为你以 `root` 身份运行 SSH 会话 **不建议这样做,因为它存在安全风险** _(唯一的例外是在单用户操作系统上,而 Ubuntu 不是)_。我在第一条评论中解释了这一点,简单的谷歌搜索可以提供现实世界的例子,说明为什么永远不应该这样做。如果您希望文件具有 UGO 权限,则必须将 SSH 密钥从 Windows 复制到 WSL,否则它们仍将具有 Windows ACL。 _**如果值得做,就值得第一次就做好_** (3认同)
  • `sudo` 不应该用于打开 SSH 会话,因为它存在安全风险。_(至少我知道)_ root 帐户应该用于打开 SSH 会话的唯一时间是在单用户系统上 _(即通常在路由器操作系统的 [OpenWrt、DD-WRT 等] 上找到)和其他嵌入式系统)_。SSH 密钥**必须** 只能由它们所针对的用户访问,其他帐户、服务或组不能访问。 (2认同)

小智 35

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

cp <path to your key> ~/.ssh/<name of your key>
Run Code Online (Sandbox Code Playgroud)

现在您应该可以正常修改权限了。

sudo chmod 600 ~/.ssh/<your key's name>
Run Code Online (Sandbox Code Playgroud)

然后使用 WSL ssh:

ssh -i ~/.ssh/<name of your key> <username>@<ip address>
Run Code Online (Sandbox Code Playgroud)

  • 最佳答案在这里。 (2认同)
  • Git-Bash 也可以直接开箱即用地完成这项工作。 (2认同)

小智 16

你只需要做至少四件事:

  1. 禁用继承

在此处输入图片说明

  1. 将继承的权限转换为显式权限

在此处输入图片说明

  1. 删除用户组

在此处输入图片说明

  1. 您最终将没有用户可以访问私人文件,这应该足以添加 id_rsa。

在此处输入图片说明

  • 这是最简单的答案!在密钥文件上:(1) 禁用继承,(2) 仅添加 1 个具有完全权限的用户(当前用户) (2认同)

小智 11

在您的密钥上使用以下命令,它适用于 Windows

icacls .\private.key /inheritance:r
icacls .\private.key /grant:r "%username%":"(R)"
Run Code Online (Sandbox Code Playgroud)

  • 注意:这些命令必须在命令窗口 (CMD.EXE) 内发出。第二个命令行在 PowerShell 命令窗口中对我不起作用;即使环境变量 USERNAME 已定义并且具有正确的值,它也会生成一条错误消息,指出“无效参数“%username%””。此外,在我对 RSA 私钥文件调用这两个 icacls 命令后,当我在 PowerShell 窗口中调用 ssh 时,我继续收到“错误权限”错误消息。 (4认同)

Ric*_*h S 10

这似乎与您运行的 OpenSSH 版本有关:

运行时..\Git\usr\bin\ssh.exe,它工作正常并且不会抱怨权限,但是运行..\OpenSSH\ssh.exe会返回以下内容,即使关键 ACL 对我自己来说是完全访问权限,没有别的:

load key "t:\mykeys\rich-private.ppk": invalid format
  banana@127.0.0.127: Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

  • 该错误消息是由于使用了无效的密钥格式 [a PuTTY 密钥],因为 OpenSSH 不支持 PuTTY 密钥_(必须首先通过 PuTTYgen → 转换对它们进行转换)_ (2认同)

Lou*_*eru 7

以下是使用 Microsoft 工具执行此操作的方法,从一开始就避免了该问题。但它也应该可以解决问题,这意味着您可以使用现有密钥按照这些说明进行操作。

以管理员身份启动 PowerShell/终端并运行以下命令:

Install-Module -Force OpenSSHUtils -Scope AllUsers

# Make sure the service isn't disabled
Get-Service -Name ssh-agent | Set-Service -StartupType Manual

# We need this service as ssh-add depends on it
Start-Service ssh-agent

cat ~\.ssh\example-key.ecdsa | ssh-add -k -
Run Code Online (Sandbox Code Playgroud)


小智 5

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

Icacls <file name> /Inheritance:r
Icacls <file name> /Grant:r "%Username%":"(R)"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢就像魅力一样有效 (2认同)