Verwalten von Geheimnissen in der ARM-Vorlage durch Lesen aus Azure Key Vault

Abgeschlossen

Infrastructure-as-Code (IaC) ist ein Konzept, bei dem Sie Ihre Infrastrukturanforderungen in von Menschen lesbaren Textdateien beschreiben. ARM-Vorlagen (Azure Resource Manager) sind eine Form von IaC.

Ebenso wie Anwendungscode können Sie den Infrastrukturcode in einem Versionskontrollsystem verwalten, z. B. in Git. Auf diese Weise können Sie mit anderen Benutzern zusammenarbeiten und Änderungen an Ihren Infrastrukturanforderungen verfolgen, wenn diese sich weiterentwickeln.

Wie bei Ihrem Anwendungscode sollten Sie vertrauliche Informationen wie Kennwörter und API-Schlüssel in Ihren ARM-Vorlagen nicht hartcodieren. Andernfalls besitzt jede Person, die Lesezugriff auf Ihr Repository hat, Zugriff auf diese geheimen Informationen.

Auch wenn nur autorisierte Personen in Ihrer Organisation Zugriff auf vertrauliche Informationen haben sollten, benötigen Ihre ARM-Vorlagen diese Informationen ebenfalls. Azure Key Vault ist eine Möglichkeit, sensible Informationen zu schützen.

Azure Key Vault hilft, vertrauliche Informationen zu schützen

Azure Key Vault ist ein Clouddienst, der als sicherer Geheimnisspeicher fungiert. Mit Key Vault können Sie mehrere sichere Container (sogenannte Tresore) erstellen. Diese Tresore basieren auf Hardwaresicherheitsmodulen (HSMs). Tresore zentralisieren die Speicherung von Anwendungsgeheimnissen und verringern so die Gefahr, dass Sicherheitsinformationen verloren gehen. Darüber hinaus steuern und protokollieren Tresore den Zugriff auf alle darin gespeicherten Elemente.

Key Vault ist in der Lage, sowohl Schlüssel als auch Geheimnisse zu speichern. Durch die zahlreichen Funktionen ist Key Vault eine gute Wahl, um Ihre Geheimnisse zu verwalten, aber auch eine gute Wahl für den Bereitstellungsprozess.

  • Rollenbasierte Zugriffssteuerung. Sie können Ihren Schlüsseltresor mithilfe verschiedener Rollen verwalten, damit Sie sicherstellen können, dass er von Apps und verschiedenen Administratorebenen verwendet werden kann.

  • Zulassen von Benutzern und Apps. Sie können Ihren Schlüsseltresor so konfigurieren, dass sowohl bestimmte Benutzer als auch Apps auf den Schlüsseltresor zugreifen können. Bei Apps erstellen Sie einen Dienstprinzipal. Tatsächlich können Sie Ihren Schlüsseltresor so konfigurieren, dass nur Dienstprinzipale darauf zugreifen können.

    Hinweis

    Ein Dienstprinzipal ist eine Identität, die für den Zugriff auf Azure-Ressourcen mit Anwendungen, gehosteten Diensten und automatisierten Tools erstellt wird. Sie schränken den Zugriff auf Ressourcen ein, indem Sie nur dem Prinzipal eine Rolle oder eine Teilmenge von Rollen mit eingeschränkten Zugriffsrechten zuweisen. Mit diesem Ansatz können Sie besser steuern, auf welche Ressourcen und in welchem Umfang zugegriffen werden kann.

  • Key Vault kann mit einer ARM-Vorlage interagieren. Bei der Bereitstellung einer ARM-Vorlage können Sie aus einem Schlüsseltresor lesen. Damit das funktioniert, ist nur ein wenig Konfiguration erforderlich. Im nächsten Abschnitt finden Sie weitere Informationen dazu.

Konfigurieren von Berechtigungen

Sie haben Key Vault als Dienst ausgewählt, in dem Sie Ihre Anmeldeinformationen speichern. Dort möchten Sie in der Lage sein, Geheimnisse während der Bereitstellung zu lesen, damit Sie z. B. das Kennwort eines virtuellen Computers festlegen können.

Es gibt mehrere Konfigurationsschritte, die Sie ausführen müssen, um Key Vault so einzurichten, dass während der Bereitstellung daraus gelesen werden kann. Führen Sie die folgenden Schritte durch:

  1. Aktivieren von Key Vault für die Bereitstellung. Aus Key Vault muss während der Bereitstellung gelesen werden dürfen. Sie können diese Einstellung bei der Erstellung übergeben oder später ändern.

  2. Der Benutzer benötigt Bereitstellungsberechtigung für die Ressourcengruppe. Dies unterscheidet sich nicht von anderen Bereitstellungen. Wenn Sie die Ressourcengruppe jedoch noch nicht erstellt haben, können Sie eine Rolle zuweisen, um sicherzustellen, dass Sie die Bereitstellung darin ausführen können.

  3. Der Benutzer benötigt ordnungsgemäßen Zugriff auf den Schlüsseltresor. Sie müssen sicherstellen, dass Sie über den richtigen Zugriff auf den Schlüsseltresor verfügen, wenn Sie während der Bereitstellung daraus lesen möchten. Wenn Sie einen Schlüsseltresor erstellen, wird eine Zugriffsrichtlinie erstellt, die dem Benutzer die Berechtigung erteilt, alle Geheimnisse, Schlüssel und Zertifikate zu verwalten.

