Azure ADでの安全な管理作業

皆さんこんにちは。国井です。

Azure ADで管理ロールを使った作業を行う際、繰り返しの操作があればPowerShellを使って操作したりするようなことってあると思います。そのとき、いちいち資格情報を入力するのが面倒だからという理由で次のようなことをするような方もいらっしゃるのではないかと思います。

$cred=Get-Credential
$cred.password | ConvertFrom-SecureString | Set-Content "password.dat"

$password = Get-Content c:\password.dat | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential "admin@xxxx.onmicrosoft.com", $password
Connect-AzureAD -Credential $credential

便利な機能ではありますが、万が一password.datファイルが盗まれたら?と考えるとぞっとしますし、昨今の標的型攻撃の被害に遭えば、こうした事態は簡単に起こりえることだと思います。

そのため、(どこだったか忘れたけど)MSさんでは管理作業を使うときは次のようなことを推奨しています。

1.マネージドIDを使うこと
2.サービスプリンシパルを使うこと
3.最小権限のアカウントで操作すること

1.と2.はいずれもユーザー名とパスワードを入力しないで管理作業を行う方法です。
ユーザー名とパスワードを入力しないで、どうして安全なの?と思われた方はこの先をお読みください。

マネージドID

マネージドIDとは超絶ざっくり言うとサービスアカウントのことです。
特定のサービスを利用するために用意されたIDでMSサイトによると以下のAzureサービスで利用できるようになっています。

・Azure Virtual Machines
・Azure Virtual Machine Scale Sets
・Azure App Service
・Azure Blueprint
・Azure Functions
・Azure Logic Apps
・Azure Data Factory V2
・Azure API Management
・Azure Container Instances
・Azure Container Registry
・Azure Service Fabric

これらのサービスを管理するときにマネージドIDを利用すると
Azureの管理アカウントのユーザー名とパスワードを使わないでも
管理ができるようになります。
設定方法は、、って書こうと思ったら、既に紹介してくださっているブログがあったので、ご紹介しておきます。

Pz-LinkCard
- URLの記述に誤りがあります。
- URL=https://ymstech.net/blog/azure-managed-id/#Azure_ID

簡単に言うと、特定のサービスだけで利用可能なアクセストークンを発行し、
そのトークンがあれば、管理が可能という仕組みです。
Azure VMの場合であれば、VM作成時にマネージドIDを利用するように設定しておけば、PowerShellからVMを管理するときにアクセストークンを指定して接続することができるようになります。

image

サービスプリンシパルを使う

サービスプリンシパルとはAzure ADのようなID基盤に登録されたサービスのことで、サービスプリンシパルとして登録されたサービスからのみAzure ADによる認証・認可を利用できるようにするという機能です(ちょっと古いですけど、サービスプリンシパルについて書いた説明があるので、こちらもよろしければご覧ください)。サービスプリンシパルを使うと、ユーザー名とパスワードの代わりにアプリケーションを識別する情報を利用したアクセスを実現します。サービスプリンシパルの作り方は次の通りです。

1.
Azure AD管理センターから、[アプリの登録]を新規作成します。これによりサービスプリンシパルが作成されます。
(厳密にいえば、[アプリの登録]を行うことにより作られるエンタープライズアプリケーションがサービスプリンシパルになります)。

image

2.
[アプリの登録]に作成したサービスプリンシパルから発行されるクライアントIDを控えておきます。これが認証におけるユーザー名みたいなものです。

image

3.
[アプリの登録]でクライアントシークレットまたは証明書を作成しておきます。これが認証におけるパスワードみたいなものです。

image

4.
[アプリの登録]でAPIアクセス許可を割り当てます。

image

ここまでができたら、Azure AD(もしくはAzure)の管理を行うクライアントアプリケーション(例えばPowerShellなど)にクライアントIDとクライアントシークレット (または証明書) を登録しておくことで、実行すると管理に必要なアクセストークンを取得できるようになり、管理が始められます。ここまでの話をまとめると、こんな感じのアクセスになります。

image

これを実際に実装しているのが、以前の投稿でPowerShellでAzure ADのログを収集する投稿を書いたこちらになります。

このやり方を応用すれば、様々な管理ができるようになります。例えば、、って書こうと思ったら、こちらもとてもきれいにまとめてくださっている投稿がありました。

最小権限のアカウントを使う

ここまでで見ていただいたマネージドIDとサービスプリンシパルは、いずれもユーザー名/パスワードを入力しなくても管理作業ができる仕組みでした。でも、それってアクセストークンやクライアントシークレットなどの情報が盗まれたら危険なのでは?という心配もありますが、マネージドIDやサービスプリンシパルは特定のサービスでしか利用できないIDであるという点で一定の安全性は担保されているわけです。
それに対してマネージドIDやサービスプリンシパルが利用できない環境がある場合、仕方がないんで、ユーザー名とパスワードを使ってください。その場合、管理作業を行うために必要な最小権限のロールを割り当てるようにしてください。例えば、Connect-AzureADコマンドレットでユーザーを作成するときにグローバル管理者のロールって必要ですか?そんなわけないですよね。

■ ■ ■

ここまでのところで、Azure ADで管理権限を利用した管理作業の方法について見てきました。単純にユーザー名とパスワードを使うだけじゃない管理方法も覚えて、より安全な管理を心がけたいですね。