2015/01/15

PowerShell を使ってMicrosoft Azureの仮想マシンにリモート接続する手順

Microsoft Azure 上にWindows Server Essentials Experienceの仮想マシンを作り、テストを行ってみました。
Microsoft Azureへの不慣れが多い状況ですが、少しづつ触っています。
今回は、PowerShellからMicrosoft Azureの仮想マシンにリモート接続する手順をメモ。
使わないと分からないものですね。

リモート接続するまでの流れ

  1. Azure PowerShell をインストール
  2. Azure PowerShell を起動する
  3. Azure アカウントを認証する
  4. Azure 仮想マシンを起動する
  5. Azure 仮想マシンへリモート接続
    1. 方法1
    2. 方法2

Azure PowerShellをインストール

How to install and configure Azure PowerShell」を参考に設定します。
  1. Windows Web Platform Installer 5.0をインストール
  2. [Microsoft Azure PowerShell]を探し、[追加]ボタンをクリック
    2015-01-15_150003
  3. [インストール(I)]ボタンをクリック
  4. [同意する(A)]ボタンをクリック
    2015-01-15_150055
  5. インストール完了後、[終了(E)]ボタンをクリック

Azure PowerShellを起動する

Windows 7の場合、スタートボタン→[プログラム一覧]→[Microsoft Azure]※→[Microsoft Azure PowerShell]を実行します。
似たような[Windows Azure] フォルダーがありますが、こちらではありません。
2015-01-15_151433

Azure アカウントを認証する

Azure の各種サービスを利用するためには、Azure アカウントを認証しなければなりません。
私はMicrosoft アカウントを使っているので、下記手順で認証しました。
  1. Add-AzureAccount コマンドレットを実行
  2. Microsoft アカウントの認証処理を行う
  3. Get-AzureAccount コマンドレットを実行し、アカウントを確認

Azure 仮想マシンを起動

作成済みのAzure 仮想マシンを確認、起動します。
  1. Get-AzureVM コマンドレットを実行、起動したいServiceNameおよびNameを確認
  2. Start-AzureVM -ServiceName <サービス名> -Name <ホスト名>
  3. 「Completed Operation: Start-AzureVM」の文言が表示されるまで待つ

Azure 仮想マシンへリモート接続~方法1

WinRM経由でAzure 仮想マシンへリモート接続する方法は、ローカルのWindows Serverにリモート接続する手順と「基本」変わりませんが、全く同じスクリプトだとエラーになりました。
試行錯誤した結果、いくつかのパラメーターが必要でした。
$u = "WSEのユーザー アカウント名"
$p = "パスワード" | ConvertTo-SecureString -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential($u,$p)
Enter-PSSession -ComputerName <ホスト名>.cloudapp.net -Credential $c -UseSSL -SessionOption (New-PSSessionOption -SkipCACheck)
-UseSSL
-UseSSL パラメータがないと、よく見るエラーが返ってきます。
2015-01-15_161955
Azure 仮想マシンのエンドポイントを確認するとWinRMのパブリック ポート/プライベート ポートは5986になっています。
2015-01-15_161533
Microsoft サポート「Configuring WINRM for HTTPS」を確認すると、
Windows 7以上のWinRM HTTPSは通常5986を使う
と説明されており、これよりHTTPSが必要である事が分かります。
-SessionOption (New-PSSessionOption -SkipCACheck)
-SessionOption パラメーターなしでリモート接続するとサーバー証明書がない旨のエラーが出力されました。
2015-01-15_162536
そこで、New-PSSessionOption -SkipCACheckを-SessionOption パラメーターにセットし実行する事で、サーバー証明書は確認されなくなりました
この方法は簡単に接続出来ましたが、セキュリティ レベルが低下する問題があります。
New-PSSessionOption」コマンドレットの-SkipCACheck パラメーターには
Use this option only when the remote computer is trusted by using another mechanism, such as when the remote computer is part of a network that is physically secure and isolated or when the remote computer is listed as a trusted host in a WinRM configuration.
と説明されているとおり「クライアントで信頼できるリモート コンピューターを登録する」などが必要のようですね。
環境を把握し可能な限りセキュアな状況で利用したいところです。

Azure 仮想マシンへリモート接続~方法2

方法2は、サーバー証明書を作成・インポートした上でPowerShell からリモート接続します。
こちらが本命ですよね。
SQLMag.comさんの記事「Use PowerShell Remoting to Manage Azure VMs」やMichael Washamさんのブログ記事「Windows Azure PowerShell Updates for IaaS GA」を参考になりました。ありがとうございます。
下記スクリプトは、Azure 仮想マシンのサーバー証明書をインストールする関数になります。
なお、実行には管理者権限が必要です。
function Import-AzureVMCert{
 param(
  [string]$ServiceName,
  [string]$Name
 )
 try{
  #Get AzureVM
  $vm = Get-AzureVM -ServiceName $ServiceName -Name $Name
  #Get WinRM Certificate Thumbprint
  $VmCert = $vm.VM.DefaultWinRMCertificateThumbprint
  #Get Azure Certificate
  $X509 = Get-AzureCertificate -ServiceName $ServiceName -Thumbprint $VmCert -ThumbprintAlgorithm sha1
  #Create Temp File
  $CertFile = [IO.Path]::GetTempFileName()
  $X509.Data | Out-File $CertFile
  #Install Certificate
  $VMCert2 = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 $CertFile
  $store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
  $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]::ReadWrite)
  $store.Add($VMCert2)
  $store.Close()
  #Delete Temp FIle
  Remove-Item $CertFile
  Write-Host "Install AzureVM Certificate - Complete!" -ForegroundColor Yellow
 }catch{
  Write-Host "Install AzureVM Certificate - Error!!!" -ForegroundColor Red
 }
}
Internet Explorerのインターネット オプションからサーバー証明書を確認、インストールされていました。
2015-01-15_1800472015-01-15_180105
確認後、Enter-PSSession コマンドレットを実行すると無事接続しました。
$u = "WSEのユーザー アカウント名"
$p = "パスワード" | ConvertTo-SecureString -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential($u,$p)
Enter-PSSession -ComputerName <ホスト名>.cloudapp.net -Credential $c -UseSSL
参考にしたサイト
スポンサーリンク

スポンサーリンク