SaaS

条件付きアクセスのベストプラクティスをTerraform化してみました

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にアプリを新規追加します

  1. AzureAD管理コンソールを開きます
  2. アプリの登録→【新規登録】をクリックします
  3. 適当な名前を入力し、シングルテナントを選択します
  4. リダイレクトURLのプラットフォームから「Web」を選択し、【登録】をクリックします
  5. [証明書とシークレット]を選択します
  6. 【新しいクライアントシークレット】をクリックします
  7. 説明欄にわかりやすい名前を入力し、有効期限を選択、【追加】をクリックします
  8. シークレットキーが表示されるので、控えておきます(この時しか確認できないので注意)

作成したアプリにAPIアクセス許可を付与する

  1. 「APIのアクセス許可」を選択します
  2. 【アクセス許可の追加】をクリックします
  3. [Microsoft Graph]を選択します
  4. 【アプリケーションの許可】をクリックします
  5. 検索欄に「Policy」と入力し検索します
  6. 以下のAPIにチェックを入れ、【アクセス許可の追加】をクリックします
  • Policy.ReadWrite.ConditionalAccess
  • Policy.Read.All
  1. 【「組織名」に管理者の同意を与えます】をクリックします
  2. 【はい】をクリックします

Terraform Cloud環境を用意する

複数人でコードを管理する場合には、tfstateをクラウド上に保管しておく必要があります
一人だけで構成管理をするのであれば、必要ないのですが現実的には少ないと思うのでここではterraform cloudを利用します
tfstateについては、公式ページ を参照してください

Terraform Cloudアカウントの作成については、公式ページのTutorials にありますのでこちらを参考にアカウント作成を行ってください

Terraform Cloudにworkspaceを作成する

Tutorialにあるこのページを実行し、Terraform Cloudへログインします

terraform.tf編集

  1. GitHubから取得したterraform.tfを適当なエディタで開きます
  2. organization部分をTerraform Cloud上の名前と合わせます
  3. 以下のコマンドを実行し、Terraform Cloud上にWorkspaceを作成します
terraform init
  1. Terraform Cloudの管理画面から「Workspaces」タブを選択します
  2. 「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:

条件付きアクセスポリシーを確認する

  1. AzureAD管理センターへログインします
  2. セキュリティ➝条件付きアクセスへ移動します

以下のように、条件付きアクセスが作成されていれば完了です
すべて無効化された状態で作成されますので、レポート等で一度確認した後に該当ポリシーを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

hikky

東京生まれ埼玉育ち情シスの人たち大体友達
スタートアップの情シスなどをしています。
カラオケやUFOキャッチャーが趣味です
(一社)日本ビジネステクノロジー協会 理事とかもやってます