Azure PowerShell スクリプトにて認証画面を出さずログインし、実行したい


※ 2016/11/16 追記

当初の手順にて、Azure Active Directory (AAD) に空のアプリケーションを作る、サービス プリンシパル権限を用いる方法をご紹介しておりましたが、もっとシンプルな方法として、AAD ユーザーを使った自動認証を行うことが可能です。

  1. 管理したい Azure サブスクリプションの AAD の既定のディレクトリにユーザーを追加し、サブスクリプションの共同管理者に設定します。
  1. Azure PowerShell スクリプトの導入部分にて、作成した AAD ユーザーの資格情報を記載し、以下 3 行のコマンドを実行します。 

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

※%Key% の部分に AAD ユーザーのパスワードを設定します。
%ClientID% の部分に、AAD ユーザーのアカウント (UserName@AADName.onmicrosoft.con) を記載します

手順はこれだけです。

上記 3 行のコマンド実行後は、ログイン完了していますので、任意の Azure PowerShell コマンドにてリソースの管理が行えます。
スクリプトにする場合には、AAD の ID とパスワードをファイルに記載することになりますので、スクリプト ファイルの管理には十分にご注意ください。

 

以下、2016/2/23 に公開した原文となります。AAD ユーザーを使いたくないという場合にお役立ていただける手順です。

-------------------------------------------------------------------------

 

こんにちは、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. クラシック ポータルにログインします。
https://manage.windowsazure.com/

1-2. 画面左の一覧から、[ACTIVE DIRECTORY] を選択します。

1-3. [既定のディレクトリ] を選択します。

1-4. 画面上から [アプリケーション] を選択します。

1-5. 画面下から、[追加] をクリックします。

1-6. "実行する作業を選択してください。" というウインドウが出ますので、[組織で開発中のアプリケーションを追加] を選びます。

1-7. 名前については、任意のものを入力ください。種類は Web アプリケーションのままで問題ありません。

1-8. "サインオン URL"、"アプリケーション ID/URI" は、いずれも任意の URL を入れてください。 (例として http://myTestApp とします。) 最後にチェックを押して完了します。

※ 実際の動作にこの URL が使われるわけではありません。

1-9. ポータルの画面に戻り、作成したアプリケーションの画面が表示されます。画面上から [構成] を選択します。

1-10. "クライアント ID" をメモします。

1-11. "キー" の項で、"時間の選択" を 1 年か 2 年に設定し、画面下の [保存] アイコンをクリックします。保存の完了まで数秒待つと、"キー" の項目に文字列があらわれます。

 

<サンプルでの例>

  • クライアント ID:  %ClientID%
  • キー: %Key%

※ 実際には、クライアント ID は GUID という文字列、キーは非常に長い半角文字列になります。

 

上記は、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 http://myTestApp -RoleDefinitionName Contributor

 

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

 

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

補足: 上記のコマンドではロールとして Contributorを設定しています。アクセス権は、これ以外にもロール ベース アクセス制御 (RBAC) に定義したものであれば利用可能です。"Get-AzurermRoleDefinition" コマンドで一覧表示することができます。Owner ロールは全権限を持っており、リスクが高い場合があります。Contributor ロールが一般的です。

 

 

上記で設定は完了です。

 

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

 

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

 

※ 注意事項 ※

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

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

 

参考情報:


Comments (2)

  1. Yamasato より:

    %ClientID% というのは ARM の Azure Active Directory でいう Application ID と同一ですか?

    1. Teppei Ishii より:

      Yamasato 様のご認識のとおりです。
      クラシック ポータルでいう、”クライアント ID” は新ポータルで Application ID という名称の設定になります。

Skip to main content