Usando a autenticação AWS IAM com o conector MongoDB para Apache Kafka
Robert Walters, Jagadish Nallapaneni4 min read • Published Jul 01, 2024 • Updated Jul 01, 2024
Avalie esse Tutorial
O AWS Identity e Access Management (IAM) é um serviço amplamente usado que permite aos desenvolvedores controlar o acesso seguro aos serviços e recursos do AWS. Um dos principais benefícios do AWS IAM é sua capacidade de fazer conexões autenticadas seguras sem que o cliente precise passar senhas confidenciais.
A partir da versão 1.13, o MongoDB Connector para Apache Kafka (Kafka Connector) agora suporta autenticação via Amazon Web Services IAM. O suporte do Amazon Web Services IAM tem sido um dos recursos mais solicitados para o Kafka Connector e, neste tutorial, mostraremos como usá-lo.
Para obter suporte para o AWS IAM, adicionamos suporte para substituir a interface MongoClient, permitindo que um desenvolvedor forneça um CustomCredentialProvider. Embora esse provedor possa ser usado para qualquer método de autenticação, este tutorial se concentrará na criação de um provedor de credenciais do AWS IAM.
Para ilustrar isso, mostraremos uma configuração simples de uma instância do AWS EC2 instalada com o Apache Kafka. Essa instância usará o MongoDB Connector para Apache Kafka para coletar dados de um tópico do Kafka em um cluster Atlas e autenticar usando o AWS IAM.
Se você deseja acompanhar este artigo, certifique-se de ter o seguinte:
- Uma função do AWS IAM, “KafkaBlogAtlasRole”. Este role será posteriormente mapeado como um utilizador de banco de dados Atlas.
- Instância do AWS EC2
- Configure a instância do EC2 com uma função AWS IAM, "KafkaConnectBlogRole. "
- Adicione uma política ao KafkaConnectBlogRole que permita “AssumeRole” no KafkaBlogAtlasRole.
Política de exemplo:
1 { 2 "Version": "2012-10-17", 3 "Statement": [ 4 { 5 "Sid": "KafkaAtlasBlogPolicy", 6 "Effect": "Allow", 7 "Action": "sts:AssumeRole", 8 "Resource": "arn:aws:iam::979559056307:role/KafkaBlogAtlasRole" 9 } 10 ] 11 }
- Java Development Kit versão 8 ou posterior
- Um usuário de banco de dados no cluster MongoDB Atlas desejado
- Configure o usuário do banco de dados com Amazon Web Services IAM e use o ARN do Amazon Web Services Role para KafkaBlogAtlasRole. O usuário do banco de dados Atlas deve ter acesso de leitura/gravação à coleção desejada.
Neste ponto, estamos prontos para começar a criar o provedor de autenticação personalizado.
A partir da versão 1 13.MongoDB connector do para Apache Kafka, agora podemos conectar um fornecedor de autenticação personalizado. Neste artigo, criaremos um provedor de autenticação personalizado em Java, compilaremos e adicionaremos ao diretório lib de sua implantação do Kafka. O fornecedor que criaremos suportará a autenticação IAM Amazon Web Services .
Para começar, no seu editor Java favorito, crie um projeto e construa o seguinte JAR que contém esta fonte:
SampleAssumeRoleCredential.java
1 package com.mongodb; 2 3 import java.util.Map; 4 import java.util.function.Supplier; 5 6 import com.mongodb.kafka.connect.util.custom.credentials.CustomCredentialProvider; 7 8 import com.amazonaws.auth.AWSCredentialsProvider; 9 import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; 10 import com.amazonaws.services.securitytoken.AWSSecurityTokenService; 11 import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceAsyncClientBuilder; 12 import com.amazonaws.services.securitytoken.model.AssumeRoleRequest; 13 import com.amazonaws.services.securitytoken.model.AssumeRoleResult; 14 import com.amazonaws.services.securitytoken.model.Credentials; 15 import com.amazonaws.util.StringUtils; 16 17 public class SampleAssumeRoleCredential implements CustomCredentialProvider { 18 19 public SampleAssumeRoleCredential() {} 20 21 public MongoCredential getCustomCredential(Map<?, ?> map) { 22 AWSCredentialsProvider provider = new DefaultAWSCredentialsProviderChain(); 23 Supplier<AwsCredential> awsFreshCredentialSupplier = () -> { 24 AWSSecurityTokenService stsClient = AWSSecurityTokenServiceAsyncClientBuilder.standard() 25 .withCredentials(provider) 26 .withRegion("us-east-1") 27 .build(); 28 AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest().withDurationSeconds(3600) 29 .withRoleArn((String)map.get("mongodbaws.auth.mechanism.roleArn")) 30 .withRoleSessionName("Test_Session"); 31 AssumeRoleResult assumeRoleResult = stsClient.assumeRole(assumeRoleRequest); 32 Credentials creds = assumeRoleResult.getCredentials(); 33 // Add your code to fetch new credentials 34 return new AwsCredential(creds.getAccessKeyId(), creds.getSecretAccessKey(), creds.getSessionToken()); 35 }; 36 return MongoCredential.createAwsCredential(null, null) 37 .withMechanismProperty(MongoCredential.AWS_CREDENTIAL_PROVIDER_KEY, awsFreshCredentialSupplier); 38 } 39 40 41 public void validate(Map<?, ?> map) { 42 String roleArn = (String) map.get("mongodbaws.auth.mechanism.roleArn"); 43 if (StringUtils.isNullOrEmpty(roleArn)) { 44 throw new RuntimeException("Invalid value set for customProperty"); 45 } 46 } 47 48 49 public void init(Map<?, ?> map) { 50 51 } 52 }
Exemplo de arquivo pom.xml
1 2 <project xmlns="http://maven.apache.org/POM/4.0.0" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 5 <modelVersion>4.0.0</modelVersion> 6 <groupId>com.mongodb</groupId> 7 <artifactId>SampleAssumeRoleCredential</artifactId> 8 <version>1.0-SNAPSHOT</version> 9 <build> 10 <plugins> 11 <plugin> 12 <groupId>org.apache.maven.plugins</groupId> 13 <artifactId>maven-shade-plugin</artifactId> 14 <version>3.5.3</version> 15 <configuration> 16 <!-- put your configurations here --> 17 </configuration> 18 <executions> 19 <execution> 20 <phase>package</phase> 21 <goals> 22 <goal>shade</goal> 23 </goals> 24 </execution> 25 </executions> 26 </plugin> 27 </plugins> 28 </build> 29 30 <dependencies> 31 <!-- Java MongoDB Driver dependency --> 32 <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-sync --> 33 <dependency> 34 <groupId>org.mongodb</groupId> 35 <artifactId>mongodb-driver-sync</artifactId> 36 <version>5.1.0</version> 37 </dependency> 38 <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk --> 39 <dependency> 40 <groupId>com.amazonaws</groupId> 41 <artifactId>aws-java-sdk</artifactId> 42 <version>1.12.723</version> 43 </dependency> 44 45 <!-- slf4j logging dependency, required for logging output from the MongoDB Java Driver --> 46 <dependency> 47 <groupId>org.slf4j</groupId> 48 <artifactId>slf4j-jdk14</artifactId> 49 <version>1.7.28</version> 50 </dependency> 51 52 <dependency> 53 <groupId>kafka-connect</groupId> 54 <artifactId>kafka-connect</artifactId> 55 <scope>system</scope> 56 <version>1.13.0</version> 57 </dependency> 58 </dependencies> 59 60 <properties> 61 <maven.compiler.source>17</maven.compiler.source> 62 <maven.compiler.target>17</maven.compiler.target> 63 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 64 </properties> 65 66 </project>
Observação: precisamos referenciar o MongoDB Connector para Apache Kafka versão 1.13 ou posterior. Neste exemplo, o connector foi baixado do repositório do Kafka Connector no Github e armazenado no repositório local do Maven.
1 mvn install:install-file -Dfile=/Users/robert.walters/Downloads/mongodb-kafka-connect-mongodb-1.13.0/lib/mongo-kafka-connect-1.13.0-confluent.jar -DgroupId=kafka-connect -DartifactId=kafka-connector -Dversion=1.13.0 -Dpackaging=jar\n
Compile e coloque este arquivo SampleAssumeRole.jar no diretório libs do Kafka em seu sistema do Kafka Connect. Agora você está pronto para configurar seu connector MongoDB para Apache Kafka para usar esse fornecedor de autenticação personalizado.
Para oferecer suporte ao provedor personalizado na versão 1.13, as seguintes opções de configuração foram adicionadas ao connector:
Parâmetro de configuração | Descrição |
---|---|
mongo.custom.auth.mechanism.enable | Determina se o connector deve usar a classe de provedor; o padrão é falso |
mongo.custom.auth.mechanism.providerClass | Ponto de entrada da classe Java para o provedor personalizado |
mongodbaws.auth.mechanism.roleArn | Função que tem acesso do IAM ao banco de dados |
Neste exemplo, o componente de autenticação personalizado utilizará o AWS IAM AssumeRole para autenticar com MongoDB Atlas. Aqui está um exemplo desta configuração conectando a um MongoDB Atlas cluster.
1 { 2 "name": "mongo-tutorial-sink", 3 "config": { 4 "connector.class": "com.mongodb.kafka.connect.MongoSinkConnector", 5 "topics": "Stocks2", 6 "connection.uri": "<MongoDB Connection String>", 7 "key.converter": "org.apache.kafka.connect.storage.StringConverter", 8 "value.converter": "org.apache.kafka.connect.json.JsonConverter", 9 "value.converter.schemas.enable": false, 10 "database": "Stocks", 11 "collection": "StockData", 12 "mongo.custom.auth.mechanism.enable":"true", 13 "mongo.custom.auth.mechanism.providerClass":"com.mongodb.SampleAssumeRoleCredential", 14 "mongodbaws.auth.mechanism.roleArn":"<AWS IAM ARN>" 15 } 16 }
Observe que o roleArn é o ARN (Amazon Resource Name) do papel AWS IAM que é utilizado para usuários do Atlas, KafkaBlogAtlasRole. No tempo de execução, como o Kafka Connect está sendo executado sob a função AWS IAM da instância2 do EC, KafkaConnectBlogRole, e essa função tem uma política que permite AssumeRole no KafkaBlogAtlasRole, o serviço pode se conectar ao Atlas sem armazenar nenhuma credencial!
Agora você está pronto para enviar dados para o Kafka e observá-los chegar em uma coleção do MongoDB usando o MongoDB Connector para Apache Kafka configurado com autenticação do AWS IAM para o MongoDB Atlas.
Neste artigo, discutimos os requisitos necessários para oferecer suporte a um provedor de autenticação personalizado, como a autenticação AWS IAM. Versão 1.13 do Kafka Connector introduziu novos parâmetros que definem qual classe usar no arquivo JAR do provedor personalizado. Este arquivo JAR inclui a lógica da autenticação personalizada.
Observe que, embora seja possível adicionar o recurso de autenticação do AWS IAM de forma nativa ao Kafka Connector (afinal, é apenas software), isso não apenas adicionaria uma dependência de versão no AWS IAM SDK, mas também aumentaria significativamente o tamanho do connector, tornando-o impraticável para todos os outros usuários que não desejam usar esse método de autenticação. Por esses motivos, escrever o fornecedor de credenciais personalizado é a solução para integrar o Kafka Connector com métodos de autenticação como o Amazon Web Services IAM.
Leia a documentação do MongoDB Connector para Apache Kafka para saber mais. Questões? Junte-se a nós na comunidade de desenvolvedores do MongoDB.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.