Konfigurieren von Key Vault für die Bereitstellung

Konfigurieren Sie Ihre Instanz von Key Vault so, dass Anmeldeinformationen während der Bereitstellung einer ARM-Vorlage daraus gelesen werden können.

Um Key Vault für die Bereitstellung zu aktivieren, können Sie eine Einstellung während der Erstellung der Key Vault-Instanz übergeben oder später ändern. In PowerShell handelt es sich um einen Schalter namens -EnabledForTemplateDeployment. In der Azure CLI handelt es sich um ein Argument namens --enabled-for-template-deployment, bei dem der Wert true ebenfalls übergeben werden muss.

Hinweis

Die Azure CLI erfordert zusätzlich, dass Sie einen booleschen Wert mit dem Wert true übergeben.

Benutzer benötigt Bereitstellungsberechtigung für Key Vault und Ressourcengruppe

Bevor Sie versuchen, Geheimnisse aus dem Schlüsseltresor bereitzustellen und zu lesen, müssen Sie sicherstellen, dass Sie über eine Bereitstellungsberechtigung verfügen. Es gibt zwei Rollen, die Ihnen diese Berechtigung erteilen:

  • Owner: Wenn Sie den Schlüsseltresor erstellt haben, verfügen Sie automatisch über diese Rolle.
  • Contributor: Diese Rolle gewährt Ihnen Zugriff zum Verwalten aller Geheimnisse. Wenn Sie den Schlüsseltresor nicht erstellt haben, ist es am einfachsten, wenn Sie sich selbst die Rolle Contributor zuweisen.

Eine andere Möglichkeit besteht darin, eine benutzerdefinierte Rolle zu erstellen und zuzuweisen und sicherzustellen, dass die Rolle die Berechtigung Microsoft.KeyVault/vaults/deploy/action enthält.

Konfigurieren der Datei mit Bereitstellungsparametern

Anstatt jeden Parameter und entsprechende Werte während der Bereitstellung als Schlüssel-Wert-Paare anzugeben, können Sie eine Parameterdatei verwenden.

In dieser Parameterdatei geben Sie an, welcher Schlüsseltresor und welches Geheimnis in diesem Schlüsseltresor für Sie von Interesse sind. Hierzu ändern Sie einen Parameter und aktualisieren anschließend die Bereitstellungsvorlage so, dass dieser Parameter verwendet wird.

Hinweis

Die Vorlage hat keine Kenntnis von einem Schlüsseltresor oder dessen Geheimnis. Die Konfiguration, die Sie vornehmen, erfolgt in der Parameterdatei.

Konfigurieren eines Schlüsseltresors und des Geheimnisses für einen Parameter

Verweisen Sie in der Parameterdatei und für einen bestimmten Parameter auf einen Schlüsseltresor, für den Sie über Bereitstellungsberechtigung verfügen. Geben Sie dann an, an welchem Geheimnis Sie interessiert sind. Sie verweisen auf das Geheimnis anhand des Namens. Während der Bereitstellung wird diese Konfiguration in den Wert des Geheimnisses aufgelöst. Hier sehen Sie einen Parameter namens myPassword, der für die Verwendung eines bestimmten Schlüsseltresors und eines Geheimnisses mit dem Namen databaseSecret konfiguriert ist.

"myPassword" : {
  "reference": {
    "keyVault": {
      "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>",
      "secretName": "databaseSecret"
    }
  }
}

Im oben gezeigten JSON-Code geben Sie die vollständige ID für den Schlüsseltresor an und rufen dann das Geheimnis databaseSecret ab. Der Wert dieses Geheimnisses wird dann extrahiert und dem Parameter myPassword zugewiesen.

Zuweisen des Parameters zum Kennwort der Ressource

Dieser Schritt bezieht sich nicht auf den Schlüsseltresor. Vielmehr wird mit diesem Schritt sichergestellt, dass die beabsichtigte Ressource den konfigurierten Parameter verwendet, um den Wert des Geheimnisses aus dem Schlüsseltresor zu lesen. Im Folgenden finden Sie einen verkürzten Codeausschnitt aus einer VM in der Vorlagendatei, der das adminPassword-Element zeigt, das aus dem Parameter myPassword liest. Der Wert des Geheimnisses wird zum Zeitpunkt der Bereitstellung aus dem Schlüsseltresor gelesen und dem adminPassword-Element zugewiesen.

{
  "osProfile": {
    "adminPassword": "[parameters('myPassword')]"
  }
}