2017年6月23日金曜日

Azureポイント対サイトVPN用証明書のハッシュ関数

Microsoft Azureでは「ポイント対サイトVPN」を構成することで、特定のPCからAzureの仮想ネットワークにVPN接続を行うことができます。

この時使われるのが「SSTP (Secure Socket Tunneling Protocol)」で、HTTPSを使った接続を行います。

Microsoft AzureによるITインフラの拡張」では、ポイント対サイトVPNを構成する演習を行いますが、先日接続ができませんでした。

どうやら、使った証明書に問題があったようです。

演習で使う証明書は、ハッシュ関数としてSHA-1を使っています。しかし、SHA-1は理論的な脆弱性が指摘されていました。2017年2月には実際の攻撃実験も成功しています。

しかし、演習ではセキュリティリスクのあるSHA-1を使い続けていました。演習で使う仮想マシンや仮想ネットワークはその日中に削除しますし、仮想マシンにはサンプルのWebサイトしか存在しないため、問題にはならないと考えていたからです。

しかし、Azure側がSHA-1の受け入れを停止したようです。

この問題を解決するには、SHA-2などSHA-1よりも強力なハッシュ関数を使って証明書の再作成を行います。

テキストでは、マイクロソフトがWindows SDKとともに配布しているmakecert.exeを使った例を紹介してます。そこで指定している「sha1」というパラメーターを「sha256」に変更してください。

【自己署名ルート証明書】
makecert -sky exchange -r -n "CN=G20K-Root" -pe -a sha256 -len 2048 -ss My "C:\G20K-Root.cer"

【クライアント証明書】
makecert -n "CN=G20K-Client" -pe -sky exchange -m 96 -ss My -in "G20K-Root" -is my -a sha256

自己署名証明書は、PowerShellの「New-SelfSignedCertificate」でも構成できます。こちらの方が少し複雑なように見えますが、Windows SDKのインストールが不要なので、むしろ簡単かもしれません。

詳しくは「PowerShell を使用したポイント対サイト接続の証明書の生成とエクスポート」をお読みください。

2017年6月7日水曜日

仮想マシンの利用料金の試算(AWS、Azure、Bluemix)【追記】さくらインターネットの場合

パブリッククラウドで最も高価なサービスは、やはり仮想マシンでしょう。

クラウド各社の仮想マシン(またはベアメタルサーバー)の利用料金を試算してみました。Azureは1分単位、AWSやBluemix Infrastructureは1時間単位の課金ですが、今回は比較を簡単にするため1ヶ月の課金にそろえました。

AWSはいつも「安い」と言われますが、安いのはネットワークとストレージであって、仮想マシンはそれほど安くないことが分かります。ただし、仮想マシンには豊富な割引オプションがあるため、運用によってはかなりコストを削減できます。

逆に「高い」と言われるBluemix Infrastructureが案外安くなっています。Bluemix Infrastructureが高価なのはネットワーク機器などのアプライアンス製品なので、単純にサーバーを構築するだけだったらそれほど高価ではないことが分かります。

ただし、Bluemix Infrastructureは可用性に関する考え方が違うので、サービスレベルを他社と同列に扱うことはできません。


【仮想マシン要件】

  • サーバー…4コア、8GBメモリ
  • ディスク…128GBシステムディスク + 1TBデータディスク (1,000 IOPS)
  • ネットワーク…月間500GBのアウトバウンド通信
  • データセンター…東京(東日本)
  • OS…Windows Server 2016 Standard (AzureはDatacenter)

【計算資料】

各社のサーバー性能は以下の通りです。ここでは、これらのパラメータを考慮せずに計算します。なお、AWSとAzureの性能あたりコストはほぼ同等というベンチマーク結果があります。


【AWSでの試算】

1ヶ月744時間として、以下の構成で$531/月、6万円/月くらいでしょうか。ただし、AWSには豊富な割引オプションがあり、仮想マシンは最大75%の割引があります。

なお、AWSの汎用SSDは10.000 IOPSを実現できるので、汎用SSDで計算しました。

  • サーバー: $324…c4.xlargeサイズ(4コア、7.5GBメモリ)
  • システムディスク: $15...汎用SSD($0.12/GB) × 128GB
  • データディスク: $122…汎用SSD($0.12/GB) × 1024GB
  • アウトバウンド通信:$70…0.14/GB×499GB(無料枠は1GB)

c4.xlargeサイズは16 ECUなので、コアあたり4 ECUとなります。Azureの場合はコアあたり210~250ACUなので、4×46=186ACUのCPUとほぼ同等の速度と考えられます。


【Azureでの試算】

1ヶ月744時間として、以下の構成で41,463円/月になります。Azureのハードディスクは500IOPSなので、2台構成のRAID-0で1,000IOPSを実現します。

  • サーバー: 33,087円…F4サイズ(4コア、8GBメモリ)
  • システムディスク: 300円...128GB管理ディスク(S10)
  • データディスク: 1,109円…512GB管理ディスク(S20)× 2
  • アウトバウンド通信:6,967円…14.08/GB×495GB(無料枠は5GB)

SSDにすると以下のようになり、58,222円に上がります。なお、SSDは高速なのでシングルディスクで構成しました。

  • サーバー: 33,087円…Fs4サイズ(4コア、8GBメモリ)
  • システムディスク: 2,312円...128GB管理ディスク(P10)
  • データディスク: 15,854円…1024GB管理ディスク(P30)
  • アウトバウンド通信:6,967円…14.08/GB×495GB(無料枠は5GB)

F/FSシリーズはコアあたり210~250ACUなので、c4.xlargeの186よりも少し速くなります。


【Bluemix Infrastructureでの試算:仮想マシン】

以下の構成で$299.02/月、34,000円くらいでしょうか。

  • サーバー:$68…4コア(2 GHz)パブリック仮想マシン
  • メモリ: $86…8GBメモリ
  • システムディスク: $4.52...100GB SATA
  • データディスク: $64…500GB SAN × 2
  • OS: $50…Windows Server 2016 Standard
  • パブリックIPアドレス: $4…4個
  • アウトバウンド通信:$22.5…$0.09/GB×250GB(仮想マシンの無料枠は250GB)


【Bluemix Infrastructureでの試算:ベアメタルサーバー】

以下の構成で$492/月、55,000円くらいでしょうか。

  • サーバー:$153…Intel Xeon E3-1270v3 4 コア(3.50 GHz)
  • メモリ: $86…8GBメモリ
  • システムディスク: $27...1TB SATA
  • データディスク: $186…960GB SSD(最小構成)
  • OS: $36…Windows Server 2016 Standard
  • パブリックIPアドレス: $4…4個
  • アウトバウンド通信: $0…月額課金ベアメタルサーバーは500GBまで無料


追記【さくらインターネットでの試算:ベアメタルサーバー】

では、ここでホスティング事業者として有名な「さくらインターネット」のサーバーで試算してみましょう。さくらインターネットでは仮想マシンやクラウドサービスも提供していますが、ここでは一般的なベアメタルサーバーで試算します。

  • サーバー:12,960円+初期費用27,000円…Xeon 4コア(3.4 GHz)
  • メモリ: 0円…8GBメモリ(基本サイズ)
  • ディスク:1,080円+初期費用59,400円 ..1TB SATA × 2
  • OS: 3,240円…Windows Server 2012 R2 Standard

以上の構成で、初期費用86,400円、月額利用料17,280円になります。

つまり、初月は10万円以上かかってしまいます。しかし、4ヶ月間の累計は155,520円となり、1ヶ月あたり38,880円になります。1年間だと累計293,760円、1ヶ月あたり24,480円で、クラウドよりはずっと安くなります。

