概要
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ユーザの初回ログイン時に強制的にパスワード変更をさせることができます。
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パスワードポリシーでは8文字以上となっていますが、ここではBuilding a Digital Defense with Passwordsに従ってパスワードを15文字で設定しました。
number
/lower
/upper
/special
AzureADパスワードポリシーでは大文字、小文字、数字、特殊文字のうち3種類以上を使用することが求められるため、上記パラメータのうち少なくとも3つをtrue
に設定する必要があります。
override_special
パスワードに使用できる特殊文字を設定します。
special
をtrue
に設定する場合、デフォルトではAzureADで使用できない特殊文字が含まれるため、override_special
で上書きする必要があります。
AzureADで使用できる特殊文字についてはAzureADパスワードポリシーを参照してください。
force_password_change
このパラメーターをtrue
に設定することで、初回ログイン時のパスワード変更を有効化できます。
その他のパラメーターの詳細については、以下のTerraform公式ドキュメントをご参照下さい。
まとめ
TerraformでAzureADユーザを作成する場合のパスワードの扱いにはいくつかの方法があると思いますが、今回はランダムに生成した文字列をAzureADユーザに割り当て、初回ログイン時にパスワードを強制変更させる方法について記載しました。
Terraformを用いてAzureADのアカウントを管理する場合は参考にしてください。