ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

Bicep で Entra ID を管理する

「上腕二頭筋」という意味をもつ Bicep(バイセップ)で Entra ID を管理します。

ライター:渥美 淳一
セキュリティアーキテクト。「ID で守り、ID を守る」がセキュリティの本質であり、未来への入り口だと考えている。

目次

Bicep とは?

Bicep は Microsoft Azure の設定をファイルに書いてまとめて管理できる仕組みです。

もともと Azure は、ARM テンプレート(Azure Resource Manager テンプレート)というファイルに設定を書いてまとめて管理できますが、「読み書きが少し難しい」という課題があります。それを、人が読み書きしやすい形に改善したものが Bicep です。

たとえば、Azure にストレージを作る場合を見てみましょう。
左が ARM テンプレート、右が Bicep で書いたファイルです。

何ができるの?

Bicep は Azure の設定(ストレージや仮想マシンなど)を管理できます。
Bicep は無料で使えます。
Microsoft のサポートも受けられます。

さらに Bicep 用 Microsoft Graph 拡張(Bicep から Graph API を使えるようにする機能)により、Entra ID の設定も Bicep ファイルに書いてまとめて管理できるようになりました。Azure も Entra ID も同じ Bicep ファイルで管理できる点がメリットです。

Bicep ファイルは Azure CLI を使って実行できます。
Azure CLI からの命令にしたがって Graph API は Entra ID を操作します。

Bicep でできる Entra ID 設定例

  • グループ
  • エンタープライズ アプリ
  • アプリの登録
  • アプリのアクセス権(ロール)の割り当て
  • API のアクセス許可

はじめての Bicep

① Bicep ツールをインストールする

Bicep ツール「Microsoft Visual Studio Code」のインストーラー(今回は VSCodeUserSetup-x64-1.110.1.exe ファイル)をダウンロードして実行します。

「完了」をクリックして Visual Studio Code を実行します。

Visual Studio Code が起動します。

これを日本語にします。拡張機能を表示します。

View > Extensions

「Japanese Language Pack」で検索し、「Install」します。

右下に表示される「Change Language and Restart」します。

日本語になりました。

Bicep をインストールします。拡張機能を表示します。

表示(V) > 拡張機能

「Bicep」で検索し、「インストール」します。

② Bicep から Microsoft Graph を使えるようにする

Bicep をインストールしたら「ファイルの作成」をします。

main.bicep ファイルをつくります。以下の内容で保存します。

targetScope = 'tenant'
extension MG

解説

  • targetScope 行
    この Bicep ファイルは Entra ID テナントに対して設定する

  • extension 行
    bicepconfig.json に書いた MG(Bicep 用 Microsoft Graph 拡張)を使う

main.bicep ファイルと同じフォルダーに bicepconfig.json ファイルをつくります。

ファイル(F) > 新しいファイル

bicepconfig.json ファイルを以下の内容で保存します。

{
  "extensions": {
    "MG": "br:mcr.microsoft.com/bicep/extensions/microsoftgraph/v1.0:1.0.0"
  }
}

これで Bicep 用 Microsoft Graph 拡張(MG)を使う準備が整いました。

③ Entra ID でやりたいことを Bicep ファイルに書く

main.bicep ファイルに「Entra ID ユーザーの表示名を出力して」と書いてみます。

targetScope = 'tenant'
extension MG
param UPN string
resource U 'Microsoft.Graph/users@v1.0' existing = { userPrincipalName: UPN }
output displayname string = U.displayName

解説

  • param 行
    Bicep ファイル実行時に --parameters で指定した UPN を受け取る

  • resource 行
    Microsoft Graph 拡張を使い、UPN と一致する既存ユーザーを参照する

  • output 行
    参照したユーザーの displayName(表示名)を出力する

④ Azure CLI をインストールする

最新の Azure CLI(64 ビット)の MSI をダウンロードして実行します。

インストールされたことをコマンドで確認できます。

PS C:\> az version
{
  "azure-cli": "2.84.0",
  "azure-cli-core": "2.84.0",
  "azure-cli-telemetry": "1.1.0",
  "extensions": {}
}
PS C:\>

⑤ Azure CLI で Bicep ファイルを実行する

まず Entra ID 管理者でログインします。

PS C:\> az login

ログインが要求されます。

ログインした管理者にテナントの Owner 権限を与えて再ログインします。

PS C:\> $AOID = az ad signed-in-user show --query id -o tsv
PS C:\> az role assignment create --scope "/" --role "Owner" --assignee-object-id $AOID --assignee-principal-type User
PS C:\> az logout
PS C:\> az login

