Udostępnij za pośrednictwem


Reguła lintera — dane wyjściowe nie powinny zawierać wpisów tajnych

Ta reguła znajduje możliwe ujawnienie wpisów tajnych w danych wyjściowych szablonu.

Kod reguły Linter

Użyj następującej wartości w pliku konfiguracji Bicep, aby dostosować ustawienia reguły: outputs-should-not-contain-secrets

Rozwiązanie

Nie uwzględniaj żadnych wartości w danych wyjściowych, które mogą potencjalnie uwidaczniać wpisy tajne. Na przykład bezpieczne parametry typu secureString lub secureObject lub list* funkcje, takie jak listKeys. Dane wyjściowe z szablonu są przechowywane w historii wdrażania, więc użytkownik z uprawnieniami tylko do odczytu może uzyskać dostęp do informacji, w przeciwnym razie nie jest dostępny z uprawnieniami tylko do odczytu. Poniższy przykład kończy się niepowodzeniem, ponieważ zawiera bezpieczny parametr w wartości wyjściowej.

@secure()
param secureParam string

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

Poniższy przykład kończy się niepowodzeniem list* , ponieważ używa funkcji w danych wyjściowych.

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

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

Poniższy przykład kończy się niepowodzeniem, ponieważ nazwa danych wyjściowych zawiera hasło wskazujące, że może zawierać wpis tajny

output accountPassword string = '...'

Aby rozwiązać ten problem, należy usunąć dane tajne z danych wyjściowych. Zalecaną praktyką jest wyprowadzenie identyfikatora resourceId zasobu zawierającego wpis tajny i pobranie wpisu tajnego podczas tworzenia lub aktualizowania zasobu wymagającego informacji. Wpisy tajne mogą być również przechowywane w usłudze KeyVault w przypadku bardziej złożonych scenariuszy wdrażania.

Poniższy przykład przedstawia bezpieczny wzorzec pobierania klucza storageAccount z modułu.

output storageId string = stg.id

Które mogą być używane w kolejnym wdrożeniu, jak pokazano w poniższym przykładzie

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

Wyciszanie wyników fałszywie dodatnich

Czasami ta reguła wysyła alerty dotyczące danych wyjściowych szablonu, które nie zawierają w rzeczywistości wpisów tajnych. Na przykład nie wszystkie list* funkcje zwracają dane poufne. W takich przypadkach można wyłączyć ostrzeżenie dla tego wiersza, dodając #disable-next-line outputs-should-not-contain-secrets przed wierszem z ostrzeżeniem.

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

Dobrym rozwiązaniem jest dodanie komentarza wyjaśniającego, dlaczego reguła nie ma zastosowania do tego wiersza.

Następne kroki

Aby uzyskać więcej informacji na temat lintera, zobacz Use Bicep linter (Używanie lintera Bicep).