【認証を自動化!】完全自動化でAzure PowerShellを実行する
【認証を自動化!】証明書認証でAzure PowerShellを完全自動実行する この記事の内容 サービスプリンシパルを使ってAzure PowerShellの認証を完全自動化する方法を紹介します ユーザーID・パスワードではなく、証明書認証を使うことで安全な無人実行を実現します 自己署名証明書の作成から、サービスプリンシパルの登録、ロール割り当て、スクリプト実行までを網羅します クライアントシークレット(文字列)を使う方法は危険であり、証明書認証が推奨される理由を解説します 一度設定すれば、スクリプトを叩くだけで認証不要にAzure操作が可能になります なぜ認証を自動化したいのか VMを定時に自動シャットダウンして、使うときだけ起動したい——そういった用途は多くの方が経験されていると思います。しかし「使うたびにポータルへログインして、サブスクリプションを選んで、VMを探して起動する」という操作は非常に手間がかかります。 PowerShellスクリプトで自動化しようにも、Connect-AzAccount による対話的な認証が毎回必要になり、真の意味での無人実行ができません。 この問題を解決するのが、サービスプリンシパル+証明書認証の組み合わせです。 サービスプリンシパルとは 通常のAzure操作は「ユーザープリンシパル」——つまり人間のアカウント——で行います。これに対してサービスプリンシパルは、スクリプトやアプリケーションが使うためのアカウント(昔でいうサービスアカウント)です。 サービスプリンシパルに必要な権限を付与しておけば、スクリプトがそのサービスプリンシパルとして認証・実行できるようになります。 なぜ証明書認証なのか サービスプリンシパルの認証方式には大きく2種類あります。 方式 概要 安全性 クライアントシークレット 文字列(パスワード)での認証 低い 証明書認証 秘密鍵を使った証明書ベースの認証 高い クライアントシークレットはスクリプトに文字列を埋め込む必要があり、スクリプトを他者に見られた場合にサービスプリンシパルを乗っ取られるリスクがあります。 証明書認証では、秘密鍵がローカルのWindowsの証明書ストアにのみ保存されます。Azureに登録されるのは公開鍵のみです。そのため、このPCの現在のユーザーでしか認証できない構造になっており、スクリプト自体をGitリポジトリなどに公開しても安全です。 事前準備:Azure PowerShellのインストール Azure PowerShellモジュール(Az)がインストールされていない場合は、管理者権限のPowerShellで以下を実行します。 # 既存の AzureRM モジュールを削除(競合防止) Uninstall-Module AzureRM -AllVersions # Az モジュールをインストール Install-Module Az -AllowClobber -Scope AllUsers インストール済みのモジュール一覧は以下で確認できます。 Get-InstalledModule 手順1:自己署名証明書の作成 まずローカルのWindowsに自己署名証明書を作成します。この証明書の秘密鍵はこのPCにのみ保存されます。 $cert = New-SelfSignedCertificate ` -CertStoreLocation "Cert:\CurrentUser\My" ` -Subject "CN=youtube-example" ` -KeySpec KeyExchange CertStoreLocation:現在のユーザーの証明書ストアに保存します Subject:証明書の識別名(任意の名前でOK) 作成後、MMC(mmc.exe)→「スナップインの追加と削除」→「証明書」→「現在のユーザー」で、個人フォルダに証明書が作成されていることを確認できます。「この証明書に対応する秘密キーを持っています」と表示されていれば正しく作成されています。 ...