Akses jarak jauh PowerShell melalui SSH

Gambaran Umum

PowerShell jarak jauh biasanya menggunakan WinRM untuk negosiasi koneksi dan transportasi data. SSH sekarang tersedia untuk platform Linux dan Windows dan memungkinkan PowerShell multiplatform jarak jauh asli.

WinRM menyediakan model hosting yang kuat untuk sesi jarak jauh PowerShell. Jarak jauh berbasis SSH saat ini tidak mendukung konfigurasi titik akhir jarak jauh dan Just Enough Administration (JEA).

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

New-PSSessionCmdlet , 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 jarak jauh SSH dengan mencantumkan New-PSSession set parameter. 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 Mulai menggunakan OpenSSH.

    Catatan

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

  3. Edit file yang sshd_config 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 -nologo
    

    Catatan

    Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan -nologo parameter saat menjalankan PowerShell dalam mode server SSH.

    Catatan

    Lokasi default executable PowerShell adalah c:/progra~1/powershell/7/pwsh.exe. Lokasi dapat bervariasi tergantung pada cara Anda menginstal PowerShell.

    Anda harus menggunakan nama pendek 8.3 untuk jalur file apa pun yang berisi spasi. Ada bug di OpenSSH untuk Windows yang mencegah ruang bekerja di jalur yang dapat dieksekusi subsistem. Untuk informasi lebih lanjut, lihat masalah GitHub ini.

    Nama pendek 8.3 untuk Program Files folder di Windows biasanya Progra~1. Namun, Anda dapat menggunakan perintah berikut untuk memastikan:

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

    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 Jalur Anda. Contohnya,C:\Program Files\OpenSSH\. Entri ini memungkinkan ssh.exe untuk ditemukan.

Menginstal layanan SSH di komputer Linux Ubuntu

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

  2. Instal Ubuntu OpenSSH Server.

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. sshd_config Edit file 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 manpage untuk ssh-keygen.

    Tambahkan entri subsistem PowerShell:

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

    Catatan

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

    Catatan

    Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan -nologo parameter saat menjalankan PowerShell dalam mode server SSH.

  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 General
    3. Klik .Sharing
    4. Periksa Remote Login untuk mengatur Remote Login: On.
    5. Izinkan akses ke pengguna yang sesuai.
  2. sshd_config Edit file 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
    

    Catatan

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

    Catatan

    Mulai dari PowerShell 7.4, Anda tidak perlu lagi menggunakan -nologo parameter saat menjalankan PowerShell dalam mode server SSH.

    Secara opsional, aktifkan autentikasi kunci:

    PubkeyAuthentication yes
    
  3. Mulai ulang layanan sshd.

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

Catatan

Saat Anda meningkatkan sistem operasi, file konfigurasi SSH mungkin ditimpa. Pastikan Anda memeriksa file konfigurasi setelah peningkatan.

Autentikasi

PowerShell jarak jauh melalui SSH bergantung pada pertukaran autentikasi antara klien SSH dan layanan SSH dan tidak menerapkan skema autentikasi itu sendiri. 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.

Catatan

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

Contoh 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 Windows untuk memastikan jarak jauh berfungsi. Kemudian, jarak jauh antar komputer 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>

Batasan

  • 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, jarak jauh melalui SSH tidak mendukung sesi jarak jauh hop 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