다음을 통해 공유


Linter 규칙 - outputs should not contain secrets

이 규칙은 템플릿의 출력에 비밀이 노출될 가능성을 확인합니다.

Linter 규칙 코드

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 = '...'

규칙이 이 줄에 적용되지 않는 이유를 설명하는 주석을 추가하는 것이 좋습니다.

다음 단계

Linter에 관한 자세한 내용은 Bicep Linter 사용을 참조하세요.