Slide 1

Slide 1 text

Microsoft Entra ID認証 サービスプリンシパル シークレット / 証明書 マネージドID Azure外でもマネージドID @ebi Masahiko Ebisuda

Slide 2

Slide 2 text

日本ビジネスシステムズ株式会社 胡田 昌彦(えびすだ まさひこ) Youtube https://youtube.com/@ebibibi 自己紹介 こんな方にオススメ!  企業の情報システム部で働く方  一般ユーザーだけど、コンピューターに興味 があって、もっと詳しくなりたい方  Windows, Azure, M365等のMicrosoft 関連技術に興味がある方 チャンネル登録よろしくお願いします!

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

最終的にやりたいことは 「トークン」を取得したうえで 「API」を叩くことです ※ポータルからの操作でもコマンド操作でもアプリケーションでの操作でも 最後の最後はトークン付きでAPIがたたかれています

Slide 11

Slide 11 text

何を言っているのかわからない? まずは実際にやってみましょう! Resource Groups - Create Or Update - REST API (Azure Resource Management) | Microsoft Docs https://docs.microsoft.com/ja- jp/rest/api/resources/resource-groups/create-or-update

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

トークンを https://jwt.io/ でデコードしてみましょう

Slide 14

Slide 14 text

トークンさえ入手できればよい それをAPIに投げればよい

Slide 15

Slide 15 text

誰がどうやって トークンを取得するのか?

Slide 16

Slide 16 text

誰がどうやってトークンを取得するのか? 様々なバリエーションがある Microsoft ID プラットフォームの認証フローとアプリのシナ リオ - Microsoft Entra | Microsoft Docs https://docs.microsoft.com/ja-jp/azure/active- directory/develop/authentication-flows-app- scenarios#scenarios-and-supported-authentication- flows ※日本語版は誤植が過去あったので注意)

Slide 17

Slide 17 text

誰が  ユーザープリンシパル  サービスプリンシパル  マネージドID どうやって  対話操作  資格情報 他にも色々あるけどまずはこれだけわかれば 「自動化」程度なら困らない(と思う)

Slide 18

Slide 18 text

基本の基本 ユーザーが対話的に認証する

Slide 19

Slide 19 text

誰が  ユーザープリンシパル  サービスプリンシパル  マネージドID どうやって  対話操作  資格情報

Slide 20

Slide 20 text

サービス ユーザープリンシパルが対話操作でトー クンを取得するパターン

Slide 21

Slide 21 text

対話操作 サービス ユーザープリンシパルが対話操作でトー クンを取得するパターン

Slide 22

Slide 22 text

対話操作 トークン取得 サービス ユーザープリンシパルが対話操作でトー クンを取得するパターン

Slide 23

Slide 23 text

対話操作 トークン取得 サービス ユーザープリンシパルが対話操作でトー クンを取得するパターン

Slide 24

Slide 24 text

PowerShell # 認証する Connect-AzAccount # 現在のコンテキストを確認する(認証したID,AADテナント,対象のサブスクリプション等) Get-AzContext # 対象サブスクリプションが適切でない場合には切り替える #Get-AzSubscription #Select-AzSubscription -Subscription # トークンが取得できることを確認する Get-AzAccessToken $token = (Get-AzAccessToken).token # リソースグループを作成する $subscriptionId = (Get-AzContext).Subscription.Id $resourceGroupName = "testrg1" $url = "https://management.azure.com/subscriptions/${subscriptionId}/resourcegroups/${resourceGroupName}?api- version=2021-04-01" $headers = @{ "Authorization" = "Bearer $token" "Content-type" = "application/json" } $body = '{location:"JapanEast"}' Invoke-RestMethod -Method PUT -Uri $url -Headers $headers -Body $body

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

専用のコマンドレットが存在 ※認証済みなら裏でトークンを取得して APIに投げてくれる

Slide 27

Slide 27 text

PowerShell # 認証する Connect-AzAccount # トークンを取得する $token = (Get-AzAccessToken).token # リソースグループを作成する $subscriptionId = (Get-AzContext).Subscription.Id $resourceGroupName = "testrg1" $url = "https://management.azure.com/subscriptions/${subscriptionId}/resourcegroups/$ {resourceGroupName}?api-version=2021-04-01" $headers = @{ "Authorization" = "Bearer $token" "Content-type" = "application/json" } $body = '{location:"JapanEast"}' Invoke-RestMethod -Method PUT -Uri $url -Headers $headers -Body $body

Slide 28

Slide 28 text

PowerShell # 認証する Connect-AzAccount # リソースグループを作成する New-AzResourceGroup -Name testrg2 -Location JapanEast

Slide 29

Slide 29 text

PowerShell # 認証する Connect-AzAccount # リソースグループを作成する New-AzResourceGroup -Name testrg2 -Location JapanEast 対話的な認証では自動化できない!

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

誰が  ユーザープリンシパル  サービスプリンシパル  マネージドID どうやって  対話操作  資格情報

Slide 32

Slide 32 text

サービスプリンシパルが資格情報でトー クンを取得するパターン サービス

Slide 33

Slide 33 text

サービスプリンシパルが資格情報でトー クンを取得するパターン 資格情報 サービス

Slide 34

Slide 34 text

サービスプリンシパルが資格情報でトー クンを取得するパターン 資格情報 トークン取得 サービス

Slide 35

Slide 35 text

サービスプリンシパルが資格情報でトー クンを取得するパターン 資格情報 トークン取得 サービス

Slide 36

Slide 36 text

 

