Microsoftさんが公開している条件付きアクセスのベストプラクティス(Excel)をterraformから流し込めるようにつくってみました
JSONファイルからインポートすることができるIntuneManagementはWindowsでしか動作しませんが、terraform環境を用意すればmacOSやLinuxからでも設定を流し込むことができます
コード管理にできるためGitHubからのCI/CDを利用して、設定前レビューとかもできるようになりますね!
Terraformとは
Terraformはオープンソースであり、HashiCorpによってGo言語で開発されたIaCツールです
手動で操作することなくインフラ構成を自動で管理でき、新規設定、更新、破棄をコードで宣言し、実行することができます
必要なもの
- Homebrew(作業環境はMacでインストールされている前提です)
- terraform
- Terraform Cloud(あれば便利)
terraformのインストール
以下のコマンドを実行し、terraformをインストールします
brew tap hashicorp/tap brew install hashicorp/tap/terraform
GitHubからクローンする
以下のリポジトリにterraformコードをおいてありますので、git cloneでローカルにコピーしてください
git clone https://github.com/khikita/CABestPractice-terraform.git
AzureADにアプリを追加する
AzureADプロバイダを利用するために、AzureADにアプリを新規追加します
- AzureAD管理コンソールを開きます
- アプリの登録→【新規登録】をクリックします
- 適当な名前を入力し、シングルテナントを選択します
- リダイレクトURLのプラットフォームから「Web」を選択し、【登録】をクリックします
- [証明書とシークレット]を選択します
- 【新しいクライアントシークレット】をクリックします
- 説明欄にわかりやすい名前を入力し、有効期限を選択、【追加】をクリックします
- シークレットキーが表示されるので、控えておきます(この時しか確認できないので注意)
作成したアプリにAPIアクセス許可を付与する
- 「APIのアクセス許可」を選択します
- 【アクセス許可の追加】をクリックします
- [Microsoft Graph]を選択します
- 【アプリケーションの許可】をクリックします
- 検索欄に「Policy」と入力し検索します
- 以下のAPIにチェックを入れ、【アクセス許可の追加】をクリックします
- Policy.ReadWrite.ConditionalAccess
- Policy.Read.All
- 【「組織名」に管理者の同意を与えます】をクリックします
- 【はい】をクリックします
Terraform Cloud環境を用意する
複数人でコードを管理する場合には、tfstateをクラウド上に保管しておく必要があります
一人だけで構成管理をするのであれば、必要ないのですが現実的には少ないと思うのでここではterraform cloudを利用します
tfstateについては、公式ページ を参照してください
Terraform Cloudアカウントの作成については、公式ページのTutorials にありますのでこちらを参考にアカウント作成を行ってください
Terraform Cloudにworkspaceを作成する
Tutorialにあるこのページを実行し、Terraform Cloudへログインします
terraform.tf編集
- GitHubから取得したterraform.tfを適当なエディタで開きます
- organization部分をTerraform Cloud上の名前と合わせます
- 以下のコマンドを実行し、Terraform Cloud上にWorkspaceを作成します
terraform init
- Terraform Cloudの管理画面から「Workspaces」タブを選択します
- 「CABestPractice-terraform」というWorkspaceが作成されたことを確認します
Terraformでコードを実行する
環境変数に値を設定する
環境変数に以下の値をセットします
環境変数にシークレットキーを入れているためhistory等にキー情報が残りますので、必要に応じて削除してください
az loginで認証を通すやり方もあるのですが、Terraform Cloudを利用した際にエラーになってしまったため、環境変数に入れるやり方で今回は実行しています
また実際の環境ではAWS Secret Manager等を利用するやり方がベターです
export TF_VAR_AAD_TENANT_ID=(条件付きアクセスを作成するAADテナントID) export TF_VAR_client_id=(上記手順で作成したアプリケーションID) export TF_VAR_clinet_secret=(上記手順で作成したシークレットキー)
terraform実行プランを確認する
terraform plan
設定が問題なければ、実行予定の内容が表示されます
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # azuread_conditional_access_policy.G001 will be created 〜中略〜 Plan: 9 to add, 0 to change, 0 to destroy.
terraformコードを実行する
確認した内容で問題なければ、実際にコードを実行します
terraform apply
以下のように表示がでるので、適用する場合にはyesと入力し、エンターキーを押します
terraformが実行され条件付きアクセスが作成されます
Plan: 9 to add, 0 to change, 0 to destroy. Do you want to perform these actions in workspace "CABestPractice-terraform"? Terraform will perform the actions described above. Only 'yes' will be accepted to approve. Enter a value:
条件付きアクセスポリシーを確認する
- AzureAD管理センターへログインします
- セキュリティ➝条件付きアクセスへ移動します
以下のように、条件付きアクセスが作成されていれば完了です
すべて無効化された状態で作成されますので、レポート等で一度確認した後に該当ポリシーをterraform側で有効化し再度 terraform apply
してください
作成した設定をterraformで削除する
以下のコマンドを実行します
terraform destroy
内容を確認した後、yesと入力し、エンターキーを押します
terraformで定義された設定がすべて削除されます
terraformで定義されていない元からあった設定はそのまま残ります
Plan: 0 to add, 0 to change, 9 to destroy. Do you really want to destroy all resources in workspace "CABestPractice-terraform"? Terraform will destroy all your managed infrastructure, as shown above. There is no undo. Only 'yes' will be accepted to confirm. Enter a value:
まとめ
まだまだAzure ADのコード管理には足りない部分も多いのですが、ある程度の管理はterraformでできます
作業ミスをなくせるように、コード化しレビュー、実行という運用にしていければ、万が一設定が飛んでしまったときでも、コードを再実行すれば環境を戻すことができます
GUIで作業したほうが早い!と思うところも多いですがGUIをダブルチェックで作業よりかは証跡も残りますし、遥かにいいと思います
今後のAzure AD Providerに期待したいですね
参考資料
条件付きアクセスポリシーのインポート/エクスポート
https://azuread.net/archives/11676
詳説!Azure AD 条件付きアクセス – 設計のやり方編 Azure AD Conditional Access deep dive – Design methodology
https://github.com/yusukekodama/PMActivities/blob/master/Webinar/Schedule.md
条件付きAccessPolicyの作成
https://docs.microsoft.com/ja-jp/graph/api/conditionalaccessroot-post-policies?view=graph-rest-1.0&tabs=http