【Azure】TerraformでAzureADユーザを作成する際のパスワードの扱い 

## 概要

TerraformでAzureADユーザを作成する際に、Terraformコード内にAzureADユーザに設定するパスワードを記載する必要があります。ただし、Terraformコード内にパスワードを平文で記載してしまうと、コード管理するリポジトリ内にパスワード情報が含まれてしまいます。

AWSの場合は以下の参考URLのように、GnuPGを用いてIAMユーザのパスワードやシークレットアクセスキーを暗号化する方法があります。

参考URL: <https://qiita.com/takkii1010/items/eef57e29be6cb7061d95>

しかし、Azureでは同様の手法を使うことができません。
そこで、Terraformの`random`プロバイダーを用いて、Terraformコード内にパスワード情報を含まない方法で実装しました。

## Terraformで変数にシークレットを扱いたい場合の一般的な方法

一般的にパスワード等のシークレットをTerraformの変数で扱いたい場合は、環境変数や外部ファイルに記載してTerraformコードを実行する際に読み込みます。
その際に外部ファイルは`.gitignore`で指定してリポジトリに登録されないようにします。

この方法の場合、Terraformコードにはパスワード情報が含まれません。
ただし、環境変数やパスワード情報が記載された外部ファイルを管理する必要があり、情報漏洩のリスクや管理の手間が増えます。

## 今回実装した方法について

初期パスワードにランダムで生成した文字列を割り当て、初回ログイン時にパスワード変更を強制させる方法です。

ランダムに生成したパスワードはtfstateもしくはTerraform実行時のOutputに出力することで確認できます。ここで生成されたパスワードを用いてログインし、パスワード変更することでtfstateにもTerraformコードにも有効なパスワードが含まれません。

`random`プロバイダーを用いて生成するランダムな文字列は、Azureのパスワードポリシーに準拠できるように、大文字、小文字、数字、特殊文字のそれぞれが少なくとも1文字以上含まれるように設定しています。
特殊文字を使用する際は、デフォルトだとAzureで使用できない文字が含まれているため、`override_special`というパラメータで使用する特殊文字を再定義する必要があります。

## 具体的な実装方法について

ここでは、初期パスワードをランダムな文字列で設定し、初回ログイン時にパスワード変更を強制させる具体的な実装方法について記載します。

### バージョン情報

実装する際に使用した各バージョンは以下の通りです。

- Terraform: 0.15.4
- hashicorp/random: 3.1.0
- hashicorp/azuread: 1.5.0

### Terraformコード

`random_password`というリソースを用いて、任意の文字数や文字を指定したランダムな文字列が生成できます。
ここで生成した文字列を`azuread_user`の`password`に設定することで、ランダムなパスワードが割り当てられたAzureADユーザを作成できます。

また、`azuread_user`の`force_password_change`を有効化することで、作成されたAzureADユーザの初回ログイン時に強制的にパスワード変更をさせることができます。

```terraform
resource "random_password" "password" {
  length      = 15
  number      = true
  lower       = true
  upper       = true
  special     = true
  min_numeric = 1
  min_lower   = 1
  min_upper   = 1
  min_special = 1
  override_special = "!@#$%&*()-_=+[]{}:?"
}

resource "azuread_user" "user" {
  user_principal_name     = "sample.user@example.com"
  display_name            = "sample.user"
  password                = random_password.password.result
  force_password_change   = true
  usage_location          = "JP"
}
```

`length`
生成するランダムな文字列の文字数を指定します。
[AzureADパスワードポリシー](https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/concept-sspr-policy#password-policies-that-only-apply-to-cloud-user-accounts)では8文字以上となっていますが、ここでは[Building a Digital Defense with Passwords](https://www.fbi.gov/contact-us/field-offices/portland/news/press-releases/oregon-fbi-tech-tuesday-building-a-digital-defense-with-passwords)に従ってパスワードを15文字で設定しました。

`number`/`lower`/`upper`/`special`
AzureADパスワードポリシーでは大文字、小文字、数字、特殊文字のうち3種類以上を使用することが求められるため、上記パラメータのうち少なくとも3つを`true`に設定する必要があります。

`override_special`
パスワードに使用できる特殊文字を設定します。
`special`を`true`に設定する場合、デフォルトではAzureADで使用できない特殊文字が含まれるため、`override_special`で上書きする必要があります。
AzureADで使用できる特殊文字については[AzureADパスワードポリシー](https://docs.microsoft.com/ja-jp/azure/active-directory/authentication/concept-sspr-policy#password-policies-that-only-apply-to-cloud-user-accounts)を参照してください。

`force_password_change`
このパラメーターを`true`に設定することで、初回ログイン時のパスワード変更を有効化できます。

その他のパラメーターの詳細については、以下のTerraform公式ドキュメントをご参照下さい。

- [random_password](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/password)
- [azuread_user](https://registry.terraform.io/providers/hashicorp/azuread/latest/docs/resources/user)

### まとめ

TerraformでAzureADユーザを作成する場合のパスワードの扱いにはいくつかの方法があると思いますが、今回はランダムに生成した文字列をAzureADユーザに割り当て、初回ログイン時にパスワードを強制変更させる方法について記載しました。

Terraformを用いてAzureADのアカウントを管理する場合は参考にしてください。