リンター ルール - 出力にシークレットを含めるべきではありません

このルールは、テンプレートの出力でシークレットが露出する可能性を検索します。

リンター ルールのコード

ルール設定をカスタマイズするには、Bicep 構成ファイルで値 outputs-should-not-contain-secrets を使用します。

解決策

シークレットを公開する可能性がある値を出力に含めないでください。 たとえば、型 secureString または secureObject のセキュリティで保護されたパラメーターや、listKeys などの list* 関数です。 テンプレートからの出力はデプロイ履歴に格納されるため、読み取り専用のアクセス許可を持つユーザーが情報にアクセスできます。他の場合には、読み取り専用アクセス許可では利用できません。 次の例は、セキュリティで保護されたパラメーターが出力値に含まれるため、不合格になります。

@secure()
param secureParam string

output badResult string = 'this is the value ${secureParam}'

次の例は、出力で list* 関数が使用されているため、不合格になります。

param storageName string
resource stg 'Microsoft.Storage/storageAccounts@2023-04-01' existing = {
  name: storageName
}

output badResult object = {
  value: stg.listKeys().keys[0].value
}

次の例は、シークレットが含まれている可能性があることを示す "password" が出力名に含まれているため、失敗します

output accountPassword string = '...'

これを修正するには、出力からシークレット データを削除する必要があります。 シークレットを含むリソースの resourceId を出力し、情報を必要とするリソースが作成または更新されるときにそのシークレットを取得することをお勧めします。 さらに複雑なデプロイ シナリオでは、シークレットが KeyVault に格納される場合もあります。

次の例は、モジュールから storageAccount キーを取得するためのセキュリティで保護されたパターンを示しています。

output storageId string = stg.id

これは、次の例に示すように、後続のデプロイで使用できます

someProperty: listKeys(myStorageModule.outputs.storageId.value, '2021-09-01').keys[0].value

偽陽性の抑制

このルールは、実際にはシークレットが含まれていないテンプレート出力について警告することがあります。 たとえば、すべての list* 関数が実際に機密データを返すというわけではありません。 このような場合は、警告を含む行の前に #disable-next-line outputs-should-not-contain-secrets を追加することで、この行の警告を無効にできます。

#disable-next-line outputs-should-not-contain-secrets // Doesn't contain a password
output notAPassword string = '...'

ルールがこの行に適用されない理由を説明するコメントを追加することをお勧めします。

次のステップ

リンターの詳細については、「Bicep リンターの使用方法」を参照してください。