Freigeben über


Authentifizieren Sie sich bei Azure-Ressourcen von lokal gehosteten Java-Apps

Apps, die außerhalb von Azure gehostet werden, z. B. lokal oder in einem Rechenzentrum eines Drittanbieters, sollten einen Anwendungsdienstprinzipal über Microsoft Entra ID verwenden, um sich bei Azure Diensten zu authentifizieren. In den folgenden Abschnitten lernen Sie:

  • Anwendung bei Microsoft Entra registrieren, um einen Dienstprinzipal zu erstellen.
  • Wie man Rollen zu Bereichsberechtigungen zuweist.
  • So authentifizieren Sie sich mithilfe eines Dienstprinzipals aus Ihrem App-Code.

Mithilfe dedizierter Anwendungsdienstprinzipale können Sie beim Zugriff auf Azure Ressourcen dem Prinzip der geringsten Berechtigung folgen. Beschränken Sie die Berechtigungen auf die spezifischen Anforderungen der App während der Entwicklung, um versehentlichen Zugriff auf Azure Ressourcen zu verhindern, die für andere Apps oder Dienste vorgesehen sind. Dieser Ansatz hilft Ihnen auch, Probleme beim Verschieben der App in die Produktion zu vermeiden, indem sichergestellt wird, dass die App in der Entwicklungsumgebung nicht überprivilegiert ist.

Erstellen Sie eine andere App-Registrierung für jede Umgebung, in der Sie die App hosten. Sie können umgebungsspezifische Ressourcenberechtigungen für jeden Dienstprinzipal konfigurieren und sicherstellen, dass eine in einer Umgebung bereitgestellte App nicht auf Azure Ressourcen in einer anderen Umgebung zugreift.

Registrieren der App in Azure

Anwendungsdienstprinzipalobjekte werden über eine App-Registrierung in Azure entweder über das Azure Portal oder Azure CLI erstellt.

  1. Verwenden Sie im Azure-Portal die Suchleiste, um zur Seite App registrations zu navigieren.

  2. Wählen Sie auf der Seite App registrations+ Neue Registrierung aus.

  3. Gehen Sie auf der Seite Registrieren einer Anwendung folgendermaßen vor:

    • Geben Sie für das Feld Name einen beschreibenden Wert ein, der den App-Namen und die Zielumgebung enthält.
    • Wählen Sie unter Unterstützte Kontotypendie Option Nur Konten in diesem Organisationsverzeichnis (nur Microsoft Customer Led - Single Tenant)oder die Option, die Ihren Anforderungen am besten entspricht.
  4. Wählen Sie Registrieren , um Ihre App zu registrieren und den Dienstprinzipal zu erstellen.

    Ein Screenshot, der zeigt, wie man eine App-Registrierung im Azure-Portal erstellt.

  5. Kopieren Sie auf der Seite App-Registrierung Ihrer App die Anwendungs-ID (Client-ID) und Verzeichnis-ID (Mandanten-ID) und fügen Sie sie an einem temporären Speicherort ein, um sie später in Ihren App-Codekonfigurationen zu verwenden.

  6. Wählen Sie Zertifikat oder Geheimnis hinzufügen , um Anmeldedaten für Ihre App einzurichten.

  7. Auf der Seite Zertifikate & Geheimnisse wählen Sie + Neues Client-Geheimnis.

  8. In dem Hinzufügen eines Client-Geheimnisses Flyout-Panel, das sich öffnet:

    • Geben Sie für die Beschreibung einen Wert von Current.
    • Lassen Sie für den Wert "Expires" den empfohlenen Standardwert von 180 days.
    • Wählen Sie Hinzufügen aus, um das Geheimnis hinzuzufügen.
  9. Kopieren Sie auf der Seite Zertifikate & Geheimnisse die Eigenschaft Wert des Client-Geheimnisses zur Verwendung in einem späteren Schritt.

    Hinweis

    Der Wert des geheimen Clientschlüssels wird nur einmal angezeigt, nachdem die App-Registrierung erstellt wurde. Sie können weitere geheime Clientschlüssel hinzufügen, ohne diesen geheimen Clientschlüssel ungültig zu machen, aber es gibt keine Möglichkeit, diesen Wert erneut anzuzeigen.

Zuweisen von Rollen zum Anwendungsdienstprinzipal

Ermitteln Sie als Nächstes, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und weisen Sie diese Rollen dem von Ihnen erstellten Dienstprinzipal zu. Rollen können auf Ressourcen-, Ressourcengruppen- oder Abonnementebene zugewiesen werden. In diesem Beispiel wird gezeigt, wie Rollen im Ressourcengruppenbereich zugewiesen werden, da die meisten Apps alle ihre Azure Ressourcen in einer einzelnen Ressourcengruppe gruppieren.

  1. Navigieren Sie im Azure-Portal zur Seite Overview der Ressourcengruppe, die Ihre App enthält.

  2. Wählen Sie im linken Navigationsbereich die Option Zugriffssteuerung (IAM).

  3. Wählen Sie auf der Seite access control (IAM)+ Hinzufügen und dann im Dropdownmenü " Rollenzuweisung hinzufügen " aus. Die Seite " Rollenzuweisung hinzufügen " bietet mehrere Registerkarten zum Konfigurieren und Zuweisen von Rollen.

  4. Verwenden Sie auf der Registerkarte " Rolle " das Suchfeld, um die Rolle zu suchen, die Sie zuweisen möchten. Wählen Sie die Rolle und dann "Weiter" aus.

  5. Auf der Registerkarte „Mitglieder“

    • Wählen Sie für den Wert "Zugriff zuweisen""Benutzer", "Gruppe" oder "Dienstprinzipal" aus.
    • Wählen Sie für den Wert " Mitglieder " die Option "Mitglieder auswählen " aus, um den Flyoutbereich " Mitglieder auswählen " zu öffnen.
    • Suchen Sie nach dem Zuvor erstellten Dienstprinzipal, und wählen Sie ihn aus den gefilterten Ergebnissen aus. Wählen Sie Auswählen aus, um die Gruppe auszuwählen und das Flyout-Panel zu schließen.
    • Wählen Sie "Überprüfen" und "Zuweisen " am unteren Rand der Registerkarte " Mitglieder " aus.

    Screenshot, der zeigt, wie dem Dienstprinzipal eine Rolle zugewiesen wird.

  6. Wählen Sie auf der Registerkarte " Überprüfen+ Zuweisen " die Option "Überprüfen" und "Zuweisen " am unteren Rand der Seite aus.

Festlegen der App-Umgebungsvariablen

Zur Laufzeit suchen bestimmte Anmeldeinformationen aus der Azure Identitätsbibliothek, wie DefaultAzureCredential, EnvironmentCredential und ClientSecretCredential, konventionell in den Umgebungsvariablen nach Dienstprinzipalinformationen. Wenn Sie mit Java arbeiten, können Sie Umgebungsvariablen je nach Tool und Umgebung auf mehrere Arten konfigurieren.

Konfigurieren Sie unabhängig vom gewählten Ansatz die folgenden Umgebungsvariablen für einen Dienstprinzipal:

  • AZURE_CLIENT_ID: Wird verwendet, um die registrierte App in Azure zu identifizieren.
  • AZURE_TENANT_ID: Die ID des Microsoft Entra Mandanten.
  • AZURE_CLIENT_SECRET: Die geheimen Anmeldeinformationen, die für die App generiert wurden.

Legen Sie die folgenden Umgebungsvariablen fest. Ersetzen Sie die Platzhalterwerte durch die tatsächlichen Werte ihrer App-Registrierung:

export AZURE_CLIENT_ID="<your-client-id>"
export AZURE_TENANT_ID="<your-tenant-id>"
export AZURE_CLIENT_SECRET="<your-client-secret>"

Definieren Sie für eine Java Anwendung, die als systemd service auf einem Produktionsserver ausgeführt wird, die Umgebungsvariablen in einer Datei, und verweisen Sie mit der direktiven EnvironmentFile in der Diensteinheitsdatei darauf:

[Unit]
Description=Java application service
After=network.target

[Service]
User=app-user
WorkingDirectory=/path/to/java-app
EnvironmentFile=/path/to/java-app/app-environment-variables
ExecStart=/usr/bin/java -jar app.jar

[Install]
WantedBy=multi-user.target

Die Umgebungsdatei sollte eine Liste von Umgebungsvariablen mit ihren Werten enthalten:

AZURE_CLIENT_ID=<your-client-id>
AZURE_TENANT_ID=<your-tenant-id>
AZURE_CLIENT_SECRET=<your-client-secret>

Authentifizieren bei Azure Diensten aus Ihrer App

Die Azure Identity Library stellt verschiedene Credentials bereit: Implementierungen von TokenCredential, die unterschiedliche Szenarien und Microsoft Entra Authentifizierungsflüsse unterstützen. Die folgenden Schritte zeigen Ihnen, wie Sie ClientSecretCredential verwenden, wenn Sie lokal und in der Produktion mit Dienstprinzipalen arbeiten.

Implementieren des Codes

Fügen Sie die azure-identity Abhängigkeit zu Ihrer pom.xml Datei hinzu.

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
</dependency>

Sie greifen auf Azure Dienste zu, indem Sie spezielle Clientklassen aus den verschiedenen Azure SDK Clientbibliotheken verwenden. Führen Sie für jeden Java Code, der ein Azure SDK Clientobjekt in Ihrer App erstellt, die folgenden Schritte aus:

  1. Importieren Sie die ClientSecretCredentialBuilder Klasse aus dem com.azure.identity Paket.
  2. Erstellen Sie ein ClientSecretCredential-Objekt mithilfe von ClientSecretCredentialBuilder und den tenantId, clientId und clientSecret.
  3. Übergeben Sie die instanz ClientSecretCredential an die credential-Methode des Azure SDK Clientobjekt-Generators.

Ein Beispiel für diesen Ansatz wird im folgenden Codesegment gezeigt:

import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.azure.storage.blob.BlobServiceClient;
import com.azure.storage.blob.BlobServiceClientBuilder;

String tenantId = System.getenv("AZURE_TENANT_ID");
String clientId = System.getenv("AZURE_CLIENT_ID");
String clientSecret = System.getenv("AZURE_CLIENT_SECRET");

ClientSecretCredential credential = new ClientSecretCredentialBuilder()
    .tenantId(tenantId)
    .clientId(clientId)
    .clientSecret(clientSecret)
    .build();

BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
    .endpoint("https://<account-name>.blob.core.windows.net")
    .credential(credential)
    .buildClient();