WinRMでの公開鍵認証

2024年6月18日

はい、WinRMでの公開鍵認証もサポートされています。ただし、公開鍵認証を使用するには、WinRMの設定やセキュリティ設定を適切に構成する必要があります。以下は、WinRMでの公開鍵認証の一般的な手順です。

  1. リモートWindowsマシンのWinRM設定:
    • リモートWindowsマシンで winrm quickconfig を実行して、WinRMを構成します。適切な設定が求められたら、それに従って設定してください。
    • winrm set winrm/config/service/auth @{Basic="true"} を実行して、基本認証を有効にします。
  2. 公開鍵の生成:
    • 公開鍵と秘密鍵のペアを生成します。SSHキーを使用する場合、ssh-keygen コマンドを使用してキーペアを生成します。
  3. 公開鍵の配置:
    • 公開鍵をリモートWindowsマシンに配置します。これは、通常、リモートWindowsマシンの .ssh ディレクトリに authorized_keys ファイルとして配置されます。
  4. WinRMセキュリティ設定:
    • WinRMのセキュリティ設定を変更して、公開鍵認証を有効にします。以下のコマンドを実行します。
      arduino
      winrm set winrm/config/service/auth @{Basic="false"}
      winrm set winrm/config/service/auth @{Basic="true"} 
      winrm set winrm/config/service @{AllowUnencrypted="false"}
      
  5. リモート接続スクリプトの修正:
    • Pythonスクリプトを修正して、公開鍵認証を使用してリモートWindowsマシンに接続します。

以下は、公開鍵認証を使用してWinRMを介してリモート接続するPythonスクリプトの一例です。pywinrm ライブラリを使用します。

python
import requests
from requests.auth import HTTPBasicAuth
import winrm

def run_command(hostname, username, private_key_path, command):
    session = winrm.Session(
        hostname, 
        auth=HTTPBasicAuth(username, ''),
        server_cert_validation='ignore',
        transport='ntlm',
        keyfile=private_key_path,
        certfile=private_key_path
    )

    encoded_ps = f"[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('{command}'))"
    ps_script = f"$command = {encoded_ps}; Invoke-Expression $command"

    encoded_ps_script = ps_script.encode('utf_16_le').decode('latin_1')

    result = session.run_ps(encoded_ps_script)

    print(f"Remote Command Output:n{result.std_out.decode('utf-8')}")

if __name__ == "__main__":
    remote_hostname = "リモートWindowsマシンのIPアドレスまたはホスト名"
    remote_username = "リモートWindowsマシンのユーザー名"
    private_key_path = "生成したSSH秘密鍵のパス"

    command_to_run = "ここに実行したいPowerShellコマンドを指定"

    run_command(remote_hostname, remote_username, private_key_path, command_to_run)

このスクリプトでは、pywinrm ライブラリを使用してSSH秘密鍵を指定し、公開鍵認証を使用してリモートWindowsマシンに対してコマンドを実行します。

未分類

Posted by ぼっち