ค้นหาเว็บไซต์

การกำหนดค่าการตรวจสอบสิทธิ์คีย์สาธารณะ SSH บน Windows


ในบทความนี้ เราจะแสดงวิธีกำหนดค่าการรับรองความถูกต้อง SSH ใน Windows โดยใช้คีย์ RSA หรือ EdDSA มาดูวิธีสร้างคู่คีย์สาธารณะและคีย์ส่วนตัวบน Windows และกำหนดค่าเซิร์ฟเวอร์ OpenSSH บน Windows 10/11 หรือ Windows Server 2019/2022 สำหรับการรับรองความถูกต้องด้วยคีย์ (โดยไม่ต้องใช้รหัสผ่าน)

การรับรองความถูกต้องโดยใช้คีย์ SSH นั้นใช้กันอย่างแพร่หลายในโลกของ Linux แต่ใน Windows นั้นเพิ่งปรากฏเมื่อไม่นานมานี้ แนวคิดคือคีย์สาธารณะของไคลเอ็นต์ถูกเพิ่มลงในเซิร์ฟเวอร์ SSH และเมื่อไคลเอ็นต์พยายามเชื่อมต่อกับคีย์ดังกล่าว เซิร์ฟเวอร์จะตรวจสอบว่าไคลเอ็นต์มีคีย์ส่วนตัวที่ตรงกันหรือไม่ วิธีนี้ทำให้ผู้ใช้ระยะไกลสามารถตรวจสอบสิทธิ์ใน Windows ได้โดยไม่ต้องป้อนรหัสผ่าน

การสร้างคู่คีย์ SSH บน Windows

คุณต้องสร้างคีย์ SSH สองคีย์ (สาธารณะและส่วนตัว) บนคอมพิวเตอร์ไคลเอนต์ที่คุณจะใช้เพื่อเชื่อมต่อกับโฮสต์ Windows ระยะไกลที่เรียกใช้ OpenSSH คีย์ส่วนตัวจะถูกเก็บไว้ในฝั่งไคลเอนต์ (รักษาคีย์ให้ปลอดภัยและไม่เปิดเผยกับใคร!) และคีย์สาธารณะจะถูกเพิ่มไปยังไฟล์ authorized_keys บนเซิร์ฟเวอร์ SSH หากต้องการสร้างคีย์ RSA บนไคลเอนต์ Windows คุณต้องติดตั้งไคลเอนต์ OpenSSH

บน Windows 10/11 และ Windows Server 2019/2022 ไคลเอนต์ OpenSSH จะถูกติดตั้งเป็นคุณลักษณะเสริมของ Windows โดยใช้ PowerShell:

Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

ใน Windows รุ่นก่อนหน้า คุณสามารถติดตั้งพอร์ต Win32-OpenSSH จาก GitHub (ดูตัวอย่างในบทความเกี่ยวกับการตั้งค่าเซิร์ฟเวอร์ SFTP (SSH FTP) บน Windows)

เปิดเซสชัน PowerShell มาตรฐาน (ไม่ยกระดับ) และสร้างคู่ของคีย์ ED25519 โดยใช้คำสั่ง:

ssh-keygen -t ed25519

โดยค่าเริ่มต้น เครื่องมือ ssh-keygen จะสร้างคีย์ RSA 2048 ปัจจุบัน ขอแนะนำให้ใช้ ED25519 แทนคีย์ RSA

คุณจะได้รับแจ้งให้ระบุรหัสผ่านเพื่อป้องกันคีย์ส่วนตัว หากคุณระบุรหัสผ่าน คุณจะต้องป้อนทุกครั้งที่คุณใช้คีย์นี้สำหรับการรับรองความถูกต้อง SSH ฉันไม่ได้ป้อนข้อความรหัสผ่าน (ไม่แนะนำ)

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\myuser/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\myuser/.ssh/id_ed25519.
Your public key has been saved in C:\Users\myuser/.ssh/id_ed25519.pub.
The key fingerprint is: SHA256:xxxxxxxx myuser@computername
The key's randomart image is:
+--[ED25519 256]--+
+----[SHA256]-----+

Ssh-keygen จะสร้างไดเรกทอรี .ssh ในโปรไฟล์ของผู้ใช้ Windows ปัจจุบัน (

%USERPROFILE%\.ssh

) และสร้าง 2 ไฟล์:

  • id_ed25519

    - รหัสส่วนตัว (หากคุณสร้างรหัส RSA ไฟล์จะถูกตั้งชื่อ

    id_rsa

    )

  • id_ed25519.pub

    - คีย์สาธารณะ (เรียกคีย์ RSA ที่คล้ายกัน

    id_rsa.pub

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

บริการ SSH Agent สามารถเก็บคีย์ส่วนตัวของคุณและจัดเตรียมไว้ในบริบทด้านความปลอดภัยของผู้ใช้ปัจจุบัน เรียกใช้บริการ ssh-agent และกำหนดค่าให้เริ่มต้นโดยอัตโนมัติโดยใช้คำสั่งการจัดการบริการ PowerShell:

set-service ssh-agent StartupType ‘Automatic’
Start-Service ssh-agent

เพิ่มรหัสส่วนตัวของคุณไปยังฐานข้อมูล ssh-agent:

ssh-add "C:\Users\youruser\.ssh\id_ed25519"
Identity added: C:\Users\youruser\.ssh\id_ed25519 (youruser@computername)

หรือดังต่อไปนี้:

ssh-add.exe $ENV:UserProfile\.ssh\id_rsa

OpenSSH: การกำหนดค่าการตรวจสอบสิทธิ์โดยใช้คีย์ด้วยคีย์สาธารณะบน Windows

ตอนนี้คุณต้องคัดลอกรหัสสาธารณะ SSH ของคุณไปยังเซิร์ฟเวอร์ SSH เซิร์ฟเวอร์ SSH ในตัวอย่างนี้เป็นเครื่อง Windows 11 ระยะไกลที่มีการติดตั้งและกำหนดค่าบริการ OpenSSH

คุณสามารถดูคู่มือฉบับเต็ม “วิธีกำหนดค่าเซิร์ฟเวอร์ OpenSSH บน Windows? ".

คัดลอกไฟล์ id_ed25519.pub ไปยังไดเร็กทอรี .ssh ในโปรไฟล์ของผู้ใช้ที่คุณจะใช้เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SSH ตัวอย่างเช่น ฉันมีบัญชี user1ในอุปกรณ์ Windows 11 ระยะไกลของฉัน ดังนั้นฉันจึงต้องคัดลอกคีย์ไปที่ C:\Users \user1\.ssh uthorized_keys

คุณสามารถคัดลอกรหัสสาธารณะไปยังเซิร์ฟเวอร์ SSH จากไคลเอนต์โดยใช้ SCP:

scp C:\Users\youruser\.ssh\id_rsa.pub admin@192.168.1.15:c:\users\admin\.ssh\authorized_keys

คุณสามารถเพิ่มพับลิกคีย์ได้หลายไฟล์ในไฟล์ Authorized_keys ไฟล์เดียว

การตรวจสอบสิทธิ์คีย์สาธารณะถูกปิดใช้งานตามค่าเริ่มต้นในเซิร์ฟเวอร์ OpenSSH บน Windows คุณสามารถตรวจสอบได้ใน sshd_config วิธีที่ง่ายที่สุดในการรับรายการวิธีการรับรองความถูกต้องที่อนุญาตใน OpenSSH คือการใช้คำสั่ง PowerShell ต่อไปนี้ (Select-String ใช้เป็นแอนะล็อกของ grep ใน PowerShell):

cat "C:\ProgramData\ssh\sshd_config"| Select-String "Authentication"
#PubkeyAuthentication yes
#HostbasedAuthentication no
#HostbasedAuthentication
PasswordAuthentication yes
#GSSAPIAuthentication no

ในตัวอย่างนี้ บรรทัด PubkeyAuthentication ถูกใส่ความคิดเห็น ซึ่งหมายความว่าวิธีการตรวจสอบสิทธิ์นี้ถูกปิดใช้งาน เปิดไฟล์ sshd_config ด้วย notepad และยกเลิกการแสดงความคิดเห็นในบรรทัด:

Notepad C:\ProgramData\ssh\sshd_config
PubkeyAuthentication yes

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

#StrictModes yes

และเปลี่ยนเป็น

StrictModes no

หากต้องการเชื่อมต่อกับรีโมตโฮสต์โดยใช้ไคลเอนต์ SSH ดั้งเดิม ให้ใช้คำสั่งต่อไปนี้:

ssh (username)@(SSH server name or IP address)

ตัวอย่างเช่น:

ssh admin@192.168.1.15

หมายความว่าคุณต้องการเชื่อมต่อกับเซิร์ฟเวอร์ SSH ระยะไกลด้วยที่อยู่ IP 192.168.1.15 ภายใต้ <user1 บัญชี บริการตัวแทน SSH จะพยายามใช้รหัสส่วนตัวของคุณโดยอัตโนมัติเพื่อตรวจสอบสิทธิ์บนโฮสต์ระยะไกล

  • หากคุณไม่ต้องการใช้บริการ ssh-agent เพื่อจัดการคีย์ SSH คุณสามารถระบุพาธไปยังไฟล์คีย์ส่วนตัวที่จะใช้สำหรับการตรวจสอบสิทธิ์ SSH:

    ssh user1@192.168.1.15 -i "C:\Users\youuser\.ssh\id_ed25519"
  • ในการเชื่อมต่อโฮสต์ SSH โดยใช้บัญชีผู้ใช้จากโดเมน Active Directory ให้ใช้รูปแบบต่อไปนี้:

    ssh jsmith@a-d.site@192.168.1.15 -i <private_key_absolute_path>

เมื่อเชื่อมต่อเป็นครั้งแรก คุณต้องเพิ่มลายนิ้วมือของคีย์เซิร์ฟเวอร์ SSH ลงในรายการที่เชื่อถือได้ พิมพ์ ใช่ -> Enter

The authenticity of host '192.168.1.15 (192.168.1.15)' can't be established.
ECDSA key fingerprint is SHA256:xxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

การบันทึก ETW ใช้ใน Windows OpenSSH เพื่อจัดเก็บบันทึก SSH แทนไฟล์ข้อความล้วน คุณสามารถตรวจสอบบันทึกการตรวจสอบสิทธิ์โดยใช้คีย์ SSH ได้ใน Windows Event Viewer (บันทึกแอปพลิเคชันและบริการ -> OpenSSH -> การทำงาน)

หากการเชื่อมต่อ SSH ด้วยคีย์ส่วนตัวสำเร็จ เหตุการณ์ต่อไปนี้จะปรากฏในบันทึก OpenSSH:

EventID 4
sshd: Accepted publickey for locadm from 192.168.15.20 port 55772 ssh2: ED25519 SHA256:xxxxxxx

หากคุณไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ SSH ของคุณโดยใช้รหัสส่วนตัวและคุณยังคงถูกขอให้ป้อนรหัสผ่าน เป็นไปได้ว่าบัญชีผู้ใช้ที่คุณพยายามเชื่อมต่อนั้นเป็นสมาชิกของกลุ่มผู้ดูแลระบบ Windows ภายในเครื่อง (กลุ่ม SID คือ

S-1-5-32-544

). เราจะหารือในภายหลัง

การบันทึก Windows ด้วยคีย์ SSH ภายใต้ผู้ใช้ที่เป็นผู้ดูแลระบบ

OpenSSH ใช้การตั้งค่าการรับรองความถูกต้องตามคีย์พิเศษสำหรับบัญชีผู้ใช้ที่เป็นผู้ดูแลระบบบน Windows

คุณต้องใช้ไฟล์ C:\ProgramData\ssh\administrators_authorized_keys แทนคีย์ authorized_keys ในโปรไฟล์ผู้ใช้ เพิ่มคีย์ SSH สาธารณะของคุณในไฟล์ข้อความนี้ (ด้วยเหตุผลด้านความปลอดภัย เฉพาะผู้ดูแลระบบและกลุ่ม SYSTEM เท่านั้นที่มีสิทธิ์อ่านไฟล์นี้)

คุณสามารถเปลี่ยนสิทธิ์ NTFS ในไฟล์ด้วย:

  • เครื่องมือ icacls:

    icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
  • หรือใช้ cmdlets Get-Acl และ Set-Acl PowerShell:

    get-acl "$env:programdata\ssh\ssh_host_rsa_key" | set-acl "$env:programdata\ssh\administrators_authorized_keys"

หลังจากนั้น การตรวจสอบคีย์ SSH จะทำงานแม้ว่าจะปิดใช้งาน StrictModes ก็ตาม

หากต้องการใช้ไฟล์ Authorized_keys จากโปรไฟล์ผู้ใช้และไม่ต้องย้ายข้อมูลคีย์สาธารณะไปยังไฟล์ administrators_authorized_keys คุณสามารถแสดงความคิดเห็นในไฟล์การกำหนดค่า OpenSSH (C:\ProgramData\ssh\sshd_config ).

#Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

นอกจากนี้ คุณสามารถปิดใช้งานการเข้าสู่ระบบด้วยรหัสผ่าน SSH ใน sshd_config:

PasswordAuthentication no

อย่าลืมรีสตาร์ทบริการ sshd หลังจากทำการเปลี่ยนแปลงใน sshd_config

restart-service sshd

หากคุณตั้งค่า PasswordAuthentication no และกำหนดค่าการตรวจสอบคีย์ SSH ไม่ถูกต้อง ข้อผิดพลาดจะปรากฏขึ้นเมื่อเชื่อมต่อผ่าน ssh:

user1@192.168.13.15: Permission denied (publickey,keyboard-interactive).

คุณสามารถใช้ตัวเลือก PermitRootLogin ใน OpenSSH บน Linux เพื่อจำกัดการเข้าสู่ระบบรูท SSH คำสั่งนี้ใช้ไม่ได้กับ Windows OpenSSH และคุณต้องใช้พารามิเตอร์ DenyGroups เพื่อปฏิเสธการเข้าสู่ระบบ ssh ภายใต้บัญชีผู้ดูแลระบบ:

DenyGroups Administrators

ดังนั้น คุณได้กำหนดค่าการรับรองความถูกต้อง SSH ใน Windows โดยใช้คู่คีย์ ตอนนี้คุณสามารถใช้วิธีการรับรองความถูกต้องนี้เพื่อเข้าถึงเซิร์ฟเวอร์ระยะไกลได้อย่างปลอดภัย ส่งต่อพอร์ตโดยอัตโนมัติในอุโมงค์ SSH เรียกใช้สคริปต์ และทำงานอัตโนมัติอื่นๆ

บทความที่เกี่ยวข้อง