Bagikan melalui


Akses jarak jauh PowerShell melalui SSH

Gambaran Umum

PowerShell remoting biasanya menggunakan WinRM untuk negosiasi koneksi dan pengangkutan data. SSH kini tersedia untuk platform Linux dan Windows serta memungkinkan penggunaan PowerShell jarak jauh multiplatform yang sebenarnya.

WinRM menyediakan model hosting yang kuat untuk sesi jarak jauh PowerShell. Remoting berbasis SSH saat ini tidak mendukung konfigurasi endpoint jarak jauh dan Administrasi Secukupnya (JEA).

Jarak jauh SSH memungkinkan Anda melakukan sesi remoting dasar PowerShell antara komputer Windows dan Linux. Penyambungan SSH menginisiasi proses host PowerShell di komputer target sebagai subsistem SSH. Akhirnya kita akan menerapkan model hosting umum, mirip dengan WinRM, untuk mendukung konfigurasi titik akhir dan JEA.

Cmdlet New-PSSession, Enter-PSSession, dan Invoke-Command sekarang memiliki parameter baru yang diatur untuk mendukung koneksi jarak jauh baru ini.

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Untuk membuat sesi jarak jauh, Anda menentukan komputer target dengan parameter HostName dan memberikan nama pengguna dengan UserName. Saat menjalankan cmdlet secara interaktif, Anda akan dimintai kata sandi. Anda juga dapat menggunakan autentikasi kunci SSH menggunakan file kunci privat dengan parameter KeyFilePath. Membuat kunci untuk autentikasi SSH bervariasi menurut platform.

Informasi penyiapan umum

PowerShell 6 atau lebih tinggi, dan SSH harus diinstal di semua komputer. Instal klien SSH (ssh.exe) dan server (sshd.exe) sehingga Anda dapat jarak jauh ke dan dari komputer. OpenSSH untuk Windows sekarang tersedia di Windows 10 build 1809 dan Windows Server 2019. Untuk informasi selengkapnya, lihat Mengelola Windows dengan OpenSSH. Untuk Linux, instal SSH, termasuk server sshd, yang sesuai untuk platform Anda. Anda juga perlu menginstal PowerShell dari GitHub untuk mendapatkan fitur jarak jauh SSH. Server SSH harus dikonfigurasi untuk membuat subsistem SSH untuk menghosting proses PowerShell di komputer jarak jauh. Dan, Anda harus mengaktifkan kata sandi atau autentikasi berbasis kunci.

Menginstal layanan SSH di komputer Windows

  1. Instal PowerShell versi terbaru. Untuk informasi selengkapnya, lihat Menginstal PowerShell di Windows.

    Anda dapat mengonfirmasi bahwa PowerShell memiliki dukungan SSH untuk akses jarak jauh dengan mencantumkan set parameter New-PSSession. Anda akan melihat ada nama set parameter yang dimulai dengan SSH. Kumpulan parameter tersebut mencakup parameter SSH.

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. Instal Win32 OpenSSH terbaru. Untuk petunjuk penginstalan, lihat Memulai OpenSSH.

    Nota

    Jika Anda ingin mengatur PowerShell sebagai shell default untuk OpenSSH, lihat Mengonfigurasi Windows untuk OpenSSH.

  3. Edit file sshd_config yang terletak di $Env:ProgramData\ssh.

    • Pastikan autentikasi kata sandi diaktifkan:

      PasswordAuthentication yes
      
    • Buat subsistem SSH yang menghosting proses PowerShell di komputer jarak jauh:

      Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs
      

      Nota

      Ada bug di OpenSSH untuk Windows yang mencegah Anda menggunakan jalur dengan spasi untuk program subsistem yang dapat dieksekusi. Ada dua cara untuk mengatasi masalah ini:

      • Gunakan nama pendek bergaya Windows 8.3 untuk jalur yang dapat dieksekusi PowerShell
      • Membuat tautan simbolis ke executable PowerShell yang menghasilkan jalur tanpa spasi

      Untuk informasi selengkapnya, lihat masalah #784 di repositori PowerShell/Win32-OpenSSH.

      Anda hanya perlu mendapatkan nama gaya 8.3 untuk segmen jalur yang memiliki spasi. Secara default PowerShell 7 diinstal di C:\Program Files\PowerShell\7\. Nama bergaya 8.3 untuk Program Files seharusnya progra~1. Anda dapat menggunakan perintah berikut untuk memverifikasi nama:

      Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
          Select-Object EightDotThreeFileName
      

      Nama 8.3 adalah fitur warisan dari sistem file NTFS yang dapat dinonaktifkan. Fitur ini harus diaktifkan untuk volume tempat PowerShell diinstal.

      Atau, Anda dapat membuat tautan simbolis ke executable PowerShell yang menghasilkan jalur tanpa spasi. Metode ini lebih disukai karena memungkinkan Anda memperbarui tautan jika jalur ke program PowerShell yang dapat dijalankan berubah suatu saat, tanpa perlu memperbarui file Anda sshd_config.

      Gunakan perintah berikut untuk membuat tautan simbolis ke executable:

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      Perintah ini membuat tautan simbolis di direktori yang sama yang digunakan oleh server OpenSSH untuk menyimpan kunci host dan konfigurasi lainnya.

    • Secara opsional, aktifkan autentikasi kunci:

      PubkeyAuthentication yes
      

      Untuk informasi selengkapnya, lihat Mengelola Kunci OpenSSH.

  4. Mulai ulang layanan sshd.

    Restart-Service sshd
    
  5. Tambahkan jalur tempat OpenSSH diinstal ke variabel lingkungan PATH Anda. Contohnya, C:\Program Files\OpenSSH\. Entri ini memungkinkan ssh.exe ditemukan.

Menginstal layanan SSH di komputer Linux Ubuntu

  1. Instal PowerShell versi terbaru, lihat Menginstal PowerShell di Ubuntu.

  2. Instal Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Edit file sshd_config di lokasi /etc/ssh.

    • Pastikan autentikasi kata sandi diaktifkan:

      PasswordAuthentication yes
      
    • Secara opsional, aktifkan autentikasi kunci:

      PubkeyAuthentication yes
      

      Untuk informasi selengkapnya tentang membuat kunci SSH di Ubuntu, lihat halaman manual untuk ssh-keygen.

    • Tambahkan entri subsistem PowerShell:

      Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
      

      Nota

      Lokasi default executable PowerShell adalah /usr/bin/pwsh. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.

  4. Mulai ulang layanan ssh.

    sudo systemctl restart sshd.service
    

Menginstal layanan SSH di komputer macOS

  1. Instal PowerShell versi terbaru. Untuk informasi selengkapnya, Menginstal PowerShell di macOS.

    Pastikan SSH Remoting diaktifkan dengan mengikuti langkah-langkah berikut:

    1. Buka System Settings.
    2. Klik pada General
    3. Klik pada Sharing.
    4. Periksa Remote Login untuk mengatur Remote Login: On.
    5. Izinkan akses ke pengguna yang sesuai.
  2. Edit file sshd_config di lokasi /private/etc/ssh/sshd_config.

    Gunakan editor teks seperti nano:

    sudo nano /private/etc/ssh/sshd_config
    
    • Pastikan autentikasi kata sandi diaktifkan:

      PasswordAuthentication yes
      
    • Tambahkan entri subsistem PowerShell:

      Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
      

      Nota

      Lokasi default executable PowerShell adalah /usr/local/bin/pwsh. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.

    • Secara opsional, aktifkan autentikasi kunci:

      PubkeyAuthentication yes
      
  3. Mulai ulang layanan sshd.

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Nota

Ketika Anda memperbarui sistem operasi Anda, file konfigurasi SSH mungkin ditimpa. Pastikan Anda memeriksa file konfigurasi setelah peningkatan.

Otentikasi

PowerShell remote melalui SSH bergantung pada pertukaran autentikasi antara klien SSH dan layanan SSH serta tidak menerapkan skema autentikasi apa pun secara langsung. Hasilnya adalah bahwa setiap skema autentikasi yang dikonfigurasi termasuk autentikasi multifaktor ditangani oleh SSH dan independen dari PowerShell. Misalnya, Anda dapat mengonfigurasi layanan SSH untuk memerlukan autentikasi kunci publik dan kata sandi satu kali untuk keamanan tambahan. Konfigurasi autentikasi multifaktor berada di luar cakupan dokumentasi ini. Lihat dokumentasi untuk SSH tentang cara mengonfigurasi autentikasi multifaktor dengan benar dan memvalidasinya berfungsi di luar PowerShell sebelum mencoba menggunakannya dengan PowerShell jarak jauh.

Nota

Pengguna mempertahankan hak istimewa yang sama dalam sesi jarak jauh. Artinya, Administrator memiliki akses ke shell tingkat tinggi, sedangkan pengguna normal tidak.

Contoh pengendalian jarak jauh PowerShell

Cara term mudah untuk menguji jarak jauh adalah dengan mencobanya pada satu komputer. Dalam contoh ini, kami membuat sesi jarak jauh kembali ke komputer Linux yang sama. Kami menggunakan cmdlet PowerShell secara interaktif sehingga kami melihat perintah dari SSH yang meminta untuk memverifikasi komputer host dan meminta kata sandi. Anda dapat melakukan hal yang sama pada komputer yang menjalankan Windows untuk memastikan pengendalian jarak jauh berfungsi. Kemudian, mengakses komputer secara jarak jauh dengan mengubah nama host.

Linux ke Linux

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

Linux ke Windows

Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]

Windows ke Windows

C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

Keterbatasan

  • Perintah sudo tidak berfungsi dalam sesi jarak jauh ke komputer Linux.

  • PSRemoting melalui SSH tidak mendukung Profil dan tidak memiliki akses ke $PROFILE. Setelah dalam sesi, Anda dapat memuat profil dengan melakukan sumber profil dengan jalur file lengkap. Ini tidak terkait dengan profil SSH. Anda dapat mengonfigurasi server SSH untuk menggunakan PowerShell sebagai shell default dan memuat profil melalui SSH. Lihat dokumentasi SSH untuk informasi selengkapnya.

  • Sebelum PowerShell 7.1, pengerjaan jarak jauh melalui SSH tidak mendukung sesi jarak jauh lintas kedua. Kemampuan ini terbatas pada sesi menggunakan WinRM. PowerShell 7.1 memungkinkan Enter-PSSession dan Enter-PSHostProcess bekerja dari dalam sesi jarak jauh interaktif apa pun.

Lihat juga