Controle de acesso com ACLs do Kafka

Este documento descreve como usar listas de controle de acesso (ACLs, na sigla em inglês) do Apache Kafka para controle de acesso no Google Cloud Managed Service para Apache Kafka.

As ACLs do Apache Kafka oferecem controle de acesso granular no cluster do Kafka. O Serviço Gerenciado para Apache Kafka ativa o StandardAuthorizer pronto para uso, que armazena ACLs nos metadados do cluster do Kafka com base no KRaft.

  • Essas ACLs controlam quais usuários autenticados podem realizar operações específicas em recursos específicos do Kafka, como produzir ou consumir mensagens em um tópico.

  • Essas ACLs são úteis para controlar interações com o cluster usando clientes padrão do Apache Kafka, que estão sujeitos apenas a uma verificação do IAM no nível do cluster para a conexão inicial. Para mais informações, consulte Controle de acesso com o IAM.

Como funciona o controle de acesso da ACL do Kafka

O cliente interage com o autorizador de ACL padrão do Kafka no cluster. O autorizador avalia as ACLs relevantes do Apache Kafka para autorizar operações específicas solicitadas pelo principal, como produzir em um tópico ou consumir de um grupo. O principal usado para a verificação de ACL é derivado de um dos seguintes métodos de autenticação:

  • SASL:o principal do IAM, como um e-mail de conta de serviço.

  • mTLS:o nome distinto (DN) do certificado do cliente, possivelmente transformado por regras de mapeamento de principais.

Para ter segurança abrangente, configure o seguinte:

  • Permissões do IAM para acesso de gerenciamento. Para mais informações, consulte Controle de acesso com o IAM.

  • ACLs do Kafka para acesso a dados e operações no cluster de clientes Apache Kafka de código aberto, independente do método de autenticação.

Uso de ACLs do Apache Kafka

As vinculações de ACL do Apache Kafka têm o seguinte formato:


Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.

Confira abaixo uma lista de informações importantes sobre o formato:

  • Principal(P): a identidade do usuário que está sendo autorizada. Ele é prefixado com User:.

    • Para autenticação SASL, esse é o principal do IAM, como User:my-service-account@my-project.iam.gserviceaccount.com.

    • Para autenticação mTLS, esse é o nome distinto (DN) do certificado do cliente, como User:CN=my-client,OU=my-org-unit. O formato exato depende do assunto do certificado. As regras de mapeamento de principais podem transformar esse valor.

  • Tipo de permissão(permitida/negada): se a vinculação da ACL permite ou nega o acesso. As vinculações de negação têm precedência.

  • Operação(O): a ação realizada, como "Ler", "Gravar" ou "Criar". Para informações sobre quais operações se aplicam a quais recursos para vários protocolos do Kafka, consulte Operações e recursos em protocolos na documentação do Apache Kafka.

  • Host(H): a máquina de origem da solicitação. Como o Serviço gerenciado para Apache Kafka traduz endereços de rede do cliente, não é possível usar hosts diferentes de '*'.

  • Padrão de recurso(RP): um padrão usado para corresponder a recursos específicos. Um padrão de recurso consiste em um tipo de recurso, um nome de recurso e um tipo de padrão (LITERAL ou PREFIXED).

Acesso padrão

Os clusters do Managed Service para Apache Kafka operam com a propriedade allow.everyone.if.no.acl.found do Apache Kafka definida como true. A presença ou ausência de ACLs do Kafka determina diretamente o nível de acesso aos recursos:

  • Se nenhuma ACL do Kafka for definida para um recurso específico, como um tópico, todos os principais autenticados terão acesso a ele. Essa configuração permite que os clusters do Serviço Gerenciado para Apache Kafka sejam operáveis imediatamente, sem a necessidade de configurar ACLs.

  • Assim que você define uma ACL do Kafka para esse recurso, o acesso fica restrito. Somente os principais que receberam permissão explícita usando uma entrada ALLOW em uma ACL do Kafka podem acessar os recursos correspondentes, a menos que sejam especificamente bloqueados por uma entrada DENY.

