−25%

cho Windows trả theo năm, đến 31/10. Xem các gói

EQVPS
Bắt đầu

Cách cài OpenSSH Server trên Windows Server 2022 (đăng nhập bằng khóa, shell PowerShell)

Cài OpenSSH Server tích hợp trên VPS Windows Server 2022, đặt PowerShell làm shell mặc định, đăng nhập bằng khóa với tài khoản Administrator và tắt đăng nhập bằng mật khẩu. Kèm hai cái bẫy của Windows khiến đăng nhập bằng khóa thất bại.

Windows Server 2022 có sẵn OpenSSH Server dưới dạng tính năng tùy chọn: không cần trình cài bên thứ ba, cập nhật qua Windows Update. Khi đã bật, bạn có thể chạy PowerShell qua SSH, chép tệp bằng scp và trỏ script hay CI vào server như với bất kỳ máy Linux nào.

Mọi bước dưới đây được làm trên image Windows Server 2022 của chúng tôi, trong PowerShell có quyền quản trị qua RDP (cách kết nối).

Trước hết là mạng. Trên gói Windows NAT, chuyển tiếp vào duy nhất đi tới RDP, nên SSH không truy cập được từ internet. Muốn SSH từ bên ngoài, bạn cần gói có IPv4 riêng, như Windows Small-IP. Khi cổng truy cập được, các bước dưới đây mất khoảng năm phút.

1. Cài OpenSSH Server

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

Client đã có sẵn; server hiện NotPresent cho đến khi bạn thêm vào. Trên server của chúng tôi, việc cài mất 28 giây.

2. Khởi động và cho chạy cùng hệ thống

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

Cài tính năng này sẽ tạo quy tắc tường lửa OpenSSH-Server-In-TCP (cổng 22, chiều vào, cho phép), nên bạn không cần tự thêm.

3. Đặt PowerShell làm shell mặc định

Mặc định, phiên SSH vào cmd.exe. Chuyển sang PowerShell:

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

Kết nối mới nhận PowerShell 5.1 ngay; không cần khởi động lại.

4. Khóa cho Administrator: tệp khiến ai cũng vấp

Đây là cái bẫy đầu tiên của Windows. Với các tài khoản trong nhóm Administrators, sshd không đọc C:\Users\<name>\.ssh\authorized_keys. Nó đọc một tệp dùng chung, C:\ProgramData\ssh\administrators_authorized_keys, và chỉ khi ngoài Administrators và SYSTEM thì không ai ghi được vào đó:

$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 cũng quan trọng. Trong lần thử của chúng tôi, cùng khóa đó lưu bằng Out-File (UTF-16, mặc định của PowerShell 5.1) đã bị từ chối với Permission denied (publickey). Từ máy của bạn:

ssh Administrator@YOUR.SERVER.IP

Bạn sẽ nhận được dấu nhắc PowerShell mà không cần mật khẩu. Với người dùng không phải quản trị, C:\Users\<name>\.ssh\authorized_keys thông thường vẫn dùng được.

5. Tắt đăng nhập bằng mật khẩu: cái bẫy thứ hai

Thay đổi hiển nhiên PasswordAuthentication no là chưa đủ ở phiên bản này. OpenSSH 8.1 vẫn đưa ra keyboard-interactive, hỏi cùng một mật khẩu Windows. Trong lần thử của chúng tôi, đăng nhập không có khóa vẫn hiện keyboard-interactive cho đến khi chúng tôi tắt cả nó. Ngoài ra, thiết lập phải nằm trước khối Match Group administrators ở cuối tệp, nếu không nó chỉ áp dụng cho quản trị viên. Lệnh này đặt cả hai dòng lên đầu:

$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

Giữ phiên SSH hiện tại mở và thử từ terminal thứ hai. Một lần thử chỉ bằng mật khẩu giờ phải nhận được:

Permission denied (publickey).

Đó là kết quả trong lần thử của chúng tôi cho cả Administrator lẫn người dùng thường, trong khi đăng nhập bằng khóa vẫn hoạt động.

Bạn có thể làm gì với nó

  • Chạy lệnh từ bất cứ đâu: ssh Administrator@IP 'Get-Service sshd'.
  • Chép tệp: scp .\app.zip Administrator@IP:C:/apps/.
  • Giới hạn cổng cho địa chỉ của bạn, giống như với RDP: Set-NetFirewallRule -Name OpenSSH-Server-In-TCP -RemoteAddress 203.0.113.10.

Chọn gói nào

SSH từ bên ngoài cần IPv4 công khai: Windows Small-IP (4 vCPU, 4 GB, 50 GB) giá $28/tháng, Windows Medium-IP (6 vCPU, 6 GB) $36/tháng. Windows là Server 2022 với giấy phép của chính bạn (giải thích BYOL). Cả bốn gói có trên trang Windows VPS. Để chương trình vẫn chạy sau khi bạn ngắt kết nối, xem chạy script 24/7 trên Windows Server.

FAQ

Vì sao cần SSH trên Windows khi đã có RDP?

Script và công cụ dùng SSH. Có OpenSSH trên server, bạn chạy lệnh PowerShell từ máy Linux hoặc job CI, chép tệp bằng scp và để tự động hóa quản lý server mà không cần phiên desktop.

Khóa của tôi dùng được cho người dùng thường nhưng không cho Administrator. Vì sao?

Với thành viên nhóm Administrators, OpenSSH trên Windows bỏ qua ~/.ssh/authorized_keys và đọc C:\ProgramData\ssh\administrators_authorized_keys. Tệp đó chỉ được để Administrators và SYSTEM ghi; nếu không, sshd sẽ lặng lẽ bỏ qua nó.

Tôi có vào SSH được trên gói Windows NAT không?

Từ bên ngoài thì không. Trên gói Windows NAT, cổng ngoài riêng được chuyển tiếp tới RDP (3389), và đó là chuyển tiếp vào duy nhất. Muốn SSH từ internet, hãy chọn gói Windows có IPv4 riêng. Bên trong server, OpenSSH vẫn dùng được cho công cụ cục bộ.

Windows Server 2022 cài phiên bản OpenSSH nào?

OpenSSH 8.1p1 for Windows. Vì thế các thiết lập mật khẩu dùng ChallengeResponseAuthentication chứ không phải tên mới hơn KbdInteractiveAuthentication.

Bình luận

Chưa có bình luận nào. Hãy là người đầu tiên.

Để lại bình luận

Bình luận được kiểm duyệt trước khi hiển thị.