Azure VM 作成時に Managed Disks のみ利用可能に強制する

#概要
過去に[「Azure Storage アカウント キーの漏洩対策」](http://qiita.com/Aida1971/items/37051e63ba7702f28481)という記事を書きました。今回はそれに関連して、Azure 仮想マシン作成時に [Managed Disks](https://azure.microsoft.com/ja-jp/services/managed-disks/) のみ利用を許可し、Azure Storage を利用させないという制約の実施方法をご紹介します。

#Managed Disks(管理ディスク) と Unmanaged Disks（従来型ディスク）
管理ディスク (Managed Disks) は、従来型ディスク (Unmanaged Disks) と違い、ユーザーは仮想マシンの VHD (Mangaed Disks) の保管場所として Azure Storage アカウントを作成する必要がありません。このためアカウントキーの漏洩を心配することなく 仮想マシンの VHD 管理が行えます。

参考資料：[Azure Managed Disk のまとめ](http://qiita.com/tsubasaxZZZ/items/7c0a15ce76d0b4d0b83f)

#リソース ポリシーとロールベースのアクセス制御 (RBAC)
Microsoft Azure でリソースに対するアクセス制限を行うには、[リソースポリシー](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-manager-policy)を利用する方法と[ロールベースのアクセス制御 (RBAC)](https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-control-what-is) の２種類があります。前者はリソースに、後者はユーザーにフォーカスした制御となります。
<dl>
  <dt> ・ リソース ポリシー</dt>
  <dd>リソースにフォーカスした制約です。サブスクリプションやリソースグループに対してポリシーを設定する事で、ユーザーとは無関係（全ユーザー）に、そのサブスクリプションやリーソースグループに所属するリソース全般にポリシーを適用する事が可能です。</dd>
  <dt> ・ ロールベースのアクセス制御 (RBAC)</dt>
  <dd>ユーザーにフォーカスした制限です。特定のユーザーやグループに対して操作権限を設定する事で、ユーザー別に職務に必要な操作権限のみを割り当てる事が可能です。</dd>
</dl>

今回はロールベースのアクセス制御 (RBAC) を用いて特定ユーザーに Azure Storage への操作権限を制約し、結果として VM 作成時に Managed Disks のみ利用可能な権限設定をしたいと思います。

#１．RBAC - カスタム ロールの作成
ロールベースのアクセス制御 (RBAC)では、定義済みの「組み込みロール」と任意のアクセス設定を定義できる「カスタムロール」があります。今回は、まず最初にストレージへの読み・書きアクセスを制限するカスタムロールを作成します。

###作業の流れ
1.　カスタムロールを定義し .json 形式 のファイルとしてローカル PC に保存します。 <～> の部分はご利用の環境にあわせて適宜変更します。NotActions の箇所に禁止する操作を指定します。今回はクラシックストレージと現行ストレージ両方の読み・書きアクセスを禁止しています。

```json:DenyStorageAccess.json
{
  "Name": "<カスタムロール名（英文字）>",
  "IsCustom": true,
  "Description": "<ロールの説明>",
  "Actions": [
    "*"
  ],
  "NotActions": [
    "Microsoft.Storage/storageAccounts/read"
   ,"Microsoft.Storage/storageAccounts/write"
   ,"Microsoft.ClassicStorage/storageAccounts/read"
   ,"Microsoft.ClassicStorage/storageAccounts/write"
  ],
  "AssignableScopes": [
    "/subscriptions/<サブスクリプション ID>"
  ]
}
```

2.　PowerShell にて、作成したカスタムロール構成ファイルをサブスクリプションに登録します。

```ps1
# Login
Login-AzureRmAccount
	
# Select Subscription
Select-AzureRmSubscription -SubscriptionId <サブスクリプション ID>

# Create Custom Role
New-AzureRmRoleDefinition -InputFile <jsonファイルへのファイルパス>
```

3.　Azure ポータルで、権限を付与したいリソースを選択します。今回はサブスクリプションに対して設定します。

ポータルより、[サブスクリプション] - [対象サブスクリプション] - [アクセス制御(IAM)] - [追加] の順番で選んでいきます。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/166732/9ad4adca-6cd3-18ba-e658-2a0ea85ddef4.png)

4.　続けて、登録したカスタムロールを選択し、権限を付与したいユーザーを選択します。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/166732/f780c3e1-cb3b-89a5-2080-1db0c7838db7.png)

5.　[保存]ボタンを押す事で、以下のように選択したユーザーにカスタムロールが割り当てられました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/166732/78aef946-8c4c-bc01-2808-11e82af6d58c.png)

#２．カスタムロールのユーザーで Azure ポータルにログイン
一旦サインアウトし、上記作業で適用したカスタムロールのユーザーで Azure ポータルにログインします。Magaed Disks が利用できるのは [ARM 版の仮想マシンのみで、クラッシック版の仮想マシン](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-manager-deployment-model)は Azure Storage の利用が前提となっています。このため本カスタムロールを適用したユーザーはクラッシック VM の作成は出来なくなっています。ここでは ARM 版の仮想マシンを Managed Disks を用いてい展開する流れを示します。

###デプロイ手順（成功例）
1.　VMデプロイ環境として、カスタムロールを適用したサブスクリプションを選択します。

![4.png](https://qiita-image-store.s3.amazonaws.com/0/166732/91cf5e40-aec4-e0f4-5f31-252707ba947a.png)

2.　仮想マシンのサイズを選択します。
3.　オプション機能の構成で、管理ディスクを利用するを選択し、ブート診断を無効にします。

既定設定では、管理ディスク(Managed Disks)は [いいえ]、監視のブート診断は [有効] が選ばれています。これらは何れも格納先として Azure Storage を利用するため、本カスタムロールを適用したユーザーは利用できなくなっています。監視機能を利用したい場合は、仮想マシンデプロイ後に、ストレージの操作権限のあるユーザーにて追加設定を行う事が可能です。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/166732/fc113c40-ef34-9215-c8dc-edce85c346fa.png)

4.　検証に成功した事がわかります。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/166732/2403ecec-c727-7f17-6404-3db5906013ba.png)

###デプロイ手順（失敗例）

上記手順で、何らかの Azure Storage を利用するオプションが選択されていた場合（具体的には従来型のディスクの使用や監視用の診断ログの保管場所としのストレージ）には、手順４の検証が以下のように失敗し、仮想マシンの作成が行えません。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/166732/c0ff5a0d-036a-a805-8464-098764f375c6.png)

#まとめ

最後にまとめとして、今回のカスタムロールは、仮想マシン作成時に Managed Disks を強制するという直接のポリシーがないため、Azure Storage の利用を制限する事で、結果として Managed Disks のみを利用可能としています。実際の使用に関しては、その点を認識した上でご利用いただく事をお願いします。