Windows SSH 登录 jarak jauh

Mengaktifkan akses SSH jarak jauh di Windows umumnya memerlukan fitur OpenSSH dari Windows. Berikut adalah petunjuk langkah-langkah rinci:

Memeriksa dan Memasang OpenSSH

  1. 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.
  2. 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

  1. Memulai Layanan OpenSSH:

    • Setelah terinstal, buka Command Prompt (jalankan sebagai administrator).
    • Masukkan net start sshd untuk memulai layanan OpenSSH. Jika ingin layanan ini otomatis setiap kali boot, bisa masukkan sc config sshd start= auto.
  2. 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

  1. Mendapatkan Alamat IP:

    • Untuk terhubung ke PC Windows yang memiliki layanan SSH dari mesin lain, kamu butuh alamat IP-nya. Bisa gunakan perintah ipconfig di Command Prompt untuk melihat IP komputer lokal.
  2. 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 mana username adalah nama akun Windows yang akan login, dan your_ip_address adalah IP yang tadi kamu dapat.

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