Windows SSH 登录 jarak jauh
Categories:
Mengaktifkan akses SSH jarak jauh di Windows umumnya memerlukan fitur OpenSSH dari Windows. Berikut adalah petunjuk langkah-langkah rinci:
Memeriksa dan Memasang OpenSSH
Memeriksa apakah OpenSSH sudah terinstal:
- Buka “Setelan” > “Aplikasi” > “Aplikasi dan Fitur” > “Fungsi opsional”.
- Cari “OpenSSH Server” dalam daftar yang sudah terinstal. Jika ada, itu berarti sudah terinstal.
Memasang OpenSSH:
- Jika OpenSSH Server tidak ditemukan, bisa klik “Tambah fitur” di halaman “Fungsi opsional”, lalu cari “OpenSSH Server” di daftar dan klik “Instal”.
Memulai dan Mengatur Layanan OpenSSH
Memulai Layanan OpenSSH:
- Setelah terinstal, buka Command Prompt (jalankan sebagai administrator).
- Masukkan
net start sshduntuk memulai layanan OpenSSH. Jika ingin layanan ini otomatis setiap kali boot, bisa masukkansc config sshd start= auto.
Mengonfigurasi Firewall:
- Pastikan firewall Windows mengizinkan koneksi SSH. Bisa melalui “Panel Kontrol” > “Sistem dan Keamanan” > “Defender Firewall Windows” > “Setelan Lanjutan”, lalu buat aturan masukan baru, izinkan koneksi TCP port 22.
Mendapatkan Alamat IP dan Menguji Koneksi
Mendapatkan Alamat IP:
- Untuk terhubung ke PC Windows yang memiliki layanan SSH dari mesin lain, kamu butuh alamat IP-nya. Bisa gunakan perintah
ipconfigdi Command Prompt untuk melihat IP komputer lokal.
- Untuk terhubung ke PC Windows yang memiliki layanan SSH dari mesin lain, kamu butuh alamat IP-nya. Bisa gunakan perintah
Uji Koneksi:
- Di komputer lain atau perangkat seluler, gunakan klien SSH (seperti: PuTTY, Termius, dll) untuk mencoba terhubung ke PC Windows kamu, menggunakan format
ssh username@your_ip_address. Di manausernameadalah nama akun Windows yang akan login, danyour_ip_addressadalah IP yang tadi kamu dapat.
- Di komputer lain atau perangkat seluler, gunakan klien SSH (seperti: PuTTY, Termius, dll) untuk mencoba terhubung ke PC Windows kamu, menggunakan format
Mengubah Konfigurasi
Hindari penggunaan kata sandi untuk login, ini area mutlak tabrakan. Wajib menggunakan kunci untuk login, kita perlu mengubah setelan, menonaktifkan login kata sandi, dan mengizinkan login kunci publik.
Berkas konfigurasi ini tidak mudah diedit, memerlukan izin khusus untuk diedit, serta perlu memastikan direktori dan berkas memiliki izin nilai tertentu, di sinilah disarankan untuk menggunakan skrip untuk mengubahnya.
# Memeriksa izin administrator
$elevated = [bool]([System.Security.Principal.WindowsPrincipal]::new(
[System.Security.Principal.WindowsIdentity]::GetCurrent()
).IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator))
if (-not $elevated) {
Write-Error "请以管理员身份运行此脚本"
exit 1
}
1. Memeriksa dan Memasang OpenSSH Server
Write-Host “正在检查 OpenSSH 服务器安装状态…” $capability = Get-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
if ($capability.State -ne ‘Installed’) { Write-Host “正在安装 OpenSSH 服务器…” Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 | Out-Null }
2. Memulai dan Mengatur Otomatis Layanan SSH
Write-Host “正在配置 SSH 服务…” $service = Get-Service sshd -ErrorAction SilentlyContinue if (-not $service) { Write-Error “OpenSSH 服务安装失败” exit 1 }
if ($service.Status -ne ‘Running’) { Start-Service sshd } Set-Service sshd -StartupType Automatic
3. Mengubah Berkas Konfigurasi
$configPath = “C:\ProgramData\ssh\sshd_config” if (Test-Path $configPath) { Write-Host “正在备份原始配置文件…” Copy-Item $configPath “$configPath.bak” -Force } else { Write-Error “找不到配置文件: $configPath” exit 1 }
Write-Host “正在修改 SSH 配置…” $config = Get-Content -Path $configPath -Raw
Mengaktifkan otentikasi kunci publik dan menonaktifkan otentikasi kata sandi
$config = $config -replace ‘^#?PubkeyAuthentication .$’,‘PubkeyAuthentication yes’ ` -replace ‘^#?PasswordAuthentication .$’,‘PasswordAuthentication no’
Memastikan mencakup konfigurasi yang diperlukan
if ($config -notmatch ‘PubkeyAuthentication’) {
$config += “nPubkeyAuthentication yes" } if ($config -notmatch 'PasswordAuthentication') { $config += "nPasswordAuthentication no”
}
Menulis kembali berkas konfigurasi
$config | Set-Content -Path $configPath -Encoding UTF8
## authorized_keys 文件权限确认
```powershell
# pengguna biasa
$authKeys = "$env:USERPROFILE\.ssh\authorized_keys"
icacls $authKeys /inheritance:r /grant "$($env:USERNAME):F" /grant "SYSTEM:F"
icacls "$env:USERPROFILE\.ssh" /inheritance:r /grant "$($env:USERNAME):F" /grant "SYSTEM:F"
# administrator
$adminAuth = "C:\ProgramData\ssh\administrators_authorized_keys"
icacls $adminAuth /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
Menetapkan Aturan Firewall
# Izinkan port SSH
New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
Menambahkan Kunci Publik
Pengguna Biasa
# pengguna biasa
$userProfile = $env:USERPROFILE
$sshDir = Join-Path $userProfile ".ssh"
$authorizedKeysPath = Join-Path $sshDir "authorized_keys"
$PublicKeyPath = "D:\public_keys\id_rsa.pub"
# Membuat direktori .ssh
if (-not (Test-Path $sshDir)) {
New-Item -ItemType Directory -Path $sshDir | Out-Null
}
# Menyetel izin direktori .ssh
$currentUser = "$env:USERDOMAIN\$env:USERNAME"
$acl = Get-Acl $sshDir
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
$currentUser, "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$acl.AddAccessRule($rule)
Set-Acl $sshDir $acl
# Menambahkan kunci publik
if (Test-Path $PublicKeyPath) {
$pubKey = Get-Content -Path $PublicKeyPath -Raw
if ($pubKey) {
# Memastikan akhir kunci memiliki baris baru
if (-not $pubKey.EndsWith("`n")) {
$pubKey += "`n"
}
# Menambahkan kunci publik (menambahkan)
Add-Content -Path $authorizedKeysPath -Value $pubKey -Encoding UTF8
# Menyetel izin file
$acl = Get-Acl $authorizedKeysPath
$acl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
$currentUser, "FullControl", "None", "None", "Allow"
))
)
Set-Acl $authorizedKeysPath $acl
}
} else {
Write-Error "公钥文件不存在: $PublicKeyPath"
exit 1
}
# Mengulang layanan SSH
Write-Host "正在重启 SSH 服务..."
Restart-Service sshd
Pengguna Administrator
# administrator
$adminSshDir = "C:\ProgramData\ssh"
$adminAuthKeysPath = Join-Path $adminSshDir "administrators_authorized_keys"
$adminPublicKeyPath = "D:\public_keys\id_rsa.pub"
# Membuat direktori SSH administrator
if (-not (Test-Path $adminSshDir)) {
New-Item -ItemType Directory -Path $adminSshDir | Out-Null
}
# Menyetel izin direktori SSH administrator
$adminAcl = Get-Acl $adminSshDir
$adminRule = New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"
)
$adminAcl.AddAccessRule($adminRule)
Set-Acl $adminSshDir $adminAcl
# Menambahkan kunci publik administrator
if (Test-Path $adminPublicKeyPath) {
$adminPubKey = Get-Content -Path $adminPublicKeyPath -Raw
if ($adminPubKey) {
# Memastikan akhir kunci memiliki baris baru
if (-not $adminPubKey.EndsWith("`n")) {
$adminPubKey += "`n"
}
# Menambahkan kunci publik (menambahkan)
Add-Content -Path $adminAuthKeysPath -Value $adminPubKey -Encoding UTF8
# Menyetel izin file
$adminAcl = Get-Acl $adminAuthKeysPath
$adminAcl.SetSecurityDescriptorRule(
(New-Object System.Security.AccessControl.FileSystemAccessRule(
"Administrators", "FullControl", "None", "None", "Allow"
))
)
Set-Acl $adminAuthKeysPath $adminAcl
}
} else {
Write-Error "管理员公钥文件不存在: $adminPublicKeyPath"
exit 1
}
# Mengulang layanan SSH
Write-Host "正在重启 SSH 服务..."
Restart-Service sshd