その他

Microsoftのライセンス付与をシステマティックにやる

Microsoftのライセンス付与どうやってますか?

迷える情シスの皆さんこんにちは、「おかしん(okash1n)」こと岡村 慎太郎です。

最近全然違う方面から似たような質問をされたので、書いてみたいと思います。Microsoft 365とか、EMSだとかEntraなどなどMicrosoftの各種ライセンスのユーザーへの付与って皆さんどうやってますか?

例えば考えうるシナリオとして以下のようなパターンがあると思います

  • 全従業員にEntra IDとIntuneとDefenderは付与
  • 営業部にはTeamsも付与
  • マーケティング部にはFormも付与

これらはMicrosoft 365 Business PremiumやMicrosoft 365 E5などを持っていたら、1つのライセンスにすべて含まれていますが、各アプリのオンオフを別途制御する必要があります。

結論から言うと「セキュリティグループ」に対してライセンスを付与し、グループのIn/OutをAPIやIPaaSなどで制御する、のが一番スマートだと思いますが、この課題について色々と整理しつつ書いていきます。

Microsoft 365 管理センターからやる場合

例えばMicrosoft 365 Business Premiumなどは複数のアプリがライセンスに含まれていて、どのアプリを有効にするかなども全員一律に行おうと思うと、各ユーザーに対して管理画面からポチポチと付与しているとなかなか大変だと思います。

テンプレート機能は便利

Microsoft 365 管理センターには「ユーザーテンプレート」という機能があります。
この機能を利用して、付与したいライセンスおよび有効にしておきたいアプリを予め保存しておくことで、入社対応などが楽にできます。

ただし、このテンプレート機能は新規作成時にしか使えないので、権限変更や異動の対応の時には利用できません。

Graph APIでやる

ということで、何かしらプログラムを書くなどして「この部署だったらこのライセンス」といった手段が一つ思い浮かびますが、強くオススメしません。

Graph APIでやるのはとてもしんどい

ライセンス付与を操作するGraph API

一応GraphAPIにもライセンスを付与する為のAPIが用意されており、 POST /users/{id | userPrincipalName}/assignLicenseでライセンスを付与することが出来ます。上記ページに記載の通り、以下のようなリクエストを投げると自身にライセンス付与ができます。

POST https://graph.microsoft.com/v1.0/me/assignLicense
Content-type: application/json

{
    "addLicenses": [
        {
            "disabledPlans": [
                "8a256a2b-b617-496d-b51b-e76466e88db0"
            ],
            "skuId": "84a661c4-e949-4bd2-a560-ed7766fcaf2b"
        },
        {
            "disabledPlans": [],
            "skuId": "f30db892-07e9-47e9-837c-80727f46fd3d"
        }
    ],
    "removeLicenses": []
}

この skuId がやっかいで、まずこれを調べるのも一苦労です。詳細は割愛しますが、 https://graph.microsoft.com/v1.0/subscribedSkus のエンドポイントを叩くとテナントが所有しているライセンスの一覧と skuId を調べる事ができます。

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#subscribedSkus",
    "value": [
        {
            "accountName": "Sample account One",
            "accountId": "f97aeefc-af85-414d-8ae4-b457f90efc40",
            "appliesTo": "User",
            "capabilityStatus": "Enabled",
            "consumedUnits": 14,
            "id": "48a80680-7326-48cd-9935-b556b81d3a4e_c7df2760-2c81-4ef7-b578-5b5392b571df",
            "prepaidUnits": {
                "enabled": 25,
                "lockedOut": 0,
                "suspended": 0,
                "warning": 0
            },
            "servicePlans": [
                {
                    "servicePlanId": "8c098270-9dd4-4350-9b30-ba4703f3b36b",
                    "servicePlanName": "ADALLOM_S_O365",
                    "provisioningStatus": "Success",
                    "appliesTo": "Company"
                }
            ],
            "skuId": "c7df2760-2c81-4ef7-b578-5b5392b571df",
            "skuPartNumber": "ENTERPRISEPREMIUM",
            "subscriptionIds": ["43d26afe-cb98-48b9-acc4-ae3ef2ac6c51"]
        },
        {
            "accountName": "Sample account Two",
            "accountId": "ee045480-0260-4c1e-b946-55842502229c",
            "appliesTo": "User",
            "capabilityStatus": "Suspended",
            "consumedUnits": 14,
            "id": "48a80680-7326-48cd-9935-b556b81d3a4e_d17b27af-3f49-4822-99f9-56a661538792",
            "prepaidUnits": {
                "enabled": 0,
                "lockedOut": 0,
                "suspended": 25,
                "warning": 0
            },
            "servicePlans": [
                {
                    "servicePlanId": "f9646fb2-e3b2-4309-95de-dc4833737456",
                    "servicePlanName": "CRMSTANDARD",
                    "provisioningStatus": "Disabled",
                    "appliesTo": "User"
                }
            ],
            "skuId": "d17b27af-3f49-4822-99f9-56a661538792",
            "skuPartNumber": "CRMSTANDARD",
            "subscriptionIds": ["15c301e0-c769-4f12-bab1-1e8519a7a6f1"]
        }
    ]
}

