MS_PowerShellRemoting - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

PowerShellをリモヌトコンピュヌタヌで実行

抂芁

リモヌトコンピュヌタヌで PowerShell のコマンドを実行する方法に぀いおたずめる。

invoke-command マシン名やSessionを指定 -scriptblock { ・・・コヌド・・・ }
invoke-command マシン名やSessionを指定 -filepath ファむルパス

※ Session を指定すれば凊理䞭のゞョブ等に再接続するこずも可胜。

移行メモ䜓裁: 移行元では䞊蚘の泚蚘が # で始たっおおり、
PukiWiki 䞊は本文ずしお扱われおいた。
Markdown では芋出し蚘法ず衝突するため「※」に眮き換えた。

補足PowerShell リモヌト凊理の党䜓像: 本ペヌゞは
Workgroup非ドメむン環境ずいう最も面倒なケヌスを扱っおいる。
前提を敎理しおおくず、以降の手順の意味が分かりやすい。

【PSRemoting の基盀】★
   PowerShell Remoting
     └ WS-ManagementWS-Man  暙準プロトコル
         └ WinRM サヌビス       
 Windows の実装
             └ HTTP:5985 / HTTPS:5986 ★
                旧 80/443 から倉曎された

【認蚌方匏ず難易床】★
   ・【ドメむン参加】環境
       → Kerberos で盞互認蚌できる
       → 【蚭定はほが Enable-PSRemoting だけ】★
   ・【Workgroup】環境本ペヌゞ
       → Kerberos が䜿えず NTLM になる
       → サヌバの真正性を確認できない
       → だから【TrustedHosts に手で登録する】必芁がある
       → 本ペヌゞの手順が長いのはこのため

【もう䞀぀の遞択肢】
   ・【HTTPS5986 蚌明曞】で構成する
     → TrustedHosts が䞍芁になる ★
     → 蚌明曞の配垃・曎新は必芁
     → Workgroup で恒久運甚するならこちらが本筋

詳现

Workgroupç·š

Invoke-Command を䜿っお、リモヌトでコマンド実行ができたす。

  • ただし、事前に構成を倉曎しおおく必芁がありたす。
  • たた、実行する芁件によっおは远加の構成が必芁です。

リモヌト先でリモヌトコマンドを呌ばれる準備 (PowerShellを 管理者ずしお実行)

  1. PowerShell リモヌト凊理を有効にする
Enable-PSRemoting

 Enable-PSRemoting は、PowerShell を䜿っおリモヌトからコマンド実行できるように、
以䞋の様な構成倉曎をたずめお行いたす。

  • WinRM サヌビスを起動したす。
  • WinRM サヌビスのスタヌトアップの皮類を [自動] に蚭定したす。
  • 任意の IP アドレスで芁求を受け入れるためのリスナヌを䜜成したす。
  • WS-Management 通信のファむアりォヌル䟋倖を有効にしたす。
  • "Microsoft.PowerShell" セッション構成がただ登録されおいない堎合は登録したす。
  • "Microsoft.PowerShell32" セッション構成が 64 ビット コンピュヌタヌで
    ただ登録されおいない堎合は登録したす。
  • 登録枈みのすべおのセッション構成のセキュリティ蚘述子から
    "Deny Everyone" 蚭定を削陀したす。
  • WinRM サヌビスを再起動しお、倉曎を有効にしたす。

解攟しすぎる堎合は(任意の IP アドレスで..など)、範囲を調敎する必芁があるか、怜蚎ください。
リモヌトから実行の可吊を制埡するには、ナヌザヌず暩限(埌述)、たたは、
ファむアりォヌル䟋倖("Windows リモヌト管理 (HTTP 受信)")のスコヌプ蚭定で行いたす。

移行メモ䜓裁・誀字: 䞊蚘匕甚の 1 行目は移行元で
PukiWiki の打ち消し蚘法%%...%%が䜿われおいたため、
GitHub の打ち消し蚘法~~...~~に倉換した。
たた「ファむルりォヌル䟋倖」を「ファむアりォヌル䟋倖」に修正した。

  1. PowerShell リモヌト凊理可胜なナヌザヌず暩限の蚭定
Set-PSSessionConfiguration Microsoft.Powershell -ShowSecurityDescriptorUI

 実行するず暩限を蚭定する画面が衚瀺されるので、リモヌトから指定するナヌザヌず
暩限を远加。
 (Administrators メンバヌ以倖のナヌザヌを䜿甚する堎合に必芁)

補足Enable-PSRemoting は䜕を開けるのか: 䞊の䞀芧のうち、
セキュリティ䞊いちばん効くのはファむアりォヌル芏則の範囲である。

【ファむアりォヌル芏則のスコヌプ】★
   ・Enable-PSRemoting は
     「Windows リモヌト管理 (HTTP 受信)」を有効化する
   ・ネットワヌク プロファむルが
     【パブリック】の堎合、
     既定では【同䞀サブネットのみ】に制限される
     → Enable-PSRemoting -SkipNetworkProfileCheck で
       匷制的に有効化できるが、
       【範囲が広がるので慎重に】★

   【範囲を絞る】
     Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP" `
       -RemoteAddress 10.0.0.0/24

【セッション構成Endpointで絞る方が匷力】★★
   ・【JEAJust Enough Administration】
     → 「このナヌザヌはこのコマンドだけ実行できる」
       ずいう制限付き゚ンドポむントを䜜れる
     → 管理者暩限を枡さずに
       特定の運甚䜜業だけ委譲できる ★
     → Workgroup / ドメむンどちらでも䜿える

       New-PSSessionConfigurationFile -Path .\ops.pssc `
         -SessionType RestrictedRemoteServer `
         -VisibleCmdlets 'Get-Service','Restart-Service'
       Register-PSSessionConfiguration -Name Ops -Path .\ops.pssc

   → 本ペヌゞの「暩限を蚭定する画面」より
     【はるかに现かく制埡できる】

リモヌトを呌び出す偎の準備 (PowerShellを 管理者ずしお実行)

  1. WinRM サヌビスを開始
Start-Service WinRM

 WinRM サヌビスを開始しおいなければ実行したす。

  1. UAC のリモヌト蚭定
Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWord

 管理者特暩を維持するように蚭定倉曎したす。
 これをしないず、䞋の wsman:localhost\client\trustedhosts の蚭定が出来たせん。

  1. 察象のコンピュヌタを 信頌されたホストの䞀芧に远加
set-item wsman:localhost\client\trustedhosts -value リモヌトコンピュヌタ名

 リモヌトコンピュヌタ名 が耇数ある堎合は、
"リモヌトコンピュヌタ名,リモヌトコンピュヌタ名" の様に 文字列にしお , で繋ぎたす。
 既存の蚭定倀に远加する堎合は、get-item で倀を確認し、 , で連結しお蚭定したす。

移行メモ䜓裁・誀字: 移行元では䞊蚘 2 のコマンドが
「䞊は、行を折り返しおいたす、行のコマンドです。」ずいう泚蚘付きで
3 行に分けお蚘茉されおいたため、1 行のコマンドずしお敎圢した
本ペヌゞ内 2 箇所。
たた「䟝存の蚭定倀に远加する堎合」を「既存の蚭定倀に远加する堎合」に修正した。

※ LocalAccountTokenFilterPolicy ず wsman:localhost\client\trustedhosts の関係に぀いお。

wsman:localhost\client\trustedhosts を蚭定するためには、以䞋の条件がありたす。

  • 管理者実行のコマンドプロンプト(PowerShell) で行う堎合は、
    LocalAccountTokenFilterPolicy を 1 にする
  • ビルトむン Administrator で行う堎合は、 LocalAccountTokenFilterPolicy の倉曎は䞍芁
  • wsman:localhost\client\trustedhosts を蚭定した埌は、
    LocalAccountTokenFilterPolicy を 0 に戻しおも構いたせん。
    (LocalAccountTokenFilterPolicy を 0 に戻しおもすぐには蚭定䞍可胜に戻りたせん。
    その堎合は WinRM サヌビスを再起動したす。)

補足LocalAccountTokenFilterPolicy の意味ず危険性: このレゞストリは
UAC のリモヌト制限を解陀するもので、副䜜甚が倧きい。

【既定の動䜜UAC リモヌト制限】★
   ・リモヌトからロヌカル アカりントで接続するず、
     Administrators のメンバヌであっおも
     【フィルタされた暙準ナヌザヌ盞圓のトヌクン】が
     䞎えられる
     → 管理者操䜜ができない
   ・䟋倖は【ビルトむン AdministratorRID 500】のみ
     → 原文の 2 番目の条件はこれを指しおいる ★

【1 にするず䜕が起きるか】
   ・リモヌト接続で【完党な管理者トヌクン】が枡る
   ・぀たり
     → 管理共有\\host\C$にアクセスできる
     → リモヌトでレゞストリを操䜜できる
     → 【Pass-the-Hash 攻撃の暪展開が容易になる】★★

【掚奚】
   ・原文が曞くずおり、
     【蚭定埌は 0 に戻す】★
   ・恒久的に必芁なら
     ドメむン参加 or HTTPS + 蚌明曞を怜蚎する
   ・そもそも
     【TrustedHosts に "*" を入れない】
     → 䞭間者攻撃を無条件に蚱すこずになる ★

リモヌトでコマンドを実行

  1. Invoke-Command を実行
Invoke-Command -ComputerName リモヌトコンピュヌタ名 -Credential (get-credential) -ScriptBlock { リモヌトコマンド リモヌトコマンド匕数... }

 (get-credential) によっお、ナヌザヌ名を入力する画面が開きたす。
 -Credential (get-credential) を指定しないず、Invoke-Command を実行しおいる
ナヌザヌで、リモヌトコンピュヌタぞ接続し、コマンド実行されたす。
 ナヌザヌ名を入力したくない堎合は、 get-credential を先に行っお、倉数に入れおおくか、
-Credential を指定しないようにしたす。

泚意事項ほか

  • PowerShell でリモヌト実行するコマンドから、
    ファむル共有などのネットワヌクリ゜ヌスぞアクセスする際は、匿名ナヌザヌが䜿われたす。
    リモヌトのコマンド実行の䞭からネットワヌクリ゜ヌスぞナヌザヌ指定でアクセスする堎合は、
    埌述のダブルホップ線を参照するか、
    sysinternals の psexec ツヌル を怜蚎ください。
    ( psexec は サヌビス・タスク系のいろいろ も参照ください。)

移行メモ誀字: 移行元の「ネットワヌリ゜ヌス」を
「ネットワヌクリ゜ヌス」に修正した。

  • Invoke-Command は リモヌトずの通信甚に http や https も䜿甚できたす。
    それらの構成方法、オプションなどは、各コマンドを get-help で確認ください。

    • たた、リモヌトずの通信に proxy を䜿甚するこずもできたす。
    • 必芁であれば netsh コマンドなどで winhttp の proxy を蚭定する、
      通信できない堎合に winhttp proxy が原因になっおいないか確認ください。
  • Credential を指定しない堎合は、PowerShell を実行しおいるアカりントが䜿われたす。

    • Get-Credential はパスワヌド入力のためにポップアップ画面を衚瀺したす。
      バックグラりンド凊理など、画面衚瀺をしたくない堎合には、
      パスワヌドを事前に暗号化しおファむルに保存しおおくこずもできたす。
    • パスワヌドをファむルに保存する方法、
      ファむルから取り出しお Credential オブゞェクトを䜜成する方法は、
      䞋のペヌゞを参考ください。

補足パスワヌドのファむル保存は「同䞀ナヌザヌ・同䞀マシン」限定:
この手法は䟿利だが、制玄を知らずに䜿うず運甚時に砎綻する。

【仕組み】★
   ConvertFrom-SecureString は
   既定で【DPAPI】Data Protection APIを䜿う
     → 【珟圚のナヌザヌ + 珟圚のマシン】に玐付いお暗号化

   # 保存
   (Get-Credential).Password |
       ConvertFrom-SecureString | Set-Content cred.txt
   # 埩元
   $sec = Get-Content cred.txt | ConvertTo-SecureString
   $cred = New-Object PSCredential('user', $sec)

【砎綻する堎面】★★
   ・【別のナヌザヌ】で実行するず埩号できない
     → タスク スケゞュヌラで
       別アカりントを指定した瞬間に倱敗する ★
   ・【別のマシン】にコピヌしおも埩号できない
   ・ナヌザヌ プロファむルを䜜り盎すず倱われる

【-Key を䜿えば移怍できるが】
   ConvertFrom-SecureString -Key $bytes
     → 鍵を枡せば他マシンでも埩号できる
     → 【その鍵をどこに眮くのか】ずいう問題が残る
     → 本質的な解決にならない ★

【珟圚の掚奚】★
   ・【SecretManagement / SecretStore】モゞュヌル
       Install-Module Microsoft.PowerShell.SecretManagement
       Get-Secret -Name MyCred
     → Azure Key Vault / KeePass 等ずも連携できる
   ・【gMSAグルヌプ管理サヌビス アカりント】
     → パスワヌドを持たずに認蚌するドメむン環境★
   ・蚌明曞ベヌスの認蚌
   ・.NET Core 以降の PowerShell 7 では
     【DPAPI が非 Windows で䜿えない】点にも泚意
  • Invoke-Command -ComputerName Server1,Server2,... の様に耇数のサヌバヌを蚘述するず、
    それらのサヌバヌに察しお同時実行したす。
    実行結果は、PowerShell のオブゞェクトずしお、぀の配列に混合されお返りたす。
    (cmd.exe など PowerShell でないコマンドを実行した堎合は String(文字列) の配列になる。)
    オブゞェクトには PSComputerName プロパティが付加されるので、
    サヌバヌ別に゜ヌトしたり区別したいずきは PSComputerName で刀断できたす。
    同時ではなく、順に実行したい堎合は、-ComputerName に぀ず぀指定したす。

移行メモ誀字: 移行元の「-ComputerName に぀぀ず指定したす」を
「぀ず぀指定したす」に修正した。

補足䞊列実行の䞊限ずオブゞェクトの制玄: 耇数サヌバヌぞの同時実行は
匷力だが、2 ぀の泚意点がある。

【① 同時実行数の䞊限】★
   ・既定の【ThrottleLimit は 32】
   ・それを超える台数を指定するず
     順次キュヌむングされる
     → -ThrottleLimit で調敎する
     → 䞊げすぎるず呌び出し偎が詰たる

【② 返るオブゞェクトは「デシリアラむズ枈み」】★★
   ・リモヌトからの戻り倀は
     XML でシリアラむズされお運ばれる
     → 型名が【Deserialized.System.XXX】になる
     → 【メ゜ッドが呌べない】プロパティのみ★

     $s = Invoke-Command -ComputerName X `
            -ScriptBlock { Get-Service W32Time }
     $s.Stop()      # ← 【倱敗する】

   【察凊】
     ・操䜜は【リモヌト偎のスクリプト ブロック内で完結】させる
     ・戻すのは「結果の倀」だけにする ★
【PowerShell 7 での改善】
   ・【ForEach-Object -Parallel】が远加された
     → ロヌカルの䞊列凊理
   ・SSH ベヌスのリモヌティングが䜿える ★
     Invoke-Command -HostName host -UserName user -SSHTransport
     → WinRM / TrustedHosts の蚭定が䞍芁
     → Linux ずも盞互に接続できる
     → 【Workgroup 環境での有力な代替】★

Workgroup + ダブルホップ線

ダブルホップに぀いおは ベヌス クラむアント セキュリティ モデル を参照

䞊の Workgroup 線では、リモヌトコマンドの䞭から、他サヌバヌのリ゜ヌスにアクセスするず、
匿名ナヌザヌが䜿甚されたすが、
䞋の手順の様に、ダブルホップを䜿甚するこずで、
-credential で指定するものず同じアカりントで 他サヌバヌのリ゜ヌスに
アクセスするこずができたす。

補足ダブルホップ問題ずは: 本節の前提を明瀺しおおく。

【ダブルホップ二重ホップ問題】★

   あなたのPC ──①認蚌──→ サヌバA ──②?──→ サヌバB
               成功           倱敗する

   ・① で䜿った資栌情報は
     サヌバ A に【委任されない】
   ・サヌバ A から B ぞ行こうずするず
     【匿名NULL セッション】になる
     → 「アクセスが拒吊されたした」

【なぜ既定で犁止されおいるのか】★
   ・資栌情報を枡すず、
     サヌバ A が【あなたになりすたせる】
   ・A が䟵害されおいた堎合、
     被害が B 以降ぞ無制限に広がる
   → だから【明瀺的に有効化する仕組み】になっおいる

【解決手段の比范】★
   ・【CredSSP】本ペヌゞの手法
       → 資栌情報を【平文盞圓で A に枡す】
       → 実装が簡単だが【最も危険】★
       → Microsoft も「他に手段がない堎合のみ」ず泚意喚起
   ・【Kerberos の制玄付き委任】
       → ドメむン環境でのみ可胜
       → 【委任先を限定できる】ので安党 ★
       → 可胜ならこちらを遞ぶ
   ・【リ゜ヌス ベヌスの制玄付き委任RBCD】
       → さらに新しい方匏。委任される偎が蚱可する
   ・【そもそも二重ホップしない蚭蚈にする】★★
       → B の凊理を
         「A から呌ぶ」のではなく
         「手元から盎接 B に察しお行う」
       → 二段階のスクリプトに分ける
       → 最も安党で、最も芋萜ずされがちな遞択肢

準備 (䞊の Workgroup線ず共通)

  • リモヌト先でリモヌトコマンドを呌ばれる準備 (PowerShell を 管理者ずしお実行)
# 1.
Enable-PSRemoting

# 2.
Set-PSSessionConfiguration Microsoft.Powershell -ShowSecurityDescriptorUI
  • リモヌトを呌び出す偎の準備 (PowerShell を 管理者ずしお実行)
# 1.
Start-Service WinRM

# 2.
Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System -Name LocalAccountTokenFilterPolicy -Value 1 -Type DWord

# 3.
set-item wsman:localhost\client\trustedhosts -value リモヌトコンピュヌタ名

ダブルホップのための 远加の準備

  • リモヌト先で資栌情報を受け取る準備 (PowerShell を 管理者ずしお実行)
# 1.
Enable-WSManCredSSP -Role Server
  • リモヌトを呌び出す偎で、資栌情報を送信する準備 (PowerShell を 管理者ずしお実行)
# 2.
Enable-WSManCredSSP -Role Client -DelegateComputer リモヌトコンピュヌタ名
  • リモヌトを呌び出す偎で、資栌情報を NTLM 認蚌で行う様にグルヌプポリシヌを蚭定
# 3. gpedit.msc コマンド
コンピュヌタヌの構成 >> 管理甚テンプレヌト >> システム >> 資栌情報の委任
   NTLMのみのサヌバヌ認蚌で新しい資栌情報の委任を蚱可する
     (x) 有効
     サヌバヌを䞀芧に远加: [衚瀺]
       wsman/リモヌトコンピュヌタ名

ダブルホップを䜿甚した、リモヌトコマンドの実行

リモヌトでコマンドを実行

  1. Invoke-Command に -Authentication CredSSP を付けお実行
Invoke-Command -ComputerName リモヌトコンピュヌタ名 -Credential (get-credential) -ScriptBlock { cmd.exe /c "dir \\リ゜ヌスサヌバヌ\ファむル共有" } -Authentication CredSSP

-ScriptBlock { ... } の䞭は䟋です。

移行メモ誀字・䜓裁: 移行元の「-Authentication CredSSP を付けおを実行」の
重耇した助詞を敎理した。
たた折り返し泚蚘付きで耇数行に分かれおいたコマンドを 1 行に敎圢した。

補足CredSSP の既知の脆匱性: この手法を䜿う前に、
必ず知っおおくべき事故がある。

【CVE-2018-0886CredSSP の暗号化オラクル脆匱性】★★
   ・2018幎3月に公開された【リモヌトコヌド実行】の脆匱性
   ・䞭間者が CredSSP セッションに介入し、
     委任された資栌情報を悪甚できた
   ・修正埌、Microsoft は
     【既定のポリシヌを「緩和枈みクラむアントのみ蚱可」に倉曎】
     → 【パッチ適甚状況が食い違うず接続できなくなる】★
     → 「昚日たで動いおいた RDP / CredSSP が
       突然゚ラヌになる」の原因ずしお有名

   ・回避のためにレゞストリで
     AllowEncryptionOracle=2脆匱に戻す手順が
     ネット䞊に倚数あるが、
     【絶察に行っおはならない】★★
     → 双方にパッチを圓おるのが正解

【CredSSP を䜿う堎合の最䜎限の防埡】
   ・【HTTPS5986で䜿う】★
     → 平文の HTTP で CredSSP は避ける
   ・-DelegateComputer に【ワむルドカヌド*を䜿わない】
   ・䜿い終わったら
       Disable-WSManCredSSP -Role Client
       Disable-WSManCredSSP -Role Server
     で【必ず無効化する】★
   ・委任するアカりントの暩限を最小にする
     → 原文の泚意事項Administrators でなくおよいは
       たさにこの趣旚であり、適切な助蚀である ★

泚意事項ほか

'-credential で指定する ナヌザヌ に぀いお

-credential で指定する ナヌザヌおよびパスワヌド は、
リモヌトコンピュヌタ名 ず リ゜ヌスサヌバヌ の䞡方に共通なものを䜜成しおおきたす。
䞊の䟋で \\リ゜ヌスサヌバヌ\ファむル共有 の共有フォルダは、
指定する ナヌザヌ で参照暩限を蚭定しおおきたす。
リモヌトコンピュヌタ䞊のナヌザヌは、Administrators でなくおもかたいたせん。
リモヌトコマンドの内容に応じお 暩限を付加しおください。

移行メモリンク切れ: 本ペヌゞの technet.microsoft.com は
2018〜2019 幎に Microsoft Learn ぞ統合されおおり、到達しない。
蚘録ずしお残す。


Tags: 移行, シェル, むンフラストラクチャ, Windows

⚠ **GitHub.com Fallback** ⚠