Autentikasi berbasis kunci di OpenSSH untuk Windows

Berlaku untuk Windows Server 2022, Windows Server 2019, Windows 10 (build 1809 dan yang lebih baru)

Sebagian besar autentikasi di lingkungan Windows dilakukan dengan pasangan nama pengguna-kata sandi, yang berfungsi dengan baik untuk sistem yang berbagi domain umum. Saat bekerja di seluruh domain, seperti antara sistem lokal dan yang dihosting cloud, itu menjadi rentan terhadap gangguan brute force.

Sebagai perbandingan, lingkungan Linux biasanya menggunakan pasangan kunci publik/kunci privat untuk mendorong autentikasi yang tidak memerlukan penggunaan kata sandi yang dapat ditebak. OpenSSH mencakup alat untuk membantu mendukung autentikasi berbasis kunci, khususnya:

  • ssh-keygen untuk menghasilkan kunci aman
  • ssh-agent dan ssh-add untuk menyimpan kunci privat dengan aman
  • scp dan sftp untuk menyalin file kunci publik dengan aman selama penggunaan awal server

Dokumen ini memberikan gambaran umum tentang cara menggunakan alat ini di Windows untuk mulai menggunakan autentikasi berbasis kunci dengan SSH. Jika Anda tidak terbiasa dengan manajemen kunci SSH, kami sangat menyarankan Anda meninjau dokumen NIST IR 7966 berjudul "Keamanan Manajemen Akses Interaktif dan Otomatis Menggunakan Secure Shell (SSH)".

Tentang pasangan kunci

Pasangan kunci mengacu pada file kunci publik dan privat yang digunakan oleh protokol autentikasi tertentu.

Autentikasi kunci publik SSH menggunakan algoritma kriptografi asimetris untuk menghasilkan dua file kunci - satu "privat" dan yang lain "publik". File kunci privat setara dengan kata sandi, dan harus tetap terlindungi dalam semua keadaan. Jika seseorang memperoleh kunci privat Anda, mereka dapat masuk saat Anda ke server SSH mana pun yang dapat Anda akses. Kunci publik adalah apa yang ditempatkan di server SSH, dan dapat dibagikan tanpa mengorbankan kunci privat.

Autentikasi berbasis kunci memungkinkan server dan klien SSH membandingkan kunci publik untuk nama pengguna yang disediakan terhadap kunci privat. Jika kunci publik sisi server tidak dapat divalidasi terhadap kunci privat sisi klien, autentikasi gagal.

Autentikasi multifaktor dapat diimplementasikan dengan pasangan kunci dengan memasukkan frasa sandi saat pasangan kunci dihasilkan (lihat pembuatan kunci pengguna di bawah). Pengguna akan dimintai frase sandi selama autentikasi. Frase sandi digunakan bersama dengan keberadaan kunci privat pada klien SSH untuk mengautentikasi pengguna.

Penting

Sesi jarak jauh yang dibuka melalui autentikasi berbasis kunci tidak memiliki kredensial pengguna terkait dan karenanya tidak mampu melakukan autentikasi keluar sebagai pengguna, ini berdasarkan desain.

Pembuatan kunci host

Kunci publik memiliki persyaratan ACL khusus yang, di Windows, sama dengan hanya mengizinkan akses ke administrator dan Sistem. Pada penggunaan pertama sshd, pasangan kunci untuk host akan dibuat secara otomatis.

Penting

Anda harus menginstal OpenSSH Server terlebih dahulu. Silakan lihat Mulai menggunakan OpenSSH.

Secara default, layanan sshd diatur untuk memulai secara manual. Untuk memulainya setiap kali server di-boot ulang, jalankan perintah berikut dari prompt PowerShell yang ditingkatkan di server Anda:

# Set the sshd service to be started automatically
Get-Service -Name sshd | Set-Service -StartupType Automatic

# Now start the sshd service
Start-Service sshd

Karena tidak ada pengguna yang terkait dengan layanan sshd, kunci host disimpan di bawah C:\ProgramData\ssh.

Pembuatan kunci pengguna

Untuk menggunakan autentikasi berbasis kunci, Anda harus terlebih dahulu menghasilkan pasangan kunci publik/privat untuk klien Anda. ssh-keygen.exe digunakan untuk menghasilkan file kunci dan algoritma DSA, RSA, ECDSA, atau Ed25519 dapat ditentukan. Jika tidak ada algoritma yang ditentukan, RSA digunakan. Algoritma yang kuat dan panjang kunci harus digunakan, seperti Ed25519 dalam contoh ini.

Untuk menghasilkan file kunci menggunakan algoritma Ed25519, jalankan perintah berikut dari Perintah PowerShell atau cmd pada klien Anda:

ssh-keygen -t ed25519

Output dari perintah harus menampilkan output berikut (di mana "nama pengguna" digantikan oleh nama pengguna Anda):

Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519):

Anda dapat menekan Enter untuk menerima default, atau menentukan jalur dan/atau nama file tempat Anda ingin kunci Anda dibuat. Pada titik ini, Anda akan diminta untuk menggunakan frasa sandi untuk mengenkripsi file kunci privat Anda. Frase sandi bisa kosong tetapi tidak disarankan. Frase sandi berfungsi dengan file kunci untuk menyediakan autentikasi dua faktor. Untuk contoh ini, kita membiarkan frasa sandi kosong.

Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\username/.ssh/id_ed25519.
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

The key's randomart image is:
+--[ED25519 256]--+
|        .        |
|         o       |
|    . + + .      |
|   o B * = .     |
|   o= B S .      |
|   .=B O o       |
|  + =+% o        |
| *oo.O.E         |
|+.o+=o. .        |
+----[SHA256]-----+

Sekarang Anda memiliki pasangan kunci ed25519 publik/privat di lokasi yang ditentukan. File .pub adalah kunci publik, dan file tanpa ekstensi adalah kunci privat:

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----         6/3/2021   2:55 PM            464 id_ed25519
-a----         6/3/2021   2:55 PM            103 id_ed25519.pub

Ingatlah bahwa file kunci privat setara dengan kata sandi harus dilindungi dengan cara yang sama seperti Anda melindungi kata sandi Anda. Gunakan ssh-agent untuk menyimpan kunci privat dengan aman dalam konteks keamanan Windows, yang terkait dengan akun Windows Anda. Untuk memulai layanan ssh-agent setiap kali komputer Anda di-boot ulang, dan gunakan ssh-add untuk menyimpan kunci privat, jalankan perintah berikut dari prompt PowerShell yang ditingkatkan di server Anda:

# By default the ssh-agent service is disabled. Configure it to start automatically.
# Make sure you're running as an Administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service
Start-Service ssh-agent

# This should return a status of Running
Get-Service ssh-agent

# Now load your key files into ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519

Setelah Anda menambahkan kunci ke ssh-agent pada klien Anda, agen ssh akan secara otomatis mengambil kunci privat lokal dan meneruskannya ke klien SSH Anda.

Penting

Sangat disarankan agar Anda mencadangkan kunci privat Anda ke lokasi yang aman, lalu menghapusnya dari sistem lokal, setelah menambahkannya ke agen ssh. Kunci privat tidak dapat diambil dari agen yang menyediakan algoritma yang kuat telah digunakan, seperti Ed25519 dalam contoh ini. Jika Anda kehilangan akses ke kunci privat, Anda harus membuat pasangan kunci baru dan memperbarui kunci publik pada semua sistem yang berinteraksi dengan Anda.

Menyebarkan kunci publik

Untuk menggunakan kunci pengguna yang dibuat di atas, konten kunci publik Anda (\.ssh\id_ed25519.pub) perlu ditempatkan di server ke dalam file teks. Nama dan lokasi file bergantung pada apakah akun pengguna adalah anggota grup administrator lokal atau akun pengguna standar. Bagian berikut mencakup pengguna standar dan administratif.

Pengguna standar

Konten kunci publik Anda (\.ssh\id_ed25519.pub) perlu ditempatkan di server ke dalam file teks yang disebut authorized_keys di C:\Users\username\.ssh\. Anda dapat menyalin kunci publik menggunakan utilitas transfer file aman scp OpenSSH, atau menggunakan PowerShell untuk menulis kunci ke file.

Contoh di bawah menyalin kunci publik ke server (di mana "nama pengguna" digantikan oleh nama pengguna Anda). Anda harus menggunakan kata sandi untuk akun pengguna untuk server pada awalnya.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell New-Item -Force -ItemType Directory -Path $env:USERPROFILE\.ssh; Add-Content -Force -Path $env:USERPROFILE\.ssh\authorized_keys -Value '$authorizedKey'"

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Pengguna administratif

Konten kunci publik Anda (\.ssh\id_ed25519.pub) perlu ditempatkan di server ke dalam file teks yang disebut administrators_authorized_keys di C:\ProgramData\ssh\. Anda dapat menyalin kunci publik menggunakan utilitas transfer file aman scp OpenSSH, atau menggunakan PowerShell untuk menulis kunci ke file. ACL pada file ini perlu dikonfigurasi untuk hanya mengizinkan akses ke administrator dan Sistem.

Contoh di bawah menyalin kunci publik ke server dan mengonfigurasi ACL (di mana "nama pengguna" digantikan dengan nama pengguna Anda). Anda harus menggunakan kata sandi untuk akun pengguna untuk server pada awalnya.

Catatan

Contoh ini memperlihatkan langkah-langkah untuk membuat administrators_authorized_keys file. Ini hanya berlaku untuk akun administrator dan harus digunakan alih-alih file per pengguna dalam lokasi profil pengguna.

# Get the public key file generated previously on your client
$authorizedKey = Get-Content -Path $env:USERPROFILE\.ssh\id_ed25519.pub

# Generate the PowerShell to be run remote that will copy the public key file generated previously on your client to the authorized_keys file on your server
$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""Administrators:F"" /grant ""SYSTEM:F"""

# Connect to your server and run the PowerShell using the $remotePowerShell variable
ssh username@domain1@contoso.com $remotePowershell

Untuk versi sistem operasi yang dilokalkan non-Bahasa Inggris, skrip perlu dimodifikasi untuk mencerminkan nama grup yang sesuai. Untuk mencegah kesalahan saat memberikan izin ke nama grup, Pengidentifikasi Keamanan (SID) dapat digunakan di tempatnya. SID dapat diambil dengan menjalankan Get-LocalGroup | Select-Object Name, SID. Saat menggunakan SID sebagai pengganti nama grup, SID harus didahului oleh tanda bintang (*). Dalam contoh berikut, grup Administrator menggunakan SID S-1-5-32-544:

$remotePowershell = "powershell Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value '''$authorizedKey''';icacls.exe ""$env:ProgramData\ssh\administrators_authorized_keys"" /inheritance:r /grant ""*S-1-5-32-544:F"" /grant ""SYSTEM:F"""

Langkah-langkah ini menyelesaikan konfigurasi yang diperlukan untuk menggunakan autentikasi berbasis kunci dengan OpenSSH di Windows. Setelah contoh perintah PowerShell dijalankan, pengguna dapat terhubung ke host sshd dari klien mana pun yang memiliki kunci privat.