O Serviço gerenciado para Apache Kafka dá ao agente de serviço acesso administrativo ao seu cluster. Esse acesso permite que o agente de serviço execute operações solicitadas pela API do Managed Service para Apache Kafka, independente de outras ACLs configuradas no cluster. O Serviço gerenciado para Apache Kafka faz isso modificando a implementação do StandardAuthorizer. A modificação concede ao agente de serviço permissões semelhantes às de superusuários, exceto para operações de leitura e gravação. Não é possível alterar essa configuração.

Principais do Kafka

Os principais do Kafka para clusters do Serviço gerenciado para Apache Kafka são especificados com o prefixo Kafka StandardAuthorizer "User:".

  • Para SASL/IAM:o principal é a contaGoogle Cloud . Por exemplo, para conceder acesso à conta de serviço test-kafka-client@test-project.iam.gserviceaccount.com, use o principal do Kafka "User:test-kafka-client@test-project.iam.gserviceaccount.com". Os principais das ACLs do Kafka precisam especificar um usuário, uma conta de serviço ou um principal individual do IAM, mas não um grupo ou um conjunto de principais. As ACLs do Kafka não são compatíveis com a resolução de associações a grupos para principais do Google Cloud .

  • Para mTLS:o principal é derivado do nome distinto (DN) do assunto do certificado do cliente. Por exemplo, User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US. É possível usar regras de mapeamento principal de mTLS para transformar o DN em uma string principal mais fácil de usar para ACLs.

Para criar uma ACL que se aplique a todos os membros de um Grupo do Google ou conjunto de principais, use um principal de conta de serviço de proxy e a representação da conta de serviço:

  1. Crie uma conta de serviço para usar como um proxy para o grupo.

  2. Conceda ao grupo do Google ou ao conjunto principal o papel Criador de token da conta de serviço na conta de serviço. Consulte Gerenciar o acesso a contas de serviço.

  3. Adicione ACLs do Kafka para a conta de serviço do proxy. Um exemplo de principal seria: User:group-proxy@test-project.iam.gserviceaccount.com.

  4. Use a representação de conta de serviço em clientes do Kafka para autenticar no Kafka como a conta de serviço. Google Cloud O IAM autoriza um principal individual como membro do grupo que pode representar a conta de serviço do proxy. e o Kafka autoriza a conta de serviço do proxy em relação às ACLs existentes no cluster.

Operações do Kafka para produtores e consumidores

Uma operação é uma ação realizada em um recurso. Para cada recurso, uma operação é mapeada para uma ou mais solicitações de protocolo do Kafka. Por exemplo, uma operação READ para o tipo de recurso topic é mapeada para os protocolos Fetch, OffsetCommit e TxnOffsetCommit do Apache Kafka.

Para conceder a um produtor principal acesso a um tópico, siga estas etapas:

  1. No recurso de tópico, permita as operações WRITE e CREATE.

  2. Se você estiver usando IDs de transação, permita a operação WRITE no recurso de ID de transação.

Para conceder acesso de consumidor principal a um tópico, siga estas etapas:

  1. No recurso de tópico, permita a operação READ.

  2. No recurso do grupo de consumidores, permita a operação READ.

Para mais informações sobre as operações válidas em recursos compatíveis com a API Kafka, consulte Operações e recursos em protocolos na documentação do Apache Kafka.

Configurar ACLs para comportamento de negação padrão

Os clusters gerenciados do Kafka são configurados com allow.everyone.if.no.acl.found = true. Portanto, por padrão, se nenhuma ACL for definida em um recurso, todos os principais poderão acessar o recurso.

