Share via


Alkalmazás migrálása jelszó nélküli kapcsolatok használatára az Azure Event Hubs for Kafkával

Ez a cikk bemutatja, hogyan migrálhat a hagyományos hitelesítési módszerekről a biztonságosabb, jelszó nélküli kapcsolatokra az Azure Event Hubs for Kafkával.

A Kafkához készült Azure Event Hubsba irányuló alkalmazáskéréseket hitelesíteni kell. Az Azure Event Hubs for Kafka különböző módszereket kínál az alkalmazások biztonságos csatlakoztatására. Az egyik módszer egy kapcsolati sztring használata. Lehetőség szerint azonban fontossági sorrendbe kell helyeznie a jelszó nélküli kapcsolatokat az alkalmazásokban.

A jelszó nélküli kapcsolatok a Spring Cloud Azure 4.3.0 óta támogatottak. Ez a cikk egy migrálási útmutató a hitelesítő adatok Spring Cloud Stream Kafka-alkalmazásokból való eltávolításához.

Hitelesítési beállítások összehasonlítása

Amikor az alkalmazás hitelesít az Azure Event Hubs for Kafkával, egy jogosult entitást biztosít az Event Hubs-névtér csatlakoztatásához. Az Apache Kafka protokollok több egyszerű hitelesítési és biztonsági réteget (SASL) biztosítanak a hitelesítéshez. Az SASL-mechanizmusok szerint két hitelesítési lehetőséget használhat a biztonságos erőforrásokhoz való hozzáférés engedélyezéséhez: a Microsoft Entra-hitelesítést és a közös hozzáférésű jogosultságkód (SAS) hitelesítést.

Microsoft Entra authentication

A Microsoft Entra-hitelesítés az Azure Event Hubs for Kafkához való csatlakozás mechanizmusa a Microsoft Entra ID-ban meghatározott identitások használatával. A Microsoft Entra-hitelesítéssel központi helyen kezelheti a szolgáltatásnév-identitásokat és más Microsoft-szolgáltatások, ami leegyszerűsíti az engedélykezelést.

A Microsoft Entra ID hitelesítéshez való használata a következő előnyöket nyújtja:

  • A felhasználók hitelesítése az Azure-szolgáltatásokban egységes módon.
  • Jelszószabályzatok és jelszóváltás kezelése egyetlen helyen.
  • A Microsoft Entra ID által támogatott hitelesítés több formája, amelyek szükségtelenné tehetik a jelszavak tárolását.
  • Az ügyfelek külső (Microsoft Entra ID) csoportokkal kezelhetik az Event Hubs-engedélyeket.
  • Jogkivonatalapú hitelesítés támogatása a Kafkához készült Azure Event Hubshoz csatlakozó alkalmazásokhoz.

SAS-hitelesítés

Az Event Hubs közös hozzáférésű jogosultságkódokat (SAS) is biztosít a Kafka-erőforrásokhoz készült Event Hubshoz való delegált hozzáféréshez.

Bár az Azure Event Hubs for Kafka-hoz sassal is lehet csatlakozni, körültekintően kell használni. Szorgalmasnak kell lennie, hogy soha ne tegye közzé a kapcsolati sztring nem biztonságos helyen. Bárki, aki hozzáfér a kapcsolati sztring, hitelesítheti magát. Fennáll például annak a veszélye, hogy egy rosszindulatú felhasználó hozzáférhet az alkalmazáshoz, ha egy kapcsolati sztring véletlenül be van jelentkezve a forrásvezérlőbe, nem biztonságos e-mailben küldi el, nem megfelelő csevegésbe illeszti be, vagy olyan személy tekinti meg, akinek nem kellene engedéllyel rendelkeznie. Ehelyett az OAuth 2.0 jogkivonat-alapú mechanizmussal való hozzáférés engedélyezése kiváló biztonságot és egyszerű használatot biztosít az SAS-en keresztül. Fontolja meg az alkalmazás jelszó nélküli kapcsolatok használatára való frissítését.