main.bicep ファイルを実行します。
指定した Entra ID ユーザーの表示名「スズキ イチロー」を確認できます。

PS C:\> cd .\Users\xxxxx\Desktop\Bicep

PS C:\Users\xxxxx\Desktop\Bicep> az deployment tenant create --location japaneast --template-file main.bicep --parameters UPN='ichiro@nosbiz.biz' { (中略) "outputs": { "displayname": { "type": "String", "value": "スズキ イチロー" } }, (中略) }

解説

  • az deployment tenant create
    Bicep ファイルを実行するコマンド
    (--location が必須です)

  • --location japaneast
    東日本リージョンを指定して実行

  • --template-file main.bicep
    実行したい Bicep ファイル

  • --parameters UPN='ichiro@nosbiz.biz'
    表示名を確認したいユーザー
    (main.bicep ファイルに UPN の値を渡します)

Bicep で Entra ID を管理する

グループを管理する

グループをつくってユーザーを追加する

newgroup.bicep ファイルをつくります。

targetScope = 'tenant'
extension MG
param UPN string param GROUP string
resource U 'Microsoft.Graph/users@v1.0' existing = { userPrincipalName: UPN }
resource G 'Microsoft.Graph/groups@v1.0' = { displayName: GROUP uniqueName: GROUP mailNickname: GROUP mailEnabled: false securityEnabled: true members: { relationships: [ U.id ] } }
output userid string = U.id output groupid string = G.id

解説

  • param 行
    Bicep ファイル実行時に --parameters で指定した値を受け取る

  • resource 行
    Microsoft Graph 拡張を使い、グループをつくって名前を GROUP にし、
    UPN と一致する既存ユーザーの id をグループに追加する

  • output 行(オプション)
    つくったグループと追加したユーザーの id を知りたいとき

newgroup.bicep ファイルを実行します。

PS C:\Users\xxxxx\Desktop\Bicep> az deployment tenant create --location japaneast --template-file newgroup.bicep --parameters UPN='ichiro@nosbiz.biz' GROUP='G1'
{
(中略)
    "outputs": {
      "groupid": {
        "type": "String",
        "value": "gggggggg-1234-5678-9000-gggggggggggg"
      },
      "userid": {
        "type": "String",
        "value": "uuuuuuuu-1234-5678-9000-uuuuuuuuuuuu"
      }
    },
(中略)
}

解説

  • az deployment tenant create
    Bicep ファイルを実行するコマンド
    (--location が必須です)

  • --location japaneast
    東日本リージョンを指定して実行

  • --template-file newgroup.bicep
    実行したい Bicep ファイル

  • --parameters UPN='ichiro@nosbiz.biz' GROUP='G1'
    追加したいユーザーと作成したいグループ名
    (newgroup.bicep ファイルに渡します)

ichiro@nosbiz.biz を追加したグループ「G1」がつくられます。

既存のグループにユーザーを追加する

groupadd.bicep ファイルをつくります。

targetScope = 'tenant'
extension MG
param UPN string param GROUP string
resource U 'Microsoft.Graph/users@v1.0' existing = { userPrincipalName: UPN }
resource G 'Microsoft.Graph/groups@v1.0' existing = { uniqueName: GROUP }
resource ADD 'Microsoft.Graph/groups@v1.0' = { uniqueName: GROUP displayName: G.displayName mailNickname: G.mailNickname mailEnabled: false securityEnabled: true members: { relationships: [ U.id ] } }

解説

  • resource 行
    resource G で既存のグループ(GROUP)を参照する
    resource ADD で既存のグループ(GROUP)にユーザーを追加する

groupadd.bicep ファイルを実行します。

PS C:\Users\xxxxx\Desktop\Bicep> az deployment tenant create --location japaneast --template-file groupadd.bicep --parameters UPN='jiro@nosbiz.biz' GROUP='G1'

解説

  • --parameters UPN='jiro@nosbiz.biz' GROUP='G1'
    追加したいユーザーと既存のグループ名
    (groupadd.bicep ファイルに渡します)

jiro@nosbiz.biz が既存のグループ「G1」に追加されます。

グループからユーザーを削除する

az rest コマンドで削除します。
(グループとユーザーの id を指定します)

PS C:\Users\xxxxx\Desktop\Bicep> az rest --method DELETE --url 'https://graph.microsoft.com/v1.0/groups/gggggggg-1234-5678-9000-gggggggggggg/members/uuuuuuuu-1234-5678-9000-uuuuuuuuuuuu/$ref'