Slide 37

Slide 37 text

サービスプリンシパル / パスワードベースの認証 1. AADにアプリケーションを登録しサービスプリンシパルを作成する - アプリケーション - サービスプリンシパル 2. サービスプリンシパルにRBACで権限を付与する 3. シークレットを作成する 4. PowerShellでサービスプリンシパルとして認証する PowerShell $applicationId = "" $clientSecret = "" $tenantId = "" $securedSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential($applicationId, $securedSecret) Connect-AzAccount -ServicePrincipal -Tenant $tenantId -Credential $creds Get-AzContext Get-AzAccessToken New-AzResourceGroup -Name testrg3 -Location JapanEast

Slide 38

Slide 38 text

サービスプリンシパル / パスワードベースの認証 1. AADにアプリケーションを登録しサービスプリンシパルを作成する - アプリケーション - サービスプリンシパル 2. サービスプリンシパルにRBACで権限を付与する 3. シークレットを作成する 4. PowerShellでサービスプリンシパルとして認証する PowerShell $applicationId = "" $clientSecret = "" $tenantId = "" $securedSecret = ConvertTo-SecureString $clientSecret -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential($applicationId, $securedSecret) Connect-AzAccount -ServicePrincipal -Tenant $tenantId -Credential $creds Get-AzContext Get-AzAccessToken New-AzResourceGroup -Name testrg3 -Location JapanEast シークレットを生で書くのはダメ!

Slide 39

Slide 39 text

サービスプリンシパル / 証明書ベースの認証 1. AADにアプリケーションを登録しサービスプリンシパルを作成する - アプリケーション - サービスプリンシパル 2. サービスプリンシパルにRBACで権限を付与する 3. (どこで作成してもいいが、今回はローカルのWindows上で)証明書を生成する 4. サービスプリンシパルに証明書をアップロードする 5. PowerShellでサービスプリンシパルとして認証する PowerShell $applicationId = "" $tenantId = "" # 証明書作成 New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" ` -Subject "CN=CertforSP" -KeySpec KeyExchange $Thumbprint = (Get-ChildItem cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq "CN=CertforSP" })[0].Thumbprint # 認証 Connect-AzAccount -ServicePrincipal -CertificateThumbprint $Thumbprint ` -ApplicationId $applicationId -TenantId $tenantId Get-AzContext Get-AzAccessToken New-AzResourceGroup -Name testrg4 -Location JapanEast

Slide 40

Slide 40 text

サービスプリンシパル / 証明書ベースの認証 1. AADにアプリケーションを登録しサービスプリンシパルを作成する - アプリケーション - サービスプリンシパル 2. サービスプリンシパルにRBACで権限を付与する 3. (どこで作成してもいいが、今回はローカルのWindows上で)証明書を生成する 4. サービスプリンシパルに証明書をアップロードする 5. PowerShellでサービスプリンシパルとして認証する PowerShell $applicationId = "" $tenantId = "" # 証明書作成 New-SelfSignedCertificate -CertStoreLocation "cert:\CurrentUser\My" ` -Subject "CN=CertforSP" -KeySpec KeyExchange $Thumbprint = (Get-ChildItem cert:\CurrentUser\My\ | Where-Object {$_.Subject -eq "CN=CertforSP" })[0].Thumbprint # 認証 Connect-AzAccount -ServicePrincipal -CertificateThumbprint $Thumbprint ` -ApplicationId $applicationId -TenantId $tenantId Get-AzContext Get-AzAccessToken New-AzResourceGroup -Name testrg4 -Location JapanEast 証明書の管理がめんどくさい!

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

誰が  ユーザープリンシパル  サービスプリンシパル  マネージドID どうやって  対話操作  資格情報

Slide 44

Slide 44 text

Azure上のリソースに を用意してくれる

Slide 45

Slide 45 text

Azure VM上でマネージドIDのアクセストー クンを取得する Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oaut h2/token?api-version=2018-02- 01&resource=https%3A%2F%2Fmanagement.azure.com %2F’ ` -Headers @{Metadata=“true”} 169.254.169.254 というIPアドレスからトークンが取得できる! マネージドIDがONであれば何もしなくてもいきなりトークンが取れる!

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

How managed identities for Azure resources work with Azure virtual machines - Managed identities for Azure resources | Microsoft Learn https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-managed-identities-work-vm

Slide 49

Slide 49 text

 Microsoft Entra IDにサー ビスプリンシパルを作成  証明書作成、登録、更新  トークン取得のProxy

Slide 50

Slide 50 text

PowerShell # 認証する Connect-AzAccount # リソースグループを作成する New-AzResourceGroup -Name testrg2 -Location JapanEast 対話的な認証では自動化できない!

Slide 51

Slide 51 text

PowerShell # 認証する Connect-AzAccount -Identity # リソースグループを作成する New-AzResourceGroup -Name testrg2 -Location JapanEast パスワードも証明書も必要ない! 超簡単!

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

No content

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

IMDS_ENDPOINT= http://localhost:40342 IDENTITY_ENDPOINT= http://localhost:40342/metadata/identity/oauth2/token

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

PowerShell # 認証する Connect-AzAccount -Identity # リソースグループを作成する New-AzResourceGroup -Name testrg2 -Location JapanEast パスワードも証明書も必要ない! 超簡単!

Slide 67

Slide 67 text

ファイルにアクセス出来ない ケースがあるので注意 ※原因知ってる人いたら教えてください。バグ?

Slide 68

Slide 68 text

No content

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content