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

hikky

hikky

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でローカルにコピーしてください

https://github.com/khikita/CABestPractice-terraform

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を作成します

注意!

環境変数にシークレットキーを入れているため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 methodologyhttps://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

この記事をシェア