Zarządzanie wpisami tajnymi przy użyciu Bicep

Wdrożenia często wymagają przechowywania i propagowania wpisów tajnych w całym środowisku platformy Azure. Platforma Bicep i platforma Azure udostępniają wiele funkcji, które ułatwiają zarządzanie wpisami tajnymi we wdrożeniach.

Unikaj wpisów tajnych, w których można

W wielu sytuacjach można unikać używania w ogóle wpisów tajnych. Wiele zasobów platformy Azure obsługuje tożsamości zarządzane, które umożliwiają ich uwierzytelnianie i autoryzację dostępu do innych zasobów na platformie Azure bez konieczności obsługi poświadczeń ani zarządzania nimi. Ponadto niektóre usługi platformy Azure mogą automatycznie generować certyfikaty HTTPS, unikając obsługi certyfikatów i kluczy prywatnych. W miarę możliwości używaj tożsamości zarządzanych i certyfikatów zarządzanych przez usługę.

Używanie bezpiecznych parametrów

Jeśli musisz podać wpisy tajne do wdrożeń Bicep jako parametry, użyj dekoratora@secure(). Gdy oznaczysz parametr jako bezpieczny, usługa Azure Resource Manager unika rejestrowania wartości lub wyświetlania jej w Azure Portal, interfejsie wiersza polecenia platformy Azure lub Azure PowerShell.

Unikaj danych wyjściowych dla wpisów tajnych

Nie używaj danych wyjściowych Bicep na potrzeby bezpiecznych danych. Dane wyjściowe są rejestrowane w historii wdrożenia, a każda osoba mająca dostęp do wdrożenia może wyświetlać wartości danych wyjściowych wdrożenia.

Jeśli musisz wygenerować wpis tajny we wdrożeniu Bicep i udostępnić go wywołującym lub innym zasobom, rozważ użycie jednego z poniższych metod.

Dynamiczne wyszukiwanie wpisów tajnych

Czasami musisz uzyskać dostęp do wpisu tajnego z jednego zasobu, aby skonfigurować inny zasób.

Na przykład konto magazynu mogło zostać utworzone w innym wdrożeniu i konieczne uzyskanie dostępu do jego klucza podstawowego w celu skonfigurowania aplikacji Azure Functions. Możesz użyć existing słowa kluczowego, aby uzyskać silnie wpisane odwołanie do wstępnie utworzonego konta magazynu, a następnie użyć metody konta listKeys() magazynu, aby utworzyć parametry połączenia z kluczem podstawowym:

Poniższy przykład jest częścią większego przykładu. Aby uzyskać plik Bicep, który można wdrożyć, zobacz kompletny plik.

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' existing = {
  name: storageAccountName
}

var storageAccountConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${listKeys(storageAccount.id, storageAccount.apiVersion).keys[0].value}'

resource functionApp 'Microsoft.Web/sites@2021-02-01' = {
  name: functionAppName
  location: location
  kind: 'functionapp'
  properties: {
    httpsOnly: true
    serverFarmId: appServicePlan.id
    siteConfig: {
      appSettings: [
        {
          name: 'APPINSIGHTS_INSTRUMENTATIONKEY'
          value: applicationInsights.properties.InstrumentationKey
        }
        {
          name: 'AzureWebJobsStorage'
          value: storageAccountConnectionString
        }
        {
          name: 'FUNCTIONS_EXTENSION_VERSION'
          value: '~3'
        }
        {
          name: 'FUNCTIONS_WORKER_RUNTIME'
          value: 'dotnet'
        }
        {
          name: 'WEBSITE_CONTENTAZUREFILECONNECTIONSTRING'
          value: storageAccountConnectionString
        }
      ]
    }
  }
}

Korzystając z tego podejścia, należy unikać przekazywania wpisów tajnych do lub z pliku Bicep.

Możesz również użyć tego podejścia do przechowywania wpisów tajnych w magazynie kluczy.

Korzystanie z Key Vault

Usługa Azure Key Vault jest przeznaczona do przechowywania bezpiecznych danych i zarządzania nimi. Użyj magazynu kluczy do zarządzania wpisami tajnymi, certyfikatami, kluczami i innymi danymi, które muszą być chronione i udostępniane.

Magazyny i wpisy tajne można tworzyć i zarządzać nimi przy użyciu narzędzia Bicep. Zdefiniuj magazyny, tworząc zasób o typie Microsoft.KeyVault/vaults.

Podczas tworzenia magazynu należy określić, kto i co może uzyskać dostęp do swoich danych. Jeśli planujesz odczytywanie wpisów tajnych magazynu z pliku Bicep, ustaw enabledForTemplateDeployment właściwość na true.

Dodawanie wpisów tajnych do magazynu kluczy

Wpisy tajne są zasobem podrzędnym i można je utworzyć przy użyciu typu Microsoft.KeyVault/vaults/secrets. W poniższym przykładzie pokazano, jak utworzyć magazyn i wpis tajny:

Poniższy przykład jest częścią większego przykładu. Aby uzyskać plik Bicep, który można wdrożyć, zobacz kompletny plik.

resource keyVault 'Microsoft.KeyVault/vaults@2019-09-01' = {
  name: keyVaultName
  location: location
  properties: {
    enabledForTemplateDeployment: true
    tenantId: tenant().tenantId
    accessPolicies: [
    ]
    sku: {
      name: 'standard'
      family: 'A'
    }
  }
}

resource keyVaultSecret 'Microsoft.KeyVault/vaults/secrets@2019-09-01' = {
  parent: keyVault
  name: 'MySecretName'
  properties: {
    value: 'MyVerySecretValue'
  }
}

Porada

W przypadku korzystania z potoków wdrażania automatycznego czasami może być trudne określenie sposobu uruchamiania wpisów tajnych magazynu kluczy dla wdrożeń. Jeśli na przykład podano klucz interfejsu API do użycia podczas komunikowania się z zewnętrznym interfejsem API, należy dodać wpis tajny do magazynu, zanim będzie można go użyć we wdrożeniach.

Podczas pracy z wpisami tajnymi pochodzącymi z innej firmy może być konieczne ręczne dodanie ich do magazynu, a następnie odwołanie do wpisu tajnego dla wszystkich kolejnych zastosowań.

Używanie magazynu kluczy z modułami

W przypadku korzystania z modułów Bicep można zapewnić bezpieczne parametry przy użyciu getSecret funkcji .

Możesz również odwołać się do magazynu kluczy zdefiniowanego w innej grupie zasobów przy użyciu existing słów kluczowych i scope razem. W poniższym przykładzie plik Bicep jest wdrażany w grupie zasobów o nazwie Sieć. Wartość parametru modułu mySecret jest definiowana w magazynie kluczy o nazwie contosonetworkingsecrets znajdującym się w grupie zasobów Wpisy tajne :

resource networkingSecretsKeyVault 'Microsoft.KeyVault/vaults@2019-09-01' existing = {
  scope: resourceGroup('Secrets')
  name: 'contosonetworkingsecrets'
}

module exampleModule 'module.bicep' = {
  name: 'exampleModule'
  params: {
    mySecret: networkingSecretsKeyVault.getSecret('mySecret')
  }
}

Używanie magazynu kluczy w pliku bicepparam

W przypadku korzystania z .bicepparam formatu pliku można podać bezpieczne wartości parametrom przy użyciu getSecret funkcji .

Odwołaj się do usługi KeyVault, podając identyfikator subskrypcji, nazwę grupy zasobów i nazwę magazynu kluczy. Wartość wpisu tajnego można uzyskać, podając nazwę wpisu tajnego. Opcjonalnie możesz podać wersję wpisu tajnego. Jeśli nie podasz wersji wpisu tajnego, zostanie użyta najnowsza wersja.

using './main.bicep'

param secureUserName = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>', '<secretVersion>')
param securePassword = az.getSecret('<subscriptionId>', '<resourceGroupName>', '<keyVaultName>', '<secretName>')

Praca z wpisami tajnymi w potokach

Podczas wdrażania zasobów platformy Azure przy użyciu potoku należy odpowiednio obsługiwać wpisy tajne.

  • Unikaj przechowywania wpisów tajnych w repozytorium kodu. Na przykład nie dodawaj wpisów tajnych do plików parametrów ani do plików YAML definicji potoku.
  • W GitHub Actions użyj zaszyfrowanych wpisów tajnych do przechowywania bezpiecznych danych. Użyj skanowania wpisów tajnych , aby wykryć wszelkie przypadkowe zatwierdzenia wpisów tajnych.
  • W usłudze Azure Pipelines użyj zmiennych tajnych do przechowywania bezpiecznych danych.