Windows Server 2022 سرویس OpenSSH Server را بهصورت قابلیت اختیاری دارد: بدون نصبکنندهٔ شخص ثالث و با بهروزرسانی از Windows Update. پس از روشن کردن، میتوانید PowerShell را از راه SSH اجرا کنید، با scp فایل کپی کنید و اسکریپتها یا CI را مانند هر ماشین لینوکسی به سرور وصل کنید.
همهٔ کارهای زیر را روی ایمیج Windows Server 2022 خودمان، در PowerShell با دسترسی مدیر از راه RDP انجام دادیم (چگونه وصل شویم).
اول شبکه. در پلن ویندوزی با 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: فایلی که همه سرش گیر میکنند
این نخستین تلهٔ ویندوز است. برای حسابهای گروه 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 را عرضه میکند که همان رمز ویندوز را میپرسد. در آزمون ما ورود بدون کلید تا وقتی آن را هم نبستیم، 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 است. ویندوز همان Server 2022 با مجوز خود شماست (توضیح BYOL). هر چهار پلن در صفحهٔ Windows VPS هستند. برای اینکه برنامه پس از قطع اتصال هم اجرا شود، اجرای اسکریپت 24/7 روی Windows Server را ببینید.
نظرات
هنوز نظری نیست. اولین نفر باشید.