Microsoft Antimalwareを使ってみる

 

Microsoft Antimalwareの設定を試してみました。

Azure VMの拡張機能にMicrosoft AntimalwareというAzure VM向けのマルウェア対策があります。

https://docs.microsoft.com/ja-jp/azure/security/fundamentals/antimalware

今回はWindows のAzure VMでMicrosoft Antimalwareでセットアップを実施してみました。

      • Azure VMの拡張機能でMicrosoft Antimalwareを追加設定する
      • Windows OS上でMicrosoft AntimalwareのGUIを表示できるようにする
      • Azure VMのテンプレートでスケジュール設定を確認変更する

※Windows 2016以降やWindows 10等ではWindows Defenderが入っているので必要ありません。またサポート対象はWinodws OSのみです。

1.Azure VMの拡張機能でMicrosoft Antimalwareを有効にして設定する

まず最初に、Azure VMの拡張機能でMicrosoft Antimalwareを有効にし設定します。

1)仮想マシンの画面で拡張機能を選択すると下記画面が表示されるので追加を選択します。

2)拡張機能のリストが表示されますので、Microsoft Antimalwareを選択します。

3)Microsoft Antimalwareの説明が表示されますので作成を選択します。

4)Microsoft Antimalwareの設定画面が表示されます。リアルタイムスキャンやスケジュールスキャンの有効無効等が選択できます。

    • 主に設定する内容
      • Excluded files and location:検索対象外とするディレクトリやファイル(今回はD:\\*を指定)
      • Scan day:スケジュールスキャンを実行する曜日(今回は日曜日を選択)
      • Run a scheduled scan:Enable
      • Scan Time:スケジュールスキャンを実行する時間(0時からの分で指定)
        • 120の場合は(2:00)となります

※サンプル画面はRun a scheduled scanがDisableになってますがEnableを選択します。

これで、Microsoft Antimalwareのセットアップは完了です。

Microsoft Antimalwareのインストール後に、Azure VMの拡張機能を見ると、IaaSAntimalwareが追加されており、正常動作している場合はProvisioning succeededと表示されます。

2.Microsoft AntimalwareをWindows上で確認する(System Center Endpoint Protectionとして表示される)

Windowsにログインし確認してみます。

今回はWinodws 2012で試してますが2008でも同様の手順になります。

アプリを確認するとSystem Center Endpoint Protectionが追加されているのが分かります。(Microsoft AntimalwareとしてではなくSystem Center Endpoint Protectionとしてインストールされます。)

実際にSystem Center Endpoint Protectionをクリックすると、Your System has administrator has  restricted access to this appというエラーメッセージが表示されGUIが開けません。

調べてみた所、System Center Endpoint Protectionポリシー設定でNGになっているようです。

コマンドプロンプトで以下のコマンドを実行します。

“C:\Program Files\Microsoft Security Client\ConfigSecurityPolicy.exe” cleanuppolicy.xml

コマンド実行後、System Center Endpoint Protectionを選択するとGUIで画面が表示される事が確認されます。

これで、OS上での設定は完了です。Setting等でスケジュールの設定も可能です。。。が注意が必要です。

3.Microsoft Antimalware(System Center Endpoint Protection)の設定はARMテンプレートを変更する必要がある

Microsoft Antimalware(System Center Endpoint Protection)ですが、OS上でScan Time等の設定をしてもAzure VM(OSではなく)を再起動や再デプロイすると、ARMテンプレート(拡張機能追加時)に設定した内容に戻ります。

Azure Portalでも設定が出来ない為、直接ARMテンプレートの修正が必要になります。

Azure Portal上で設定する仮想マシンを選択します。テンプレートのエクスポートのメニューを選択するとAzure VMのARMテンプレートが表示されます。

ARMテンプレートのconcat(parameters(‘virtualMachines_VM名_name’), ‘/IaaSAntimalware’)を見ると以下のように表示されます。

“settings”に設定値があります。ここを修正する必要があります。

      {
            “type”: “Microsoft.Compute/virtualMachines/extensions”,
            “apiVersion”: “2019-07-01”,
            “name”: “[concat(parameters(‘virtualMachines_VM名_name’), ‘/IaaSAntimalware’)]”,
            “location”: “ロケーション名“,
            “dependsOn”: [
                “[resourceId(‘Microsoft.Compute/virtualMachines’, parameters(‘virtualMachines_VM名_name’))]”
            ],
            “tags”: {
                “division”: “notag”
            },
            “properties”: {
                “autoUpgradeMinorVersion”: true,
                “publisher”: “Microsoft.Azure.Security”,
                “type”: “IaaSAntimalware”,
                “typeHandlerVersion”: “1.3”,
                “settings”: {
                    “AntimalwareEnabled”: true,
                    “RealtimeProtectionEnabled”: “true”,
                    “ScheduledScanSettings”: {
                        “isEnabled”: “true”,
                        “day”: “1”,
                        “time”: “120”,
                        “scanType”: “Quick”
                    },
                    “Exclusions”: {
                        “Paths”: “D:\\\\*”,
                        “Extensions”: “[parameters(‘extensions_IaaSAntimalware_Extensions’)]”,
                        “Processes”: “[parameters(‘extensions_IaaSAntimalware_Processes’)]”
                    }
                }
            }
        }
    ]
}

例えば、毎日スケジュールスキャン(Full)を4時に実施する場合は下記のように変更します。

               “settings”: {
                    “AntimalwareEnabled”: true,
                    “RealtimeProtectionEnabled”: “true”,
                    “ScheduledScanSettings”: {
                        “isEnabled”: “true”,
                        “day”: “0”,
                        “time”: “240”,
                        “scanType”: “Full”
                    },
                “Exclusions”: {
                        “Paths”: “D:\\\\*”,
                        “Extensions”: “[parameters(‘extensions_IaaSAntimalware_Extensions’)]”,
                        “Processes”: “[parameters(‘extensions_IaaSAntimalware_Processes’)]”

これでAzure VMを再起動や再デプロイをしても、スケジュールスキャンの設定が反映されます。

※修正時は必ずARMテンプレートのバックアップを保存して実施して下さい。

Azure VM(Windows Server)にディスクを追加する

 

Winodws Server 2016のAzure VMにディスク(Managed Disk)を追加をしてみました。

実施した手順は以下の通りになります。

      • Azure Portalでディスク(Managed Disk)を新規作成
      • Azure PortalでVMへディスクを追加
      • Windows Server 2016上でディスク追加

.Azure Portalでディスク(Managed Disk)を新規作成

まず最初にAzure Portalを使って追加用のディスク(Managed Disk)の新規作成します。

今回は以下の条件で追加します。

      • ディスク設定内容
        • 容量:128GB
        • 種類:Standard HDD

1)Azure Portalでディスクのメニューを選択します。追加を選択します。

2)マネージドディスクの作成画面が表示されるので、リソースグループやディスク名等を設定します。

サイズにあるサイズを変更しますをクリックします。

3)ディスクサイズを選択します。

今回は記憶域の種類はStandard HDD、サイズは128GBを設定します。

4)暗号化のタブが表示されますので、そのまま次へをクリックします。

5)詳細のタブが表示されますので、そのまま次へをクリックします。

6)ネットワークのタブが表示されますので、そのまま次へをクリックします。

7)タグのタブが表示されます。設定しない場合はそのまま次へをクリックします。

 

確認画面が表示されるので、問題が無ければ作成をクリックします。これでディスク(Managed Disk)作成は完了です。

.Azure VMへディスクを追加する

Auzre VMへ作成したディスク(Managed Disk)を追加します。

1)仮想マシンのメニューでディスクを選択します。データディスクにある既存のディスクのアタッチを選択します。

2)ディスクの行が表示されます。ディスク名に作成したディスク(Managed Disk)を選択します。

 

3)保存をクリックします。

これでAzure VMへのデータディスク(Managed Disk)追加作業完了です。

.Windows Server 2016上でディスクを追加する

次にWindows OS上でディスク追加します。

1)コントロールパネルでシステムとセキュリティを選択します。

2)管理ツールのハードディスクパーティションの作成とフォーマットを選択します。

3)ディスクの初期化画面が表示されますので、OKをクリック選択します。

4)ディスクの管理画面が表示されます。追加したディスクがディスク2に表示されています。領域の部分で右クリックするとメッセージが表示されるので、新しいシンプルボリュームの作成を選択します。

5)新しいシンプルボリュームウィザードが表示されますので、次へを選択し開始します。

6)ボリュームとサイズの指定が表示されるので、そのまま次へをクリックします。(容量を変更する場合はサイズを変更します。)

7)ドライブ文字またはパスの割り当てが表示されるので、そのまま次へをクリックします。(ドライブ文字を変更する場合は適時指定します。)

8)パーティションのフォーマット画面が表示されますので、特に指定が無ければそのまま次へクリックします。

