【AZ-900対策】Azureのガバナンスとコンプライアンスの機能とツールをまとめた

# はじめに
この記事はMicrosoftの認定試験であるAZ-900:(Microsot Azure Fundamentals)の試験範囲であるAzureストレージについてまとめたものです。基本は、Microsoftが無料で公開している学習ツールであるMicrosoft Learnの記事の内容をまとめていますが、適宜必要な情報を加えています。

https://learn.microsoft.com/ja-jp/training/modules/describe-features-tools-azure-for-governance-compliance/


# Azure Blueprints
`Azure Blueprints`とは、Azure環境でのリソースの作成や構成を自動化するためのサービスです。事前に定義されたポリシー、ロール、およびリソーステンプレートを使用して、Azureサブスクリプションで展開されるリソースの構成を定義・展開できます。これにより、セキュリティ、コンプライアンス、および管理要件を確実に満たすことが可能になります。

## Azure Blueprintsの用途
- 環境の標準化
    - テスト環境や開発環境など、デプロイの標準化が可能
    - チーム間での環境の一貫性を維持することが可能
- セキュリティとコンプライアンスの確保
    - セキリュティやコンプライアンスの規制要件に従った環境を構築可能
    - 設定ミスによるヒューマンエラーのリスクが軽減
- 効率的な管理
    - 新規サブスクリプションごとの`Azure Policy`の設定が不要
    - DevOpsプロセスの自動化が可能
- デプロイの監視
    - `Azure Blueprints`はバージョン対応のため、更新ごとに新しいバージョンの割り当てが可能

## アーティファクト
アーティファクトとは、Azureリソースを作成するために必要な要素のことを指します。アーティファクトの要素は設定する必要はなく、複数の設定も可能です。例えば、以下の要素が設定可能です。
- ロールの割り当て
    - リソースへのアクセスを制御するために使用
- ポリシーの割り当て
    - リソースの構成やセキュリティ要件を規定するために使用
- ARM(Azure Resource Manager)テンプレート
    - リソースの展開や構成を自動化するために使用
- リソースグループ
    - リソースを分類するためのリソースグループを定義するために使用

## Azure BlueprintsとARMテンプレートの違い
Azure BlueprintsとARMテンプレートは、管理の範囲が異なります。サブスクリプションやリソースグループを管理する場合はAzure Blueprintsを用い、リソースを管理する場合はARMテンプレートを用います。

- ARMテンプレート
    - Azureのリソースを定義し、展開するための単一のJSONファイル
    - 単一のリソースグループ内で複数のリソースを作成することができ、リソースの依存関係を管理することができる

- Azure Blueprints
    - 複数のARMテンプレートを組み合わせ、より広範なAzureリソースの自動化と一貫性を提供するためのサービス
    - 複数のAzureサブスクリプション、複数の地域、複数のリソースグループで標準化されたソリューションを導入することができる

## AzureポータルでAzure Blueprintsを使用してみる
Azureポータルの検索窓から、ブループリントと検索して表示されたサービスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/f3ddc0d2-bd26-5db5-7734-fc76738fbe9d.png)
"空白のブループリントで始める"をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/1d3c24d9-2b85-3939-c7c8-08992b2d350e.png)
ブループリント名の指定と、定義の場所でサブスクリプションの選択を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0c500e14-8140-7aec-5276-1f69cfff7dc8.png)

### ロールの割り当て
"+生成物の追加..."を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/5976ea5e-33d4-4c86-8036-935b020d8415.png)
生成物の種類では、"ロールの割り当て"を選択し、ロールを"共同作成者"と指定した後、"追加"を押すことで生成物をブループリントに追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/c68b9dee-2c63-82a4-b838-9007f33c510e.png)

### ポリシーの割り当て
"+生成物の追加..."を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ed4c09a1-bf5f-2fd5-afd9-1b521cbc7e26.png)
生成物の種類を"ポリシーの割り当て"とし、種類を"ビルトイン"、検索を"タグ"と入力し、"タグとその値をリソースに追加する"を選択した後、"追加"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/cc960fa9-df20-e90f-02e0-53b0d9283e62.png)