Para configurar um comportamento de default-deny semelhante ao do IAM, primeiro configure o acesso para um usuário administrador em todos os recursos do cluster. Como resultado, cada recurso recebe uma ACL definida nele, e o comportamento allow.everyone.if.no.acl.found é suprimido. Por padrão, qualquer principal que não tenha permissão explícita de uma ACL ALLOW tem o acesso negado.

Por exemplo, para definir ACLs em todos os recursos do cluster para a conta de serviço clusterAdmin@test-project.iam.gserviceaccount.com, crie as seguintes entradas de ACL.

O comando da CLI gcloud a seguir concede a uma conta de serviço chamada clusterAdmin@test-project.iam.gserviceaccount.com acesso administrativo completo (--operation=ALL) a um cluster do Kafka específico localizado em uma região específica. Essa permissão permite que a conta de serviço execute qualquer operação no cluster de qualquer host.

gcloud managed-kafka acls add-acl-entry cluster \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

O comando da CLI gcloud a seguir concede a uma conta de serviço chamada clusterAdmin@test-project.iam.gserviceaccount.com acesso administrativo completo (--operation=ALL) a todos os tópicos em um cluster específico do Kafka localizado em uma região específica. Essa permissão permite que a conta de serviço realize qualquer operação em todos os tópicos de qualquer host.

gcloud managed-kafka acls add-acl-entry allTopics \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

O comando da CLI gcloud a seguir concede a uma conta de serviço chamada clusterAdmin@test-project.iam.gserviceaccount.com acesso administrativo completo (--operation=ALL) a todos os grupos de consumidores em um cluster específico do Kafka localizado em uma região específica. Essa permissão permite que a conta de serviço execute qualquer operação em todos os grupos de consumidores de qualquer host.

gcloud managed-kafka acls add-acl-entry allConsumerGroups \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

O comando da CLI gcloud a seguir concede a uma conta de serviço chamada clusterAdmin@test-project.iam.gserviceaccount.com acesso administrativo completo (--operation=ALL) a todos os IDs de transação em um cluster específico do Kafka localizado em uma região específica. Essa permissão permite que a conta de serviço realize qualquer operação em todos os IDs de transação de qualquer host.

gcloud managed-kafka acls add-acl-entry allTransactionalIds \
    --principal=`User:clusterAdmin@test-project.iam.gserviceaccount.com` \
    --operation=ALL \
    --permission-type=ALLOW \
    --host=* \
    --cluster=CLUSTER_ID \
    --location=LOCATION

Confira abaixo uma lista de informações importantes sobre os comandos:

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': o principal a quem a ACL se aplica. O principal é uma contaGoogle Cloud , com o prefixo User: do Kafka StandardAuthorizer.

  • --operation=all: a operação do Kafka que está sendo concedida, que é acesso total neste caso.

  • --permission-type=ALLOW: esta entrada da ACL concede acesso.

  • --host='*': o host de onde o principal pode acessar o recurso. '*' concede acesso de qualquer host. O Serviço Gerenciado para Apache Kafka só aceita ACLs com host '*'.

  • CLUSTER_ID: o nome do cluster do Serviço gerenciado para Apache Kafka.

  • LOCATION: a região Google Cloud em que o cluster do Serviço Gerenciado para Apache Kafka está localizado, como us-central1.

Configurar ACLs

É possível configurar ACLs do Apache Kafka com as APIs do Serviço gerenciado para Apache Kafka ou com ferramentas de código aberto do Apache Kafka, como a CLI do autorizador do Apache Kafka kafka-acls.sh ou Admin Client.

O Serviço gerenciado para Apache Kafka organiza as ACLs por padrões de recursos do Kafka. O padrão de recurso é definido da seguinte maneira:

  • Tipo de recurso: cluster, tópico, grupo de consumidores ou ID de transação

  • Tipo de padrão: literal ou com prefixo (todos os recursos cujo nome começa com a string fornecida)

  • Nome do recurso: o nome do recurso ou prefixo a que as entradas de ACL se aplicam.

Um recurso de ACL do Serviço Gerenciado para Apache Kafka representa todo o controle de acesso configurado para um único padrão de recurso do Kafka, como uma lista repetida de entradas de ACL. O nome do recurso da ACL identifica exclusivamente o padrão de recurso da vinculação de ACL. Para mais informações, consulte ID da ACL.

É possível gerenciar as ACLs do Serviço gerenciado para Apache Kafka no nível do recurso de ACL (todas as entradas de ACL para um padrão de recurso) ou de forma incremental, adicionando e removendo entradas de ACL individuais para um padrão de recurso de ACL.

Para mais informações, consulte Criar uma ACL do Kafka gerenciado e Adicionar uma entrada de ACL do Kafka gerenciado.

Permitir a leitura de um tópico

Para permitir que clientes de código aberto do Apache Kafka executados como a conta de serviço test-kafka-client@test-project.iam.gserviceaccount.com leiam do tópico topic-name, crie uma entrada de ACL do Serviço gerenciado para Apache Kafka usando o comando managed-kafka acls add-acl-entry:

gcloud managed-kafka acls add-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

Confira abaixo uma lista de informações importantes sobre o comando:

  • topic/topic-name: especifica o tópico do Serviço gerenciado para Apache Kafka a que você quer conceder acesso. Substitua topic-name pelo nome real do seu tópico. O prefixo topic/ indica que esta entrada de ACL se aplica a um padrão de recurso de tópico específico (literal).

  • LOCATION: a região Google Cloud em que o cluster do Serviço Gerenciado para Apache Kafka está localizado, como us-central1.

  • CLUSTER_ID: o nome do cluster do Serviço gerenciado para Apache Kafka.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': o principal a quem a ACL se aplica. O principal é uma contaGoogle Cloud , com o prefixo User: do Kafka StandardAuthorizer.

  • --operation=READ: a operação do Kafka que está sendo concedida, que é READ neste caso.

  • --permission-type=ALLOW: indica que esta entrada de ACL concede acesso.

  • --host='*': especifica o host de onde o principal pode acessar o recurso. '*' concede acesso de qualquer host. O Serviço gerenciado para Apache Kafka só oferece suporte a ACLs com host '*'.

Para remover o acesso de leitura, use o comando remove-acl-entry com os mesmos parâmetros.

gcloud managed-kafka acls remove-acl-entry topic/topic-name \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=READ \
    --permission-type=ALLOW \
    --host='*'

Permitir gravação em todos os tópicos com um prefixo comum

Para permitir que clientes de código aberto do Apache Kafka executados como a conta de serviço test-kafka-client@test-project.iam.gserviceaccount.com gravem em todos os tópicos cujo nome começa com o prefixo topic-prefix, adicione uma entrada de ACL do Kafka gerenciado da seguinte maneira:

gcloud managed-kafka acls add-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

Confira abaixo uma lista de informações importantes sobre o comando:

  • topicPrefixed/topic-prefix: especifica o padrão de recurso do Serviço Gerenciado para Apache Kafka a que você quer conceder acesso. Substitua topic-prefix pelo prefixo real dos seus tópicos. O prefixo topicPrefixed/ indica que esta entrada de ACL se aplica a um padrão de recurso com prefixo: todos os tópicos que correspondem ao prefixo especificado.

  • PROJECT: o ID do seu projeto Google Cloud em que o cluster do Serviço gerenciado para Apache Kafka está localizado.

  • LOCATION: a região Google Cloud em que o cluster do Serviço Gerenciado para Apache Kafka está localizado, como us-central1.

  • CLUSTER_ID: o nome do cluster do Serviço gerenciado para Apache Kafka.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': o principal a quem a ACL se aplica. O principal é uma contaGoogle Cloud , com o prefixo User: do Kafka StandardAuthorizer.

  • --operation=WRITE: a operação do Kafka que está sendo concedida, que é WRITE neste caso.

  • --permission-type=ALLOW: esta entrada da ACL concede acesso.

  • --host='*': o host de onde o principal pode acessar o recurso. '*' concede acesso de qualquer host. O Serviço Gerenciado para Apache Kafka só aceita ACLs com host '*'.

Para remover o acesso de gravação dessa conta de serviço, remova a entrada da ACL:

gcloud managed-kafka acls remove-acl-entry topicPrefixed/topic-prefix \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=WRITE \
    --permission-type=ALLOW \
    --host='*'

Negar a modificação de todos os temas

Para evitar que clientes de código aberto do Apache Kafka executados como a conta de serviço test-kafka-client@test-project.iam.gserviceaccount.com modifiquem todos os tópicos em um cluster, crie um recurso de ACL do Serviço gerenciado para Apache Kafka com uma lista de recursos AclEntry para negar as operações ALTER, ALTER_CONFIGS e DELETE em todos os tópicos. Essa abordagem define o estado necessário em uma única configuração.

Como alternativa, é possível conseguir o mesmo resultado adicionando de forma imperativa três entradas de ACL separadas usando o comando gcloud managed-kafka acls add-acl-entry. Esse método envolve a execução do comando para negar o acesso a cada uma das operações ALTER, ALTER_CONFIGS e DELETE, da seguinte maneira:

gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=ALTER_CONFIGS \
    --permission-type=DENY \
    --host='*'
gcloud managed-kafka acls add-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

As informações a seguir se aplicam a cada um dos comandos add-acl-entry:

  • allTopics: especifica que essa ACL se aplica a todos os tópicos no cluster do Serviço gerenciado para Apache Kafka.

  • LOCATION: a região Google Cloud em que o cluster do Serviço Gerenciado para Apache Kafka está localizado, como us-central1.

  • CLUSTER_ID: o nome do cluster do Serviço gerenciado para Apache Kafka.

  • --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': especifica o principal a quem a ACL se aplica. O principal é uma contaGoogle Cloud , com o prefixo StandardAuthorizer do Kafka User:.

  • --operation: especifica a operação do Kafka que está sendo negada:

    • ALTER: inclui ações como mudar o número de partições ou o fator de replicação.

    • ALTER_CONFIGS: inclui a modificação de configurações no nível do tópico.

    • DELETE: inclui a exclusão de tópicos.

  • --permission-type=DENY: indica que essas entradas de ACL bloqueiam o acesso para as operações especificadas.

  • --host='*': especifica que essa negação se aplica independentemente do host de origem da solicitação. O Serviço Gerenciado para Apache Kafka só aceita ACLs com host '*'.

Para remover essas restrições, use o comando remove-acl-entry para cada uma das entradas adicionadas, usando os mesmos parâmetros. Por exemplo, para permitir novamente a exclusão de tópicos:

gcloud managed-kafka acls remove-acl-entry allTopics \
    --cluster=CLUSTER_ID \
    --location=LOCATION
    --principal='User:test-kafka-client@test-project.iam.gserviceaccount.com' \
    --operation=DELETE \
    --permission-type=DENY \
    --host='*'

Solução de problemas com ACLs

O autorizador padrão do Apache Kafka grava registros de auditoria por padrão em negações de autorização. Se você receber um erro de autorização do Kafka, poderá confirmar o principal, o recurso e a operação que foram negados pesquisando os registros do cluster por StandardAuthorizerData logAuditMessage.

Por exemplo, confira um registro de cluster de amostra.

org.apache.kafka.metadata.authorizer.StandardAuthorizerData logAuditMessage\n
INFO: Principal = User:556291496362-compute@developer.iam.gserviceaccount.com is
Denied operation = DESCRIBE from host = 172.16.0.20 on resource = Topic:LITERAL:t1
for request = Metadata with resourceRefCount = 1 based on rule DefaultDeny

A seguir

Apache Kafka® é uma marca registrada da The Apache Software Foundation ou afiliadas nos Estados Unidos e/ou em outros países.