Autentikasi berbasis kunci di OpenSSH untuk Windows

Sebagian besar autentikasi di lingkungan Windows dilakukan dengan pasangan nama pengguna/kata sandi, yang berfungsi dengan baik untuk sistem yang berbagi domain umum. Saat Anda bekerja lintas domain, seperti antara sistem lokal dan yang di-host di cloud, jenis autentikasi ini menjadi rentan terhadap serangan brute force.

Sebagai perbandingan, lingkungan Linux biasanya menggunakan pasangan kunci publik/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 Secure Shell (SSH). Jika Anda tidak terbiasa dengan manajemen kunci SSH, kami sangat menyarankan Agar Anda meninjau dokumen NIST IR 7966, berjudul Keamanan Manajemen Akses Interaktif dan Otomatis Menggunakan Secure Shell (SSH).

Autentikasi berbasis kunci di OpenSSH untuk Windows berfungsi dengan akun Windows lokal dan akun Direktori Aktif (domain). Akun ID Microsoft Entra tidak mendukung autentikasi berbasis kunci.

Note

Windows OpenSSH tidak mendukung arahan AuthorizedKeysCommand dan AuthorizedKeysCommandUser . Artinya Anda tidak dapat mengambil kunci SSH secara dinamis dari Direktori Aktif menggunakan arahan ini seperti yang Anda mungkin pada sistem Linux. Untuk informasi selengkapnya tentang opsi konfigurasi yang didukung, lihat Konfigurasi OpenSSH Server untuk Windows Server dan Windows.

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 publik lainnya. Setiap file kunci privat setara dengan kata sandi dan harus tetap terlindungi dalam semua keadaan. Jika seseorang memperoleh kunci privat Anda, mereka dapat masuk sebagai Anda ke server SSH mana pun yang Anda dapat akses. Kunci publik adalah apa yang ditempatkan di server SSH dan dapat dibagikan tanpa mengorbankan kunci privat.

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

Anda dapat menerapkan autentikasi multifaktor dengan pasangan kunci dengan memasukkan frasa sandi saat Anda membuat pasangan kunci. Untuk informasi selengkapnya, lihat Pembuatan kunci pengguna. Pengguna dimintai frase sandi selama autentikasi. Frase sandi yang dikombinasikan dengan keberadaan kunci privat digunakan pada klien SSH untuk mengautentikasi pengguna.

Important

Sesi jarak jauh yang dibuka melalui autentikasi berbasis kunci tidak memiliki kredensial pengguna terkait. Akibatnya, sesi tidak mampu melakukan autentikasi keluar sebagai pengguna. Perilaku ini dirancang.

Pembuatan kunci host

Kunci publik memiliki persyaratan daftar kontrol akses (ACL) tertentu yang, di Windows, sama dengan hanya mengizinkan akses ke administrator dan pengguna Sistem. Pertama kali layanan sshd dipakai, pasangan kunci untuk host dihasilkan secara otomatis.

Important

Anda perlu menginstal OpenSSH Server sebelum dapat menjalankan perintah dalam artikel ini. Untuk informasi selengkapnya, lihat Mulai menggunakan OpenSSH untuk Windows.

Secara default, Anda perlu mulai sshd secara manual. Untuk mengonfigurasinya agar dimulai secara otomatis setiap kali server dimulai 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

# Start the sshd service.
Start-Service sshd

Karena tidak ada pengguna yang sshd terkait dengan layanan, 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. Anda dapat menggunakan ssh-keygen.exe untuk menghasilkan file kunci. Anda dapat menentukan algoritma pembuatan kunci berikut:

  • Algoritma Tanda Tangan Digital (DSA)
  • Rivest–Shamir–Adleman (RSA)
  • Algoritma Tanda Tangan Digital Kurva Elips (ECDSA)
  • Ed25519

Jika Anda tidak menentukan algoritma, Ed25519 digunakan. Algoritma yang kuat dan panjang kunci harus digunakan, seperti ECDSA dalam contoh ini.

Untuk menghasilkan file kunci dengan menggunakan algoritma ECDSA, jalankan perintah berikut di jendela PowerShell atau Prompt Perintah pada klien Anda:

ssh-keygen -t ecdsa

Output dari perintah akan terlihat seperti baris berikut, kecuali yang username diganti dengan nama pengguna Anda:

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

Pada perintah, Anda dapat memilih Enter untuk menerima jalur file default, atau Anda dapat menentukan jalur atau nama file untuk kunci yang anda buat.

Selanjutnya, Anda diminta untuk menggunakan frase sandi untuk mengenkripsi file kunci privat Anda. Secara umum, kami tidak merekomendasikan penggunaan frasa sandi kosong, karena frase sandi berfungsi dengan file kunci untuk menyediakan autentikasi dua faktor. Tetapi untuk contoh ini, Anda dapat 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_ecdsa.
Your public key has been saved in C:\Users\username/.ssh/id_ecdsa.pub.
The key fingerprint is:
SHA256:OIzc1yE7joL2Bzy8!gS0j8eGK7bYaH1FmF3sDuMeSj8 username@LOCAL-HOSTNAME

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

Sekarang Anda memiliki pasangan kunci ECDSA 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_ecdsa
-a----         6/3/2021   2:55 PM            103 id_ecdsa.pub

File kunci privat setara dengan kata sandi dan harus dilindungi dengan cara yang sama seperti Anda melindungi kata sandi Anda. Anda dapat menggunakan ssh-agent untuk menyimpan kunci privat Anda dengan aman dalam konteks keamanan Windows yang terkait dengan akun Windows Anda. Untuk mengonfigurasi ssh-agent layanan agar dimulai secara otomatis setiap kali komputer Anda dimulai ulang, dan untuk menggunakan ssh-add untuk menyimpan kunci privat, jalankan perintah berikut pada prompt PowerShell yang ditingkatkan di server Anda:

# By default, the ssh-agent service is disabled. Configure it to start automatically.
# Run the following command as an administrator.
Get-Service ssh-agent | Set-Service -StartupType Automatic

# Start the service.
Start-Service ssh-agent

# The following command should return a status of Running.
Get-Service ssh-agent

# Load your key files into ssh-agent.
ssh-add $env:USERPROFILE\.ssh\id_ecdsa

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

Important

Kami menyarankan agar Anda mencadangkan kunci privat Anda ke lokasi yang aman lalu menghapusnya dari sistem lokal setelah Anda menambahkannya ke ssh-agent layanan. Kunci privat tidak dapat diambil dari agen ketika algoritma yang kuat, seperti ECDSA dalam contoh ini, digunakan. 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 Anda buat sebelumnya, Anda perlu menempatkan konten kunci publik Anda (\.ssh\id_ecdsa.pub) 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

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

Anda dapat menggunakan kode berikut untuk menyalin kunci publik ke server. Di baris terakhir, ganti username dengan nama pengguna Anda. Awalnya, Anda diminta untuk memasukkan kata sandi untuk akun pengguna untuk server.

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

# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain@hostname $remotePowershell

Pengguna administratif

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

Anda dapat menggunakan kode berikut untuk menyalin kunci publik ke server dan mengonfigurasi ACL. Di baris terakhir, ganti username dengan nama pengguna Anda. Awalnya, Anda diminta untuk memasukkan kata sandi untuk akun pengguna untuk server.

Note

Contoh ini memperlihatkan langkah-langkah untuk membuat administrators_authorized_keys file. File ini hanya berlaku untuk akun administrator. Anda harus menggunakannya sebagai ganti file yang spesifik untuk pengguna di dalam lokasi profil pengguna.

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

# Generate the PowerShell command to run remotely that copies 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 command by using the $remotePowerShell variable.
ssh username@domain@hostname $remotePowershell

Untuk versi sistem operasi yang dilokalkan non-Bahasa Inggris, skrip perlu dimodifikasi untuk mencerminkan nama grup yang sesuai. Untuk mencegah kesalahan yang dapat terjadi saat Anda memberikan izin ke nama grup, Anda dapat menggunakan pengidentifikasi keamanan (SID) sebagai pengganti nama grup. Anda dapat mengambil SID dengan menjalankan Get-LocalGroup | Select-Object Name, SID. Saat Anda menggunakan SID sebagai pengganti nama grup, SID harus didahului dengan 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 menjalankan perintah PowerShell ini, Anda dapat terhubung ke sshd host dari klien mana pun yang memiliki kunci privat.