【第17回】Azureで社内システム再現（クラウド編）｜Entra ID Connect でオンプレADのユーザーを同期してみた

## 概要

これまでの「オンプレ編」では、Azure の仮想マシン（IaaS）を使って、社員番号から名前を検索できるシンプルな社内システムを構築してきました。Active Directory、SQL Server、ADFS などを組み合わせ、オンプレミスの構成を仮想的に再現しています。

※全体構成の詳細は、[【第0回】Azureで社内システム再現（オンプレ編）｜構成図と動作の流れ](https://qiita.com/your-link-here) をご参照ください。

クラウド編では、これまでの構成をベースにしつつ、Azure のマネージドサービス（PaaS）を中心とした構成へ段階的に移行していきます。

※クラウド移行全体の設計方針については、[【第10.5回】Azureで社内システム再現（クラウド編）｜オンプレ構成をどうクラウドに移行するか？](https://qiita.com/saba_infra/items/4ff691131593e947d6cf) にまとめています。

## システム構成（今回の対象範囲）

![cloud_webapp_AADC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/2e14efd7-b8db-4e56-8252-c33784680b0b.png)

今回は、オンプレミスの Active Directory に登録されたユーザー情報を、Entra Connect を使って Microsoft Entra ID に同期する構成です。

図の太い矢印のとおり、オンプレAD から Entra ID への同期部分が、今回の中心となる構成要素です。


---

具体的には、以下の作業を行いました：

- **Microsoft Entra ID にカスタムドメインを設定**
- **カスタム属性の同期ルール（Inbound / Outbound）を作成**
- **Entra Connect を使ってディレクトリ同期を構成**
- **同期結果をツールやAPIで確認**




## Entra ID にカスタムドメインを追加

Azure Active Directory（現在の Microsoft Entra ID）にカスタムドメインを追加しました。  
初期状態では `xxxxx.onmicrosoft.com` のようなドメインが自動で付与され、ユーザーの UPN（User Principal Name）もそれに基づいた長い形式になってしまいます。

今回は、独自に所有しているカスタムドメイン `azuretest0905.com` を追加しました。  
このドメインは、以前お名前.comで取得して使用していたものが余っていたため、再利用することにしました。  
これにより、同期後のユーザー名をシンプルかつ統一された形式に整えることができます。

![スクリーンショット 2025-04-17 14.05.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/26d8315f-eb26-4372-b0f1-010723c9acb1.png)

---

## Entra Connect をダウンロードしてインストール

オンプレミス環境に構築した Azure VM（AD-VM1）に、Microsoft Entra Connectをインストールします。  
これにより、オンプレミスの Active Directory に登録されているユーザー情報を、Microsoft Entra ID 側に同期できるようになります。

インストーラーは以下の公式ページからダウンロードできます。  
[https://www.microsoft.com/en-us/download/details.aspx?id=47594](https://www.microsoft.com/en-us/download/details.aspx?id=47594)
  

---


## 同期前の準備

同期を始める前にオンプレミスADに存在する同期対象ユーザーのプロパティを確認します。

![スクリーンショット 2025-04-02 13.38.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/160cec7b-c914-443c-860c-0309302e3c11.png)

今回の対象は `employees` OU に属するユーザーです。ユーザーのプロパティには、表示名（displayName）と説明（description）が設定されていました。

- `displayName` は既定の同期ルールにより、そのまま Microsoft Entra ID に同期されます。
- 一方、`description` は既定では同期対象に含まれていません。


> [Azure AD Connect: Attributes synchronized to Microsoft Entra ID](https://learn.microsoft.com/en-us/entra/identity/hybrid/connect/reference-connect-sync-attributes-synchronized)

---

## カスタム属性（extensionAttribute1）を使って同期対応

`description` のように既定で同期されない属性を Entra ID 側に持っていくには、代わりに `extensionAttribute1` を利用します。

- `extensionAttribute1` ～ `15` は、既定で Entra ID に同期されるカスタム属性です。


この属性に `description` の値を格納すれば、Entra ID 側でも参照できるようになります。

---

## 同期ルール（Inbound / Outbound Rule）の作成

Active Directory から Microsoft Entra ID に属性データを同期する際、Entra Connect（AADC）は以下のような3段階の処理を行います。

```
オンプレミス AD  
↓（Inbound Rule）  
Metaverse（中間データベース）  
↓（Outbound Rule）  
Microsoft Entra ID
```


この流れの中で、それぞれのルールが果たす役割は次の通りです。

| 種類 | 処理対象 | 役割 |
|------|-----------|------|
| Inbound Rule | オンプレAD → Metaverse | オンプレミスの属性を中間層（Metaverse）に取り込む |
| Outbound Rule | Metaverse → Entra ID | Metaverse の属性を Entra ID に書き出す |

---

今回は、オンプレADに存在する `description` 属性を、Entra ID 側でも参照できるようにするのが目的です。

ただし、`description` は既定の同期対象ではないため、代替として **`extensionAttribute1`** を使用します。  
この属性は Entra ID に既定で同期されるため、同期ルールを通して `description` を `extensionAttribute1` にマッピングします。

---

### Inbound Rule の設定

以下は Inbound Rule の作成画面です。

![スクリーンショット 2025-04-02 14.08.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/192dfb37-1adc-4558-a2c2-2bd3cabbe9f8.png)


この設定では、オンプレADの `description` 属性を Metaverse の `extensionAttribute1` にコピーしています。

- **FlowType**：Direct
- **Target Attribute**：extensionAttribute1
- **Source**：description
- **Merge Type**：Update

---

### Outbound Rule の設定

続いて、Metaverse から Entra ID への出力用ルール（Outbound Rule）を設定します。

![スクリーンショット 2025-04-02 14.12.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/816cd9f8-fcb5-432f-a189-8d4e15203478.png)


こちらも Inbound 同様に、`extensionAttribute1` をそのまま Entra ID に渡す構成です。

- **FlowType**：Direct
- **Target Attribute**：extensionAttribute1
- **Source**：extensionAttribute1
- **Merge Type**：Update

---

これで、オンプレミスのユーザーの `description` 属性を Microsoft Entra ID 側でも利用できるようになりました。

---

## Entra Connect で同期を実行

カスタムドメインや同期ルールの設定が完了したら、実際に Entra Connect を使ってオンプレミスADのユーザー情報を Entra ID に同期させます。

同期ウィザードの流れを簡単に紹介します。

---

### オンプレAD（AADS）および Entra ID への接続

オンプレミスAD（AADS）と Microsoft Entra ID への接続設定を行います。  
接続情報が正しく設定されていれば、ウィザードが問題なく進行します。
![スクリーンショット 2025-04-02 14.15.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/2eaa711e-7c0c-4195-9158-39d1f90022d5.png)


---

### 同期対象の OU（組織単位）を選択

今回は、`employees` OU を同期対象として選択しました。

![スクリーンショット 2025-04-02 14.15.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/8f306abd-ff6e-43c1-adb4-5005611a3261.png)

---

### 同期の実行と完了画面

構成がすべて完了したら、同期プロセスを実行します。  
正常に同期が開始されました。

![スクリーンショット 2025-04-02 14.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/56111c77-b448-426e-a919-838c18443687.png)

---

## 同期が正常に行われたことを確認する

---

### ①Metaverse 上での属性確認（Entra Connect 内部）

Entra Connectには、同期処理の状態を確認するための専用ツール「**Synchronization Service Manager**（`miisclient.exe`）」が付属しています。  
このツールでは、オンプレミスAD → Metaverse の同期がどう行われているかを確認することができます。


![スクリーンショット 2025-04-02 15.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/5559f0bf-1d37-4cf1-9ec5-b82e628ba323.png)

- `description` に「1007」という値が取り込まれており、オンプレミスADからの属性取得に成功していることがわかります。
- また、`extensionAttribute1` にも同じ値が設定されており、Inbound Rule によるマッピングが正しく行われていることを確認しました。

---

### ② Entra ID 上での確認（Azure ポータル）

Microsoft Entra 管理センターで、対象ユーザーが Entra ID に正常に同期されていることを確認しました。

![スクリーンショット 2025-04-17 15.35.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/287b56e3-e615-42ed-804f-223daabe93e0.png)

- ユーザー情報は Entra ID 側に正しく同期されていることが確認できました。
- ただし、**`extensionAttribute1` などのカスタム属性は Azure ポータルの UI 上では確認できないため、次の Graph API を用いた方法で確認を行います。**



---

### ③ Graph API による確認

Microsoft Graph API を使用し、外部から Entra ID に登録されたユーザー情報を取得しました。  
この方法を使うことで、Azure ポータル上では確認できない `extensionAttribute1` を含むカスタム属性も取得できます。



![スクリーンショット 2025-04-02 15.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4037248/25609095-bffd-4193-a21d-75d5b0174728.png)

- `displayName: "中村 綾香"` と表示されており、対象ユーザーが正しく取得できていることを確認しました。
- `extensionAttribute1: "1007"` と表示されており、**オンプレミスの description 属性が Entra ID に同期されていることを API 経由で明示的に確認できました。**