Jelszó nélküli kapcsolatok bemutatása

Jelszó nélküli kapcsolattal anélkül csatlakozhat az Azure-szolgáltatásokhoz, hogy az alkalmazáskódban, annak konfigurációs fájljaiban vagy környezeti változóiban bármilyen hitelesítő adatot tárol.

Számos Azure-szolgáltatás támogatja a jelszó nélküli kapcsolatokat, például az Azure Managed Identity használatával. Ezek a technikák robusztus biztonsági funkciókat biztosítanak, amelyeket az Azure Identity-ügyfélkódtárak DefaultAzureCredential használatával valósíthat meg. Ebben az oktatóanyagban megtanulhatja, hogyan frissíthet egy meglévő alkalmazást, hogy alternatív megoldások, például kapcsolati sztring helyett használjonDefaultAzureCredential.

DefaultAzureCredential több hitelesítési módszert támogat, és automatikusan meghatározza, hogy melyiket érdemes futtatókörnyezetben használni. Ez a megközelítés lehetővé teszi, hogy az alkalmazás különböző hitelesítési módszereket használjon különböző környezetekben (helyi fejlesztés és éles környezet) környezetspecifikus kód implementálása nélkül.

A hitelesítő adatok keresésének sorrendje és helyei DefaultAzureCredential megtalálhatók az Azure Identity Library áttekintésében. Ha például helyileg dolgozik, általában azzal a fiókkal hitelesít, DefaultAzureCredential amellyel a fejlesztő bejelentkezett a Visual Studióba. Az alkalmazás Azure-ban DefaultAzureCredential való üzembe helyezésekor automatikusan átvált felügyelt identitás használatára. Ehhez az áttűnéshez nincs szükség kódmódosításra.

Annak érdekében, hogy a kapcsolatok jelszó nélküliek legyenek, figyelembe kell vennie a helyi fejlesztést és az éles környezetet is. Ha mindkét helyen szükség van egy kapcsolati sztring, akkor az alkalmazás nem jelszó nélküli.

A helyi fejlesztési környezetben hitelesítheti magát az Azure CLI, az Azure PowerShell, a Visual Studio vagy a Visual Studio Code vagy az IntelliJ Azure beépülő moduljaival. Ebben az esetben ezt a hitelesítő adatot használhatja az alkalmazásban a tulajdonságok konfigurálása helyett.

Amikor alkalmazásokat helyez üzembe egy Azure-beli üzemeltetési környezetben, például egy virtuális gépen, hozzárendelhet felügyelt identitást ebben a környezetben. Ezután nem kell hitelesítő adatokat megadnia az Azure-szolgáltatásokhoz való csatlakozáshoz.

Megjegyzés:

A felügyelt identitás biztonsági identitást biztosít egy alkalmazás vagy szolgáltatás megjelenítéséhez. Az identitás kezelését az Azure-platform végzi, és nem szükséges hozzá semmilyen titkos kulcs kiosztása vagy rotálása. A felügyelt identitásokról az áttekintési dokumentációban olvashat bővebben.

Meglévő alkalmazás migrálása jelszó nélküli kapcsolatok használatára

Az alábbi lépések bemutatják, hogyan migrálhat egy meglévő alkalmazást jelszó nélküli kapcsolatok használatára SAS-megoldás helyett.

0) A munkakörnyezet előkészítése a helyi fejlesztési hitelesítéshez

Először a következő paranccsal állítson be néhány környezeti változót.

export AZ_RESOURCE_GROUP=<YOUR_RESOURCE_GROUP>
export AZ_EVENTHUBS_NAMESPACE_NAME=<YOUR_EVENTHUBS_NAMESPACE_NAME>
export AZ_EVENTHUB_NAME=<YOUR_EVENTHUB_NAME>

