Azure Powershellで非対話型でログインする方法

投稿者: | 5月 18, 2020

 

Azure Powershellで非対話型でログインする方法。これ、だいぶ頭を使った。

Azure Powershellで、Connect-AzAccountでログインをすると以下のようなメッセージが出る。Mac/LinuxだとそのURLとコードを入れて、自分のMSアカウント選択してログイン。
WARNING: To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code ABCDEFGH to authenticate.
なんか、正直たるい。まぁ、どこかのWEBブラウザを開く必要があるし。。。自動化するのも難しい。

コマンドラインだけでログインできないのか?
できた。。。

まず、その前にService Principalというのを理解する必要がある。
Azure PortalにログインをするのにMSアカウントでログインができるが、自動化する場合は、Azure ADに登録された「Application」というものでログインをする。
その「Application」は、ロールを持っていて、Tenant ID、Application IDでクレデンシャルを認識する。

簡単に「Application」の作り方を説明すると、
Azure Portalを開き
Azure AD -> Add Applicationを開き、New registrationをクリック
A944580C BEA4 46F4 806F 95B9B1F06EDA
名前とアカウントタイプとRedirct URIを指定。URIは、http://localhost以外は証明書がいる。
3273AD15 4FD8 4248 B1DE 1531B6A07040
認証の作成をする。証明書とSecretが利用できるが、Secretを使うためにNew Client secretをクリック
87E64D17 717C 40B3 8077 739956823AFC
Descriptionと期限を入力
75C3D9B6 7B9F 45EB AE35 C23740CB9EFD
ValueにSecretが表示される。この時メモしないと2度と再表示ができないので注意

3C80AEE7 F6DD 4CB0 B2EA EBF32D4BC0BF

ロールの作成
Subscrtiption -> IAM –> Add role assigmentをクリック
D403DE79 6B7B 438C BE81 D5DAF26E7F27
ロールとApplicationとの紐付け

64BAB7EF 179A 4111 8278 34A103FB740D
これで「Application」は作成できる。

名前は識別名で実際は、Tenant ID、Application IDが重要。Application IDがユーザ名に相当する。

8A113BFA DCFB 4F68 BBD4 316C1324DE3C

 

 

閑話休題

実際にコマンドラインだけでログインをする方法を記載する
手順は
1. アプリケーションの作成(初回だけ)
2. ロールの割当(初回だけ)
3. ログイン
となる。

1. アプリケーションの作成(初回だけ)
https://docs.microsoft.com/ja-jp/powershell/azure/create-azure-service-principal-azureps?view=azps-3.8.0

アプリケーション名は、Azure_my_login、パスワードはPassword1234Password1234で作成する。有効期限は2024年まで。パスワードと有効期限を細かく指定できるのはPowerShellだけ。
PS /home/tmase> Import-Module Az.Resources
PS /home/tmase> $credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{ StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=”Password1234Password1234“}
PS /home/tmase> $sp = New-AzAdServicePrincipal -DisplayName Azure_my_login -PasswordCredential $credentials
PS /home/tmase> Write-Output $sp

ServicePrincipalNames : {11111111-2222-3333-4444-555555555555, http://Azure_my_login}
ApplicationId         : 11111111-2222-3333-4444-555555555555
ObjectType            : ServicePrincipal
DisplayName           : Azure_my_login
Id                    : 66666666-7777-8888-9999-AAAAAAAAAAAA
Type                  :

 

2. ロールの割当(初回だけ)
この例はContributorで記載しているので注意!
PS /home/tmase> New-AzRoleAssignment -ApplicationId 11111111-2222-3333-4444-555555555555 -RoleDefinitionName “Contributor

RoleAssignmentId   : /subscriptions/XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB/providers/Microsoft.Authorization/roleAssignments/SSSSSSSS-TTTT-UUUU-PPPPPPPPPPPP
Scope              : /subscriptions/XXXXXXXX-YYYY-ZZZZ-AAAA-BBBBBBBBBBBB
DisplayName        : Azure_my_login
SignInName         :
RoleDefinitionName : Contributor
RoleDefinitionId   : b24988ac-6180-42a0-ab88-20f7382dd24c
ObjectId           : 66666666-7777-8888-9999-AAAAAAAAAAAA
ObjectType         : ServicePrincipal
CanDelegate        : False

<参考>作成したApplication
PS /home/tmase> Get-AzADApplication -DisplayName Azure_my_login

DisplayName             : Azure_my_login
ObjectId                : oooooooo-bbbb-jjjj-eeee-cccccccccccc
IdentifierUris          : {http://Azure_my_login}
HomePage                : http://Azure_my_login
Type                    :
ApplicationId           : 11111111-2222-3333-4444-555555555555
AvailableToOtherTenants : False
AppPermissions          :
ReplyUrls               : {}
ObjectType              : Application

 

3. ログイン
https://docs.microsoft.com/ja-jp/powershell/azure/authenticate-azureps?view=azps-3.8.0#code-try-2

Tenant IDを事前に確認しておく。(TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT)
Tenant IDを変数に入れておく
PS /home/tmase> $tenantId=TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT
PS /home/tmase> Write-Output $tenantId
TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT

テスト
ApplicationIDが11111111-2222-3333-4444-555555555555、パスワードがPassword1234Password1234の場合
PS /home/tmase> $pscredential = Get-Credential

PowerShell credential request
Enter your credentials.
User: 11111111-2222-3333-4444-555555555555
Password for user 11111111-2222-3333-4444-555555555555: ********************** (Password1234Password1234)
PS /home/tmase> $tenantId=(Get-AzContext).Tenant.Id
PS /home/tmase> Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
WARNING: The provided service principal secret will be included in the ‘AzureRmContext.json’ file found in the user profile ( /home/tmase/.Azure ). Please ensure that this directory has appropriate protections.

Account                              SubscriptionName TenantId                             Environment
——-                              —————- ——–                             ———–
11111111-2222-3333-4444-555555555555 従量課金         TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT AzureCloud

〜/.Azure/AzureRmContext.jsonにパスワードやSecretが入っているので注意

テキストに埋め込む場合
TenantIDがTTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT、ApplicationIDが11111111-2222-3333-4444-555555555555、パスワードがPassword1234Password1234の場合

$tenantId=TTTTTTTT-NNNN-AAAA-NNNN-TTTTTTTTTTTT
$passwd = ConvertTo-SecureString “Password1234Password1234” -AsPlainText -Force
$pscredential = New-Object System.Management.Automation.PSCredential(‘11111111-2222-3333-4444-555555555555/id’, $passwd)
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId

 

 

  

コメントを残す