[Terraform][Azure AD] Terraform で Azure AD Connect の検証環境を構築してみた
はじめに
本記事では、Azure AD Connect 環境を構築するために記述した Terraform コードを紹介したいと思います。
対象読者
Azure AD Connect をお手元の Azure 環境で試してみたい方
前提条件
- お手元の環境に azure CLI をインストールされている方
- インストールがまだの方はこちらをご確認ください
- お手元の環境に terraform をインストールされている方 (本記事では terraform v1.5.0 を利用しています)
コード
目次
モチベーション
普段の業務においていつでも作ったり壊したりできる Azure AD Connect の検証環境を作りたく、今回 Terraform で環境構築を検討しました。また、Terraform に入門したかったというのもあり、自身の理解を進めるためというのも理由の一つとしてあります。
Terraform とは
Infrastructure as Code (IaC) を実現するために使用されるツールです。
Azure で使える IaC ツールでいいますと、Azure Resource Manager (ARM) Template や Bicep なども例として挙げられるかと思います。
以下の引用の通り、Terraform はクラウドリソースを明示的に管理するためのツールです。本サービスを利用することにより、どういったリソースがデプロイされるか管理することができます。
Hashicorp Terraform は、クラウド インフラストラクチャのプロビジョニングおよび管理を行うためのオープン ソースの IaC (コードとしてのインフラストラクチャ) ツールです。
Azure における Terraform の利用について
Terraform では、Azure をクラウドのリソース提供者として、Azure が用意している Azure Resource Manager API を通して Azure 上のリソースの操作を行います。
Provider
Provider は、Terraform が クラウドプロバイダ (Azure/AWS/GCP 等) が提供する Resource Manager API を通してリソースに関する操作を行うために利用されるプラグインです。
Terraform においてリソース管理する際に hashicorp 公式により提供されているプロバイダであるhashicorp/azurerm を使っていきます。
hashicorp/azurerm の内部的な処理としましては Azure Resource Manager API に対してリソース操作のリクエストを行なっています。Azure Resource Manager の仕組みとしましては以下の画像が参考になるかと思います。
検証環境
概要
今回は Azure AD Connect の検証環境を構築するため、以下のような構成の検証環境を構築します。
AzureAD
AD ユーザを同期するためのカスタムドメインの登録が必要になります。
カスタムドメインを登録し、AD において作成した User を Azure AD に同期できるようにします。
検証用環境なので、私は Azure App Service の一部である App Service ドメイン というサービスから検証用ドメインを取得しました。
カスタムドメインの登録におけるドメイン検証は Terraform ではできないため、 Azure Portal から GUI をポチポチしていきます。
カスタムドメインの検証においては、ドメインの所有権確認が必要となりますので、ご利用中のドメインサービスより TXT あるいは MX レコードを登録できるように準備します。
DCServer
ドメインコントローラ (DC) の Windows Server となります。
こちらについてはなんと、GitHub の hashicorp/terraform-provider-azurerm に DC と Domain Member を構成できる example が載っていますので、こちらを参考にしていきたいと思います。
試しに↑だけで試してみたのですが、これデプロイ時にめちゃくちゃ時間かかりました・・・
DC に昇格し、Available になるまで時間がかかる模様。(体感 20 分ぐらいかかります)
ドメインコントローラの各種設定は以下の通りです:
- ドメイン
-
var.custom_domain
- Azure AD で設定したカスタムドメインを AD のドメインとして設定します。
-
- NetBIOS
-
split(var.custom_domain)[0]
- custom_domain の .(dot) より前の文字列を NetBIOS に指定するようにしています。
- NetBIOS などの命名規則などは こちら も併せて参考にさせていただきました。
-
DomainMember
ドメイン参加する Windows Server になります。ドメイン参加させるのみですが、検証用のデバイスとして一台用意いたしました。
ドメイン参加させるため、応答が返ってくるまでドメインコントローラへ Echo Request を送ります。DC Server の節で説明した都合上、ドメインコントローラの昇格に伴う処理に時間を要するのでしばらく Echo Request を送信する仕様となっているそうです。
while (!(Test-Connection -TargetName ${var.active_directory_domain_name} -Count 1 -Quiet) -and ($retryCount++ -le 360)) { Start-Sleep 10 }
DC 昇格処理が終わり、応答が返ってきた後にドメイン参加設定を行います。
Microsoft.Compute/virtualMachines/extensions における JsonADDomainExtension と呼ばれるリソースを用いて、Azure VM をドメイン参加させます。
Terraform の記述は下記の通りになります。
resource "azurerm_virtual_machine_extension" "join_domain" {
name = azurerm_windows_virtual_machine.domain_member.name
publisher = "Microsoft.Compute"
type = "JsonADDomainExtension"
type_handler_version = "1.3"
virtual_machine_id = azurerm_windows_virtual_machine.domain_member.id
settings = <<SETTINGS
{
"Name": "${var.active_directory_domain_name}",
"OUPath": "",
"User": "${var.active_directory_username}@${var.active_directory_domain_name}",
"Restart": "true",
"Options": "3"
}
SETTINGS
protected_settings = <<SETTINGS
{
"Password": "${var.active_directory_password}"
}
SETTINGS
depends_on = [azurerm_virtual_machine_extension.wait_for_domain_to_provision]
}
公開記事の中に、AD 参加を設定するための Azure VM 拡張機能の記述の一例がありますので、こちらも参考になるかと思います(こちらは Azure Active Directory Domain Service (AADDS) へのドメイン参加の一例ではありますが、ドメイン参加のために利用しているリソースは一緒かと思います):
AADCServer
Azure AD Connect をインストールする Windows Server の設定を行います。
前提条件
-
Azure AD Connect をインストールするサーバは今回作成する DC Server にドメイン参加する必要がある
-
Azure AD Connect が Windows Server 2016 以降のデバイスにインストールする必要がある
やること
前提条件に従い、今回は Windows Server 2019 に Azure AD Connect をインストールしようと思います。
AADC の初期設定は GUI コンソールにて行われますので、AADC のインストールまでを Terraform で自動化しようと思います。実際、AADC の設定をする際には パスワードハッシュ同期 / パススルー認証 など初期設定においてカスタマイズできますので、検証の際にも都合が良いです。
実行するスクリプトは以下の通りとなります:
# Azure AD Connect をサイレントインストール (qn と passive は片方指定すればいいと思います)
msiexec.exe /i https://download.microsoft.com/download/B/0/0/B00291D0-5A83-4DE7-86F5-980BC00DE05A/AzureADConnect.msi /qn /passive
# ADSyncConfig を有効にするために RSAT-AD-Tools をインストール
Install-WindowsFeature RSAT-AD-Tools
# DC 昇格に伴う処理を待つコマンド
while (!(Test-Connection -TargetName ${var.active_directory_domain_name} -Count 1 -Quiet) -and ($retryCount++ -le 360)) { Start-Sleep 10 }
公開記事の中に、AD 参加を設定するための Azure VM 拡張機能の記述の一例がありますので、こちらも参考になるかと思います。
以上を事前に実行することにより、 AADC Server が以下の状態となります。
- ドメインコントローラをリモートで操作できる
- ドメイン参加している
- Azure AD Connect がインストールされている
上記作業によって AADC Server の下準備が完了します。
デプロイ
ご利用のテナントにサインイン
# デプロイを実行する azure 環境へログインする
az login
# (optional) デプロイするサブスクリプションを指定します
az account list
az account set --subscription {target}
以下のコードに従い、デプロイを実行します。
実行コマンド
# terraform コードの初期化
terraform init
# output されるリソースを確認
terraform plan
# リソースを実際にデプロイ
terraform apply
入力パラメータ
-
admin_password
- 作成される AD の Administrator アカウントのパスワード
-
admin_username
- 作成される AD の Administrator アカウントのユーザネーム
- DC 昇格後、
{cusom_domain}\{admin_username}
でログイン可能
-
custom_domain
- Azure AD で登録したカスタムドメイン
-
location
- リソースがデプロイされる Azure のリージョン
-
prefix
- リソース名やデバイス名に紐づく任意の文字列
-
your_home_ip
- Network Security Group で設定する送信元 IP アドレス
- Inbound RDP Rule を指定するためにご利用のグローバル IP を調べる必要があります
- こちらのサイトより取得した値を指定
- Network Security Group で設定する送信元 IP アドレス
動作確認
-
Azure AD Connect Server (リソース名:
${prefixに指定した文字列}-aadc
) に リモートデスクトップで接続する(お使いの RDP クライアントにおいて、${prefix}-aadc.{指定したregion}.cloudapp.azure.com
をサーバとして指定することによりアクセスできます) -
インストールされている Azure AD Connect を開く
-
Azure AD Connect の設定ウィザードに従い、設定していく
[Continue] をクリック
AADC による同期方式を設定(今回は [Express Settings] を指定します)
Azure AD におけるグローバル管理者でサインイン
AD DS の管理者権限を持つユーザでサインイン
Install します
しばらく待ち、Configuration complete と表示されたら完成です
-
Active Directory にユーザーを追加する
-
Powershell を開き、
Start-ADSyncSyncCycle -PolicyType Delta
を実行して AADC のユーザー同期を実行
-
ユーザーが同期することを確認する
以上で、ユーザが同期するところまで確認できました。
終わりに
本記事では、Azure AD Connect 環境を Azure VM で立ち上げるためのコードを記述しました。
不要となった場合は terraform destroy
なり、リソースグループごと削除するなりしていただければと思います。
次は Microsoft の IaC ツールである Bicep で同様に実装してみたいですね。
Discussion