การกำหนดค่าการตรวจสอบสิทธิ์คีย์สาธารณะ 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_rsaOpenSSH: การกำหนดค่าการตรวจสอบสิทธิ์โดยใช้คีย์ด้วยคีย์สาธารณะบน 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_configPubkeyAuthentication 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 เรียกใช้สคริปต์ และทำงานอัตโนมัติอื่นๆ