「クラウドの仮想マシンは、連続稼働を前提にすると、それほど安くはない」という意味をお分かりいただけたかと思います。

2017年5月9日火曜日

Hyper-VまたはAzure上のドメインコントローラーでの時刻同期

以前、Hyper-V上のドメインコントローラーについて書きました(Hyper-V 仮想化環境での時刻同期)。

この時は「ドメインコントローラーについては、Hyper-Vを使ったホストとの同期を停止する」と紹介しています。根拠は、マイクロソフトの公開文書「仮想化ドメイン コントローラーの展開に関する考慮事項」です。

Microsoft Azureの仮想化基盤はHyper-Vなので、Azure上のドメインコントローラーについても同じことが言えるはずです。

しかし、Azureテクニカルサポート チームのブログ「Azure 仮想マシンの時刻同期の仕組み」では、ホスト同期を無効にする方法について触れつつも「基本的には、Azure に時刻同期を任せてしまう、という考えで、既定のままにしていただくことが便利です」とあります。

矛盾するようですが、以下のようなことではないかと想像します。

Hyper-V、つまりオンプレミス環境では複数の仮想化ホスト(物理マシン)の時刻同期がきちんと行われていない可能性があります。こうした状況でホスト同期を行うことはリスクが大きいため、ドメインコントローラー自身が持つNTP時刻同期を使う方が無難です。

しかし、Azure内にあるすべての物理マシンは時刻同期が正しく行われています。このような環境では、ホスト同期を優先した方がリスクが小さいと考えられます。

逆に言うと、すべてのHyper-Vホストが適切に時刻同期している環境であれば、ホスト同期を有効にしたままで問題ない(むしろ推奨される)と思われます。

2017年4月11日火曜日

Azure仮想マシン展開用のJSONファイル

Microsoft Azureの仮想マシンを一般化して再展開する場合は、JSON形式のフォーマットでパラメーターを与える必要があります。

このフォーマット、なかなか複雑なので苦労します。私が使っているものを公開しておきます。

なお、このファイルはマイクロソフトの安納さんのブログ記事「Azure Resource Manager で作成した仮想マシンをキャプチャーする」に掲載されたものを一部修正し、可用性セットの設定を追加したものです。

もっとも、現在は「管理ディスク(managed disk)」を使った仮想マシンであれば、GUIで簡単に取り込めるので、JSONファイルの出番もあまりないかもしれません。



