Tidak dapat membuat otentikasi CredSSP berfungsi di PowerShell

10

Dalam mencoba membuat skrip PowerShell menggunakan remoting, saya menemukan apa yang saya yakini sebagai masalah double-hop . Dalam artikel itu, Perriman memberikan deskripsi singkat tentang masalah tersebut serta langkah-langkah spesifik untuk menyelesaikan masalah (hampir sepele jika Anda tahu perintahnya, tetapi bagi seseorang yang kurang familiar seperti saya, informasi itu sangat berharga!).

Saya berlari Enable-WSManCredSSP Serverdi server Win7 saya tanpa insiden, tetapi mencoba untuk berjalan Enable-WSManCredSSP Client –DelegateComputer <FQDN of the server>di klien Win7 saya menghasilkan kesalahan ini:

Enable-WSManCredSSP : The client cannot connect to the destination specified
in the request. Verify that the service on the destination is running and
is accepting requests.
Consult the logs and documentation for the WS-Management service running
on the destination, most commonly IIS or WinRM. If the destination
is the WinRM service, run the following com mand on the destination
to analyze and configure the WinRM service: "winrm quickconfig".

Menjalankan winrm quickconfig mengonfirmasi server saya menjalankan WinRM:

WinRM already is set up to receive requests on this machine.
WinRM already is set up for remote management on this machine.

Dan Get-WSManCredSSP mengonfirmasi server saya siap menerima kredensial dari klien:

The machine is not configured to allow delegating fresh credentials.
This computer is configured to receive credentials from a remote client computer.

Saya juga menemukan artikel Boessen tentang WinRM di mana ia menjelaskan pengaturan WinRM umum dan menemukan satu berita menarik untuk mendapatkan titik data yang berguna dalam diagnosis; perintah ini dijalankan pada klien menggunakan alat winrs untuk mengakses server dari jarak jauh:

winrs -r:http://<FQDN of my server>:5985 -u:<myDomain>\msorens "dir c:\"

Perintah itu mengembalikan hasil yang diharapkan, isi direktori root di server, tanpa insiden, membenarkan bahwa FQDN saya benar dan WinRM diaktifkan.

Boessen menunjukkan port 5985 adalah default untuk Win7; perintah ini dijalankan di server mengonfirmasi nilai 5985:

get-item wsman:\localhost\listener\listener*\port

Pertanyaannya: Mengapa saya tidak dapat menjalankan perintah Enable-WSManCredSSP di sisi klien?


2011.06.07 Pembaruan

Saya menemukan solusi untuk pertanyaan di atas: menjalankan Enable-PSRemoting , diiklankan untuk mengkonfigurasi komputer untuk menerima perintah jarak jauh, memungkinkan Enable-WSManCredSSP pada klien untuk bekerja dengan sukses! Ingin tahu, tetapi halaman manualnya menunjukkan bahwa ia melakukan sejumlah tindakan berbeda, jadi saya menganggap salah satu dari mereka secara tidak sengaja melakukan apa yang saya butuhkan.

Tapi kemudian saya mencapai penghalang jalan lain ketika saya mencoba menggunakan otentikasi CredSSP. Inilah perintahnya:

Invoke-Command { Write-Host "hello, world" } -computername $serverName `
-credential $testCred  -Authentication Credssp

Dan inilah jawabannya:

Menyambung ke server jarak jauh gagal dengan pesan kesalahan berikut:
Klien WinRM tidak dapat memproses permintaan. Kebijakan komputer tidak memungkinkan
delegasi kredensial pengguna ke komputer target. Gunakan gpedit.msc
dan lihat kebijakan berikut: Konfigurasi Komputer
-> Template Administratif -> Sistem -> Delegasi Kredensial
-> Izinkan Mendelegasikan Kredensial Baru. Verifikasi bahwa itu diaktifkan dan
dikonfigurasi dengan SPN yang sesuai untuk komputer target. Sebagai contoh,
untuk nama komputer target "myserver.domain.com", SPN dapat menjadi salah satu dari
berikut ini: WSMAN /myserver.domain.com atau WSMAN / *. domain.com.
Untuk informasi lebih lanjut, lihat topik Bantuan tentang_Remote_Pemecahan Masalah.

Saya memverifikasi pengaturan seperti yang disarankan oleh pesan kesalahan yang sangat membantu ini, dan sepertinya saya sudah terkonfigurasi dengan benar.

Pertanyaan baru: Apa yang gagal dilakukan koneksi jarak jauh dengan CredSSP ini?


Dalam menjawab, harap perhatikan hal-hal berikut: Biarkan saya membuang terlebih dahulu gagasan bahwa saya tahu apa yang saya lakukan di sini, terlepas dari segala penampilan yang bertentangan. :-) Windows admin bukanlah bidang keahlian saya!

Michael Sorens
sumber
Namun contoh lain yang menyedihkan dari MS mengubah hal-hal demi mengubahnya !! Saya tidak tertarik dengan migrasi langsung atau hal-hal seperti itu, saya hanya ingin dapat masuk ke server 3 Hyper-V 2012 yang saya miliki dan membuat / delete / start / stop / reboot VM pada mereka, itu bekerja dengan sempurna dari desktop WIn7 saya, sekarang saya menang 10 dan saya harus melompat melewati lingkaran kiri dan tengah untuk melakukan sesuatu yang mudah dilakukan sebelumnya, windows 10 saat ini membuat saya gila: - /
shawty

Jawaban:

8

Saya kembali ke hal ini setelah jeda singkat untuk melihat lagi dengan mata segar (baik milik saya maupun rekan kerja) dan memutuskan untuk kembali ke dasar lagi:

Pada klien saya dieksekusi (di shell administrator):

enable-wsmancredssp -role client -delegatecomputer devremvm03 -force

Di server saya mengeksekusi (di shell administrator):

enable-wsmancredssp -role server -force

Keduanya mengembalikan output normal yang menunjukkan CredSSP sekarang "benar".

Saya kemudian menggunakan kode berolahraga berikut untuk menjalani peningkatan tingkat kompleksitas:

$block = {
  Write-Host ("hello, world: {0}, {1}" -f $env:USERNAME, (hostname))
}
$username = "test_user"
$password = "..."   
$adjPwd = $password | ConvertTo-SecureString -asPlainText -Force
$testCred = (New-Object System.Management.Automation.PSCredential($username,$adjPwd))    

switch ($choice)
{
  "basic"       { Invoke-Command $block }
  "remote"      { Invoke-Command $block -computername $serverName }
  "credentialA" { Invoke-Command $block -computername $serverName -credential $testCred  }
  "credentialB" { Invoke-Command $block -computername $serverName -credential $testCred  -Authentication Credssp}
  "session"     { 
      $testSession = New-PSSession -computername $serverName -credential $testCred -Authentication Credssp
      if ($testSession) { Invoke-Command $block -Session $testSession; Remove-PSSession $testSession }
      }
}

Semua itu ada dalam skrip run.ps1 saya sehingga transkripnya berjalan sebagai berikut (dan ini berjalan dalam shell non- administrator):

PS C:\> .\run.ps1 basic
hello, world: msorens, MyLocalMachine
PS C:\> .\run.ps1 remote MyRemoteServer
hello, world: msorens, MyRemoteServer
PS C:\> .\run.ps1 credentialA MyRemoteServer
hello, world: test_user, MyRemoteServer
PS C:\> .\run.ps1 credentialB MyRemoteServer
hello, world: test_user, MyRemoteServer
PS C:\> .\run.ps1 session MyRemoteServer
hello, world: test_user, MyRemoteServer

Sebelumnya, hanya dasar, jarak jauh, dan kredensial yang berfungsi. Sekarang semua 5 bekerja. Wah!

Michael Sorens
sumber
CredSSP adalah solusi yang bagus? Microsoft mengatakan: Perhatian: Otentikasi Penyedia Layanan Keamanan Kredensial (CredSSP), di mana kredensial pengguna diteruskan ke komputer jarak jauh untuk diautentikasi, dirancang untuk perintah yang memerlukan otentikasi pada lebih dari satu sumber daya, seperti mengakses pangsa jaringan jarak jauh. Mekanisme ini meningkatkan risiko keamanan operasi jarak jauh. Jika komputer jarak jauh terganggu, kredensial yang diteruskan ke itu dapat digunakan untuk mengontrol sesi jaringan.
Kiquenet
2

Ketika saya harus melakukan ini, ini adalah apa yang saya lakukan untuk membuatnya bekerja (mungkin juga ada beberapa pengaturan GPO, tetapi sepertinya Anda sudah membahasnya).

Untuk mengaktifkan CLIENT untuk menggunakan CredSSP untuk terhubung ke mesin apa pun di domain:

Enable-WSManCredSSP -Role Client -DelegateComputer "*.my.domain.com" -Force | out-null
#the following is used because -delegatecomputer (above) doesn't appear to actually work properly.
Set-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Lsa\Credssp\PolicyDefaults\AllowFreshCredentialsDomain -Name WSMan -Value "WSMAN/*.my.domain.com"

Kemudian saya menjalankan yang berikut pada setiap mesin target (server) untuk mengaktifkan otentikasi CredSSP:

Connect-WSMan -ComputerName $computer 
Set-Item "WSMAN:\$computer\service\auth\credssp" -Value $true 

Ini tentu saja mengharuskan Anda menjalankan skrip dengan izin yang sesuai. Ini berhasil bagi saya - saya harap ini membantu Anda.

jbsmith
sumber
Terima kasih atas sarannya tetapi masih gagal dengan hasil yang sama.
Michael Sorens
Saya tidak yakin apakah ini membuat perbedaan, tetapi posting asli saya mungkin menyesatkan. Saya menjalankan semua perintah ini dari mesin CLIENT . Jadi "$ komputer" di blok kode kedua di atas adalah nama server yang saya mencoba untuk terhubung ke .
jbsmith
Saya agak tahu itu karena tidak masuk akal bahwa server harus memiliki pengetahuan apriori dari klien. Saya hanya mengulangi seluruh urutan lagi untuk memastikan, dan gagal dengan kesalahan yang sama. Satu variasi lain: Saya menghapus parameter -Authentication dan mengkonfirmasi bahwa semua yang lain dalam pernyataan saya berfungsi ( Invoke-Command { Write-Host "hello, world" } -computername $serverName -credential $testCred). Jadi otentikasi CredSSP adalah masalah utama.
Michael Sorens
Setuju - WinRM dasar baik-baik saja; Saya tidak tahu persis apa masalahnya, tetapi saya menduga itu terkait dengan kebijakan 'izinkan kredensial baru' dan SPN yang Anda buat. Saya akan melihat lebih dekat pada pengaturan kebijakan itu dan mungkin menggali sedikit lebih dalam untuk memastikan kerbero Anda berfungsi dengan baik. Tautan ini sepertinya bermanfaat: [tautan] msdn.microsoft.com/en-us/library/ee309365(v=vs.85).aspx
jbsmith
Mengapa menggunakan Connect-WSMan ke Server, lebih baik gunakan server enable-wsmancredssp -role, bukan?
Kiquenet
1

Saya dapat tempat tinggal migrasi satu VM dari satu server hyper-v 2012R2 ke yang lain, tetapi tidak dapat bermigrasi kembali. (Saya mencoba menggunakan SAMBA 4.2 sebagai pengontrol domain saya dan ingin melihat apakah saya bisa hidup bermigrasi dengan CredSSP karena saya tidak dapat menggunakan delegasi terbatas dengan Samba4).

Akhirnya saya pergi ke hyper-v yang berfungsi dan menyalin entri registri di hklm: \ SOFTWARE \ Policies \ Microsoft \ Windows \ CredentialsDelegation ke hyper-v yang tidak berfungsi. Bekerja dengan baik setelah itu.

Bruce
sumber
Salinan pohon registri juga berfungsi untuk saya. hklm: \ SOFTWARE \ ... \ CredentialsDelegation node tidak ada, nilainya disimpan dalam hklm: \ SOFTWARE \ Wow6432Node \ ... \ CredentialsDelegation dan di HKEY_USERS \ ... \ Obyek Kebijakan Grup \ ... \ CredentialDelegation.
Der_Meister