−25%

Windows รายปี ถึง 31 ต.ค. ดูแพ็กเกจ

EQVPS
เริ่มต้นใช้งาน

วิธีติดตั้ง OpenSSH Server บน Windows Server 2022 (ล็อกอินด้วยคีย์ เชลล์ PowerShell)

ติดตั้ง OpenSSH Server ที่มากับระบบบน VPS Windows Server 2022 ตั้ง PowerShell เป็นเชลล์เริ่มต้น ล็อกอินด้วยคีย์ในฐานะ Administrator และปิดการล็อกอินด้วยรหัสผ่าน พร้อมกับดักสองข้อของ Windows ที่ทำให้ล็อกอินด้วยคีย์ไม่ได้

Windows Server 2022 มี OpenSSH Server เป็นฟีเจอร์เสริม: ไม่ต้องใช้ตัวติดตั้งของบุคคลที่สาม อัปเดตผ่าน Windows Update เมื่อเปิดใช้แล้ว คุณรัน PowerShell ผ่าน SSH คัดลอกไฟล์ด้วย scp และชี้สคริปต์หรือ CI มาที่เซิร์ฟเวอร์ได้เหมือนเครื่อง Linux ทั่วไป

ทุกอย่างด้านล่างเราทำบนอิมเมจ Windows Server 2022 ของเรา ใน PowerShell ที่มีสิทธิ์ผู้ดูแลระบบผ่าน RDP (วิธีเชื่อมต่อ)

เรื่องเครือข่ายก่อน บนแพ็กเกจ Windows แบบ NAT การส่งต่อขาเข้าเพียงอย่างเดียวไปที่ RDP จึงเข้า SSH จากอินเทอร์เน็ตไม่ได้ ถ้าต้องการ SSH จากภายนอกต้องใช้แพ็กเกจที่มี IPv4 ของตัวเอง เช่น Windows Small-IP เมื่อเข้าถึงพอร์ตได้ ขั้นตอนด้านล่างใช้เวลาราวห้านาที

1. ติดตั้ง OpenSSH Server

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

ไคลเอนต์ติดตั้งไว้แล้ว ส่วนเซิร์ฟเวอร์แสดง NotPresent จนกว่าคุณจะเพิ่ม บนเซิร์ฟเวอร์ของเรา การติดตั้งใช้เวลา 28 วินาที

2. เริ่มบริการและให้เริ่มเองตอนบูต

Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-NetFirewallRule -Name *OpenSSH*

การติดตั้งฟีเจอร์นี้จะสร้างกฎไฟร์วอลล์ OpenSSH-Server-In-TCP (พอร์ต 22 ขาเข้า อนุญาต) ให้เอง คุณไม่ต้องเพิ่มเอง

3. ตั้ง PowerShell เป็นเชลล์เริ่มต้น

โดยค่าเริ่มต้นเซสชัน SSH จะเข้า cmd.exe เปลี่ยนเป็น PowerShell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

การเชื่อมต่อใหม่จะได้ PowerShell 5.1 ทันที ไม่ต้องรีสตาร์ต

4. คีย์สำหรับ Administrator: ไฟล์ที่ทุกคนสะดุด

นี่คือกับดักแรกของ Windows สำหรับบัญชีในกลุ่ม Administrators sshd ไม่อ่าน C:\Users\<name>\.ssh\authorized_keys แต่อ่านไฟล์กลางไฟล์เดียวคือ C:\ProgramData\ssh\administrators_authorized_keys และจะอ่านก็ต่อเมื่อไม่มีใครนอกจาก Administrators และ SYSTEM เขียนไฟล์นั้นได้:

$pub = 'ssh-ed25519 AAAA...your-public-key... you@laptop'
Set-Content -Path C:\ProgramData\ssh\administrators_authorized_keys -Value $pub -Encoding ascii
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"

-Encoding ascii ก็สำคัญ ในการทดสอบของเรา คีย์เดียวกันที่บันทึกด้วย Out-File (UTF-16 ซึ่งเป็นค่าเริ่มต้นของ PowerShell 5.1) ถูกปฏิเสธด้วย Permission denied (publickey) จากเครื่องของคุณ:

ssh Administrator@YOUR.SERVER.IP

คุณควรได้พรอมต์ PowerShell โดยไม่ต้องใส่รหัสผ่าน สำหรับผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบ C:\Users\<name>\.ssh\authorized_keys แบบปกติใช้ได้

5. ปิดการล็อกอินด้วยรหัสผ่าน: กับดักที่สอง

