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
ความคิดเห็น
ยังไม่มีความคิดเห็น เป็นคนแรกสิ