A helyőrzőket írja felül a következő értékekkel, amelyeket a cikk teljes további részében használni fogunk:

  • <YOUR_RESOURCE_GROUP>: A használni kívánt erőforráscsoport neve.
  • <YOUR_EVENTHUBS_NAMESPACE_NAME>: A használni kívánt Azure Event Hubs-névtér neve.
  • <YOUR_EVENTHUB_NAME>: A használni kívánt eseményközpont neve.

1) Engedély megadása az Azure Event Hubshoz

Ha helyileg szeretné futtatni ezt a mintát a Microsoft Entra-hitelesítéssel, győződjön meg arról, hogy a felhasználói fiókja az Azure Toolkit for IntelliJ, a Visual Studio Code Azure Account beépülő modul vagy az Azure CLI segítségével lett hitelesítve. Győződjön meg arról is, hogy a fiók megfelelő engedélyeket kapott.

  1. Az Azure Portalon keresse meg az Event Hubs-névteret a fő keresősáv vagy a bal oldali navigációs sáv használatával.

  2. Az Event Hubs áttekintési oldalán válassza a Hozzáférés-vezérlés (IAM) lehetőséget a bal oldali menüben.

  3. A Hozzáférés-vezérlés (IAM) lapon válassza a Szerepkör-hozzárendelések lapot.

  4. Válassza a Felső menü Hozzáadás elemét, majd a szerepkör-hozzárendelés hozzáadása lehetőséget az eredményül kapott legördülő menüből.

    Screenshot of Azure portal Access Control (IAM) page of Event Hubs Namespace resource with Add role assignment highlighted.

  5. A keresőmezővel szűrheti az eredményeket a kívánt szerepkörre. Ebben a példában keresse meg az Azure Event Hubs-adatküldőt és az Azure Event Hubs-adatátvevőt, és válassza ki a megfelelő eredményt, majd válassza a Tovább gombot.

  6. A Hozzáférés hozzárendelése területen válassza a Felhasználó, csoport vagy szolgáltatásnév lehetőséget, majd válassza a Tagok kijelölése lehetőséget.

  7. A párbeszédpanelen keresse meg a Microsoft Entra-felhasználónevet (általában a user@domain e-mail-címét), majd válassza a Párbeszédpanel alján található Kiválasztás lehetőséget.

  8. Válassza a Véleményezés + hozzárendelés lehetőséget a végső lapra való ugráshoz, majd a folyamat befejezéséhez a Véleményezés + hozzárendelés lehetőséget.

További információ a hozzáférési szerepkörök megadásáról: Event Hubs-erőforrásokhoz való hozzáférés engedélyezése a Microsoft Entra ID használatával.

2) Jelentkezzen be, és migrálja az alkalmazáskódot jelszó nélküli kapcsolatok használatára

Helyi fejlesztés esetén győződjön meg arról, hogy ugyanazzal a Microsoft Entra-fiókkal van hitelesítve, amelyhez a szerepkört hozzárendelte az Event Hubsban. Hitelesítést az Azure CLI, a Visual Studio, az Azure PowerShell vagy más eszközök, például az IntelliJ használatával végezhet.

Jelentkezzen be az Azure-ba az Azure CLI-vel az alábbi paranccsal:

az login