例えばこんなレスポンスが返ってきます。これは少し省略したものになっていますが、レスポンスの中のservicePlans がそのライセンスに含まれているアプリです。E5だったらものすごい数が表示されます。

お気づきになったと思いますが、付与の際にアプリのオンオフも制御しようと思うと、servicePlans.servicePlanId も全部調べないといけません。かなりしんどいです。やってみたい人は以下の記事がおすすめです(本人に掲載許可を取っています)

グループにライセンスを付与する(オススメ)

付与の為の型を作るという観点では、これが一番楽だと思います。

やり方

グループを作る

まずはグループを作ります(今回はセキュリティグループでやります)。Entraの管理画面からでも、Microsoft 365管理センターでもどちらでも構いませんが、実際にライセンスを付与するのはMicrosoft 365管理センターからじゃないと出来ません。Entraのグループの画面を見ると、「ライセンス」という選択肢が見えると思います。そうです、Microsoftのグループにはライセンスを付与することができるのです。

管理センターからグループにライセンスを付与

グループにライセンスを付与する導線はEntra IDの方にはなく、Microsoft 365 管理センターにしかありません。また、グループの画面からは付与出来ないので、「ライセンス」の画面から付与する必要があります。今回はMicrosoft 365 E5 Developerを付与していきます。

わかりやすくするため、先程作った「lmg-test-core」に「Azure Information Protection Premium P2」だけを付与します。(lmgはLicense Management Groupの略)

このグループをEntra ID管理画面から見てみるとE5が付与されており、1つだけサービスが有効になっています。

このグループに何もライセンスの当たっていないユーザーを追加してみます。

するとこのユーザーにはグループに付与されたライセンスがアプリのオンオフも含めて継承されます。

では、このユーザーが部署異動をするか、新たにアプリが必要になった場合はどうすれば良いか。例として「Azure Rights Management Premium」を追加付与するためのグループをもう一つ作ります(実際は最初の例でいくとTeams付与用のグループを作ることになります)

先ほどのユーザーをこのグループにも追加すると複数のグループから継承された2つのアプリが有効になっていることがわかります。

よって、最初の例に戻ると全従業員に付与するアプリを揃えた動的グループを作っておき、全従業員がそのグループに入るようにしておきます。職種や問い合わせに応じて、ライセンスやアプリを追加するためのグループにも追加してあげる、という方法で簡単にライセンス付与を制御することができます。動的グループを使えばかなり楽に設計することも可能でしょう。

この方法の良いところは、APIやIPaaS経由で処理するのが楽ということです。

プログラムから付与する

Graph API

ライセンスを直接付与する為のassignLicense は先程述べたように非常に取り扱いが難しいですが、グループにユーザーを追加したり削除したりするのは簡単です

PATCH https://graph.microsoft.com/v1.0/groups/{group-id}
Content-type: application/json

{
  "members@odata.bind": [
    "https://graph.microsoft.com/v1.0/directoryObjects/{id}",
    "https://graph.microsoft.com/v1.0/directoryObjects/{id}",
    "https://graph.microsoft.com/v1.0/directoryObjects/{id}"
    ]
}

このように、追加したいユーザーやグループのオブジェクトIDを一覧化した配列にするか、もしくは繰り返し処理で1ユーザーずつ追加するような処理にすれば簡単です。

Power Automate

Power AutomateでもEntra IDのグループの操作は可能なので、FormsやTeamsなどと組み合わせることで、申請と承認、グループの追加(ライセンスの追加)の自動化処理を組むことも簡単にできます。

弊社エンジニアが書いたブログ記事があるので是非ご参考ください。(なお、記事の内容を実践するには、現在ではPower Automateの有料ライセンスが必要です)

まとめ

  • Microsoftのライセンス付与はグループでやろう
  • グループでやればアプリのオンオフの型も作れて簡単
  • APIやIPaaSからも処理しやすい

ではまた!

okash1n

香川大学医学部医学科中退→SES・情シス・SREを経てクラウドネイティブ入社。趣味はIT。

・有限会社脇屋 代表取締役
・一般社団法人日本ビジネステクノロジー協会 代表理事
・一般社団法人 SRE NEXT 理事
・情シスSlack、BTCONJP、SRENEXT運営