ABEJA Tech Blog

中の人の興味のある情報を発信していきます

AzureADの条件付きアクセスポリシーをTerraformで作る 〜情シス業務の効率化トライ〜

はじめに


こんにちは! 株式会社ABEJAで情シスをしている世古です。本記事はABEJAアドベントカレンダー2022の14日目の記事です!

今回は「AzureADの条件付きアクセスをポリシーをTerraformで作ってみた」という内容の実装の部分を架空の設定を用いて簡単にお話できたらなと思います!

なぜやるのか


  • 作業ミスの防止

    • GUIでぽちぽちやると集中力が切れたときにミスが起きやすい
  • 作業効率の向上

    • コード化することにより、大量の設定適用が楽になる。また設定の確認が捗る。
  • モダンな情シスっぽくてモテそうだから

環境準備


  • Terraform、AzureCLIがインストール済であること
  • 情報量(コード)を減らすために架空の設定です(ベストプラクティスではないです)

※インストールしてない方は以下を実行するとインストール可能です

# AzureCLI
$ brew install azure-cli

# Terraform
$ brew tap hashicorp/tap
$ brew install hashicorp/tap/terraform
  • 本記事では下記環境を前提にすすめております
M1 Mac
Azure-cli 2.43.0
Terraform v1.3.6

今回の実装想定


今回は、「特定のグループがGoogleWorkspace(GWS)、Slackへのアクセスするときに条件に満たしてない場合はアクセス不可にしたい」というポリシーを実装してみます。

※本設定を適用するグループ名をグループAとします

  • グループAであること
  • 制限の対象サービスはGWS、Slack
  • MFA設定がされていることが必須
  • 端末がAzureADのポリシーに準拠しているか
  • 適用するPlatform
    • Mac, Windows, iOS, Android

実装

1.最初にAzureADにログインします

$ az login --allow-no-subscriptions

※MicrosoftGraph経由で実装する方法もありますが今回は利用せずにAzureCLI経由で認証をします

2.ディレクトリを作成して移動します

$ mkdir azuread-conditional-access
$ cd azuread-conditional-access

3.ファイルを作成します

$ touch main.tf
$ touch conditional_access.tf

4.azureadプロバイダーを定義します

TerraformでAzureADを制御するためにazureadというものを使います

なので、事前にプロバイダー情報をmain.tfに定義しておきます

#main.tf
# Configure Terraform
terraform {
  required_version = ">=1"

  required_providers {
    azuread = {
      source  = "hashicorp/azuread"
      version = "2.22.0"
    }
  }
}

# Configure the Azure Active Directory Provider
provider "azuread" {
    # MicrosoftGraphで実装する場合はこの中にCredential情報を定義します
}

4.条件付きアクセスの実装の部分を書いていきます

#conditional_access.tf
resource "azuread_conditional_access_policy" "conditional_acccess_test" {

  display_name = "conditional_acccess_test" # 名前
  state        = "disabled"              # 非アクティブ状態で作成する
                                         # enabledで作成すると設定が適用された状態で作成されるので注意が必要です

  conditions {
    client_app_types = [
      "all",
    ]
    sign_in_risk_levels = []
    user_risk_levels    = []

    applications {
      excluded_applications = []
      included_applications = [
        "37fce34f-f91b-4629-b0de-cfc39862ja1", # GWSのアプリID
        "82347edd-e79c-4000-a328-b2c294e429ec", # slackのアプリID
      ]
    }

    users {
      excluded_groups = []
      excluded_roles = [
      ]
      excluded_users = []
      included_groups = [
        "f2ff407d-ef84-4fa5-821f-a4d2f50030c5",  # グループAとします
      ]
      included_roles = []
      included_users = ["none"] # 
    }

    platforms {
      # 制限するプラットフォームを記載
      included_platforms = ["macOS", "windows" "android", "iOS"]
    }
  }

  grant_controls {
    built_in_controls = [
      # 制限する条件でMFA必須、準拠デバイスであること
      "mfa",
      "compliantDevice"
    ]
    custom_authentication_factors = []
    operator                      = "OR"
    terms_of_use                  = []
  }

  timeouts {}

}

コードの記述は以上です。

5.terraform planで設定状況確認

6.terraform applyをすると実際に条件付きアクセスのポリシーが作成されてるはずです 中身を見ると中身も上記の既述通りに制限がかかっております(画像が増えそうなので一部だけ記載)

不要になった場合はterraform destroyをするとterraform applyで作成したリソースを削除することができます

参考


  • 条件付きAccessPolicy の作成

https://learn.microsoft.com/ja-jp/graph/api/conditionalaccessroot-post-policies?view=graph-rest-1.0&tabs=http

  • AzureADの設定をJSONでエクスポート出来る記事

https://azuread.net/archives/11676

  • Azureadのドキュメント

https://registry.terraform.io/providers/hashicorp/azuread/latest/docs

採用メッセージ


ABEJAでは一緒に働く仲間を募集しています!

幅広い技術を活用・習得したい、顧客・社内メンバーと協業しながら開発したい、このブログを読んで興味を持った方は是非こちらの採用ページからエントリーください! careers.abejainc.com