Ezután az alábbi lépésekkel frissítse a Spring Kafka-alkalmazást jelszó nélküli kapcsolatok használatára. Bár fogalmilag hasonló, minden keretrendszer különböző megvalósítási részleteket használ.

  1. Nyissa meg a pom.xml fájlt a projekten belül, és adja hozzá a következő hivatkozást:

    <dependency>
       <groupId>com.azure</groupId>
       <artifactId>azure-identity</artifactId>
       <version>1.6.0</version>
    </dependency>
    
  2. A migrálás után implementálja a AuthenticationCallbackHandlert és az OAuthBearerTokent a projektben az OAuth2-hitelesítéshez, ahogyan az az alábbi példában látható.

    public class KafkaOAuth2AuthenticateCallbackHandler implements AuthenticateCallbackHandler {
    
       private static final Duration ACCESS_TOKEN_REQUEST_BLOCK_TIME = Duration.ofSeconds(30);
       private static final String TOKEN_AUDIENCE_FORMAT = "%s://%s/.default";
    
       private Function<TokenCredential, Mono<OAuthBearerTokenImp>> resolveToken;
       private final TokenCredential credential = new DefaultAzureCredentialBuilder().build();
    
       @Override
       public void configure(Map<String, ?> configs, String mechanism, List<AppConfigurationEntry> jaasConfigEntries) {
          TokenRequestContext request = buildTokenRequestContext(configs);
          this.resolveToken = tokenCredential -> tokenCredential.getToken(request).map(OAuthBearerTokenImp::new);
       }
    
       private TokenRequestContext buildTokenRequestContext(Map<String, ?> configs) {
          URI uri = buildEventHubsServerUri(configs);
          String tokenAudience = buildTokenAudience(uri);
    
          TokenRequestContext request = new TokenRequestContext();
          request.addScopes(tokenAudience);
          return request;
       }
    
       @SuppressWarnings("unchecked")
       private URI buildEventHubsServerUri(Map<String, ?> configs) {
          String bootstrapServer = Arrays.asList(configs.get(BOOTSTRAP_SERVERS_CONFIG)).get(0).toString();
          bootstrapServer = bootstrapServer.replaceAll("\\[|\\]", "");
          URI uri = URI.create("https://" + bootstrapServer);
          return uri;
       }
    
       private String buildTokenAudience(URI uri) {
          return String.format(TOKEN_AUDIENCE_FORMAT, uri.getScheme(), uri.getHost());
       }
    
       @Override
       public void handle(Callback[] callbacks) throws UnsupportedCallbackException {
          for (Callback callback : callbacks) {
             if (callback instanceof OAuthBearerTokenCallback) {
                OAuthBearerTokenCallback oauthCallback = (OAuthBearerTokenCallback) callback;
                this.resolveToken
                        .apply(credential)
                        .doOnNext(oauthCallback::token)
                        .doOnError(throwable -> oauthCallback.error("invalid_grant", throwable.getMessage(), null))
                        .block(ACCESS_TOKEN_REQUEST_BLOCK_TIME);
             } else {
                throw new UnsupportedCallbackException(callback);
             }
          }
       }
    
       @Override
       public void close() {
          // NOOP
       }
    }
    
    public class OAuthBearerTokenImp implements OAuthBearerToken {
        private final AccessToken accessToken;
        private final JWTClaimsSet claims;
    
        public OAuthBearerTokenImp(AccessToken accessToken) {
            this.accessToken = accessToken;
            try {
                claims = JWTParser.parse(accessToken.getToken()).getJWTClaimsSet();
            } catch (ParseException exception) {
                throw new SaslAuthenticationException("Unable to parse the access token", exception);
            }
        }
    
        @Override
        public String value() {
            return accessToken.getToken();
        }
    
        @Override
        public Long startTimeMs() {
            return claims.getIssueTime().getTime();
        }
    
        @Override
        public long lifetimeMs() {
            return claims.getExpirationTime().getTime();
        }
    
        @Override
        public Set<String> scope() {
            // Referring to https://docs.microsoft.com/azure/active-directory/develop/access-tokens#payload-claims, the scp
            // claim is a String, which is presented as a space separated list.
            return Optional.ofNullable(claims.getClaim("scp"))
                    .map(s -> Arrays.stream(((String) s)
                    .split(" "))
                    .collect(Collectors.toSet()))
                    .orElse(null);
        }
    
        @Override
        public String principalName() {
            return (String) claims.getClaim("upn");
        }
    
        public boolean isExpired() {
            return accessToken.isExpired();
        }
    }
    
  3. A Kafka-gyártó vagy -fogyasztó létrehozásakor adja hozzá az SASL/OAUTHBEARER mechanizmus támogatásához szükséges konfigurációt. Az alábbi példák bemutatják, hogyan kell kinéznie a kódnak a migrálás előtt és után. Mindkét példában cserélje le a <eventhubs-namespace> helyőrzőt az Event Hubs-névtér nevére.

    A migrálás előtt a kódnak a következő példához hasonlóan kell kinéznie:

    Properties properties = new Properties();
    properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "<eventhubs-namespace>.servicebus.windows.net:9093");
    properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
    properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
    properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
    properties.put(SaslConfigs.SASL_MECHANISM, "PLAIN");
    properties.put(SaslConfigs.SASL_JAAS_CONFIG,
            String.format("org.apache.kafka.common.security.plain.PlainLoginModule required username=\"$ConnectionString\" password=\"%s\";", connectionString));
    return new KafkaProducer<>(properties);
    

    A migrálás után a kódnak az alábbi példához hasonlóan kell kinéznie. Ebben a példában cserélje le a <path-to-your-KafkaOAuth2AuthenticateCallbackHandler> helyőrzőt a implementált KafkaOAuth2AuthenticateCallbackHandlerosztály teljes nevére.

    Properties properties = new Properties();
    properties.put(CommonClientConfigs.BOOTSTRAP_SERVERS_CONFIG, "<eventhubs-namespace>.servicebus.windows.net:9093");
    properties.put(CommonClientConfigs.SECURITY_PROTOCOL_CONFIG, "SASL_SSL");
    properties.put(SaslConfigs.SASL_MECHANISM, "OAUTHBEARER");
    properties.put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.oauthbearer.OAuthBearerLoginModule required");
    properties.put(SaslConfigs.SASL_LOGIN_CALLBACK_HANDLER_CLASS, "<path-to-your-KafkaOAuth2AuthenticateCallbackHandler>");
    return new KafkaProducer<>(properties);
    

Az alkalmazás futtatása helyben

A kódmódosítások elvégzése után futtassa az alkalmazást helyileg. Az új konfigurációnak át kell vennie a helyi hitelesítő adatokat, feltéve, hogy egy kompatibilis IDE-be vagy parancssori eszközbe van bejelentkezve, például az Azure CLI-be, a Visual Studióba vagy az IntelliJ-be. A helyi fejlesztői felhasználóhoz az Azure-ban hozzárendelt szerepkörök lehetővé teszik, hogy az alkalmazás helyileg csatlakozzon az Azure-szolgáltatáshoz.

3) Az Azure-beli üzemeltetési környezet konfigurálása

Miután az alkalmazás jelszó nélküli kapcsolatok használatára lett konfigurálva, és helyileg fut, ugyanaz a kód hitelesíthető az Azure-szolgáltatásokban az Azure-szolgáltatásokban az Azure-ban való üzembe helyezés után. Egy felügyelt identitással rendelkező Azure Spring Apps-példányon üzembe helyezett alkalmazások például csatlakozhatnak a Kafkához készült Azure Event Hubshoz.

Ebben a szakaszban két lépést kell végrehajtania, hogy az alkalmazás jelszó nélküli azure-beli üzemeltetési környezetben fusson:

  • Rendelje hozzá a felügyelt identitást az Azure-beli üzemeltetési környezethez.
  • Szerepkörök hozzárendelése a felügyelt identitáshoz.

Megjegyzés:

Az Azure szolgáltatás Csatlakozás or szolgáltatást is biztosít, amely segíthet az üzemeltetési szolgáltatás és az Event Hubs összekapcsolásában. Ha a Service Csatlakozás or konfigurálja az üzemeltetési környezetet, kihagyhatja a szerepkörök felügyelt identitáshoz való hozzárendelésének lépését, mert a Service Csatlakozás or ezt megteszi Ön helyett. A következő szakasz azt ismerteti, hogyan konfigurálhatja az Azure-beli üzemeltetési környezetet kétféleképpen: az egyiket a Service Csatlakozás oron keresztül, a másikat pedig az egyes üzemeltetési környezetek közvetlen konfigurálásával.