9)確認画面が表示されますので、完了をクリックします。

フォーマットが開始されます。

10)フォーマットが終了すると、ボリュームE:128GB 正常と表示されます。

これでOS上でのディスク追加作業は完了です。

最後にエクスプローラーで実際に確認してみます。ボリュームEが表示される事が確認出来ます。

 

これでディスク追加作業は完了です。

Azure VM(Windows Server)を日本語化する

 

Winodws Server 2016のAzure VMを新規構築するとデフォルトでは英語になっています。

今回はAzure VMのWinodws Server 2016の日本語化を実施してみました。

実施した手順は以下の通りになります。(色んなサイトに記載されていますが。。。)

      • コントロールパネルで日本語Language Packを追加(インストール)
      • リージョン(Region)の設定
      • 時刻設定

.Windowsのコントロールパネルで日本語Language Packを追加する

まず最初に日本語のLanguage Packを追加します。

1)日本語化する仮想マシン(Virtual Machine)にRDP(リモートデスクトップ)で接続します。

2)接続すると下記画面(デフォルトではServer Manager画面)が表示されますので、一番左下のWindowsマークをクリックします。

3)Windowsのメニューが表示されますので、Control Panelを選択します。

4)Control Panelの画面で、Add a languageを選択します。

5)Languageのメニュー画面でAdd a languageを選択します。

6)Add languageのメニューで日本語を選択します。

 

7)日本語か追加されますので、Move Upをクリックして日本語を一番上にします。(優先順位の1位を日本語にします。)

8)日本語にあるOptinonsを選択します。

9)Download and Install language packを選択します。

自動的にInstallが始まりますので完了まで待ちます。

環境にもよりますが、10分~30分程度かかります。

これで日本語Language Packのインストールは完了です。

.リージョン(Region)を日本に変更設定する

ログイン時に表示されるメッセージ等が日本語表記されるように設定します。

1)Control Panelの画面に戻ります。Change date, time, or number formatsを選択します。

2)Regionの画面が表示されますので、Locationタブを選択します。

3)LocationタブのHome locationでJapanを選択します。

 

4)AdministrativeタブでWelcome screen and new user accountsのCopy settingsを選択します。

確認メッセージが表示されますので、Applyを選択します。

5)Welcome screen and new user accounts serrings画面が表示されます。Welcome screen and system accountsとNew user accountsのチェックボックスにチェックを入れます。

※この設定でログイン時のメッセージや新規ユーザ追加時も日本語化されます。

 

6)チェックを入れるとWelcome screen等の部分が日本語になっている事が確認出来ます。OKをクリックすると再起動確認メッセージが表示されます。継続して設定を行うのでCancelを選択します。

7)RegionのAdministrativeのタブに戻ります。Language for non-Unicode programsのChange System localeを選択します。

8)Current system localeでJapanese(Japan) を選択します。

 

確認メッセージが表示されますので、Restart nowを選択して再起動します。

これで、リージョン(Region)の設定が完了です。OS再起動後起動メッセージやログイン後のメニューが日本語になっていればOKです。

.時計を日本時間に変更設定する

デフォルトでは時計がUTC(国際標準時)になっているので、これを日本時間に変更します。

1)OSへログイン後、右下の時計をクリックすると下記画面が表示されるので、日付と時刻の設定を選択します。

2)日付と時刻の設定画面が表示されるので、タイムゾーンを(UTC+9:00)大阪、札幌、東京を選択します。

選択するだけで、設定が自動的に反映されます。

これでWindows Server 2016の日本語化設定がすべて完了です。

Azure VMと一緒にディスクやNICも纏めて削除

 

仮想マシン(Azure VM)名を指定するだけで、仮想マシン(Azure VM)と一緒に関連アイテムを削除できないか?という事で試してみました。

Azure Portalを使って仮想マシン(Azure VM)を削除する場合、以下のメッセージが表示されます。

メッセージに表示されている通り、Azure VM削除時にディスク(Managed Disks)やネットワークインターフェースといった関連は一緒に削除されません。後で個別に削除する必要があります。

これを纏めて削除できれば便利かも?という事で、仮想マシン(Azure VM)を指定すれば一緒に関連アイテムも削除するPower Shellを作ってみました。

今回のPower Shellの削除対象はこちらの4つになります。複数接続されていても一緒に削除できるようにしてみました。

      • 仮想マシン(Azure VM)
      • ディスク(Managed Disks)
      • ネットワークインターフェース
      • パブリックIP

ディスクやネットワークインターフェース関連はこちらでも試しております。併せて見て頂ければと。

使われていないAzure Managed Disksやネットワークインターフェースをまとめて削除

Azure VMの稼働ステータスやIPアドレス、ディスク情報を纏めて取得

1.仮想マシン(Azure VM)と一緒にディスク(Managed Disks)やネットワークインターフェースをまとめて削除するPower Shell

マイクロソフト様のサイトの情報を参考にして仮想マシン名を指定すれば関連アイテムの情報を取得して一緒に削除するPower Shellを作成してみました。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/scripts/virtual-machines-powershell-sample-collect-vm-details

こちらのサンプルではディスク情報が取得されていないので追加しています。

実際のPower Shellの流れは、こちらの通りになります。

      • 削除対象となる仮想マシン(Azure VM)の名前やリソースグループ名をパラメータとして指定する
      • 削除対象となるディスク(Managed Disks)やネットワークインターフェースパブリックIPの情報を取得する
      • 削除対象となる情報を表示する(確認用)
      • 削除処理を実行する

先に仮想マシン(Azure VM)を削除してしまうと、仮想マシン(Azure VM)と関連付けされていたネットワークインターフェース等が分からなくなる為先に情報を取得しています。

ネットワークインターフェースやディスク(Managed Disks)は仮想マシン(Azure VM)のIDと合致するものを条件に抽出しています。

表示する為の情報を$infoや$reportに格納しています。(必要なければ削除でもOKかと思います。)

今回作成したPower ShellはGitHubにアップロードしてございます。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/VMDelete_20200809

#仮想マシンを関連リソースと一緒に削除するPower Shell

$param (
    [String] [Parameter(Mandatory=$true)] $resourceGroupName,
    [String] [Parameter(Mandatory=$true)] $VMName
    )

$vms = Get-AzVM -ResourceGroupName $resourceGroupName -Name $VMName
$report = @()
$publicIps = Get-AzPublicIpAddress 

Foreach ($vm in $vms){
$info = “” | Select VmName, ResourceGroupName, PublicIPName, NicName, DiskName 

$nics = Get-AzNetworkInterface | Where { $_.VirtualMachine.id -contains $vm.id} 
$disks = Get-AzDisk -ResourceGroupName $vm.ResourceGroupName | Where { $_.ManagedBy -contains $vm.id }

    foreach($publicIp in $publicIps) { 
        if($nics.IpConfigurations.id -eq $publicIp.ipconfiguration.Id) {
            $info.PublicIPName = $publicIp.Name
            } 
        }    
              
        $info.VMName = $vm.Name 
        $info.ResourceGroupName = $vm.ResourceGroupName 
        $info.NicName = $nics.Name 
        $info.DiskName = $disks.Name 
        $report+=$info 
    } 

Write-Host “”
Write-Host “削除対象はこちらのアイテムになります。”
$report | ft VmName, ResourceGroupName, PublicIPName, NicName, DiskName

#VMを削除します。
Write-Host “VMを削除します:$($VMName)”

Remove-AzVM -ResourceGroupName $resourceGroupName -Name $VMName

#関連アイテムの削除確認。確認のみの場合は0を指定
$deletecheck = 1

#Nicを削除します。
foreach ($DeleteNic in $nics) {
    if($deletecheck -eq 1){
        Write-Host “Deleting NicName: $($DeleteNic.Name)”
        $DeleteNic | Remove-AzNetworkInterface 
    }else{
        Write-Host “Deleting NicName: $($DeleteNic.Name)”
    } 

#Diskを削除します。
foreach ($DeleteDisk in $disks) {
    if($deletecheck -eq 1){
        Write-Host “Deleting DiskName: $($DeleteDisk.Name)”
        $DeleteDisk | Remove-AzDisk
    }else{
        Write-Host “Deleting DiskName: $($DeleteDisk.Name)”
    } 

#PublicIPを削除します。
foreach ($DeletePublicIP in $publicIp) {
    if($deletecheck -eq 1){
        Write-Host “Deleting PublicIPName: $($DeletePublicIP.Name)”
        $DeletePublicIP | Remove-AzPublicIpAddress 
    }else{
        Write-Host “Deleting PublicIPName: $($DeletePublicIP.Name)”
    } 

2.仮想マシン(Azure VM)とネットワークインターフェースとディスクを一緒に削除

作成したPower Shellを実行してみました。実行時の条件はこんな感じになります。

      • 対象の仮想マシンとリソースグループ名をパラメータとして指定する
      • 関連アイテムを一緒に削除しない場合はPower Shellの$deletecheck = 0にします。
      • 確認メッセージを表示しない場合は各削除コマンドに-Forceをつけて下さい。

今回、削除対象の仮想マシン(Azure VM)はこちらになります。

      • 仮想マシン(Azure VM)名
        • TEST-VM
      • ネットワークインターフェース名
        • TEST-VM-NIC2
        • test-vm751
      • ディスク(Managed Disks)名
        • TEST-VM_DataDisk_0
        • TEST-VM_OsDisk_1
      • パブリックIPアドレス名
        • TEST-VM-ip

実行結果はこんな感じになります。今回は-Forecをつけていませんので、削除確認メッセージが表示されます。

削除対象はこちらのアイテムになります。

VmName ResourceGroupName PublicIPName NicName DiskName
—— —————– ———— ——- ——–
TEST-VM RG-1 TEST-VM-02-ip {TEST-VM-NIC2, test-vm751} {TEST-VM_DataDisk_0, TEST-VM_OsDisk_1

VMを削除します:TEST-VM
Virtual machine removal operation
This cmdlet will remove the specified virtual machine. Do you want to continue?
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y

Deleting NicName: TEST-VM-NIC2
Confirm
Are you sure you want to remove resource ‘TEST-VM-NIC2’
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y
Deleting NicName: test-vm751
Confirm
Are you sure you want to remove resource ‘test-vm751’
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y

Deleting DiskName: TEST-VM_DataDisk_0
Remove-AzDisk operation
This cmdlet will remove the specified resource. Do you want to continue?
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y

Deleting DiskName: TEST-VM_OsDisk_1
Remove-AzDisk operation
This cmdlet will remove the specified resource. Do you want to continue?
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y

Deleting PublicIPName: TEST-VM-ip
Confirm
Are you sure you want to remove resource ‘TEST-VM-ip’
[Y] Yes [N] No [S] Suspend [?] Help (default is “Yes”): y

Azure Portal上で確認しても削除されている事が確認出来ました。

もう少し改良できそうなので、随時試してみたい所です。

認証方法にSSH公開キーを利用しAzure VMにログインする(Cent OS)

 

Cent OSのAzure Virtual Machine(Azure VM)は作成時に、管理者アカウントの認証方式(ログイン方法)を、パスワードかSSH公開キーか選択する事が出来ます。

今回は、以下のサイトを参考に、管理者アカウントの認証方式をSSH公開キーでVMを作成し接続までを試してみました。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/ssh-from-windows

今回実施した作業は大きく分けて3段階になります。

1)PuTTYgenを利用して公開鍵、秘密鍵を作成する。

2)1)で作成した公開鍵を利用して、Azure VMを作成する。

3)1)で作成した秘密鍵を利用して、作成したAzure VMにログインする。

1.PuTTYgenを利用して公開鍵、秘密鍵を作成する

PuTTYがインストールされていない場合は、下記サイトよりダウンロードしてインストールします。

https://www.putty.org/

※Download PuTTYに、You can download PuTTYとありますので、こちらをクリックするとダウンロードのページに移動します。Package filesとありますので、こちらからダウンロードします。(通常のWin環境であれば64bitのMSIファイルで良いかと思います。)

1)PuTTYgenを起動し、Generateをクリックし、公開鍵と秘密鍵を作成します。

※空白部分でマウスを動かさないとKeyが生成されませんので注意して下さい。

2)作成されたら、公開鍵、秘密鍵をそれぞれ保存します。公開鍵はSave Public Key、秘密鍵はSave Private Keyをクリックして行います。

これでPuTTYgenを利用した鍵の発行作業は完了です。

2.Azure VMの認証方法でSSH公開キーを選択する

Azure VM作成時の認証方法でSSH公開キーを選択する場合の設定になります。

先ほど保存した公開鍵のファイルをテキストエディタで開き、オレンジ色の部分をコピーします。

—- BEGIN SSH2 PUBLIC KEY —-
Comment: “rsa-key-20200705”
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
—- END SSH2 PUBLIC KEY —-

Cent OSのAzure VM作成時に管理者アカウントの認証方法でSSH公開キーを選択すると下記画面が表示されますので、下記の通り入力します。

    • ユーザー名は管理者アカウント名を入力します。
    • SSH公開キーのソースは既存の公開キーを選択します。
    • SSH公開キーには、PuTTYgenで発行した、公開鍵情報をコピペします。

後は通常通りAzure VMの作成を行えば、作業は完了です。

3.SSHキー(秘密鍵)を利用してAzure VM(Cent OS)にログインする

作成したAzure VMに、PuTTYを利用してログインします。(認証方法にSSH公開キーを設定した場合、サーバ上に公開鍵が配置されます。ですのでログイン時に使用するのは秘密鍵になります。)

1)PuTTYを起動し、接続先IPアドレス(もしくはホスト名)を入力します。

2)PuTTYのCategoryでAuthを選択すると下記画面が表示されます。最初に作成した秘密鍵を指定します。(SSHログイン時に利用する秘密鍵になります。)

3)PuTTYでOpenをクリックし、Azure VMに接続します。下記画面が表示されますので、管理者アカウントにユーザー名を入力してください。

この方法で、認証に公開SSHキーを利用してAzure VMにログインが出来ました。

4.認証方法にSSH公開キーを利用した場合の注意点

Azure Portalのシリアルコンソールを利用してログインする場合、認証方法にSSH公開キーを設定したユーザーは利用できません。(2020年7月5日現在)

シリアルコンソールを利用するには、別途パスワードでログインできるユーザーを作成する必要があります。

なお、rootアカウントのパスワード設定方法はこちらの記事に記載しております。

Azure VMのroot初期パスワードについて(Cent OS)

Azure VMのroot初期パスワードについて(Cent OS)

 

Cent OSのAzure Virtual Machine(Azure VM)を作成した場合、rootアカウントの初期パスワードは非公開となっておりAzure VM作成時点では分かりません。

では、どうするのか? 

自身が作成した初期アカウントにはsudoの権限が付与されています。このsudo権限を利用してrootになり、root自身としてパスワードの初期化を実施する事でパスワードを設定する事が出来ました。

今回は、その手順を記載します。

1.Azure VMのrootのパスワードを設定する

1)まずAzure VM作成時に設定したアカウントでOSにログインします。

2)sudo su -でルートになります。この際にパスワードを聞かれます。Azure VM作成時に設定したユーザーのパスワードを入力します。

[user@test-vm ~]$ sudo su –
Password:  #Azure VM作成時のユーザーパスワード
[root@test-vm ~]#

3)rootになれたら、passwdコマンドでパスワードの初期化を行います。

[root@test-vm ~]# passwd
Changing password for user root.

New password: #新規設定するrootのパスワードを入力
Retype new password: #新規設定するrootのパスワードを再入力

これでrootのパスワードが設定できました。

2.Azure VMのrootのパスワードを設定する(keyでログインした場合)

Azure VM作成時にパスワードでは無く、keyで設定した場合にはどうなるでしょうか?

この場合も同じ方法で設定可能です。sudo実行時にパスワードを聞かれません。

sudo su -でルートになり、passwdコマンドでパスワードを初期化します。

[root@test-vm ~]# sudo su –

[root@test-vm ~]# passwd
Changing password for user root.

New password: #新規設定するrootのパスワードを入力
Retype new password: #新規設定するrootのパスワードを再入力

同じくrootのパスワードが設定できました

3.初期作成アカウントのsudo権限を剥奪する

Azure VM作成時の初期アカウントには、sudo権限が付与されています。

セキュリティ面を考えると、sudo権限を剥奪しておいた方が良いと思われます。

今回はこちらの手順もあわせて記載します。

初期作成アカウントのsudo権限は、/etc/sudoers.d/waagentにて定義されています。これをコメントアウトする事でsudo権限が剥奪出来ました。

[root@test-vm ~]#vi /etc/sudoers.d/waagent

#コメントアウトします。

username ALL=(ALL) ALL

#username ALL=(ALL) ALL

これでsudo権限を剥奪する事が出来ました。

※sudo権限の剥奪は必ずrootアカウントのパスワード設定後に実施して下さい。

認証方法にSSHキーを用いた場合はこちらで試しております。

認証方法にSSH公開キーを利用しAzure VMにログインする(Cent OS)

その他に初期設定を下記にも記載しております。参考にしていただければ幸いです。

Azure VMデプロイ直後のOS初期設定(CentOS 7.5編)

Azure VMデフォルトのまま作ると危険なのでNSG設定しましょう

 

Azure Portalを使って仮想マシン(VM)をそのまま作成すると、外部からのRDPやSSHアクセスが許可された状態になります。

これはネットワークセキュリティグループ(NSG)の受信規則が、Windowsの場合はRDP(3389)、Linux系の場合はSSH(22)がAnyで許可された状態になる為です。

AzureのパブリッククラウドのグローバルIPに対しては、作成した瞬間から不正なアクセスが来ます。インターネットからのアクセスをすべて許可した状態で放置する事は非常に危険な状態になります。

今回は、実際にやってみて、メッセージが表示される意味や、VM作成作業中に接続許可IPを指定する方法を確認してみました。

なおネットワークセキュリティグループ(NSG)はAzureで接続許可や拒否設定を行うものになります。

1 .仮想マシン(VM)をそのまま作成した際の、ネットワークセキュリティグループ(NSG)設定を確認してみました。

今回は、にAzure PortalでWindowsの仮想マシン(VM)作成を作成する時にネットワークセキュリティグループに関する設定を確認します。

まず基本画面で受信ポートの規則という以下の項目が表示されます。デフォルトこの画面で3389のポートが許可されます。

次にネットワーク画面で、以下の項目がデフォルトで表示されます。

デフォルトはBasicを選択されてます。このままデフォルト設定のまま進んでみます。

この設定のまま仮想マシン(VM)を作成してみます。

作成後、ネットワークインターフェースの設定を確認してみました。

ネットワークインターフェースに対して、NSG(ネットワークセキュリティグループ)が作成されているのですが、受信規則として下記ルールが作成されていました。

AnyでRDP(3389)が受信が許可された状態になってます。RDPでどこからでもアクセスできる状態になっています。

デフォルトのまま進んでしまうと、このように非常に危険な状態になる事がわかりました。

.仮想マシン(VM)と共に作成される、ネットワークセキュリティグループ設定を変更してみる

次に、仮想マシン(VM)作成時のどこで設定するのかを確認してみました。

Azure Portalで仮想マシン(VM)作成時に表示されるメッセージの通りで、基本画面の受信ポートの設定では何もできません。

ネットワークの画面で行います。下記の通りNICネットワークセキュリティグループで詳細を選択します。

ネットワークセキュリティグループの構成で、新規作成をクリックします。

そうすると下記画面が表示されます。ここで受信規則をクリックします。

そうすると下記画面が表示されます。ソースでIPアドレスを選択しますと、ソースIPアドレスが表示されますので、自身がアクセスするIPアドレスを入力します。

IPアドレスや名前等を入力して保管しますと、特定のIPからのみアクセス可能なネットワークセキュリティグループ(NSG)が作成されます。

なお自身のIPアドレスは、下記サイト等で確認が可能です。(Proxy等をご利用の方は社内システム管理者さん等に確認下さい。)

https://www.cman.jp/network/support/go_access.cgi

.そのままにしておくとどうなるのか

自身の経験ですが、実際にそのままにしておくと、5分後位から秒で辞書攻撃的なアクセスが来ました。

検証環境だから、すぐ消すからとか言ってそのままにしている事を多くみかけますが、要件が無い限り、ログイン元のIPアドレスは制限するようにした方が良いかと思います。

使う時しか上げないとかって、絶対に忘れますから!!

※実際のシステムではサブネットや、すでに作成済みのネットワークセキュリティグループ(NSG)を使うケースが多いと思いますが注意しましょう。

Azure VMの割り当て解除、停止忘れ対策

 

今回は、Azure Virtual Machine(VM)を止めたつもりなのに、停止し忘れて課金が発生しているVMを一覧出力して停止するPower Shellを作ってみました。

Azureを触り始めて最初の頃に非常に戸惑ったのですが、AzureのVMでは、OSでシャットダウンコマンドを発行しても課金が停止しません。

VMの起動状態には、大きく分けてVM自体の起動状態とOSの起動状態という2つの考え方があります。

電源ON、OS停止、電源オフという流れを具体的に書くとこんな感じになります。

    • 電源ON(Azure Portalで開始をクリックする) 1→3
    • OSでシャットダウンコマンド発行 3→5
    • 電源Off(Azure Portalで停止をクリックする) 5→7
 VMの状態状態PowerState課金

1

停止済み(割り当て解除)

電源OffVM deallocated課金されない
2起動中VM、OS起動中VM starting課金される
3起動済みOS起動済みVM running課金される
4停止中OS停止中VM stopping課金される
5停止済みOS停止VM stopped課金される

6

停止中(割り当て解除中)

VM停止中VM deallocating課金される

7

停止済み(割り当て解除)

電源OffVM deallocated課金されない

OSでシャットダウンコマンドを発行しても、OSは停止するのですが、VMのリソース解放はされてない状態(OS停止、VM起動)になります。その為継続して課金が発生します。

OSのみシャットダウンして、VM停止し忘れて課金が発生し続けるという事が結構ありました。

そこで、VMの課金が発生し続ける事態を防ぐために、OSのみがシャットダウンされている状態のVM一覧を取得し停止するPower Shellを作ってみました。

Azure VM停止時にディスクタイプを変更するPower Shellも作っておりますので、こちらも見て頂ければと。

Power ShellでAzure VM起動/停止と一緒にディスクタイプを変更する

1 .Azure Portal上でVMの電源状態を確認してみる。

最初にAzure PortalでVMの電源状態を確認してみました。VMのメニューの概要(VMを選択すると一番最初に表示される画面)の状態が電源状態を示すます。

 1) VMが完全に停止している状態(1の状態)(課金が発生しない状態)

 

 2) VMが実行されている状態(3の状態)

 

 3) OSのみがシャットダウンしている状態(5の状態)(課金が発生している状態)

 

 また、Virtual Machinesのメニューでも一覧で確認する事ができます。

 

.Power Shellを使ってVMの電源状態を確認するにはGet-AzVM -status

PowerShellでVMの電源状態を確認するには、Get-AzVM コマンドを利用します。

Get-AzVM -statusのPowerStateが電源状態に対応します。

VM名とVMのステータスのみを取得する場合の例を示します。ftでコマンドの実行結果の中で表示される内容をVM名(Name)と電源状態(PowerState)に絞ってます。

#見れるVMのすべての電源状態を見る場合

PS> Get-AzVM -Status |ft Name,PowerState

Name PowerState
—- ———-
VM1 VM deallocated
VM2 VM deallocated

#リソースグループを指定してVMの電源状態を見る場合

PS> Get-AzVM -Status -ResourceGroupName “リソースグループ名” |ft Name,PowerState

.VMの電源状態を取得して電源オフにするPower Shell(無駄な課金が発生してるVMの一覧を取得する)

不必要な課金が発生しているVMはPowerState が “VM Stoppe”になっているVMになります。

そこでPowerState が “VM Stoppe”の一覧取得しPower Shellで実施してみました。併せてVM停止をするようにしています。

    • #VMの状態を取得部分で、PowerState が “VM Stopped”の一覧を取得しています。
    • リソースグループを指定して実施するようにしています。
    • $vmstoporcheckを指定する事で、確認のみか停止するかを選択できるようにしています。
    • Stop-AzVMに-Forceをつける事で停止時の確認メッセージが表示されないようにしています。

#VM 割り当て解除忘れ漏れ対策 PowerShell

#RGを指定します。(RGを指定しない場合は下記3行をコメントアウトします。)
param (
        [string] [Parameter(Mandatory=$true)]  $resourceGroupName
      )

#確認のみの場合は0を選択する
$vmstoporcheck=1

#VM の状態を取得
    $vmstat = (Get-AzVM -Status `
    | Select-Object ResourceGroupName,Name,PowerState `
    | Where-Object { $_.PowerState -eq “VM Stopped” } )

#RGを指定する場合
    foreach ($vmstatus in $vmstat | Where-Object {$_.ResourceGroupName -eq $resourceGroupName })

#RGを指定しない場合
#   foreach ($vmstatus in $vmstat)

{
    if($vmstoporcheck -eq 1){
  
        Write-Host “Stop VM Name: $($vmstatus.Name)”
        Stop-AzVM -ResourceGroupName $vmstatus.resourceGroupName -Name $vmstatus.Name -Force
    
    }else{

        Write-Host “Stop VM Name: $($vmstatus.Name)”

    }
}

作成したPowerShellはGitHubにも公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/VmPowerStatusCheck_20200607

※VMのPowerState が “VM Stopped”になっていても、意図的にその状態で置かれているケースもあるかと思います。その編は実際の利用環境に合わせて注意願います。

※マイクロソフトサポート様より教えて頂いたサンプルをもとに作成しています。

第2世代 Azure Virtual Machineの指定

 

すでに半年以上たってはいるのですが、第 2 世代仮想マシン (VM) が Azure でサポートされるようになっています。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/generation-2

まだ、Hyper-Vの第2世代とは、セキュアブートやVHDX形式はサポートされない等の差はあるようです。

ですが、ディスク コントローラーがSCSIになるなど、いろいろ進化しているようです。

今回は、第2世代の仮想マシンを明示的に指定する方法について、Azure PortalとARMテンプレートの場合について確認してみました。

1 .Azure Portal上で第2世代の仮想マシンを指定する方法について

マイクロソフト様のサイトにもありますが、Azure Portalを利用して第2世代の仮想マシンを作成するのは詳細タブで実施します。。

下記のように詳細タブの一番下に、VMの生成という項目があります。こちらでGen2を選択すると第2世代の仮想マシンが作成できます。

.Azure Resource Manager(ARM)テンプレート等で第2世代の仮想マシンを指定する方法について

ARMテンプレート等で第2世代の仮想マシンを指定するには、SKUで指定する形になるようです。

仮想マシンの場合は、OSを指定する場合、以下の項目で指定されます。

    • PublisherName 発行者
    • Offer OSのタイプ(WindowsかCentOSか)
    • Skus OSのバージョン
    • version 詳細バージョン(大体latestかと思います。)

実際に見るのが一番わかりやすいので、Windows Serverの場合とCentOSの場合について確認してみました。(結果は省略してます。)

まずはWindows Serverの場合です。gsというのもあるのですが、2019-datacenter-gensecondを選ぶようです。

PS> Get-AzVMImageSku -Location ‘Japan East’ -PublisherName MicrosoftWindowsServer -Offer WindowsServer |ft Skus,Offer,PublisherName,Version

Skus Offer PublisherName Version
—- —– ————- ——-
2019-Datacenter WindowsServer MicrosoftWindowsServer
2019-datacenter-gensecond WindowsServer MicrosoftWindowsServer
2019-datacenter-gs WindowsServer MicrosoftWindowsServer
2019-Datacenter-smalldisk WindowsServer MicrosoftWindowsServer
2019-datacenter-smalldisk-g2 WindowsServer MicrosoftWindowsServer
2019-Datacenter-with-Containers WindowsServer MicrosoftWindowsServer
2019-datacenter-with-containers-g2 WindowsServer MicrosoftWindowsServer
2019-datacenter-with-containers-gs WindowsServer MicrosoftWindowsServer

次にCent OSの場合ですCentOSの場合は、-gen2がついているのが第2世代の仮想マシンに対応するようです。 (結果は省略してます。)

PS> Get-AzVMImageSku -Location ‘Japan East’ -PublisherName OpenLogic -Offer CentOS |ft Skus,Offer,PublisherName,Version

Skus Offer PublisherName Version
—- —– ————- ——-
7.4 CentOS OpenLogic
7.5 CentOS OpenLogic
7.6 CentOS OpenLogic
7.7 CentOS OpenLogic
7_4 CentOS OpenLogic
7_4-gen2 CentOS OpenLogic
7_5-gen2 CentOS OpenLogic
7_6-gen2 CentOS OpenLogic
7_7-gen2 CentOS OpenLogic
7_8 CentOS OpenLogic
7_8-gen2 CentOS OpenLogic
8.0 CentOS OpenLogic
8_0-gen2 CentOS OpenLogic
8_1 CentOS OpenLogic
8_1-gen2 CentOS OpenLogic

この結果を踏まえて、ARMテンプレートで第2世代の仮想マシンを指定する場合はこんな感じになりました。

#Windows Serverの場合

“imageReference”: {
“publisher”: “MicrosoftWindowsServer”,
“offer”: “WindowsServer”,
“sku”: “2019-datacenter-gensecond”,
“version”: “latest”

#Cent OSの場合

“imageReference”: {
“publisher”: “OpenLogic”,
“offer”: “CentOS”,
“sku”: “8_1-gen2”,
“version”: “latest”

注意点ですが、第2世代の仮想マシンと第1世代の仮想マシンは相互に変換する事が2020年6月時点ではできません。基本的には第2世代で作った方が良いように思えるのですが、注意はしておいた方が良いと思われます。

ARMテンプレートを使ったAzure VMのデプロイについてはこちらの記事に記載しております。

テンプレート機能を使ってAzure VMをデプロイする

Azure VMの稼働ステータスやIPアドレス、ディスク情報を纏めて取得

 

Azure Portal上で、Virtual Machineの設定を確認しようとすると、ディスクの情報はディスクのメニューを開き、ネットワークインターフェースの情報は、ネットワークインターフェースのメニューを開きという事で少し面倒だったりします。

これをまとめて見れないかなぁという事で、Power Shellで情報取得する事に挑戦してみました。

作成にあたっては以下の各コマンド(Get-AzDisk、Get-AzNetworkInterface)ガイドをサイトを参考に進めました。

https://docs.microsoft.com/en-us/powershell/module/az.network/get-aznetworkinterface?view=azps-3.8.0

https://docs.microsoft.com/en-us/powershell/module/az.compute/get-azdisk?view=azps-3.8.0

今回作成したものは GitHub上に公開しています。

https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/VM-Status-Get-20200424

1.Azure VMに関して使って取得する情報

今回は指定したVMについて稼働状況、DISK情報、ネットワークインターフェースの下記情報を取得してみました。

    • Virtual Machine名
    • PowerState
    • VMSize
    • DISK名
    • DISKサイズ
    • DSIKのTier
    • Network Interface名
    • Private IP Address
    • 静的IP or 動的IP

2.Azure VMの情報を取得するPower Shell

Get-AzVM でVirtual Machineの情報を取得し、その中にあるVM固有のIDを特定します。

Virtual Machineにディスクがアタッチされている場合は、このIDがディスクの情報に含まれます。そこで合致するディスクのディスク情報をGet-AzDiskで取得します。同じく ネットワークインターフェース情報はGet-AzNetworkInterfaceで取得しています。

また、Get-AzVMに-Statusオプションがないと、VMの稼働状況が取得出来ません。

一方で、-StatusオプションをつけるとVmSizeが取得出来ません。

その為、VmSizeの方は@{n=”VMSize”; e={$vm.HardwareProfile.VmSize}}とし、-Status無しの結果から値を取得しています。

#VMの情報を取得するPowerShell(基本編)

#VM名を指定して、IF名、IP、DISK名、サイズ、SKU等を取得

#パラメータ指定
param (
    [String] [Parameter(Mandatory=$true)] $VMName
    )

# VM Status 取得

$vm = Get-AzVM -name $VMName

# サブスクリプションID指定

$SubscriptionId =“サブスクリプションID”
Select-AzSubscription -SubscriptionId $SubscriptionId 

# VMの各情報を取得

Get-AzVm -ResourceGroupName $vm.ResourceGroupName -Name $vm.Name -Status `
| select-Object Name,@{n=”Status”; e={$_.Statuses[1].Code}},@{n=”VMSize”; e={$vm.HardwareProfile.VmSize}}
& `
Get-AzDisk -ResourceGroupName $vm.ResourceGroupName`
| Where { $_.ManagedBy -contains $VM.id }`
| Select-Object @{n=”DiskNmae”; e={$_.Name}},DiskSizeGB,@{n=”Tier”; e={$_.sku.Name}}
& `
Get-AzNetworkInterface `
| Where { $_.VirtualMachine.id -contains $VM.id}`
| Select-Object @{n=”NWInterFaceNmae”; e={$_.Name}},`
@{n=”PrivateIP”; e={$_.IpConfigurations.PrivateIpAddress}},`
@{n=”PrivateIpAllocation”; e={$_.IpConfigurations.PrivateIpAllocationMethod}}

※なぜか、サブスクリプションIDの指定をしないと情報取得出来なかったので、今回は、Select-AzSubscriptionでサブスクリプションIDの指定を行っています。

3.Azure VMの稼働ステータスやIPアドレス、ディスクの情報の取得結果

実際にPower Shellを実行してみると、以下のような結果が得られます。(今回はディスクを2本ついたVirtual Machineなので2つ表示されます。)

PS> c:\PowerShell\VMの情報を取得する(基本編)(公開用).ps1 -VMname VM名

Name : VM名
Status : PowerState/running
VMSize : Standard_B1ms


DiskNmae : OSディスク名
DiskSizeGB : 30
Tier : Standard_LRS


DiskNmae : データDISK名
DiskSizeGB : 30
Tier : StandardSSD_LRS


NWInterFaceNmae : ネットワークインターフェース名
PrivateIP : PrivateIP
PrivateIpAllocation : Static

※作成にあたって、躓くことがあり、マイクロソフトサポート様に大変貴重なアドバイスをいただいております。有難うございました。

Azure VMの削除と一緒にネットワークインターフェースやディスクを削除するのはこちらで試しております。

Azure VMと一緒にディスクやNICも纏めて削除

Azure VM Bシリーズ CPUクレジットの確認と監視

 

Azure VMのシリーズの1つに、Bシリーズがあります。

Bシリーズは普段使わないCPUの使用量を貯めておいて、負荷が高くなった時にその貯めたCPU使用量を使うシリーズです。

Dシリーズと比較して2分の1位の使用料金で使える為、普段からCPUを使わないようなサーバに向いているシリーズになります。

Azure VM Bシリーズの詳細については下記マイクロソフト様のサイトを確認してください。

  • Virtual Machineシリーズ

https://azure.microsoft.com/ja-jp/pricing/details/virtual-machines/series/

  • Bシリーズ詳細

https://docs.microsoft.com/ja-jp/azure/virtual-machines/sizes-b-series-burstable

このAzure VMのBシリーズですが、負荷が高い状態が継続するとCPUの使用量(クレジット)が使い果たされている為性能が発揮されないという可能性もあります。

今回はCPUクレジット残量確認方法を試し、Azure Monitorの設定項目確認までを行ってみました。

1 .Azure VM BシリーズのCPUクレジット残(CPU Credits Remaining)をAzure Portal上で確認する

Azure Portal上のメトリックで確認ができます。

仮想マシンのメニューの監視にあるメトリックという項目を選択します。

このメトリックを選択すると、下記のように項目を選ぶとグラフが表示されます。この項目でCPU Credits Remainingを選択すると過去のクレジット残の履歴確認ができます。

CPU使用率が高く使い果たしているような状況だと0になります。

なお、CPU Credits Consumedを使う事により、CPUクレジットがどれだけ溜まっているのか確認できます。

.BシリーズのCPUクレジット残(CPU Credits Remaining)をPower Shellで確認する

Power ShellでもCPU Credits Remainingが確認できます。今回は直近の値を確認しています。

サブスクリプションIDやリソースグループ名は環境に合わせて設定します。Power Shell実行時に取得対象のVM名を指定します。

Get-Dateで取得した日付フォーマットそのままだとエラーになるので、フォーマットを変更しています。

StartTime等を変更することにより、過去の値も取得可能です。

#CPU Credits Remaining

param (
    [String] [Parameter(Mandatory=$true)]  $VMname
    )

$subscriptionID =“サブスクリプションID”
$RGName = “リソースグループ名”

$startTime = (Get-Date).AddMinutes(-3) | Get-Date  -Format ‘yyyy-MM-dd THH:mm’
$endTime = Get-Date -Format “yyyy-MM-dd THH:mm”
 
# 注意-ResourceIdの行は折り返していますが、実際には1行です。GitHubの方を参考にして下さい
# https://github.com/Tama-negi/Li-akb-branch-office/tree/PowerShell_Azure/Azure_PowerShell

(Get-AzMetric `
    -ResourceId “/subscriptions/$subscriptionID/resourceGroups/$RGName/providers/Microsoft.Compute
/virtualMachines/$VMname” `
    -TimeGrain 00:01:00 `
    -AggregationType “Average” `
    -StartTime $startTime `
    -EndTime $endTime `
    -MetricName “CPU Credits Remaining” `
    -DetailedOutput).Data `
| Select-Object TimeStamp,Average
 

実行すると以下のように結果が得られます。

TimeStamp Average

——— ——-

2020/04/16 10:20:00 316.12
2020/04/16 10:21:00 316.12
2020/04/16 10:22:00 316.12
 

※MetricNameの値を、CPU Credits Consumedに変更することにより、1分間にどれだけクレジットがたまっているかの確認が可能です。

.Azure MonitorでAzure VM Bシリーズの残CPUクレジット(CPU Credits Remaining)を監視

Azure MonitorのVirtual Machineメトリック監視にCPU Credits Remainingの項目があります。

スコープにAzure VMを指定します。

条件の選択でCPU Credits Remainingを選択するとシグナルロジックの構成が表示されます。

下記画面のように残量が次の値より小さいと指定すると、CPU Credits Remainingが少なくなった場合にアラートを上げる事も可能です。 

このアラートが頻発するようだと、CPUのリソースを使っているという事になるので、Dシリーズを選択した方が良いと思われます。

Azure Virtual MachineのManaged Disksサイズを変更する(FIOでIOPSを測定もする)

 

Azure VM のデータディスクの拡張を試してみました。
また、Managed DiskはサイズによってIOPSが違います。

今回は併せてManaged Diskのサイズ拡張による、IOPSの変化をFIOで測定してみました。

Azure VMでのデータディスク拡張作業は、下記条件で実施しています。

    • OSはCent OS 7.7
    • Managed DISKはPremium SSDを利用
    • 32GB→512GBに拡張
    • データディスクは/dev/sdc
    • データディスクは/mnt/diskにマウント済みである。
    • IOPSはFIOで測定

※念のため、必ずバックアップを取得したうえで作業を実施して下さい。

なお、データディスクの追加に関しては以下の記事に纏めております。

Azure VM(CentOS 7)にデータディスクを追加する

1 .Azure VMのデータディスクサイズ変更

データディスクのサイズ変更を、Azure Portal上で実施します。
作業はVirtual Machine 停止させて実施します。
データディスクのアタッチ、デタッチはオンラインでも可能ですが、アタッチ済みのディスクの構成変更は、仮想マシンを停止する必要があります。(一度デタッチ後に構成変更して再アタッチという手も。。。)
対象のVirtual Machineを選択後、SettingsにあるDisksをクリックします。以下の画面が表示されますので、拡張するデータディスクをクリックします。

Disksの画面に移動するので、構成をクリックします。以下の画面が表示されますので、アカウントの種類やサイズの項目を変更します。今回はアカウントの種類をPremium SSDサイズを512GBとし保存をクリックします。

保存が完了したら、Virtual Machineを起動します。

2. Cent OSでデータディスクのボリューム拡張設定

Virtual Machineを起動した段階では、Azure側で実施したディスクの拡張はデバイスとしては認識されていますが、ボリュームとしては拡張されていない状態です。

dfのコマンド結果を見ると、拡張前の32Gしか認識されていない事が分かります。

[ユーザー名@ホスト名 tmp]$ fdisk -l /dev/sdc[

Disk /dev/sdc: 549.8 GB, 549755813888 bytes, 1073741824 sectors

[ユーザー名@ホスト名 tmp]$ df -h | grep /dev/sdc

/dev/sdc1 32G 6.1G 24G 21% /mnt/disk

ボリュームのサイズ変更を、fdiskコマンド使って行います。

[ユーザー名@ホスト名 tmp]$ fdisk /dev/sdc

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

コマンド (m でヘルプ): p

Disk /dev/sdc: 549.8 GB, 549755813888 bytes, 1073741824 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O サイズ (最小 / 推奨): 4096 バイト / 4096 バイト
Disk label type: dos
ディスク識別子: 0x00140f2e

デバイス ブート 始点 終点 ブロック Id システム
/dev/sdc1 2048 67108863 33553408 83 Linux

コマンド (m でヘルプ): d
Selected partition 1
Partition 1 is deleted

コマンド (m でヘルプ): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
パーティション番号 (1-4, default 1): 1
最初 sector (2048-1073741823, 初期値 2048):”入力せずにEnter”
初期値 2048 を使います
Last sector, +sectors or +size{K,M,G} (2048-1073741823, 初期値 1073741823):”入力せずにEnter”
初期値 1073741823 を使います
Partition 1 of type Linux and of size 512 GiB is set

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。

WARNING: Re-reading the partition table failed with error 16: デバイスもしくはリソースがビジー状態です.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
ディスクを同期しています。

以上の操作が完了したら、パーティションを拡張します。これで作業完了です。

[ユーザー名@ホスト名 tmp]$ resize2fs /dev/sdc1

確認してみると、データディスクのサイズが変わっているのがわかります。

[ユーザー名@ホスト名 tmp]$ df -h | grep /dev/sdc 

/dev/sdc1 504G 6.1G 477G 2% /mnt/disk

3.FIOでManaged DiskのIOPSを測定

FIOのセットアップはyumコマンド(epelは有効)でOKです。関連パッケージを含めてインストールされます。

[ユーザー名@ホスト名 tmp]$ yum -y install fio

FIOのコマンドは以下のサイトを参考にしています。

https://qiita.com/toshihirock/items/fa4d310115e6921ab0ac

実行してみると以下のような結果になりました。ランダムreadでもスペック通りのIOPSが出ています。シーケンシャルでもおおむね同じ数値が出ています。

#シーケンシャルwriteの場合
 write: IOPS=402, BW=1610KiB/s (1649kB/s)(15.0MiB/10154msec)
#シーケンシャルreadの場合
 read: IOPS=2347, BW=9391KiB/s (9617kB/s)(92.3MiB/10069msec)

#ランダムwriteの場合
 write: IOPS=395, BW=6332KiB/s (6484kB/s)(69.8MiB/11295msec)
#ランダムreadの場合
 read: IOPS=2337, BW=36.5MiB/s (38.3MB/s)(383MiB/10490msec)

なお、いくつかのパターンで試すと、”ほぼ”Managed Diskの指標通りになっている事がわかります。

#Standard HDD(32GB)の場合(シーケンシャルread)
 read: IOPS=562, BW=2251KiB/s (2305kB/s)(22.3MiB/10131msec)

#Standard HDD(32GB)の場合(シーケンシャルwrite)
  write: IOPS=152, BW=610KiB/s (625kB/s)(6296KiB/10316msec)

#Premium SSD(32GB)の場合(シーケンシャルread)
  read: IOPS=122, BW=488KiB/s (500kB/s)(5148KiB/10544msec)

#Premium SSD(32GB)の場合(シーケンシャルwrite)
  write: IOPS=122, BW=489KiB/s (500kB/s)(5388KiB/11028msec)

※Writeが遅いのですが、この原因は不明です。

 

Azure Virtual Machineを別テナントに移してみた

 

今回は、Azure VMをAzureの別テナントへ移行してみました。

実際に試行錯誤して実施してみたのですが、最終的には以下のような段取りになりました。

      • Azure VMのManaged Disksを別テナントのBlobストレージにコピーする
      • コピーしたファイルをManaged Disksに戻す
      • Managed DisksからVMを作成する

実施してみた所、Azure VMのManaged Disksを移行先のテナントのBLOBストレージにVHDファイルとして保管する必要があるようでした。移行先テナントでVHDファイルをManaged Disksに戻すことで仮想マシンを作成することで実現出来ました。

今回作業にあたっては、PowerShellを利用して実施してみました。

※なお、同じテナントの別サブスクリプションへは、Managed Disksのまま移行が可能です。

1 .Azure VMのManaged Disksを移行先テナントのBlobストレージにコピーする

まず事前に以下の準備をしておきます。

      • 移行先のテナントに、ストレージアカウントとBlobストレージのコンテナを準備しておく
      • 移行対象の仮想マシンを停止しておく。(Managed DisksにAzure VMをアタッチしていない場合はそのままで実行可能です。)

Managed Disksを一旦ローカルにダウンロードして、移行先のストレージアカウントにアップロードする事でも対応可能です。

ただ作業が面倒なので、以下のサイトを参考に、Managed Disksをダウンロードせずに、直接移行先のBlobストレージにコピーする方法を試してみました。

サイト記載のサンプルをAz化しています。

https://docs.microsoft.com/ja-jp/archive/blogs/jpaztech/export-managed-disks-to-vhd

Power Shell実行時には各テナントへのログイン画面が表示されます。適時ログインして下さい。

※サイト記載のサンプルをAz化しています。

#Managed Disk Copy PowerShell

# コピー元へのログイン
Login-AzAccount
Select-AzSubscription -SubscriptionId  “コピー元のサブスクリプション ID”

# コピー元のディスクパラメータ
$sourcergname = “コピー元リソースグループ名”
$diskname = “コピー対象のManagedDisk名”

# SAS URL の作成(有効時間を1時間にしています。タイムアウトになる場合は適時調整します。)
$mdiskURL = Grant-AzDiskAccess -ResourceGroupName $sourcergname -DiskName $diskname -Access Read -DurationInSecond 3600

# コピー先の情報
# コピー先テナントにログイン

Login-AzAccount
Select-AzSubscription -SubscriptionId  “コピー先のサブスクリプション ID”

# コピー先の各種パラメーター
$targetrgname = “コピー先リソースグループ名”
$storageacccountname = “コピー先ストレージアカウント名”
$countainername = “コピー先コンテナ名”

$storageacccountkey = Get-AzStorageAccountKey -ResourceGroupName $targetrgname -Name $storageacccountname
$storagectx = New-AzStorageContext -StorageAccountName $storageacccountname -StorageAccountKey $storageacccountkey[0].Value
$targetcontainer = Get-AzStorageContainer -Name $countainername -Context $storagectx

$destdiskname = “コピー後のファイル名”
$sourceSASurl = $mdiskURL.AccessSAS

# コピー
$ops = Start-AzStorageBlobCopy -AbsoluteUri $sourceSASurl -DestBlob $destdiskname -DestContainer $targetcontainer.Name -DestContext $storagectx
Get-AzStorageBlobCopyState -Container $targetcontainer.Name -Blob $destdiskname -Context $storagectx -WaitForComplete

コマンドが完了したら、移行先のBlobストレージ内にファイルが生成されているの確認してください。生成されていたら作業は完了です。

.コピーされたVHDファイルをManaged Disksに変換する

コピーされたファイルをコピー先のテナントでManaged Disksに変換します。

以下のサイトを参考に戻すPower Shellを作ってみました。

https://docs.microsoft.com/ja-jp/archive/blogs/jpaztech/convertvhdtomanageddiskdeployvm

本Power Shellの重要な注意点ですが、OS Typeを指定しないと、変換自体は出来るのですが、後の作業で仮想マシン作成ボタンが押せない状態となります。これでドはまりしました。

Power Shell内で指定するVHDファイルのURLは、VHDファイルが保管されているBlobストレージにて確認します。

Storage ExplorerにてVHDファイルを選択します。右クリックするとプロパティという項目が表示されますので選択します。下記画面が表示されますので、Uriに表示されている内容をコピーします、Power Shell実行時に指定するVHDファイルのURLになります。

実際に実行するPower Shellは下記の通りになりました。

# VHD→ManagedDisk PowerShell

#Select Subscription
$SubscriptionId =“コピー先のサブスクリプションID”
Select-AzSubscription -SubscriptionId $SubscriptionId

#Parameter
$ResourceGroupName = “ManagedDiskのRG名”
$location = “ManagedDiskのロケーション”
$DiskName = “作成するManagedDisk名”
$vhdUri = “コピーしたファイルのURL”
$AccountType =“ストレージアカウントのType (ex; Standard_LRS)”<
$OsType = ”ManagedDiskのOS Type (ex; Linux)”

#Disk Config
$DiskConfig = New-AzDiskConfig `
-AccountType $AccountType `
-Location $Location `
-CreateOption Import `
-SourceUri $vhdUri `
-OsType $OsType

#VHD → Managed Disk
New-AzDisk `
-DiskName $DiskName `
-Disk $DiskConfig `
-ResourceGroupName $ResourceGroupName

※複数のサブスクリプションにログインした状態での作業となるため、作業ミス防止用に明示的にサブスクリプションを指定を追加しています。

Power Shellを実行し完了すると、新たにManaged Disksができています。確認はディスクのメニューでできます。

変換が終了したManaged Disksを選択すると、VMの作成というボタンが表示されてますのでクリックします。そうすると仮想マシンの作成画面に遷移しますので、そのまま作成を進めればAzure VMが作成できます。

※オペレーティングシステムが空白の場合はVMの作成ボタンがクリックできません。

.移行後のAzure VMで作業が必要そうです

なお、OMSエージェントを含む、拡張機能は接続先のテナントが異なる為、再度設定が必要になります。この編でドはまりする事もあるので注意が必要になります。

別件にはなりますが参考程度で見て頂ければと。(結果、関連パッケージのアンインストール、インストールを実施しました。)

Log AnalyticsでLogやリソース情報が取得出来なくなった時にやった事

 

 

SQL Serverのデータディスクサイズを指定してデプロイ

 

Azure Portalを使ってMarket Placeから直接Windows SQL Serverをデプロイするとデータディスクが1TBで作成されてしまいます。

後でデータディスクを削除、追加して修正する事も可能なのですが、デプロイ時からディスクサイズを指定した方が便利かと思われます。

そこでデプロイ時にデータディスクのサイズを指定出来るように、ARMテンプレートを作成してみました。

Cent OSの場合のテンプレート作成、デプロイはこちらに記載しております。

テンプレート機能woAzure VMをデプロイする

1 .Windows SQL Serverをデプロイする為のJsonファイルを作成する。

基本的なVM設定としています。

データディスクのサイズは、diskSizeGBの値で指定します。(今回は128GBで設定しています。)

まず、最初にWindows SQL ServerのVMイメージ(SKU)を確認します。

#Image List get

$location=“japaneast”

#pubName Get
#Get-AzVMImagePublisher -Location $location

$pubName=“MicrosoftSQLServer”

#offer Name Get
#Get-AzVMImageOffer -Location $location -Publisher $pubName

$offerName=“SQL2008R2SP3-WS2008R2SP1”
Get-AzVMImageSku -Location $location -Publisher $pubName -Offer $offerName

確認したSKUを指定して、Windows SQL ServerのARMテンプレートを作ってみるとこんな感じになりました。(今回はSQL Server 2008を選択しています。)

{
“$schema”: “https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#”,
“contentVersion”: “1.0.0.0”,
“variables”: {
  “location”: “japaneast”,

  “vmName”: “VM名”,
  “vmSize”: “Standard_B2s”,

  “adminUsername”: “User Name”,
  “adminPassword”: “Password”,

  “publisher”: “MicrosoftSQLServer”,
  “offer”: “SQL2008R2SP3-WS2008R2SP1”,
  “sku”: “Standard”,

  “nicName”: “[concat(variables(‘vmName’),’_nic’)]”,
  “addressPrefix”: “XXX.XXX.XXX.XXX/XX”,
  “subnetName”: “Subnet Name”,
  “subnetPrefix”: “XXX.XXX.XXX.XXX/XX”,
  “virtualNetworkName”: “VNET Name”,
  “subnetRef”: “[resourceId(‘Microsoft.Network/virtualNetworks/subnets’, variables(‘virtualNetworkName’), variables(‘subnetName’))]”,

  “diskName”: “[concat(variables(‘vmName’),’_os_disk’)]”,
  “DatadiskName”: “[concat(variables(‘vmName’),’_Data_disk’)]”,
  “storageAccountType”: “Standard_LRS”,

  “storageAccountName”: “Storage Account Name”

},
 “resources”: [
 {
  “type”: “Microsoft.Network/virtualNetworks”,
  “apiVersion”: “2018-11-01”,
  “name”: “[variables(‘virtualNetworkName’)]”,
  “location”: “[variables(‘location’)]”,
  “properties”: {
  “addressSpace”: {
  “addressPrefixes”: [
  “[variables(‘addressPrefix’)]”
  ]
},
 “subnets”: [
 {
  ”name”: “[variables(‘subnetName’)]”,
  ”properties”: {
  ”addressPrefix”: “[variables(‘subnetPrefix’)]”
    }
   }
  ]
 }
},
{
 ”type”: “Microsoft.Network/networkInterfaces”,
 ”apiVersion”: “2018-11-01”,
 ”name”: “[variables(‘nicName’)]”,
 ”location”: “[variables(‘location’)]”,
 ”dependsOn”: [
 ”[resourceId(‘Microsoft.Network/virtualNetworks/’, variables(‘virtualNetworkName’))]”
],
“properties”: {
 ”ipConfigurations”: [
 {
 ”name”: “ipconfig1”,
 ”properties”: {
 ”privateIPAllocationMethod”: “Dynamic”,
 ”subnet”: {
 ”id”: “[variables(‘subnetRef’)]”
     }
    }
   }
  ]
 }
},
{
 ”type”: “Microsoft.Compute/virtualMachines”,
 ”apiVersion”: “2018-10-01”,
 ”name”: “[variables(‘vmName’)]”,
 ”location”: “[variables(‘location’)]”,
 ”dependsOn”: [
 ”[resourceId(‘Microsoft.Network/networkInterfaces/’, variables(‘nicName’))]”
 ],
 ”properties”: {
 ”hardwareProfile”: {
 ”vmSize”: “[variables(‘vmSize’)]”
 },
 ”osProfile”: {
 ”computerName”: “[variables(‘vmName’)]”,
 ”adminUsername”: “[variables(‘adminUsername’)]”,
 ”adminPassword”: “[variables(‘adminPassword’)]”
 },
 ”storageProfile”: {
 ”imageReference”: {
 ”publisher”: “[variables(‘publisher’)]”,
 ”offer”: “[variables(‘offer’)]”,
 ”sku”: “[variables(‘sku’)]”,
 ”version”: “latest”
 },
 ”osDisk”: {
 ”createOption”: “FromImage”,
 ”name”: “[variables(‘diskname’)]”,
 ”managedDisk”: {
 ”storageAccountType”: “[variables(‘storageAccountType’)]”
 }
  },
 ”dataDisks”: [
 {
 ”lun”: 0,
 ”name”: “[variables(‘datadiskname’)]”,

 ”createOption”: “Empty”,
 ”managedDisk”: {
  ”storageAccountType”: “[variables(‘storageAccountType’)]”
  },
  ”diskSizeGB”: 128

  }
 ]
},
 ”networkProfile”: {
 ”networkInterfaces”: [
 {
 ”id”: “[resourceId(‘Microsoft.Network/networkInterfaces’,variables(‘nicName’))]”
 }
 ]
},
 ”diagnosticsProfile”: {
 ”bootDiagnostics”: {
 ”enabled”: true,
 ”storageUri”: “[concat(‘https://’, variables(‘storageAccountName’), ‘.blob.core.windows.net’)]”
       }
     }
   }
  }
 ]

}

2.Windows SQL Serverをテンプレートを使ってデプロイする

テンプレート機能にARMテンプレートを登録します。以下の内容が表示されますので、名前と説明を入力しOKを表示します。

テンプレート画面が表示されますので、デフォルト表示されている内容を削除し、1)で作成したテンプレートをペーストしOKボタンをクリックします。 保存が完了したテンプレートを選択すると以下の画面が表示されますので、リソースグループ名を登録、使用条件に同意し、購入ボタンをクリックします。

デプロイが完了したら、リソースに移動して確認します。無事完成しているかと思います。

3.登録されているテンプレートをPower Shellから呼び出せない(2019年12月現在)

2019年12月時点では、テンプレート機能に登録したテンプレートを外部から呼び出すことはできないそうです。Azure Portalからのデプロイしかできないそうです。

Power Shell等からARMテンプレートを使ったデプロイを行うには、ローカルに保存したファイルやGitHubを指定してのデプロイとなるようです。

Power ShellでAzure VM起動/停止と一緒にディスクタイプを変更する

 

Azure Managed Disksですが、Azure VMの起動停止状態に関わらず使用料金が発生します。

またAccount Type(Premium SSD、Standard HDD)により使用料金が異なります。
Azure VMを停止している時に、Premium SSDを利用する事はコストの無駄になります。Azure VM停止時にPremiumSSD等からStandard HDDに戻す事等で、Azureの利用料金を抑えることができます。

今回は、Azure VM起動時や停止時に、Managed DiskのAccount Typeを変更するPower Shellを作ってみました。

作成にあたっては、以下のサイトを参考にしています。

https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/convert-disk-storage

Azure VMの起動停止をRunbook使って実施する記事やAzure VMの停止忘れ対応に関する記事も併せて参考にして頂ければと。

Azure AutomationのRunbookで実行時間制限

Azure VMの割り当て解除、停止忘れ対策

1 .Azure VM起動と共にディスクタイプを変更するPower Shell(HDD→SSD) 

Azure VMの起動に併せて、Azure VMに接続されているすべてのManaged DiskをStandard SSDとするようにしてみました。
Power Shell実行時に、VM名を変数として指定し、実行するようにしています。(VM IDを2回指定してますが、気にしないでください。)

#Vm Start (Changed Disk Type)

#VM名を固定にする場合は、下記の通り指定します。(param部分はコメントアウト)
#$vmName =”VM Name”

param (
            [string] [Parameter(Mandatory=$true)] $vmName
            )

$resourceGroupName =“リソースグループ名”
$storageType =“StandardSSD_LRS”

$VM = Get-AzVM -Name $vmName -resourceGroupName $resourceGroupName
$vmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $resourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
 {
  if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $storageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $resourceGroupName `
  -DiskName $disk.Name
  }
}