{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",

    "parameters": {
      "osMasterImageUri": {
      "type": "string",
      "metadata": {
        "description": "マスターイメージのURI"
      }
    },
    "vmName": {
      "type": "string",
      "metadata": {
        "description": "仮想マシンの名前"
      }
    },
    "osType": {
      "type": "string",
      "allowedValues": [
        "Windows",
        "Linux"
      ],
      "defaultValue" :"Windows",
      "metadata": {
        "description": "OSのタイプ"
      }
    },
    "adminUserName": {
      "type": "string",
      "metadata": {
        "description": "管理者ユーザーID"
      }
    },
    "adminPassword": {
      "type": "securestring",
      "metadata": {
        "description": "管理者ユーザーIDのパスワード"
      }
    },
    "vmSize": {
      "type": "string",
      "allowedValues": [
        "Standard_D1",
        "Standard_D1_v2",
        "Standard_F1"
      ],
      "defaultValue" :"Standard_F1",
      "metadata": {
        "description": "仮想マシンのサイズ"
      }
    },
    "StorageAccountName": {
      "type": "string",
      "metadata": {
        "description": "ストレージアカウントの名前"
      }
    },
    "existingVirtualNetworkName": {
      "type": "string",
      "metadata": {
        "description": "仮想ネットワーク"
      }
    },
    "subnetName": {
      "type": "string",
      "metadata": {
        "description": "サブネット名"
      }
    },
    "availabilitySetName": {
      "type": "string",
      "metadata": {
        "description": "可用性セット名"
      }
    }
  },

  "variables": {
    "api-version": "2015-06-15",
    "location": "[resourceGroup().location]",
    "publicIPAddressType": "Dynamic",
    "vnetID": "[resourceId('Microsoft.Network/virtualNetworks', parameters('existingVirtualNetworkName'))]",
    "subnetRef": "[concat(variables('vnetID'),'/subnets/', parameters('subnetName'))]",
    "nicName": "[concat(parameters('vmName'),'-nic')]",
    "publicIPAddressName": "[concat(parameters('vmName'),'-pip')]",
    "osDiskVhdName": "[concat('http://',parameters('StorageAccountName'),'.blob.core.windows.net/vhds/',parameters('vmName'),'osDisk.vhd')]"
  },

  "resources": [
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/publicIPAddresses",
      "name": "[variables('publicIPAddressName')]",
      "location": "[variables('location')]",
      "properties": {
        "publicIPAllocationMethod": "[variables('publicIPAddressType')]"
      }
    },
    {
      "apiVersion": "[variables('api-version')]",
      "type": "Microsoft.Network/networkInterfaces",
      "name": "[variables('nicName')]",
      "location": "[variables('location')]",
      "dependsOn": [ "[concat('Microsoft.Network/publicIPAddresses/', variables('publicIPAddressName'))]" ],
      "properties": {
        "ipConfigurations": [
          {
            "name": "ipconfig1",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[resourceId('Microsoft.Network/publicIPAddresses',variables('publicIPAddressName'))]"
              },
              "subnet": {
                "id": "[variables('subnetRef')]"
              }
            }
          }
        ]
     }
  },
  {
    "apiVersion": "[variables('api-version')]",
    "type": "Microsoft.Compute/virtualMachines",
    "name": "[parameters('vmName')]",
    "location": "[variables('location')]",
    "dependsOn": [
      "[concat('Microsoft.Network/networkInterfaces/', variables('nicName'))]"
    ],
    "properties": {
      "hardwareProfile": {
        "vmSize": "[parameters('vmSize')]"
      },
      "osProfile": {
        "computername": "[parameters('vmName')]",
        "adminUsername": "[parameters('adminUsername')]",
        "adminPassword": "[parameters('adminPassword')]"
      },
      "storageProfile": {
        "osDisk": {
          "name": "[concat(parameters('vmName'),'-osDisk')]",
          "osType": "[parameters('osType')]",
          "caching": "ReadWrite",
          "createOption": "FromImage",
          "image": {
            "uri": "[parameters('osMasterImageUri')]"
          },
          "vhd": {
            "uri": "[variables('osDiskVhdName')]"
          }
        }
      },
      "networkProfile": {
        "networkInterfaces": [
          {
            "id": "[resourceId('Microsoft.Network/networkInterfaces',variables('nicName'))]"
          }
        ]
      },
      "availabilitySet": {
           "id": "[resourceId('Microsoft.Compute/availabilitySets', parameters('availabilitySetName'))]"
      }
    }
  }
  ]
}

今さら聞けない! Active Directory入門

2017年4月10日(月)に「今さら聞けない! Active Directory入門」というタイトルで無料セミナーを行ないました。

スライドは「今さら聞けない! Windows Server 2016 Active Directoryドメインサービス入門」として公開しています。

私が初めてActive Directoryに触ったのが1997年ですから20年経ったことになります。

今でも基本的な構造は全く変わっていないのは、当初の設計が良かったからでしょう。

もっとも、1997年当時は今と違うこともたくさんあって、ドキュメントには「Windows NTでは、ローカルグループとグローバルグループが分かりにくかったので、Active Directoryでは単に『グループにする』とありましたが、実際にはユニバーサルグループが追加されて、さらに複雑になっています(しかし、分かりやすくはなりました)。

DSA
▲Windows NT 5.0ベータ1での管理画面

2017年4月7日金曜日

クラウドコンピューティングの定義: rapidly provisioned and released

訳あって、改めてクラウドコンピューティングの定義を調べています。

米国商務の国立標準技術研究所(NIST)の定義は、WordファイルだったのがPDFになっていました。

The NIST Definition of Cloud Computing

この翻訳はいくつかあるのですが、最も有名なものが情報処理推進機構(IPA)のものでしょう。

NISTによるクラウドコンピューティングの定義

クラウドコンピューティングは、共用の構成可能なコンピューティングリソース(ネットワーク、サー バー、ストレージ、アプリケーション、サービス)の集積に、どこからでも、簡便に、必要に応じて、ネットワーク経由でアクセスすることを可能とするモデルであり、最小限の利用手続きまたはサービスプロバイダとのやりとりで速やかに割当てられ提供されるものである。

以前読んだものを少し違う、と思って調べたらAgile Catさんによる別の翻訳もありました。

とても重要な NIST のクラウド定義:対訳

クラウド・コンピューティングとは、コンフィグレーションが可能なコンピューティング・リソース(ネットワーク/サーバー/ストレージ/アプリケーション/サービス)で構成される共有層への、オン・デマンドのネットワーク・アクセスを可能にするための、利便性の高いモデルのことだ。そして、それらのリソースは、最小の管理手順もしくは、サービス・プロバイダーとのやりとりにより、迅速に供給され、また、解消されるものとなる。

太字部分の原文はこうなっています。

rapidly provisioned and released

一般的な「release」の意味は「解放する」でしょう。スポーツフィッシングでよくある「catch and release」のreleaseです。

クラウドコンピューティングで「(利用者が)仮想マシンをリリースする」と言えば「仮想マシンを物理的な結びつきから解放する」「削除する」の意味になります。

一方で、releaseには「提供」の意味もあります。通常は「出版」の意味で使いますが、IT分野では「製品がリリースされる」のような使い方をします。

クラウドコンピューティングで「(クラウド事業者が)新しい仮想マシンをリリースする」と言えば「社内で準備していたものが、一般提供(社内だけのものから一般解放)された」となり、「高性能な仮想マシンを使う準備ができた」になります。

このように、誰が主体かによってまるで違う意味になってしまいます。

さて、本当はどうなんでしょうね。

クラウドでは「すぐに確保する」ことと同じくらい「すぐに(追加費用なしで)解放する」ことが大事なので、「解消」説を採用したいと思います。

そういえば、CRMを提供しているクラウドサービスの会社「Salesforce」の方が、何かの講演で言ってました。

Salesforceの顧客満足度はとても高い。
なぜなら「不満のある人はすぐに解約する」。

半ば冗談のようでしたが、これは非常に大事なことだと思います。

DSC00409
▲我が家のSurface RT、不要になったけどなかなか捨てられない

2017年3月31日金曜日

今さら聞けない! Microsoft Azure 仮想マシン入門

2017年3月30日(木)「今さら聞けない! Microsoft Azure 仮想マシン入門」というタイトルで無料セミナーを開催しました。

内容は、「管理ディスク(Managed Disk)」を使った仮想マシン展開とテンプレート作成の方法で、比較的新しいお話ができたのではないかと思います。

クラシックモデルでは容易だった仮想マシンイメージの作成が、リソースマネージャーになるとJSONファイルを扱ったり、リソースエクスプローラーを使ったり、結構面倒だったのですが、管理ディスクを使うことでクラシックモデル並みに簡単になりました。

管理ディスクの本来の意味は、「ストレージアカウントの管理からの開放」ですが、簡単にテンプレートが作れるようになったことも大きいと思います。

当日使用したスライドを公開してもらったので参考にしてください。

スライドシェア: 今さら聞けない! Microsoft Azure 仮想マシン入門

02-DSC03764 (1024x684)
▲写真と本文は関係ありません