Fontos

A szolgáltatás Csatlakozás or parancsaihoz az Azure CLI 2.41.0-s vagy újabb verziója szükséges.

Felügyelt identitás hozzárendelése az Azure-beli üzemeltetési környezethez

Az alábbi lépések bemutatják, hogyan rendelhet hozzá rendszer által hozzárendelt felügyelt identitást a különböző web hosting szolgáltatásokhoz. A felügyelt identitás biztonságosan csatlakozhat más Azure-szolgáltatásokhoz a korábban beállított alkalmazáskonfigurációk használatával.

  1. A Azure-alkalmazás szolgáltatáspéldány fő áttekintő lapján válassza az Identitás lehetőséget a navigációs panelen.

  2. A Rendszerhez rendelt lapon állítsa be az Állapot mezőt. A rendszer által hozzárendelt identitásokat az Azure belsőleg kezeli, és rendszergazdai feladatokat kezel Önnek. Az identitás részletei és azonosítói soha nem jelennek meg a kódban.

    Screenshot of Azure portal Identity page of App Service resource with System assigned tab showing and Status field highlighted.

Felügyelt identitást is hozzárendelhet egy Azure-beli üzemeltetési környezethez az Azure CLI használatával.

A felügyelt identitásokat hozzárendelheti egy Azure-alkalmazás szolgáltatáspéldányhoz az az webapp identity assign paranccsal, ahogyan az az alábbi példában is látható.

export AZURE_MANAGED_IDENTITY_ID=$(az webapp identity assign \
    --resource-group $AZ_RESOURCE_GROUP \
    --name <app-service-name> \
    --query principalId \
    --output tsv)

Szerepkörök hozzárendelése a felügyelt identitáshoz

Ezután adjon engedélyeket az Event Hubs-névtér eléréséhez létrehozott felügyelt identitásnak. Engedélyeket úgy adhat meg, hogy hozzárendel egy szerepkört a felügyelt identitáshoz, ugyanúgy, mint a helyi fejlesztőfelhasználóval.

Ha a szolgáltatás Csatlakozás or használatával kapcsolta össze a szolgáltatásokat, nem kell elvégeznie ezt a lépést. A rendszer a következő szükséges konfigurációkat kezelte:

  • Ha a kapcsolat létrehozásakor kiválasztott egy felügyelt identitást, a rendszer által hozzárendelt felügyelt identitás lett létrehozva az alkalmazáshoz, és hozzárendelte az Azure Event Hubs-adatküldő és az Azure Event Hubs-adatátvevő szerepköröket az Event Hubshoz.

  • Ha egy kapcsolati sztring használata mellett döntött, a kapcsolati sztring alkalmazáskörnyezeti változóként lett hozzáadva.

Az alkalmazás tesztelése

Miután végrehajtotta ezeket a kódmódosításokat, keresse meg az üzemeltetett alkalmazást a böngészőben. Az alkalmazásnak sikeresen csatlakoznia kell a Kafkához készült Azure Event Hubshoz. Ne feledje, hogy eltarthat néhány percig, amíg a szerepkör-hozzárendelések propagálása az Azure-környezetben történik. Az alkalmazás mostantól úgy van konfigurálva, hogy helyileg és éles környezetben is fusson anélkül, hogy a fejlesztőknek titkos kulcsokat kellene kezelnie az alkalmazásban.

További lépések

Ebben az oktatóanyagban megtanulta, hogyan migrálhat egy alkalmazást jelszó nélküli kapcsolatokba.

A cikkben tárgyalt fogalmak részletesebb megismeréséhez olvassa el az alábbi forrásokat: