Windows SSH: การอนุญาตสำหรับ 'รหัสส่วนตัว' นั้นเปิดเกินไป


99

ฉันติดตั้ง OpenSSH 7.6 ใน Windows 7 เพื่อการทดสอบแล้ว ไคลเอ็นต์และเซิร์ฟเวอร์ SSH ทำงานได้ดีจนกระทั่งฉันพยายามเข้าถึงหนึ่งในกล่อง AWS EC2 ของฉันจากหน้าต่างนี้

ดูเหมือนว่าฉันจะต้องเปลี่ยนการอนุญาตในไฟล์คีย์ส่วนตัว สิ่งนี้สามารถทำได้อย่างง่ายดายบน unix / linux ด้วยchmodคำสั่ง

แล้ว windows ล่ะ?

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 หรือไม่
Ignacio Vazquez-Abrams

1
คีย์ส่วนตัวของคุณเป็นจริงใน C: \ root path หรือไม่ ฉันเห็นว่าทำไมมันถึงบ่นได้เหมือนทุกสิ่งใน C: \ ที่ทุกคนเข้าถึงได้ คุณลองย้ายมันไปยังโฟลเดอร์ที่มีเพียงคุณเท่านั้นที่เป็นผู้ใช้ที่มีสิทธิ์เข้าถึง (เช่น C: \ Users \ ชื่อผู้ใช้ \ desktop) และดูว่าข้อความนั้นยังคงปรากฏขึ้นมาหรือไม่?
Darius

@ ดาไรอัสใช่แล้ว เมื่อคุณคัดลอกไฟล์จาก unix / linux ไปยัง windows การอนุญาตจะถูกคัดลอกเช่นกัน ฉันต้องเปลี่ยนสิ่งนี้ แต่ไม่แน่ใจว่าจะทำอย่างไรกับ windows สิ่งนี้สามารถทำได้อย่างง่ายดายบน unix / linux ด้วยคำสั่ง chmod
ซาบรีนา

@ IgnacioVazquez-Abrams, ACL หรือไม่ ACL ประเภทใด
ซาบรีนา

1
@Sabrina ไม่ว่าคุณจะใช้คำสั่ง icacls เพื่อเปลี่ยนการอนุญาตหรือเพียงคลิกขวาที่คีย์ส่วนตัวแล้วเลือกคุณสมบัติและตรวจสอบภายใต้แท็บ "ความปลอดภัย" และตรวจสอบให้แน่ใจว่าคุณ / ใครก็ตามที่เข้าถึงคีย์ส่วนตัวได้ หาก "ผู้ใช้" มีสิทธิ์เข้าถึงเพื่ออ่าน - หมายถึงทุกคนที่มีสิทธิ์เข้าถึงระบบสามารถอ่านคีย์ส่วนตัวนั้นได้
Darius

คำตอบ:


114

คุณค้นหาไฟล์ใน Windows Explorer คลิกขวาแล้วเลือก "Properties" ไปที่แท็บ "ความปลอดภัย" แล้วคลิก "ขั้นสูง"

เปลี่ยนเจ้าของให้คุณปิดการใช้งานการสืบทอดและลบสิทธิ์ทั้งหมด จากนั้นให้สิทธิ์ตัวเอง "ควบคุมทั้งหมด" และบันทึกการอนุญาต ตอนนี้ SSH จะไม่บ่นเกี่ยวกับการอนุญาตให้เปิดไฟล์อีกต่อไป

มันควรจะเป็นแบบนี้:

ป้อนคำอธิบายรูปภาพที่นี่


2
ฉันแค่อยากจะเพิ่ม1)วิธีนี้ใช้ได้กับ10.0.17134.191กล่องWindows 10 ( ) ของฉันพร้อมCygwin ver CYGWIN_NT-10.0-WOW 2.3.1(0.291/5/3) 2015-11-14 12:42และ ssh ver OpenSSH_for_Windows_7.6p1, LibreSSL 2.6.4และ2)ขอบคุณ! @iBug!
atreyu

หากไฟล์สำคัญอยู่ใน Thumb Drive / แฟลชดิสก์นั้นแท็บความปลอดภัยจะไม่สามารถใช้งานได้!
Dylan B

@DylanB ทำไมคุณต้องใส่ข้อมูลประจำตัวในไดรฟ์แบบถอดได้ (อันที่จริงแท็บนั้นใช้ได้เฉพาะกับระบบไฟล์ NTFS เท่านั้น - คุณสามารถฟอร์แมตไดรฟ์ของคุณเป็น NTFS ได้อย่างง่ายดาย)
iBug

11
ที่จริงแล้วฉันทำอย่างนั้นและก็ยังบ่นว่าสิทธิ์ 0777 เปิดเกินไป
Aaron Bramson

10
ทำไมจึงเป็นเรื่องยากมากใน windows ใครบางคนสามารถเพิ่มตัวเลือกคำสั่ง --ignore-stupid-rule
Liam Mitchell

21

กุญแจจะต้องสามารถเข้าถึงได้โดยผู้ใช้ที่พวกเขาตั้งใจไว้และไม่มีบัญชีบริการหรือกลุ่มอื่น ๆ

  • GUI:
    • [ไฟล์] คุณสมบัติ - ความปลอดภัย - ขั้นสูง
      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 serviceCygwin คิดว่าการอนุญาตคือ 0770 แทนที่จะเป็น 0700
244 hyspace

ไฟล์ต้องเป็นเจ้าของโดยผู้ใช้และกลุ่มไม่ใช่เฉพาะกลุ่ม สิทธิ์ของกลุ่มคือเลขฐานแปดที่ 3 [ผู้ใช้คืออันดับที่ 2] ในข้อมูลจำเพาะของเลขฐานแปดสี่ตัวและคีย์ SSH ไม่สามารถเป็นกลุ่มหรือผู้อื่นที่สามารถเข้าถึงได้
JW0914

นั่นคือกรณีของ Unix ใน Windows network serviceสามารถเป็นเจ้าของไฟล์และเป็นกลุ่ม
hyspace

Cygwin อนุญาตการทำงานของ POSIX API บน Windows แต่ยังคงทำงานภายใต้กฎของโปรแกรมที่ใช้ UNIX ดั้งเดิม (ด้วยเหตุนี้การอนุญาตแบบ 3 และ 4 ฐานแปดในการตั้งค่า UGO) ในขณะที่คุณสามารถเปิดปัญหาใน GitHub ของ Win32-OpenSSH ของ Microsoft ได้เนื่องจากคีย์ SSH ต้องเป็นกลุ่มและอื่น ๆไม่สามารถเข้าถึงได้การมีกรรมสิทธิ์ในวิธีที่คุณอธิบายไม่น่าเป็นไปได้ มันจะดีกว่าที่จะสอดคล้องกับบรรทัดฐานของโปรแกรมมากกว่าความพยายามที่จะกำหนดค่าด้วยวิธีที่ไม่น่าสนับสนุน
JW0914

1
นี่ควรเป็นคำตอบที่ถูกต้อง ขอบคุณสำหรับตัวเลือก CLI GUI มักจะดูดในกรณีที่ windows
shyammakwana.me

10

นอกจากคำตอบที่ได้รับจาก ibug ตั้งแต่ฉันใช้ระบบ ubuntu ใน windows เพื่อรันคำสั่ง ssh มันยังไม่ทำงาน ดังนั้นฉันทำ

sudo ssh ...

แล้วมันก็ใช้งานได้


sudoไม่ควรใช้เพื่อเปิดเซสชัน SSH เนื่องจากเป็นความเสี่ยงด้านความปลอดภัย ควรใช้บัญชีรูทเท่านั้น(อย่างน้อยที่สุดที่ฉันทราบ)เพื่อเปิดเซสชัน SSH นั้นใช้ระบบผู้ใช้เดี่ยว(เช่นปกติที่พบในระบบปฏิบัติการเราเตอร์ [OpenWrt, DD-WRT, ฯลฯ ] และระบบฝังตัวอื่น ๆ ) . คีย์ SSH จะต้องสามารถเข้าถึงได้เฉพาะกับผู้ใช้ที่มีและไม่มีบัญชีบริการหรือกลุ่มอื่น ๆ
JW0914

@ JW0914 LOL ฉันมีเซิร์ฟเวอร์ Debian สำหรับผู้ใช้คนเดียวและผู้ใช้ (เข้าสู่ระบบ) เป็น 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 ด้วยเหตุผลทั้งหมดตั้งแต่ความปลอดภัยจนถึงความไม่สะดวกอย่างมากหากจำเป็นต้องแก้ไขไดเรกทอรี Windows ที่เสียหายไม่ว่าจะผ่านDISMหรือใช้ตัวเลือกการรีเซ็ต(ซึ่งได้รับการปรับปรุงให้ใช้ไดเรกทอรี WinSxS เมื่อเทียบกับการย้อนกลับไปที่เดิมinstall.esd )
JW0914

นี่คือสิ่งที่ช่วยฉันฉันไม่เคยมีรุ่น windows ssh มาทำงานในสถานการณ์นี้มีเพียง Git เท่านั้น :(
cudacoder

นี่คือการแก้ไขสำหรับฉันด้วย ดูเหมือนว่า Windows 10 Pro จะมาพร้อมกับ openssh เวอร์ชันที่ได้รับการดัดแปลง ฉันถูกบังคับให้ลบโฟลเดอร์ C: \ Windows \ System32 \ OpenSSH และเพิ่ม ssh.exe ของ git ไปที่ PATH
Shukri Adams

"แก้ไข" นี้สำหรับฉันโดยใช้ C: \ Program Files \ Git \ usr \ bin \ ssh.exe ทำงานเป็น C: \ Windows \ System32 \ OpenSSH \ ssh.exe ไม่ได้
smartins

3

คุณต้องการ jsut 2 สิ่ง:

1) ปิดใช้งานการสืบทอด ป้อนคำอธิบายรูปภาพที่นี่

2) แปลงสิทธิ์ที่สืบทอดมาให้เป็นสิทธิ์ที่ชัดเจน ป้อนคำอธิบายรูปภาพที่นี่

3) ลบกลุ่มผู้ใช้ ป้อนคำอธิบายรูปภาพที่นี่

4) คุณจะพบว่าไม่มีผู้ใช้สามารถเข้าถึงไฟล์ส่วนตัวได้ซึ่งควรจะเพียงพอที่จะเพิ่ม id_rsa ป้อนคำอธิบายรูปภาพที่นี่


2

ฉันมีปัญหาที่คล้ายกัน แต่ฉันทำงานและไม่มีความสามารถในการเปลี่ยนการอนุญาตไฟล์ในคอมพิวเตอร์ที่ทำงานของฉัน สิ่งที่คุณต้องทำคือติดตั้งWSLแล้วคัดลอกคีย์ของคุณไปยังไดเรกทอรี ssh ที่ซ่อนอยู่ใน WSL:

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

ตอนนี้คุณควรจะสามารถแก้ไขสิทธิ์ได้ตามปกติ

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

จากนั้น ssh ใช้ WSL:

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

คุณสามารถใช้ icacls ใน windows แทน chmod เพื่อปรับเปลี่ยนการอนุญาตไฟล์ เพื่อให้ผู้ใช้ปัจจุบันได้รับอนุญาตอ่านและลบทุกอย่างออก

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

0

นี่เป็นเพียงเวอร์ชัน scripted ของคำตอบ CLI ของ @ JW0914 ดังนั้นจงโหวตให้เขาเป็นคนแรกและสำคัญที่สุด นอกจากนี้ยังเป็นสคริปต์ 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 $_
}

0

Mingw-w64ใช้

ข้อมูล: http://mingw-w64.org/doku.php

ดาวน์โหลดด้วย Git สำหรับ Windows หรือโดยตรง

มีให้ที่นี่: https://github.com/mirror/mingw-w64

git clone https://github.com/mirror/mingw-w64

นอกจากนี้ยังมีคำสั่งลินุกซ์อื่น ๆ ที่มีประโยชน์เช่นและtargzip


-1

ตอบโดย iBug ทำงานได้ดี! คุณสามารถติดตามและกำจัดปัญหานี้ได้

แต่มีบางสิ่งที่จำเป็นต้องล้างข้อมูลเมื่อฉันประสบปัญหาระหว่างการตั้งค่าการอนุญาตและใช้เวลาสองสามนาทีเพื่อให้ฉันเข้าใจปัญหา!

ทำตามคำตอบของ iBug คุณจะลบสิทธิ์ทั้งหมด แต่คุณจะตั้งค่าสิทธิ์ควบคุมทั้งหมดให้กับตัวเองได้อย่างไร นั่นคือสิ่งที่ฉันติดอยู่ในตอนแรกเพราะฉันไม่รู้ว่าจะทำอย่างไร

หลังจากปิดใช้งานการสืบทอดคุณจะสามารถลบผู้ใช้หรือกลุ่มที่อนุญาตทั้งหมด

เมื่อทำเสร็จแล้ว

คลิกที่Addแล้วคลิกที่Set a Principalแล้วใส่SystemและAdministratorsและในด้านที่ด้านล่างแล้วคลิกที่your email addreddcheck names

มันจะโหลดชื่อหากมีผู้ใช้ จากนั้นคลิกที่OK> ประเภทAllow> สิทธิ์พื้นฐานFull Control>Okay

การดำเนินการนี้จะตั้งค่าสิทธิ์ควบคุมทั้งหมดเป็น SYSTEM, Administrators และ User

หลังจากนั้นลองใช้ ssh โดยใช้ปุ่มนั้น ควรแก้ไขได้ในขณะนี้

ฉันมีปัญหาเดียวกันและฉันแก้ไขโดยใช้วิธีนี้ หากมีผู้ใช้หรือกลุ่มที่มีชื่อนั้นมันจะโหลด

-Screenshots-

รายการสิทธิ์ เลือกผู้ใช้หลัก / เลือกผู้ใช้หรือกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.