Azure Stack Hub でシークレットをローテーションする
この記事では、Azure Stack Hub インフラストラクチャのリソースおよびサービスとのセキュリティで保護された通信の維持に役立つ、シークレットのローテーション実行に関するガイダンスを提供します。
概要
Azure Stack Hub はシークレットを使用して、インフラストラクチャのリソースおよびサービスとのセキュリティで保護された通信を維持します。 Azure Stack Hub インフラストラクチャの整合性を維持するために、オペレーターは、組織のセキュリティ要件と一致する頻度でシークレットをローテーションできる必要があります。
シークレットの有効期限が近づくと、管理者ポータルで次のアラートが生成されます。 シークレットのローテーションを完了すると、次のアラートが解決されます。
- 保留中のサービス アカウントのパスワードの有効期限
- 保留中の内部証明書の有効期限
- 保留中の外部証明書の有効期限
警告
有効期限が切れる前に管理者ポータルでトリガーされるアラートには、次の 2 つのフェーズがあります。
- 有効期限の 90 日前になると、警告アラートが生成されます。
- 有効期限の 30 日前になると、重要なアラートが生成されます。
これらの通知を受け取った場合は、シークレットのローテーションを完了することが "重要" です。 これを行わないと、ワークロードが失われたり、Azure Stack Hub の再デプロイを自分の費用で行うことになる可能性があります。
アラートの監視と修復の詳細については、「 Azure Stack Hub で正常性とアラートを監視する」を参照してください。
Note
1811 より前の Azure Stack Hub 環境では、保留中の内部証明書やシークレットの有効期限のアラートが表示される場合があります。 これらのアラートは正確ではないため、内部シークレットのローテーションを実行せずに無視する必要があります。 正しくない内部シークレットの有効期限切れアラートは、1811 で解決される既知の問題です。 環境が 2 年間アクティブになっていない限り、内部シークレットの有効期限が切れることはありません。
前提条件
サポートされているバージョンの Azure Stack Hub を実行し、インスタンスが実行されている Azure Stack Hub バージョンに最新の修正プログラムを適用することを強くお勧めします。 たとえば、2008 を実行している場合は、2008 で利用可能な最新の修正プログラムがインストールされていることを確認します。
重要
1811 より前のバージョンの場合:
- シークレットのローテーションが既に実行されている場合、バージョン 1811 以降に更新してから、シークレットのローテーションを再び実行する必要があります。 シークレットのローテーションは、特権エンドポイントを使用して実行する必要があり、Azure Stack Hub オペレーターの資格情報が必要です。 ご使用の環境でシークレットのローテーションが実行されているかどうかがわからない場合は、シークレットのローテーションを実行する前に 1811 に更新してください。
- 拡張機能ホストの証明書を追加するためにシークレットのローテーションを行う必要はありません。 拡張機能ホストの証明書を追加するには、「Azure Stack Hub の拡張機能ホストを準備する」の手順に従ってください。
計画メンテナンス操作をユーザーに通知します。 可能な限り非営業時間中に、通常のメンテナンス期間をスケジュールします。 メンテナンス操作は、ユーザーのワークロードとポータル操作の両方に影響を及ぼす可能性があります。
シークレットのローテーション中に、アラートが開いて自動的に閉じることにオペレーターが気付くことがあります。 これは予期される動作であり、アラートは無視してもかまいません。 オペレーターは、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
- グラフ1
- コンテナー レジストリ2
1Active Directory フェデレーション サービス (ADFS) を使用する場合に適用されます。
2Azure Container Registry (ACR) を使用する場合に適用されます。
準備
外部シークレットのローテーション前:
シークレットをローテーションする前に、
-group SecretRotationReadiness
パラメーターを使用してTest-AzureStack
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 以降 * Windows の信頼されたルート プログラムの一部。
準備する証明書は、PKI 証明書の検証に関する記事に記載された手順を使用して必ず検証してください。
パスワードに
$
、*
、#
、@
、or
)` などの特殊文字が含まれていないことを確認します。PFX 暗号化が TripleDES-SHA1 であることを確認します。 問題が発生した場合は、「Azure Stack Hub PKI 証明書に関する一般的な問題を修復する」を参照してください。
ローテーションに使われる証明書のバックアップを安全なバックアップ場所に格納します。 ローテーションを実行して失敗した場合は、ローテーションを再実行する前に、ファイル共有内の証明書をバックアップ コピーに置き換えます。 バックアップ コピーはセキュリティで保護されたバックアップ場所に保存してください。
ERCS VM からアクセスできるファイル共有を作成します。 ファイル共有は、CloudAdmin ID で読み書きできる必要があります。
ファイル共有にアクセスできるコンピューターから PowerShell ISE コンソールを開きます。 ファイル共有に移動します。ここで、外部証明書を配置するディレクトリを作成します。
という名前
Certificates
のファイル共有に フォルダーを作成します。 証明書フォルダー内に、ハブで使用する ID プロバイダーに応じて、 またはADFS
という名前AAD
のサブフォルダーを作成します。 たとえば、 .\Certificates\AAD や .\Certificates\ADFS などです。 ここでは、証明書フォルダーと ID プロバイダー サブフォルダー以外のフォルダーを作成する必要はありません。手順 2 で作成した置換外部証明書の新しいセットを、手順 #6 で作成した .\Certificates\<IdentityProvider> フォルダーにコピーします。 前述のように、ID プロバイダーのサブフォルダーは または
ADFS
であるAAD
必要があります。 交換する外部証明書のサブジェクトの別名 (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 と ADFS に Azure Container Registry (ACR) を使用する場合に適用されます。
注意
外部コンテナー レジストリ証明書をローテーションする場合は、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 リファレンスを参照してください。パラメーター 変数 説明 -PfxFilesPath
$CertSharePath 証明書ルート フォルダーへのネットワーク パス ( \\<IPAddress>\<ShareName>\Certificates
など) (「準備」セクションの手順 6 を参照)。-PathAccessCredential
$CertShareCreds 共有に対する資格情報の PSCredential オブジェクト。 -CertificatePassword
$CertPassword 作成されるすべての pfx 証明書ファイルに使われるパスワードのセキュリティで保護された文字列です。
# 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 インフラストラクチャによって使用されるすべての証明書、パスワード、セキュリティで保護された文字列、キーなどがあります。 内部シークレットのローテーションは、それが侵害された可能性がある場合、または有効期限アラートを受け取った場合にのみ必要です。
1811 より前のデプロイでは、保留中の内部証明書やシークレットの有効期限に関するアラートが表示される場合があります。 これらのアラートは正確ではないため、無視してください。これらは既知の問題であり、1811 で解決されています。
内部シークレットをローテーションするには、次の手順を実行します。
次の PowerShell スクリプトを実行します。 内部シークレットのローテーションの場合、シークレットのローテーション実行に関するセクションで 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
Note
1811 より前のバージョンでは、
-Internal
フラグは必要ありません。正常に完了すると、コンソールに
ActionPlanInstanceID ... CurrentStatus: Completed
メッセージが表示され、その後にAction plan finished with status: 'Completed'
が表示されます。Note
シークレット ローテーションが失敗した場合は、エラー メッセージ内の指示に従い、
Start-SecretRotation
に-Internal
パラメーターと-ReRun
パラメーターを付けて再実行します。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 システムのインフラストラクチャ シークレットのローテーションを行います。 このコマンドレットは、-Session
パラメーターで PEP セッションを渡す Invoke-Command
スクリプト ブロックを使用することによって、Azure Stack Hub の特権エンドポイントに対してのみ実行できます。 既定では、すべての外部ネットワーク インフラストラクチャ エンドポイントの証明書のみのローテーションを行います。
パラメーター | Type | 必須 | [位置] | Default | 説明 |
---|---|---|---|---|---|
PfxFilesPath |
String | False | named | なし | すべての外部ネットワーク エンドポイント証明書を含む \Certificates ルート フォルダーへのファイル共有パスです。 外部シークレットのローテーションを行う場合にのみ必要です。 パスは \Certificates フォルダーで終わる必要があります (\\<IP アドレス>\<共有名>\Certificates など)。 |
CertificatePassword |
SecureString | False | named | なし | -PfXFilesPath で提供されているすべての証明書のパスワード。 外部のシークレットのローテーションを行うときに PfxFilesPath を指定する場合は、必須の値です。 |
Internal |
String | False | named | なし | Azure Stack Hub オペレーターが内部インフラストラクチャ シークレットのローテーションを行うときは、常に Internal フラグを使用する必要があります。 |
PathAccessCredential |
PSCredential | False | named | なし | すべての外部ネットワーク エンドポイント証明書を含む \Certificates ディレクトリへのファイル共有の PowerShell 資格情報。 外部シークレットのローテーションを行う場合にのみ必要です。 |
ReRun |
SwitchParameter | False | named | なし | 試行が失敗した後でシークレットのローテーションが再試行されるときに、常に使用する必要があります。 |
構文
外部シークレットのローテーションの場合
Start-SecretRotation [-PfxFilesPath <string>] [-PathAccessCredential <PSCredential>] [-CertificatePassword <SecureString>]
内部シークレットのローテーションの場合
Start-SecretRotation [-Internal]
外部シークレットのローテーションの再実行の場合
Start-SecretRotation [-ReRun]
内部シークレットのローテーションの再実行の場合
Start-SecretRotation [-ReRun] [-Internal]
例
内部インフラストラクチャ シークレットのみのローテーション
このコマンドは、Azure Stack Hub 環境の特権エンドポイントを使用して実行する必要があります。
PS C:\> 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 証明書のローテーションを行います。
内部と外部のインフラストラクチャ シークレットのローテーション (1811 より前のみ)
重要
ローテーションは内部証明書と外部証明書に分けられたので、このコマンドは 1811 より前の Azure Stack Hub にのみ適用されます。
"1811 以降" 、内部証明書と外部証明書の両方をローテーションすることはできなくなりました。
# 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 {
Start-SecretRotation -PfxFilesPath $using:CertSharePath -PathAccessCredential $using:CertShareCreds -CertificatePassword $using:CertPassword
}
Remove-PSSession -Session $PEPSession
このコマンドは、Azure Stack Hub 内部ネットワークに公開されているインフラストラクチャ シークレットと、Azure Stack Hub の外部ネットワーク インフラストラクチャ エンドポイントに使用される TLS 証明書をローテーションします。 Start-SecretRotation は、スタックで生成されたすべてのシークレットのローテーションを行い、証明書が指定されているため、外部エンドポイント証明書のローテーションも行われます。