ichiro@nosbiz.biz がグループ「G1」から削除されます。

グループを削除する

az rest コマンドで削除します。
(グループの id を指定します)

PS C:\Users\xxxxx\Desktop\Bicep> az rest --method DELETE --url 'https://graph.microsoft.com/v1.0/groups/gggggggg-1234-5678-9000-gggggggggggg'

グループ「G1」が Entra ID から削除されます。

アプリケーションを管理する

アプリへのアクセス権をグループに与える

appgroup.bicep ファイルをつくります。

targetScope = 'tenant'
extension MG
param APP string param ROLE string param GROUP string
resource R 'Microsoft.Graph/appRoleAssignedTo@v1.0' = { resourceId: APP appRoleId: ROLE principalId: GROUP }

解説

  • param 行
    Bicep ファイル実行時に --parameters で指定した値を受け取る

  • resource 行
    Microsoft Graph 拡張を使い、APP の ROLE を GROUP に与える

appgroup.bicep ファイル実行時に --parameters で指定する値を確認します。
(APP、ROLE、GROUP の 3 つ)

エンタープライズアプリ「A1」の id を確認します。
Entra ID を操作する az ad コマンドで確認できます。
sp list はサービスプリンシパル(エンタープライズアプリのこと)を表示します。

PS C:\> az ad sp list --display-name "A1" --query "[0].id"
"aaaaaaaa-1234-5678-9000-aaaaaaaaaaaa"

このアプリのアクセス権(今回は User ロール)の id を確認します。

PS C:\> az ad sp show --id "aaaaaaaa-1234-5678-9000-aaaaaaaaaaaa" --query "appRoles[]"
[
  {
    "allowedMemberTypes": [
      "User"
    ],
    "description": "User",
    "displayName": "User",
    "id": "rrrrrrrr-1234-5678-9000-rrrrrrrrrrrr",
    "isEnabled": true,
    "origin": "Application",
    "value": null
  }
]

このロールを与えたいグループ「G1」の id を確認します。

PS C:\> az ad group list --display-name "G1" --query "[0].id"
"gggggggg-1234-5678-9000-gggggggggggg"

appgroup.bicep ファイルを実行します。
確認した 3 つの id を --parameters で指定します。

PS C:\Users\xxxxx\Desktop\Bicep> az deployment tenant create --location japaneast --template-file appgroup.bicep --parameters APP="aaaaaaaa-1234-5678-9000-aaaaaaaaaaaa" ROLE="rrrrrrrr-1234-5678-9000-rrrrrrrrrrrr" GROUP="gggggggg-1234-5678-9000-gggggggggggg"

A1 アプリの User ロールが G1 グループに与えられます。


G1 グループのユーザーでマイアプリにアクセスします。
https://myapps.microsoft.com

A1 アプリ(のアイコン)が追加されます。

アイコンをクリックすると A1 アプリを利用(シングルサインオン)できます。

アプリのアクセス権をグループからはく奪する

まずアプリ、ロール、グループの id をそれぞれ変数に格納します。
次にそれらを指定してアプリのロール割り当ての id を確認します。

PS C:\> $APP   = "aaaaaaaa-1234-5678-9000-aaaaaaaaaaaa"
PS C:\> $ROLE  = "rrrrrrrr-1234-5678-9000-rrrrrrrrrrrr"
PS C:\> $GROUP = "gggggggg-1234-5678-9000-gggggggggggg"
PS C:\> az rest --method get --url "https://graph.microsoft.com/v1.0/servicePrincipals/$APP/appRoleAssignedTo" --query "value[?principalId=='$GROUP' && appRoleId=='$ROLE'].id | [0]" "sF-3VpxRikaedr3D__wEi92zNP6wG1hOruVneAvUBEE"

アプリのロール割り当ての id を指定して削除します。

PS C:\> az rest --method delete --url "https://graph.microsoft.com/v1.0/servicePrincipals/$APP/appRoleAssignedTo/sF-3VpxRikaedr3D__wEi92zNP6wG1hOruVneAvUBEE"

G1 グループに与えられていた A1 アプリの User ロールがはく奪されます。


G1 グループのユーザーでマイアプリにアクセスします。
https://myapps.microsoft.com

A1 アプリ(のアイコン)が削除されます。
つまり A1 アプリを利用(シングルサインオン)できなくなります。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND