たいちの何か

趣味を中心に車・クラウド・サーバーなどの話を勝手気ままに書いています

Azure - サービスプリンシパルを使ってPoweshellスクリプトでAzureに自動ログインする その1

定常化された作業はスクリプトなどで自動化し省力化することは多々あるかと思います。
もちろんAzureも例に漏れず、自動化することで省力化できる部分はたくさんありますが、多くの人が悩まされていないでしょうか? Azureへのログオン処理 に。

ベタな方法だと、以下のコマンドで都度認証情報を入力するという感じですが、これでは自動化の効果も半減してしまいます。

Add-AzureRMAccount
Add-AzureAccount

今日は、Azureの仕組みを使ってPowershellスクリプトの自動ログインの方法を考えてみたいと思います。  

目次

自動ログオンをするには?

下記リンクにサービスプリンシパルを使って自動ログオンする方法が詳しく載っているのですが、意外と難解なところが多いのでこの記事では簡単にまとめてみようと思います。

docs.microsoft.com

リソースへのアクセスを必要とするアプリやスクリプトがある場合は、アプリの ID を設定し、アプリを独自の資格情報で認証できます。 この ID は、サービス プリンシパルと呼ばれます。 このアプローチを使用すると、以下のことを実行できます。
 ・ユーザー自身のアクセス許可とは異なるアクセス許可を、アプリケーション ID に割り当てることができます。 通常、こうしたアクセス許可は、アプリが行う必要があることに制限されます。
 ・無人スクリプトを実行するときに、証明書を使用して認証できます。

そもそもサービスプリンシパルってなに?

サービスプリンシパルを初めて聞いて、「あれでしょ?」って思った人がいたらすごいと思います。自分も最初、なにこれ?美味しいの?って思いました。

Azureにおけるサービスプリンシパルとは、 Azureのリソースにアクセスするアプリケーションが利用する専用のID を指します。
じゃぁ、アプリケーションがAzureにアクセスするときはサービスプリンシパルが絶対必要なの?という疑問も湧きますが、必須ではありません。
AzureADに設定されたユーザーアカウントを使ってもOKです。

しかし、サービスプリンシパルを使わないと様々な不都合が出てきてしまいます。一例を上げると…

不都合 正しい形
使用しているアカウントの権限でアプリケーションがログイン/操作をしてしまう アカウント乗っ取りなどのインシデントに備えて、必要最低限の権限のみ与えるべき
ユーザが退職などでいなくなったときに、アプリケーションが動かなくなる アプリケーションが利用するアカウントは常に利用可能な状態にする
アプリケーションのログインも、ユーザ本人によるログインも同じユーザ名で記録される 用途や人に応じてログインユーザ名を変える。(セキュリティインシデントが起きた時にログを追跡できなくなる恐れがある)
本来不要な対話型ログオンの仕組みがスクリプトに提供されてしまう アプリケーションは非対話型のログインとする

これらの不都合を解消し、よりセキュアにアプリケーションを稼働させるためのIDが サービスプリンシパル という仕組みです。よりわかりやすい説明がSlideshareにあったのでリンクを張っておきます。

www.slideshare.net

ちなみにAzureポータル上でサービスプリンシパルを確認したい場合は、Azure ADの以下パスにアクセスします。
[Azure Active Directory] - [アプリの登録]

f:id:taitioooo:20170815225241p:plain

サービスプリンシパルの作成方法は?

サービスプリンシパルの作成の方法は大きく分けて[パスワード方式]と[証明書方式]の2種類があります。
さらに[証明書方式]は[自己署名証明書]と[証明機関から発行された証明書]の2通りあります。
個人用途であれば、パスワードや自己署名証明書が使いやすいのではないでしょうか。 Enterprise用途の場合は、セキュリティを考慮すると、証明書方式のどちらかが良いと思います。

方法 必要なもの メリット デメリット
パスワード パスワード文字列 手軽に設定できる Powershellにパスワードか、パスワードのハッシュをセットする必要がある
自己署名証明書 自己署名証明書(いわゆるオレオレ証明書 少し手間はかかるが、パスワードをスクリプト内に書かなくて良い 自己署名なので、信頼性が担保されずアクセス時に警告が出る場合もある
証明機関から発行された証明書 3rdParty発行の証明書 第3者によって信頼された証明書を使うため信頼性が保たれる 取得にお金がかかる場合は殆ど

ここまででサービスプリンシパルの役割は理解できたでしょうか。
次回は実際にサービスプリンシパルを作成し、Powershellで自動ログオンする方法を紹介したいと思います。

Copyright © 2014 - taitioooo. All Rights Reserved.