Azure PowerShell スクリプトにて認証画面を出さずログインし、実行したい (2018/1/29 更新)

※ 2018/1/29 追記

旧 Azure ポータルが廃止となったことに伴い、Azure 新ポータルをベースに手順を更新しました。

 

こんにちは、Azure 技術サポート部の石井です。

 

今回は、新ポータルでAzureリソースマネージャーモード (以下ARM) の管理を Azure PowerShell から行う時、ログイン画面を出さずに、コマンド内でログインさせる方法をご紹介します。Azure PowerShell では、ARMでの管理を行う際に、まずはじめに、"Login-AzureRmAccount" というコマンドを実行しますが、このコマンドを実行すると対話型なログイン画面が出て、Microsoft アカウントを入力しなければなりません。しかしながら、自動化処理の導入の一環などで、Azure PowerShell スクリプトをタスクスケジューラなどで自動実行したい、という要望をお持ちのお客様もいらっしゃるかと思います。下記では当該手順についてご案内します。

 

手順の概要としては、大きく分けると以下になります。

  1. Azure Active Directory に、空のアプリケーションを作成し、アプリケーションの ID とパスワードを作成する。
  2. 入手したアプリケーション ID とパスワードを認証情報にして、Azure PowerShell からログインする。

 

それぞれ、詳細なステップは以下となります。

 

1. Azure Active Directory に、空のアプリケーションを作成し、アプリケーションの ID とパスワードを作成する

1-1. Azure ポータルにログインします。

https://portal.azure.com

1-2. 画面左の [すべてのサービス] から [Azure Active Directory] を選択します。

1-3. 画面左から [アプリの登録] を選択します。

1-4. 画面上から、[新しいアプリケーションの登録] をクリックします。

1-5. "名前"、"アプリケーションの種類"、"サインオン URL" に任意の値を入力してください。 (例として、"アプリケーションの種類" は Web アプリ/API、"サインオン URL" は https://myTestApp とします。) 最後に [作成] を押して完了します。
※ 実際の動作にこの URL が使われるわけではありません。

1-6. ポータルの画面に戻り、作成したアプリケーションを選択します。

1-7. 画面上から [設定] を選択します。

1-8. 画面右から [プロパティ] を選択し、"アプリケーション ID" をメモします。

1-9. [キー] を選択し、"説明"、"有効期限" に任意の値を入力し、画面上の [保存] アイコンをクリックします。保存の完了まで数秒待つと、"値" の項目に文字列があらわれますのでメモします。

<後述のサンプルでは、ここでメモしたアプリケーション ID とキー (パスワード) を使います。>

アプリケーション ID: %ApplicationID%
キー: %Key%
※ 実際には、アプリケーション ID は GUID という文字列、キーは非常に長い半角文字列になります。

 

■参考情報
リソースにアクセスできる Azure Active Directory アプリケーションとサービス プリンシパルをポータルで作成する
/ja-jp/azure/azure-resource-manager/resource-group-create-service-principal-portal

 

上記は、Azure PowerShell でログインするときに用いる ID とパスワードになります。キーは管理者以外に漏えいすると Azure の管理権限がそのまま漏えいしてしまうため、厳重に取り扱いをしてください。

 

2.入手したアプリケーション ID とパスワードを認証情報にして、Azure PowerShell からログインする

2-1. Azure PowerShell で以下の設定をしておきます。

 

 > Login-AzureRmAccount

 

認証ダイアログを経て、以下の結果が出ることを確認します。

 

 Environment           : AzureCloud
Account               : MyAccount@MyDomain.com
TenantId              : %テナントID%
SubscriptionId        : %サブスクリプションID%
CurrentStorageAccount :

 

2-2. Azure にサービス プリンシパル名を登録します。(つまり、手順 1 で作った Web アプリケーション名を登録しておきます。)

 

 > New-AzureRmRoleAssignment -ServicePrincipalName https://myTestApp -RoleDefinitionName Contributor

 

以下のような内容が結果として表示されます。

 

 RoleAssignmentId   : /subscriptions/%サブスクリプションID%/***
Scope              : /subscriptions/%サブスクリプションID%
DisplayName        : testApp  <---- アプリケーション名
SignInName         :
RoleDefinitionName : Contributor
RoleDefinitionId   :***
ObjectId           : ***
ObjectType         : ServicePrincipal

補足: 上記のコマンドではロールとして Contributorを設定しています。アクセス権は、これ以外にもロール ベース アクセス制御 (RBAC) に定義したものであれば利用可能です。ポータルの UI より、各リソース グループや、各リソースへの  IAM (アクセス制御) メニューからもアクセス権が与えられますので、セキュリティを高めたい場合には細かいアクセス権を設定下さい。

"Get-AzurermRoleDefinition" コマンドで一覧表示することができます。Owner ロールは全権限を持っており、アカウント漏洩時などにはリスクが高い場合があります。Contributor ロールが一般的です。

 

 

上記で設定は完了です。

 

2-3. PowerShell スクリプトなどでログインするには、以下のコマンドを入力します。

 

 $secpasswd = ConvertTo-SecureString "%Key%" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("%ApplicationID%", $secpasswd)
Login-AzureRmAccount -ServicePrincipal -Tenant %テナントID% -Credential $mycreds

 

※ 注意事項 ※

パスワードは厳密に管理し、定期的に変更をしていただくことをお勧めします。 スクリプトで使う場合、平文で保存されるので、一例として、管理者のみしかログインができない Windows マシンを 1 台ご用意いただき、その中にアクセス権を設定して配置していただくことが望ましいかと存じます。 物理マシンであれば、ディスクも BitLocker を使って暗号化いただくことで、管理者以外のユーザーの目に触れるリスクは非常に低くなります。

また、それ以外の方法として、Azure Automation の機能を使えば、資格情報は Azure 上に保存されるので、スクリプトを決まったスケジュールで運用されたいのでしたら、Automation の利用もご検討ください。

 

参考情報:

 

補足: 上記のような AAD アプリケーションを作成せず、AAD のユーザー アカウントで自動ログオンを行う方法はセキュリティ上の懸念から、出来なくなりました。