説明
ARMのsecureStringとBicepの@secure()は、パラメーター値が通常のデプロイ履歴に露出しないよう保護します。しかし、パスワードやキーを既定値としてコードに記述すると、テンプレートやリポジトリ履歴を読める人にその値が見えてしまいます。
セキュアなパラメーターとして宣言しても、ソースコードに埋め込んだシークレットは保護されません。
想定される影響
- テンプレートやリポジトリ履歴にアクセスできる人が、シークレットを取得する可能性があります。
- 同じシークレットを複数環境で使い回すと、漏えいの影響が広がる可能性があります。
対処方法
- シークレットを含む既定値を削除し、Key Vault参照や保護されたパイプライン変数などを使ってデプロイ時に値を渡してください。値を出力したり、通常のログに記録したりしないでください。
- 露出したシークレットは利用側の設定と併せて更新し、古い値を無効にしてください。現在のファイルから削除するだけでは、リポジトリ履歴での露出は解消されません。
- デプロイとシークレットの読み取り権限を必要な主体に限定し、保護された入力経路を確認してください。
例
SQLサーバー名と管理者アカウントを環境に合わせて指定してください。パスワードはサービスの複雑さの要件を満たす必要があり、ネットワークとアクセス権限は別途設定してください。
変更前
bicep
@secure()
param adminPassword string = 'HardcodedPassword1!'
param adminLogin string
param sqlServerName string
resource sqlServer 'Microsoft.Sql/servers@2015-05-01-preview' = {
name: sqlServerName
location: resourceGroup().location
tags: {}
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
HardcodedPassword1!がソースコードに残っています。実際のシークレットとして使わないでください。
変更後
bicep
@secure()
param adminPassword string
param adminLogin string
param sqlServerName string
resource sqlServer 'Microsoft.Sql/servers@2015-05-01-preview' = {
name: sqlServerName
location: resourceGroup().location
tags: {}
properties: {
administratorLogin: adminLogin
administratorLoginPassword: adminPassword
version: '12.0'
}
}
既定値を削除し、デプロイ時に値を指定する構成です。その値も保護された経路で取得し、ログやソースコードに残さないでください。