### リソースグループの追加
"+生成物の追加..."を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/4b63f7b2-eadb-8c2a-afc4-f3408daa0379.png)
生成物の種類で"リソースグループ"を選択し、"追加"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/92f9cbee-7504-42ba-4d4b-8792c23dbbe7.png)

### リソースグループにテンプレートの追加
リソースグループ以下の"+生成物の追加..."を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/df5bba55-8cff-eee9-f4c2-c75a1317226d.png)
生成物の種類を"Azure Resource Managerテンプレート"とし、生成物の表示名を"StorageAccount"と入力します。テンプレートタブで以下のjsonファイルを添付します。
<details><summary>jsonファイルを表示</summary><div>

```json
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "storageAccountType": {
            "type": "string",
            "defaultValue": "Standard_LRS",
            "allowedValues": [
                "Standard_LRS",
                "Standard_GRS",
                "Standard_ZRS",
                "Premium_LRS"
            ],
            "metadata": {
                "description": "Storage Account type"
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Location for all resources."
            }
        }
    },
    "variables": {
        "storageAccountName": "[concat('store', uniquestring(resourceGroup().id))]"
    },
    "resources": [{
        "type": "Microsoft.Storage/storageAccounts",
        "name": "[variables('storageAccountName')]",
        "location": "[parameters('location')]",
        "apiVersion": "2018-07-01",
        "sku": {
            "name": "[parameters('storageAccountType')]"
        },
        "kind": "StorageV2",
        "properties": {}
    }],
    "outputs": {
        "storageAccountName": {
            "type": "string",
            "value": "[variables('storageAccountName')]"
        }
    }
}
```
</div></details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/a936da83-e5ab-32ed-1a98-ece6c93d6c5e.png)

パラメータータブにて、`storageAccountType`と`location`のパラメーターが検出されたことが確認し、"追加"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/fcbd1bf8-62d5-fdc5-1fbc-7ca1b616f316.png)

### ブループリントの作成
以下のようなブループリントが作成できたことを確認し、ページ下部にある"下書きの保存"ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0b941841-af57-0a52-c793-7ab4907c6328.png)

### ブループリントの発行
"ブループリントの定義"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b19a7abc-c08d-2ceb-a894-f174e142a165.png)
表示されたブループリント一覧の中で、先ほど作成したものを右クリックして、"ブループリントを発行する"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/991cbd45-337a-7621-16ae-9da4f65d6ad5.png)
バージョンを"v1"として、ページ下部にある"公開"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/eae8f042-6029-224e-4c3e-0781aa36558f.png)

### ブループリントの割り当て
"ブループリントの定義"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/6225cb4d-26a3-ca43-8106-fd98b46454f4.png)
表示されたブループリント一覧の中から、先ほど作成したものを右クリックし、"ブループリントの割り当て"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/21f5c991-5799-06c2-cc9f-2c90f0cd21c4.png)
各項目を以下のように入力した後、"割り当て"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/dabc781d-2563-2ad2-120c-987333d61469.png)

### ブループリントのデプロイを追跡
"割り当てられたブループリント"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/cbecc71a-c1f9-b6f8-4a64-5f2c1995ac4a.png)
表示されたブループリント一覧の中から、先ほど割り当てたものを右クリックし、"割り当ての詳細を表示する"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/565b67bb-e6c0-88fc-46f6-a1e84064f0d0.png)
全ての成果物が正常にデプロイされたことと、デプロイ時にエラーが発生しなかったことが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/031ff938-842e-b4ca-0467-7a6018d06c23.png)
実際、選択したサブスクリプション内に新しく"StorageAccount"のリソースグループが作成されていることが確認されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/24c27b5e-8703-03e3-fc76-446b0694bfe3.png)
"StorageAccount"のリソースグループには、ストレージアカウントが作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/78f766ab-ca96-137a-3f8b-efa89cff49ad.png)
ブループリントで指定した通りの内容でアカウントが作成されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b6dce9a4-f597-1aae-7912-4105652370a2.png)


