Azure Stack Hub でシークレットをローテーションする
この記事では、Azure Stack Hub インフラストラクチャのリソースおよびサービスとのセキュリティで保護された通信の維持に役立つ、シークレットのローテーション実行に関するガイダンスを提供します。
概要
Azure Stack Hub はシークレットを使用して、インフラストラクチャのリソースおよびサービスとのセキュリティで保護された通信を維持します。 Azure Stack Hub インフラストラクチャの整合性を維持するために、オペレーターは、組織のセキュリティ要件と一致する頻度でシークレットをローテーションできる必要があります。
シークレットの有効期限が近い場合は、管理者ポータルで次のアラートが生成されます。 シークレットローテーションを完了すると、次のアラートが解決されます。
- 保留中のサービス アカウントのパスワードの有効期限
- 保留中の内部証明書の有効期限
- 保留中の外部証明書の有効期限
警告
有効期限が切れる前に管理者ポータルでトリガーされるアラートには、次の 2 つのフェーズがあります。
- 有効期限の 90 日前になると、警告アラートが生成されます。
- 有効期限の 30 日前になると、重要なアラートが生成されます。
これらの通知を受け取った場合は、シークレットローテーションを完了することが重要です。 これを行わないと、ワークロードが失われ、Azure Stack Hub の再デプロイが自分の費用で必要になることがあります。
アラートの監視と修復の詳細については、「Azure Stack Hubでの正常性とアラートの監視
前提条件
- サポートされているバージョンの Azure Stack Hub を実行し、インスタンスが実行されている Azure Stack Hub バージョンに対して利用可能な最新の修正プログラムを適用することをお勧めします。 たとえば、2408 を実行している場合は、 2408 に利用可能な
最新の修正プログラムがインストールされていることを確認します。 - 計画メンテナンス操作をユーザーに通知します。 可能な限り非営業時間中に、通常のメンテナンス期間をスケジュールします。 メンテナンス操作は、ユーザーのワークロードとポータル操作の両方に影響する可能性があります。
- Azure Stack Hub の証明書署名要求を生成。
- Azure Stack Hub PKI 証明書を準備します。
- シークレットのローテーション中に、オペレーターはアラートが開いて自動的に閉じるのに気づくかもしれません。 これは予期される動作であり、アラートは無視してもかまいません。 オペレーターは、PowerShell コマンドレットの Test-AzureStack を使用して、これらのアラートの有効性を確認できます。 オペレーターの場合、System Center Operations Manager を使用して Azure Stack Hub システムを監視すると、システムをメンテナンス モードにすると、これらのアラートが ITSM システムに到達できなくなります。 ただし、Azure Stack Hub システムに到達できなくなった場合でも、アラートは引き続き発生します。
外部シークレットをローテーションする
重要
外部シークレットのローテーション:
- セキュリティで保護されたキーや文字列などの証明書ではないシークレットは、管理者が手動で実行する必要があります。 これには、ユーザーと管理者のアカウントのパスワード、ネットワーク スイッチのパスワードなどがあります。
- 付加価値リソース プロバイダー (RP) シークレット については、別のガイダンスで説明します。
- ベースボード管理コントローラー (BMC) 資格情報 は、この記事で後述 手動プロセスです。
- Azure Container Registry 外部証明書は、この記事で後述 手動のプロセスです。
このセクションでは、外部向けサービスをセキュリティで保護するために使用される証明書のローテーションについて説明します。 これらの証明書は、次のサービスのために Azure Stack Hub Operator によって提供されます。
- 管理者ポータル
- パブリック ポータル
- 管理者の Azure Resource Manager
- グローバルな Azure Resource Manager
- 管理者の Key Vault
- Key Vault
- 管理者拡張機能ホスト
- ACS (Blob、Table、Queue Storage を含みます)
- ADFS1
- Graph1
- Container Registry2
1 Active Directory フェデレーション サービス (ADFS) を使用する場合に適用できます。
2 Azure Container Registry (ACR) を使用する場合に適用できます。
準備
外部シークレットのローテーション前:
シークレットをローテーションする前に、
Test-AzureStack
パラメーターを使用して-group SecretRotationReadiness
PowerShell コマンドレットを実行し、すべてのテスト出力が正常であることを確認します。代わりの外部証明書の新しいセットを準備します。
新しいセットは、Azure Stack Hub PKI 証明書の要件に関する記事に記載されている証明書の仕様に一致している必要があります。
証明機関 (CA) に送信する証明書署名要求 (CSR) を生成します。 証明書署名要求の生成に関する記事に記載された手順を使用します。また、PKI 証明書の準備に関する記事の手順を使用して、これらの要求を Azure Stack Hub 環境で使用するために準備します。 Azure Stack Hub では、次のようなコンテキストで、新しい証明書機関 (CA) からの外部証明書を使用したシークレットのローテーションがサポートされます。
CA からのローテーション CA へのローテーション Azure Stack Hub バージョンのサポート 自己署名 Enterprise 1903 以降 自己署名 自己署名 サポートされていません 自己署名 パブリック* 1803 以降 Enterprise Enterprise 1803 以降。デプロイ時に使用されるものと同じエンタープライズ CA の場合は 1803-1903 Enterprise 自己署名 サポートされていません Enterprise パブリック* 1803 以降 パブリック* Enterprise 1903 以降 パブリック* 自己署名 サポートされていません パブリック* パブリック* 1803 以降 準備する証明書は、PKI 証明書の検証に関する記事に記載された手順を使用して必ず検証してください。
パスワードに
$
、*
、#
、@
、or
)` などの特殊文字が含まれていないことを確認します。PFX 暗号化が TripleDES-SHA1 であることを確認します。 問題が発生した場合は、「Azure Stack Hub PKI 証明書に関する一般的な問題を修復する」を参照してください。
ローテーションに使われる証明書のバックアップを安全なバックアップ場所に格納します。 ローテーションを実行して失敗した場合は、ローテーションを再実行する前に、ファイル共有内の証明書をバックアップ コピーに置き換えます。 バックアップ コピーはセキュリティで保護されたバックアップ場所に保存してください。
ERCS VM からアクセスできるファイル共有を作成します。 ファイル共有は、CloudAdmin ID で読み書きできる必要があります。
ファイル共有にアクセスできるコンピューターから PowerShell ISE コンソールを開きます。 ファイル共有に移動します。ここで、外部証明書を配置するディレクトリを作成します。
Certificates
という名前のファイル共有にフォルダーを作成します。 証明書フォルダー内に、ハブで使用する ID プロバイダーに応じて、AAD
またはADFS
という名前のサブフォルダーを作成します。 たとえば、 .\Certificates\AAD や .\Certificates\ADFS。 ここでは、証明書フォルダーと ID プロバイダー サブフォルダー以外のフォルダーは作成しないでください。手順 2 で作成した新しい代替外部証明書のセットを、手順 6 で作成した .\Certificates\<IdentityProvider> フォルダーにコピーします。 前述のように、ID プロバイダーのサブフォルダーは
AAD
またはADFS
する必要があります。 代替外部証明書のサブジェクトの別名 (SAN) が、azure Stack Hub 公開キー 基盤 (PKI) 証明書の要件 で指定されているcert.<regionName>.<externalFQDN>
形式に従っていることを確認します。Microsoft Entra ID プロバイダーのフォルダー構造の例を次に示します。
<ShareName> │ └───Certificates └───AAD ├───ACSBlob │ <CertName>.pfx │ ├───ACSQueue │ <CertName>.pfx │ ├───ACSTable │ <CertName>.pfx │ ├───Admin Extension Host │ <CertName>.pfx │ ├───Admin Portal │ <CertName>.pfx │ ├───ARM Admin │ <CertName>.pfx │ ├───ARM Public │ <CertName>.pfx │ ├───Container Registry* │ <CertName>.pfx │ ├───KeyVault │ <CertName>.pfx │ ├───KeyVaultInternal │ <CertName>.pfx │ ├───Public Extension Host │ <CertName>.pfx │ └───Public Portal <CertName>.pfx
*Microsoft Entra ID と AD FS に Azure Container Registry を使用する場合に適用されます。
Note
外部コンテナー レジストリ証明書をローテーションする場合は、ID プロバイダーのサブフォルダーに Container Registry サブフォルダーを手動で作成する必要があります。 また、この手動で作成したサブフォルダー内に、対応する .pfx 証明書を格納する必要があります。
回転
外部シークレットをローテーションするには、次の手順を実行します。
次の PowerShell スクリプトを使用して、シークレットをローテーションします。 このスクリプトには、特権エンドポイント (PEP) セッションへのアクセスが必要です。 PEP には、PEP をホストする仮想マシン (VM) 上のリモート PowerShell セッションを介してアクセスします。 統合システムを使用している場合、PEP の 3 つのインスタンスがあり、それぞれ異なるホスト上の VM (Prefix-ERCS01、Prefix-ERCS02、または Prefix-ERCS03) 内で動作しています。 このスクリプトでは、次のステップを実行します。
CloudAdmin アカウントを使用して特権エンドポイントで PowerShell セッションを作成し、セッションを変数として格納します。 この変数は、次の手順でパラメーターとして使用されます。
Invoke-Command を実行し、PEP セッション変数を
-Session
パラメーターとして渡します。次のパラメーターを使用して、PEP セッションで
Start-SecretRotation
を実行します。 詳細については、 Start-SecretRotation リファレンスを参照してください。
# Create a PEP session winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}' $PEPCreds = Get-Credential $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Run secret rotation $CertPassword = ConvertTo-SecureString '<Cert_Password>' -AsPlainText -Force $CertShareCreds = Get-Credential $CertSharePath = "<Network_Path_Of_CertShare>" Invoke-Command -Session $PEPsession -ScriptBlock { param($CertSharePath, $CertPassword, $CertShareCreds ) Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword } -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds) Remove-PSSession -Session $PEPSession
外部シークレットのローテーションには、約 1 時間かかります。 正常に完了すると、コンソールに
ActionPlanInstanceID ... CurrentStatus: Completed
メッセージが表示され、その後にAction plan finished with status: 'Completed'
が表示されます。 「準備」セクションで作成した共有から証明書を削除し、セキュリティで保護されたバックアップ場所に保存します。Note
シークレットのローテーションが失敗した場合は、エラー メッセージの指示に従い、
-ReRun
パラメーターを使用してStart-SecretRotation
を再実行します。Start-SecretRotation -ReRun
シークレットのローテーションの失敗が繰り返される場合は、サポートにお問い合わせください。
必要に応じて、すべての外部証明書が回転されたことを確認するには、次のスクリプトを使用して、 Test-AzureStack検証ツールを実行します。
Test-AzureStack -Include AzsExternalCertificates -DetailedResults -debug
内部シークレットをローテーションする
内部シークレットには、Azure Stack Hub オペレーターの介入なしに Azure Stack Hub インフラストラクチャによって使用されるすべての証明書、パスワード、セキュリティで保護された文字列、キーなどがあります。 内部シークレットのローテーションは、それが侵害された可能性がある場合、または有効期限アラートを受け取った場合にのみ必要です。
内部シークレットをローテーションするには、次の手順を実行します。
次の PowerShell スクリプトを実行します。 内部シークレット ローテーションの場合、[Run Secret Rotation]\(シークレット ローテーションの実行\) セクションでは、Start-SecretRotation コマンドレットに対して
-Internal
パラメーターのみが使用。# Create a PEP Session winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}' $PEPCreds = Get-Credential $PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS_Machine> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) # Run Secret Rotation Invoke-Command -Session $PEPSession -ScriptBlock { Start-SecretRotation -Internal } Remove-PSSession -Session $PEPSession
正常に完了すると、コンソールに
ActionPlanInstanceID ... CurrentStatus: Completed
メッセージが表示され、その後にAction plan finished with status: 'Completed'
が表示されます。Note
シークレットのローテーションが失敗した場合は、エラー メッセージの指示に従い、
-Internal
パラメーターと-ReRun
パラメーターを使用してStart-SecretRotation
を再実行します。Start-SecretRotation -Internal -ReRun
シークレットのローテーションの失敗が繰り返される場合は、サポートにお問い合わせください。
Azure Stack Hub のルート証明書をローテーションする
Azure Stack Hub ルート証明書は、デプロイ中にプロビジョニングされ、有効期限は 5 年です。 2108 以降では、内部シークレットのローテーションでもルート証明書がローテーションされます。 標準のシークレット有効期限アラートは、ルート証明書の有効期限を識別し、日数が 90 (警告) と 30 (重大) のいずれでもアラートを生成します。
ルート証明書をローテーションするには、システムを 2108 に更新し、内部シークレットのローテーションを実行する必要があります。
次の例では、特権エンドポイントを使用して、ルート証明書の有効期限を一覧表示します。
$pep = New-PSSession -ComputerName <ip address> -ConfigurationName PrivilegedEndpoint -Credential $cred -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
$stampInfo = Invoke-Command -Session $pep -ScriptBlock { Get-AzureStackStampInformation }
$rootCert = $stampInfo.RootCACertificates| Sort-Object -Property NotAfter | Select-Object -Last 1
"The Azure Stack Hub root certificate expires on {0}" -f $rootCert.NotAfter.ToString("D") | Write-Host -ForegroundColor Cyan
BMC 資格情報を更新する
ベースボード管理コントローラーは、サーバーの物理的な状態を監視します。 BMC のユーザー アカウント名とパスワードを更新する手順については、OEM (Original Equipment Manufacturer) ハードウェア ベンダーを参照してください。
Note
OEM が追加の管理アプリを提供する場合があります。 他の管理アプリのユーザー名またはパスワードを更新しても、BMC のユーザー名またはパスワードには影響しません。
- OEM の指示に従って、Azure Stack Hub の物理サーバー上で BMC を更新します。 環境内の各 BMC のユーザー名とパスワードは同じである必要があります。 BMC のユーザー名は、16 文字を超えることはできません。
- OEM の指示に従って Azure Stack Hub 物理サーバーの BMC 資格情報を最初に更新する必要がなくなりました。 環境内の各 BMC のユーザー名とパスワードは同じである必要があり、16 文字以内で指定する必要があります。
Azure Stack Hub セッションで特権エンドポイントを開きます。 手順については、「Azure Stack Hub で特権エンドポイントを使用する」を参照してください。
特権エンドポイント セッションを開いた後、次のいずれかの PowerShell スクリプトを実行します。このスクリプトでは、
Invoke-Command
を使用してSet-BmcCredential
を実行します。 省略可能な-BypassBMCUpdate
パラメーターをSet-BMCCredential
と共に使用した場合、BMC の資格情報は更新されません。Azure Stack Hub 内部データストアのみが更新されます。 パラメーターとして特権エンドポイントのセッション変数を渡します。ユーザー名とパスワードの入力を求める PowerShell スクリプトの例を次に示します。
# Interactive Version $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here. $PEPCreds = Get-Credential "<Domain>\CloudAdmin" -Message "PEP Credentials" $NewBmcPwd = Read-Host -Prompt "Enter New BMC password" -AsSecureString $NewBmcUser = Read-Host -Prompt "Enter New BMC user name" $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) Invoke-Command -Session $PEPSession -ScriptBlock { # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional. Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser } Remove-PSSession -Session $PEPSession
ユーザー名とパスワードを変数にエンコードすることもできますが、これは安全性が低くなる可能性があります。
# Static Version $PEPIp = "<Privileged Endpoint IP or Name>" # You can also use the machine name instead of IP here. $PEPUser = "<Privileged Endpoint user for example Domain\CloudAdmin>" $PEPPwd = ConvertTo-SecureString '<Privileged Endpoint Password>' -AsPlainText -Force $PEPCreds = New-Object System.Management.Automation.PSCredential ($PEPUser, $PEPPwd) $NewBmcPwd = ConvertTo-SecureString '<New BMC Password>' -AsPlainText -Force $NewBmcUser = "<New BMC User name>" $PEPSession = New-PSSession -ComputerName $PEPIp -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US) Invoke-Command -Session $PEPSession -ScriptBlock { # Parameter BmcPassword is mandatory, while the BmcUser parameter is optional. Set-BmcCredential -BmcPassword $using:NewBmcPwd -BmcUser $using:NewBmcUser } Remove-PSSession -Session $PEPSession
リファレンス: Start-SecretRotation コマンドレット
Start-SecretRotation コマンドレットは、Azure Stack Hub システムのインフラストラクチャ シークレットのローテーションを行います。 このコマンドレットは、Invoke-Command
パラメーターで PEP セッションを渡す -Session
スクリプト ブロックを使用することによって、Azure Stack Hub の特権エンドポイントに対してのみ実行できます。 既定では、すべての外部ネットワーク インフラストラクチャ エンドポイントの証明書のみのローテーションを行います。
パラメーター | タイプ | 必須 | Position | 既定値 | 説明 |
---|---|---|---|---|---|
PfxFilesPath |
String | いいえ | named | なし | すべての外部ネットワーク エンドポイント証明書を含む \Certificates ルート フォルダーへのファイル共有パスです。 外部シークレットのローテーションを行う場合にのみ必要です。 パスは \Certificates フォルダーで終わる必要があります (\\<IP アドレス>\<共有名>\Certificates など)。 |
CertificatePassword |
SecureString | いいえ | named | なし | -PfXFilesPath で提供されているすべての証明書のパスワード。 外部のシークレットのローテーションを行うときに PfxFilesPath を指定する場合は、必須の値です。 |
Internal |
String | いいえ | named | なし | Azure Stack Hub オペレーターが内部インフラストラクチャ シークレットのローテーションを行うときは、常に Internal フラグを使用する必要があります。 |
PathAccessCredential |
PSCredential | いいえ | named | なし | すべての外部ネットワーク エンドポイント証明書を含む \Certificates ディレクトリへのファイル共有の PowerShell 資格情報。 外部シークレットのローテーションを行う場合にのみ必要です。 |
ReRun |
SwitchParameter | いいえ | named | なし | 試行が失敗した後でシークレットのローテーションが再試行されるときに、常に使用する必要があります。 |
構文
外部シークレットのローテーションの場合
Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]
内部シークレットのローテーションの場合
Start-SecretRotation [-Internal]
外部シークレットのローテーションの再実行の場合
Start-SecretRotation [-ReRun]
内部シークレットのローテーションの再実行の場合
Start-SecretRotation [-ReRun] [-Internal]
例
内部インフラストラクチャ シークレットのみのローテーション
このコマンドは、Azure Stack Hub 環境の特権エンドポイントを使用して実行する必要があります。
Start-SecretRotation -Internal
このコマンドを使用すると、Azure Stack Hub 内部ネットワークに公開されているすべてのインフラストラクチャ シークレットのローテーションが行われます。
外部インフラストラクチャ シークレットのみのローテーション
# Create a PEP Session
winrm s winrm/config/client '@{TrustedHosts= "<IP_address_of_ERCS>"}'
$PEPCreds = Get-Credential
$PEPSession = New-PSSession -ComputerName <IP_address_of_ERCS> -Credential $PEPCreds -ConfigurationName "PrivilegedEndpoint" -SessionOption (New-PSSessionOption -Culture en-US -UICulture en-US)
# Create Credentials for the fileshare
$CertPassword = ConvertTo-SecureString '<CertPasswordHere>' -AsPlainText -Force
$CertShareCreds = Get-Credential
$CertSharePath = "<NetworkPathOfCertShare>"
# Run Secret Rotation
Invoke-Command -Session $PEPsession -ScriptBlock {
param($CertSharePath, $CertPassword, $CertShareCreds )
Start-SecretRotation -PfxFilesPath $CertSharePath -PathAccessCredential $CertShareCreds -CertificatePassword $CertPassword
} -ArgumentList ($CertSharePath, $CertPassword, $CertShareCreds)
Remove-PSSession -Session $PEPSession
このコマンドは、Azure Stack Hub の外部ネットワーク インフラストラクチャ エンドポイントで使用する TLS 証明書のローテーションを行います。