Start-AzVM -ResourceGroupName $resourceGroupName -Name $vmName

起動対象のVM名を指定し、Power Shell実行します。(今回はPowerShell名を、VM_Start_SelectDiskType.ps1としています。)

c:\VM_Start_SelectDiskType.ps1 -vmName VM Name

.Azure VM停止と共にディスクタイプを変更するPower Shell(SSD→HDD

Azure VM停止に併せて、VMに接続されているManaged DiskをすべてStandard HDDにしています。Power Shell実行時に、VM名を変数として指定し、実行するようにしています。

#Vm Stop (Changed Disk Type)

#VM名を固定にする場合は、下記の通り指定します。(param部分はコメントアウト)
#$vmName =”VM Name”

param (
[string] [Parameter(Mandatory=$true)] $vmName
   )

  $resourceGroupName =“リソースグループ名”
  $storageType =“Standard_LRS”

 Stop-AzVM -ResourceGroupName $resourceGroupName -Name $vmName -Force

 $VM = Get-AzVM -Name $vmName -resourceGroupName $resourceGroupName
 $vmDisks = Get-AzDisk | Where { $_.ResourceGroupName -eq $resourceGroupName } | Where { $_.ManagedBy -eq $VM.id }

foreach ($disk in $vmDisks)
{
 if ($disk.ManagedBy -eq $vm.Id)
  {
  $diskUpdateConfig = New-AzDiskUpdateConfig –AccountType $storageType
  Update-AzDisk -DiskUpdate $diskUpdateConfig -ResourceGroupName $resourceGroupName `
  -DiskName $disk.Name

 }
}

停止対象のVM名を指定し、Power Shell実行します。(今回はPowerShell名を、VM_Stop_SelectDiskType.ps1としています。)

c:\VM_Stop_SelectDiskType.ps1 -vmName VM Name

3 .Managed DisksのAccount Typeを確認する

Power ShellでManaged DiskのAccount Typeを表示する事ができます。変更後の確認に使えます。

Get-AzDisk -resourceGroupName  ”リソースグループ名” |ft Name,@{Name=”Name”; Expression={$_.Sku.Name}}