# Azure Policy
`Azure Policy`とは、管理者が定義したルールを適用し、コンプライアンスやセキュリティの観点からリソースの構成や展開を制御するためのサービスです。`Azure Policy`を使用することで、リソースを制御または監査するポリシーの作成、割り当て、管理を行うことが可能です。また、ポリシーに準拠していないリソースが明示させたり、準拠していないリソースを作成を禁止することも可能です。

## Azure Policyの継承
`Azure Policy`はリソース、リソースグループ、サブスクリプションなどの各レベルで設定可能です。`Azure Policy`は継承され、高レベルでポリシーを設定すると親に含まれるすべてのグループに自動的に適用されます。たとえば、リソースグループに`Azure Policy`を設定すると、そのリソースグループ内に作成されたすべてのリソースが同じポリシーを自動的に受け取ります。

## Azure Policyによるリソースの修復と例外フラグ
ポリシーに準拠していないリソースや構成を`Azure Policy`で自動的に修復して、リソースの状態の整合性を保証することができます。例えば、リソースにタグを付与するポリシーを設定していた場合、タグが未設定でも自動的に再適用されるようになります。また、自動修正させたくない特定のリソースがある場合、リソースに例外フラグを設定することで、ポリシーによって自動修正されることはなくなります。

## イニシアティブ
イニシアティブ(`PolicySet`とも呼ぶ)とは、関連するポリシーをまとめてグループ化することを言います。そのため、サブスクリプションやマネージドアプリケーション、ポリシールールなどを一元的に管理することが可能になり、ポリシー定義の管理と割り当てが簡素化されます。 

## Azure PolicyとAzure Blueprintsの違い
`Azure Policy`も`Azure Blueprints`も共に、Azureのリソース管理に使用するツールでですが、`Azure Policy`はルールに順守しないリソースを自動的に修正するツールであるのに対し、`Azure Blueprints`は標準化されたソリューションを導入するツールです。

- Azure Policy
    - リソースの状態を監視し、定義したルールに従って評価し、必要に応じて自動的に修正するためのサービス
    - Azureリソースを一貫性のある状態に維持し、コンプライアンスの要件を確認することができる
    - Azure Blueprintsの一部として使用されることができる
- Azure Blueprints
    - 複数のAzureサブスクリプション、複数の地域、複数のリソースグループで標準化されたソリューションを導入するためのサービス
    - 複数のARMテンプレート、ポリシー、ロールの組み合わせを1つのパッケージとして定義し、再利用可能なリソーススキーマを提供する

### Azure PolicyとAzure RBACの使い分け
`Azure Policy`と`Azure RBAC`は、両方ともAzureのアクセス制御を管理するために使用されますが、異なる目的を持っています。`Azure Policy`はリソースの設定を管理することが目的であり、`Azure RBAC`はユーザーのアクセス許可を管理することが目的です。

- Azure Policy
    - リソースの設定を強制するために使用されます
    - 誰が変更を行ったかや、誰が変更を行うアクセス許可を持っているかに関係なく、リソースがビジネスルールに準拠した状態になります

- Azure RBAC
    - ユーザーのアクセス許可を管理するために使用されます
    - あるユーザーがアクションを実行するためのアクセス権を持っていても、結果としてリソースが準拠していない場合、その作成や更新は `Azure Policy`によってブロックされます

### AzureポータルでAzure Policyを使用してみる

### 適当なリソースグループの作成
ここでは適当なリソースグループを作成し、作成したリソースグループに対してポリシーを設定することにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ff61d5d9-83d1-cb45-4352-24f02555f24d.png)
問題がなければ、リソースグループを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/c2691437-b888-892b-0a93-953b63841d93.png)

### ポリシーの作成
Azureポータルの左側に、"ポリシー"とされているので選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/ed99b71d-f06e-af5f-1dbc-368faccceed0.png)
"ポリシーの割り当て"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/486f6423-1b11-a5e3-5de7-870bc6be506e.png)
ポリシーの割り当てページが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b2ccb8e1-28df-a299-b86a-02191b96021d.png)
"ポリシー定義"の省略記号(`...`)を押下します。右側にポリシー一覧が表示されるため、検索窓に"タグ"と入力し、"タグとその値がリソースに必要"を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/81bfa092-99b2-fd01-8d5a-86b0142889fd.png)
"割り当て名"は自動的に入力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/5cda5190-c6fa-c406-e2a2-494de4ad512f.png)
パラメーターのタブを選択し、任意のタグ名とタグ値を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/e203a0f4-f403-9301-e8c4-7dae085a4f44.png)
確認及び作成のタブを選択し、問題が無ければ"作成"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/8ef0ed99-b2d4-9441-ac71-bae8beb167dc.png)
ポリシーが追加されていることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/434bd807-b844-ba91-d431-f9b5f7c36cfd.png)

### ポリシーの有効性についての確認
タグが未設定のリソースを作成しようとした時、ポリシー違反によりリソースが作成されないことを確認するため、先ほど作成したリソースグループの中にリソースを作成していきます。リソースは任意のものでよいですが、ここでは`Azure Functions`を利用します。設定は以下のようにしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/1e519b34-1cc6-bd0a-e23f-5c5468803711.png)
タグを設定しないとポリシー違反になることを確認したいため、タグは空白のままにしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0249d1a4-0bad-f28a-c2b2-a04ef63187d8.png)
確認及び作成のタブを選択し、問題がなければ"作成"ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/2c62278f-9f04-97c5-19b7-5883a514b962.png)
"タグとその値がリソースに必要"のポリシーを設定しているにもかかわらず、タグを設定せずにリソースを作成しようとしたことから、リソース違反のエラーが表示されることが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/51a2da5f-04b2-f019-7fb5-a5659d103781.png)

# リソースロック
RBACポリシーが適用されていても、アクセス権を持つユーザーが重要なリソースを削除・変更するリスクがあるため、リソースロックを使用することで意図しない削除・変更が行われるのを防ぐことができます。リソースロックには削除と読み取り専用の2種類存在し、Azureポータル、Power Shell、Azure CLI、ARMテンプレートから管理が可能です。また、リソースロックは継承されるため、リソースグループにリソースロックを設定すると、リソースグループ内のすべてのリソースにもリソースロックが適用されます。ロックされたリソースを削除または変更するためには、事前にロックの解除を行っておく必要があります。

## Azureポータルでのリソースロックの設定
以下のスクリーンショットは、ストレージアカウントに対してロックを追加している様子です。ここでは、読み取り専用のロックを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/30412f78-dfa6-8dd2-56cb-838a951df7fd.png)
設定後、ストレージコンテナーを作成しようとすると、次のようなエラーが表示され、ストレージコンテナーの作成に失敗したことが確認されます。これは、読み取り専用ロックにより、ストレージアカウントの作成または更新の操作ができないためです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/0b2453a0-fb1c-5cfd-8641-7802791bea67.png)
当然、削除もすることができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/4b304be2-6eef-7031-f3ae-5b187aed44f9.png)
ロックを解除することで、変更・削除が可能になります。


# Microsoft Service Trust Portal
`Microsoft Service Trust Portal`(https://servicetrust.microsoft.com/ )は、マイクロソフトのクラウドサービスに関する信頼性とセキュリティに関する情報を提供するウェブポータルです。このポータルは、マイクロソフトの顧客とパートナーに、マイクロソフトのサービスの信頼性とセキュリティに関する情報を提供し、企業の情報セキュリティポリシーとコンプライアンス要件を満たすのに役立ちます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452857/b59e4267-0048-d947-29d1-37a656fcc378.png)


# おわりに
ガバナンスやコンプライアンスは個人で開発する分には重要度が低くなりますが、会社で開発する分には重要になる分野なので、この機会に体系的に学ぶことができて良かったです。まだまだAzureの勉強中なので、間違い等ございましたら教えていただけると嬉しいです。