การแก้แบบตรงไปตรงมาอย่าง PasswordAuthentication no ยังไม่พอในเวอร์ชันนี้ OpenSSH 8.1 ยังเสนอ keyboard-interactive ซึ่งถามรหัสผ่าน Windows ตัวเดียวกัน ในการทดสอบของเรา การล็อกอินโดยไม่มีคีย์ยังแสดง keyboard-interactive จนกว่าเราจะปิดมันด้วย นอกจากนี้การตั้งค่าต้องอยู่ ก่อน บล็อก Match Group administrators ท้ายไฟล์ ไม่เช่นนั้นจะมีผลกับผู้ดูแลระบบเท่านั้น คำสั่งนี้ใส่ทั้งสองบรรทัดไว้บนสุด:

$cfg = 'C:\ProgramData\ssh\sshd_config'
$lines = Get-Content $cfg | Where-Object { $_ -notmatch '^#?\s*(PasswordAuthentication|KbdInteractiveAuthentication|ChallengeResponseAuthentication)\s' }
Set-Content $cfg -Value (@('PasswordAuthentication no', 'ChallengeResponseAuthentication no') + $lines) -Encoding ascii
Restart-Service sshd

เปิดเซสชัน SSH ปัจจุบันค้างไว้ แล้วทดสอบจากเทอร์มินัลที่สอง การลองด้วยรหัสผ่านอย่างเดียวตอนนี้ควรได้:

Permission denied (publickey).

นี่คือผลในการทดสอบของเรา ทั้งกับ Administrator และผู้ใช้ทั่วไป ขณะที่การล็อกอินด้วยคีย์ยังใช้ได้

ใช้ทำอะไรได้บ้าง

  • รันคำสั่งจากที่ไหนก็ได้: ssh Administrator@IP 'Get-Service sshd'
  • คัดลอกไฟล์: scp .\app.zip Administrator@IP:C:/apps/
  • จำกัดพอร์ตให้เฉพาะที่อยู่ของคุณ แบบเดียวกับ RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10

เลือกแพ็กเกจไหน

SSH จากภายนอกต้องมี IPv4 สาธารณะ: Windows Small-IP (4 vCPU, 4 GB, 50 GB) ราคา $28/เดือน Windows Medium-IP (6 vCPU, 6 GB) $36/เดือน Windows คือ Server 2022 กับใบอนุญาตของคุณเอง (BYOL คืออะไร) ทั้งสี่แพ็กเกจอยู่ใน หน้า Windows VPS ถ้าต้องการให้โปรแกรมทำงานต่อหลังตัดการเชื่อมต่อ ดู รันสคริปต์ 24/7 บน Windows Server

คำถามที่พบบ่อย

ทำไมต้องมี SSH บน Windows ในเมื่อมี RDP อยู่แล้ว

สคริปต์และเครื่องมือต่าง ๆ ใช้ SSH เมื่อมี OpenSSH บนเซิร์ฟเวอร์ คุณรันคำสั่ง PowerShell จากเครื่อง Linux หรืองาน CI คัดลอกไฟล์ด้วย scp และให้ระบบอัตโนมัติดูแลเซิร์ฟเวอร์ได้โดยไม่ต้องมีเซสชันเดสก์ท็อป

คีย์ของฉันใช้กับผู้ใช้ทั่วไปได้ แต่ใช้กับ Administrator ไม่ได้ เพราะอะไร

สำหรับสมาชิกกลุ่ม Administrators OpenSSH บน Windows จะไม่สนใจ ~/.ssh/authorized_keys แต่จะอ่าน C:\ProgramData\ssh\administrators_authorized_keys แทน ไฟล์นั้นต้องเขียนได้เฉพาะ Administrators และ SYSTEM ไม่เช่นนั้น sshd จะข้ามไปเงียบ ๆ

เข้า SSH บนแพ็กเกจ Windows แบบ NAT ได้ไหม

จากภายนอกไม่ได้ บนแพ็กเกจ Windows แบบ NAT พอร์ตภายนอกส่วนตัวถูกส่งต่อไปที่ RDP (3389) และเป็นการส่งต่อขาเข้าเพียงอย่างเดียว ถ้าต้องการ SSH จากอินเทอร์เน็ต ให้เลือกแพ็กเกจ Windows ที่มี IPv4 ของตัวเอง ภายในเซิร์ฟเวอร์ OpenSSH ยังใช้กับเครื่องมือภายในได้

Windows Server 2022 ติดตั้ง OpenSSH เวอร์ชันไหน

OpenSSH 8.1p1 for Windows การตั้งค่ารหัสผ่านจึงใช้ ChallengeResponseAuthentication ไม่ใช่ชื่อใหม่กว่าอย่าง KbdInteractiveAuthentication

ความคิดเห็น

ยังไม่มีความคิดเห็น เป็นคนแรกสิ

แสดงความคิดเห็น

ความคิดเห็นจะถูกตรวจสอบก่อนแสดง