Questo documento descrive come utilizzare le liste di controllo dell'accesso (ACL) di Apache Kafka percontrollo dell'accesso'accesso in Google Cloud Managed Service per Apache Kafka.
Le ACL Apache Kafka forniscono un controllo dell'accesso granulare all'interno del cluster Kafka. Managed Service per Apache Kafka abilita
StandardAuthorizer predefinito, che
memorizza gli elenchi di controllo degli accessi nei metadati del cluster Kafka basati su KRaft.
Queste ACL controllano quali utenti autenticati possono eseguire operazioni specifiche su risorse Kafka specifiche, ad esempio produrre o utilizzare messaggi in un argomento.
Queste ACL sono utili per controllare le interazioni con il cluster utilizzando client Apache Kafka standard, che sono soggetti solo a un controllo IAM a livello di cluster per la connessione iniziale. Per saperne di più, consulta Controllo dell'accesso con IAM.
Come funziona controllo dell'accesso ACL Kafka
Il client interagisce con l'autorizzatore ACL standard di Kafka all'interno del cluster. L'autorizzatore valuta gli elenchi ACL Apache Kafka pertinenti per autorizzare operazioni specifiche richieste dal principal, ad esempio la produzione in un argomento o il consumo da un gruppo. L'entità utilizzata per il controllo ACL deriva da uno dei seguenti metodi di autenticazione:
SASL:l'entità IAM, ad esempio l'email di un account di servizio.
TLS reciproco:il nome distinto (DN) del certificato client, potenzialmente trasformato dalle regole di mappatura dei principal.
Per una sicurezza completa, devi configurare quanto segue:
Autorizzazioni IAM per l'accesso di gestione. Per saperne di più, consulta Controllo dell'accesso con IAM.
ACL Kafka per l'accesso ai dati e le operazioni in-cluster dai client Apache Kafka open source, indipendentemente dal metodo di autenticazione.
Utilizzo degli elenchi di controllo dell'accesso Apache Kafka
I binding ACL di Apache Kafka hanno il seguente formato:
Principal P is [Allowed/Denied] Operation O From Host H on any resource matching Resource Pattern RP.
Di seguito è riportato un elenco di informazioni importanti sul formato:
Entità(P): l'identità utente da autorizzare. Questo valore è preceduto da
User:.Per l'autenticazione SASL, si tratta dell'entità IAM, ad esempio
User:my-service-account@my-project.iam.gserviceaccount.com.Per l'autenticazione mTLS, questo è il nome distinto (DN) del certificato client, ad esempio
User:CN=my-client,OU=my-org-unit. Il formato esatto dipende dal soggetto del certificato. Le regole di mappatura dei principal possono trasformare questo valore.
Tipo di autorizzazione(consentita/negata): indica se l'associazione ACL consente o nega l'accesso. I binding di negazione hanno la precedenza.
Operazione(O): l'azione eseguita, ad esempio lettura, scrittura o creazione. Per informazioni su quali operazioni si applicano a quali risorse per vari protocolli Kafka, consulta Operazioni e risorse sui protocolli nella documentazione di Apache Kafka.
Host(H): la macchina da cui ha origine la richiesta. Poiché Managed Service per Apache Kafka traduce gli indirizzi di rete client, l'utilizzo di host diversi da
'*'non è supportato.Pattern risorsa(RP): un pattern utilizzato per trovare corrispondenze con risorse specifiche. Un pattern di risorse è costituito da un tipo di risorsa, un nome risorsa e un tipo di pattern (
LITERALoPREFIXED).
Accesso predefinito
I cluster Managed Service per Apache Kafka funzionano con la proprietà Apache Kafka
allow.everyone.if.no.acl.found impostata su true. La presenza o l'assenza
di ACL Kafka determina direttamente il livello di accesso alle risorse:
Se non sono definite ACL Kafka per una risorsa specifica come un argomento, a tutti i principal autenticati viene concesso l'accesso. Questa configurazione consente ai cluster Managed Service per Apache Kafka di essere immediatamente operativi, senza la necessità di configurare gli elenchi di controllo degli accessi.
Non appena definisci un ACL Kafka per la risorsa, l'accesso viene limitato. Solo i principal a cui è stata concessa esplicitamente l'autorizzazione utilizzando una voce
ALLOWin un ACL Kafka possono accedere alle risorse corrispondenti (a meno che non siano bloccati specificamente da una voceDENY).
Managed Service per Apache Kafka concede al suo
service agent l'accesso
amministrativo al tuo cluster. Questo accesso consente all'agente di servizio di eseguire
le operazioni richieste dall'API Managed Service per Apache Kafka, indipendentemente dalle altre ACL configurate nel cluster. Managed Service per Apache Kafka lo fa modificando l'implementazione di StandardAuthorizer. La modifica concede all'agente di servizio autorizzazioni simili a quelle dei superuser, ad eccezione delle operazioni di lettura e scrittura. Non puoi modificare questa configurazione.
Entità Kafka
I principal Kafka per i cluster Managed Service per Apache Kafka sono specificati con il prefisso
Kafka StandardAuthorizer "User:".
Per SASL/IAM: l'entità è l'account Google Cloud . Ad esempio, per concedere l'accesso al account di servizio
test-kafka-client@test-project.iam.gserviceaccount.com, utilizza l'entità Kafka"User:test-kafka-client@test-project.iam.gserviceaccount.com". Le entità ACL Kafka devono specificare un utente, un account di servizio o un'entità IAM individuale, ma non un gruppo o un insieme di entità. Le ACL Kafka non supportano la risoluzione delle iscrizioni ai gruppi per i principal Google Cloud .Per mTLS reciproco:il principal viene derivato dal nome distinto (DN) del soggetto del certificato client. Ad esempio,
User:CN=client1,OU=dev,O=MyOrg,L=City,ST=State,C=US. Puoi utilizzare le regole di mappatura delle entità mTLS per trasformare il nome distinto in una stringa principale più intuitiva per le ACL.
Per creare un ACL che si applichi a tutti i membri di un gruppo Google o di un insieme di entità, puoi utilizzare un'entitàaccount di serviziot proxy e la simulazione dell'identità delaccount di serviziot:
Crea un service account da utilizzare come proxy per il gruppo.
Concedi al gruppo Google o al set di entità il ruolo Creatore token account di servizio nell'account di servizio. Consulta Gestire l'accesso agli account di servizio
Aggiungi ACL Kafka per il account di servizio proxy. Un esempio di entità è:
User:group-proxy@test-project.iam.gserviceaccount.com.Utilizza la simulazione dell'identità del service account nei client Kafka per autenticarti in Kafka come account di servizio. Google Cloud IAM autorizza una singola entità come membro del gruppo autorizzato a impersonare il account di servizio proxy. e Kafka autorizza ilaccount di serviziot proxy in base agli elenchi ACL esistenti nel cluster.
Operazioni Kafka per produttori e consumatori
Un'operazione è un'azione eseguita su una risorsa. Per ogni risorsa,
un'operazione viene mappata a una o più richieste del protocollo Kafka per quella risorsa.
Ad esempio, un'operazione READ per il tipo di risorsa topic viene mappata ai protocolli Apache Kafka Fetch, OffsetCommit e TxnOffsetCommit.
Per concedere a un produttore principale l'accesso a un argomento, procedi nel seguente modo:
Nella risorsa argomento, consenti le operazioni
WRITEeCREATE.Se utilizzi ID transazionali, nella risorsa ID transazionale, consenti l'operazione
WRITE.
Per concedere a un consumer principale l'accesso a un argomento, segui questi passaggi:
Nella risorsa argomento, consenti l'operazione
READ.Nella risorsa del gruppo consumer, consenti l'operazione
READ.
Per saperne di più sulle operazioni valide sulle risorse supportate dall'API Kafka, consulta Operations and Resources on Protocols nella documentazione di Apache Kafka.
Configurare gli ACL per il comportamento di negazione predefinito
I cluster Kafka gestiti sono configurati con
allow.everyone.if.no.acl.found = true.
Pertanto, per impostazione predefinita, se non sono impostate ACL su una risorsa, tutti i principal
possono accedere alla risorsa.
Per configurare un comportamento di default-deny simile a quello di IAM, puoi
prima configurare l'accesso per un utente amministratore a tutte le risorse del cluster.
Di conseguenza, ogni risorsa ha un ACL definito e
il comportamento allow.everyone.if.no.acl.found viene eliminato.
Per impostazione predefinita, a qualsiasi entità non esplicitamente consentita da un'ACL ALLOW viene negato l'accesso.
Ad esempio, per impostare gli ACL su tutte le risorse del cluster per l'account di servizio clusterAdmin@test-project.iam.gserviceaccount.com, crea le seguenti voci ACL.
Il seguente comando gcloud CLI concede a un account di servizio
denominato clusterAdmin@test-project.iam.gserviceaccount.com
l'accesso amministrativo completo (--operation=ALL) a un cluster Kafka specifico
situato in una regione particolare. Questa autorizzazione consente all'account di servizio di eseguire qualsiasi operazione sul cluster da qualsiasi 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
Il seguente comando gcloud CLI concede a un account di servizio
denominato clusterAdmin@test-project.iam.gserviceaccount.com
l'accesso amministrativo completo (--operation=ALL) a tutti gli argomenti all'interno di un
cluster Kafka specifico che si trova in una determinata regione. Questa autorizzazione consente
al account di servizio di eseguire qualsiasi operazione su tutti gli argomenti da qualsiasi 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
Il seguente comando gcloud CLI concede a un account di servizio
denominato clusterAdmin@test-project.iam.gserviceaccount.com
l'accesso amministrativo completo (--operation=ALL) a tutti i gruppi di consumatori all'interno di
un cluster Kafka specifico che si trova in una regione particolare. Questa autorizzazione
consente all'account di servizio di eseguire qualsiasi operazione su tutti i gruppi
di consumatori da qualsiasi 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
Il seguente comando gcloud CLI concede a un account di servizio denominato
clusterAdmin@test-project.iam.gserviceaccount.com
l'accesso amministrativo completo (--operation=ALL) a tutti gli ID transazionali all'interno di un
cluster Kafka specifico che si trova in una regione particolare. Questa autorizzazione consente
alaccount di serviziot di eseguire qualsiasi operazione su tutti gli ID transazionali da qualsiasi
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
Di seguito è riportato un elenco di informazioni importanti sui comandi:
--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': l'entità a cui si applica l'ACL. Il principal è un accountGoogle Cloud con il prefisso Kafka StandardAuthorizerUser:.--operation=all: l'operazione Kafka concessa, che in questo caso è l'accesso completo.--permission-type=ALLOW: questa voce ACL concede l'accesso.--host='*': l'host da cui l'entità può accedere alla risorsa.'*'concede l'accesso da qualsiasi host. Managed Service per Apache Kafka supporta solo ACL con host'*'.CLUSTER_ID: il nome del tuo cluster Managed Service per Apache Kafka.
LOCATION: la regione Google Cloud in cui si trova il cluster Managed Service per Apache Kafka, ad esempio
us-central1.
Configurare gli ACL
Puoi configurare gli elenchi ACL Apache Kafka con le API Managed Service per Apache Kafka ACL o con
strumenti Apache Kafka open source come Apache Kafka authorizer cli
kafka-acls.sh,
o Admin Client.
Managed Service per Apache Kafka organizza gli elenchi ACL in base ai pattern di risorse Kafka. Il pattern della risorsa è definito da quanto segue:
Tipo di risorsa: cluster, argomento, gruppo di consumer o ID transazionale
Tipo di pattern: letterale o con prefisso (tutte le risorse il cui nome inizia con la stringa fornita)
Nome della risorsa: il nome o il prefisso della risorsa a cui si applicano le voci ACL.
Una risorsa ACL Managed Service per Apache Kafka rappresenta tutto il controllo dell'accesso configurato per un singolo pattern di risorse Kafka, come un elenco ripetuto di voci ACL. Il nome della risorsa ACL identifica in modo univoco il pattern della risorsa dell'associazione ACL. Per saperne di più, consulta ID ACL.
Puoi gestire gli ACL Managed Service per Apache Kafka a livello di risorsa ACL (tutte le voci ACL per un pattern di risorsa) o in modo incrementale aggiungendo e rimuovendo singole voci ACL per un pattern di risorsa ACL.
Per saperne di più, consulta Crea un ACL Kafka gestito e Aggiungi una voce ACL Kafka gestita.
Consenti la lettura da un argomento
Per consentire ai client Apache Kafka open source in esecuzione come account di servizio
test-kafka-client@test-project.iam.gserviceaccount.com
di leggere dall'argomento topic-name, crea una voce ACL Managed Service per Apache Kafka
utilizzando il
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='*'
Di seguito è riportato un elenco di informazioni importanti sul comando:
topic/topic-name: specifica l'argomento Managed Service per Apache Kafka a cui vuoi concedere l'accesso. Sostituiscitopic-namecon il nome effettivo dell'argomento. Il prefissotopic/indica che questa voce ACL si applica a un pattern di risorsa argomento specifico (letterale).LOCATION: la regione Google Cloud in cui si trova il cluster Managed Service per Apache Kafka, ad esempious-central1.CLUSTER_ID: il nome del cluster Managed Service per Apache Kafka.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': l'entità a cui si applica l'ACL. Il principal è un accountGoogle Cloud con il prefisso Kafka StandardAuthorizerUser:.--operation=READ: l'operazione Kafka che viene concessa, che in questo caso èREAD.--permission-type=ALLOW: indica che questa voce ACL concede l'accesso.--host='*': specifica l'host da cui l'entità può accedere alla risorsa.'*'concede l'accesso da qualsiasi host. Managed Service per Apache Kafka supporta solo gli ACL con host'*'.
Per rimuovere l'accesso in lettura, puoi utilizzare il
comando remove-acl-entry con gli stessi parametri.
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='*'
Consenti la scrittura in tutti gli argomenti con un prefisso comune
Per consentire ai client Apache Kafka open source in esecuzione come account di servizio
test-kafka-client@test-project.iam.gserviceaccount.com
di scrivere in tutti gli argomenti il cui nome inizia con il prefisso topic-prefix,
aggiungi una voce ACL Kafka gestita come segue:
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='*'
Di seguito è riportato un elenco di informazioni importanti sul comando:
topicPrefixed/topic-prefix: specifica il pattern della risorsa Managed Service per Apache Kafka a cui vuoi concedere l'accesso. Sostituiscitopic-prefixcon il prefisso effettivo dei tuoi argomenti. Il prefissotopicPrefixed/indica che questa voce ACL si applica a un pattern di risorse con prefisso: tutti gli argomenti che corrispondono al prefisso specificato.PROJECT: l'ID del tuo progetto Google Cloud in cui si trova il cluster Managed Service per Apache Kafka.LOCATION: la regione Google Cloud in cui si trova il cluster Managed Service per Apache Kafka, ad esempious-central1.CLUSTER_ID: il nome del tuo cluster Managed Service per Apache Kafka.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': l'entità a cui si applica l'ACL. Il principal è un accountGoogle Cloud con il prefisso Kafka StandardAuthorizerUser:.--operation=WRITE: l'operazione Kafka che viene concessa, che in questo caso èWRITE.--permission-type=ALLOW: questa voce ACL concede l'accesso.--host='*': l'host da cui l'entità può accedere alla risorsa.'*'concede l'accesso da qualsiasi host. Managed Service per Apache Kafka supporta solo ACL con host'*'.
Per rimuovere l'accesso in scrittura per questo account di servizio, rimuovi la voce 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='*'
Nega la modifica di tutti gli argomenti
Per impedire ai client Apache Kafka open source in esecuzione come account di servizio
test-kafka-client@test-project.iam.gserviceaccount.com
di modificare tutti gli argomenti in un cluster, puoi creare una
risorsa ACL Managed Service per Apache Kafka con un elenco di risorse AclEntry
per negare le operazioni ALTER, ALTER_CONFIGS e DELETE su tutti gli argomenti. Questo approccio definisce lo stato richiesto in un'unica configurazione.
In alternativa, puoi ottenere lo stesso risultato aggiungendo in modo imperativo tre voci ACL separate utilizzando il comando gcloud managed-kafka acls add-acl-entry.
Questo metodo prevede l'esecuzione del comando per negare l'accesso a ciascuna delle operazioni
ALTER, ALTER_CONFIGS e DELETE, come segue:
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='*'
Le seguenti informazioni si applicano a ciascuno dei comandi add-acl-entry:
allTopics: specifica che questo ACL si applica a tutti gli argomenti all'interno del cluster Managed Service per Apache Kafka.LOCATION: la regione Google Cloud in cui si trova il cluster Managed Service per Apache Kafka, ad esempious-central1.CLUSTER_ID: il nome del cluster Managed Service per Apache Kafka.--principal='User:test-kafka-client@test-project.iam.gserviceaccount.com': specifica l'entità a cui si applica l'ACL. L'entità è un accountGoogle Cloud con il prefisso KafkaStandardAuthorizerUser:.--operation: specifica l'operazione Kafka negata:ALTER: include azioni come la modifica del numero di partizioni o del fattore di replica.ALTER_CONFIGS: include la modifica delle configurazioni a livello di argomento.DELETE: include l'eliminazione degli argomenti.
--permission-type=DENY: indica che queste voci ACL bloccano l'accesso per le operazioni specificate.--host='*': specifica che questo rifiuto si applica indipendentemente dall'host da cui ha origine la richiesta. Managed Service per Apache Kafka supporta solo ACL con host'*'.
Per rimuovere queste limitazioni, utilizza il comando remove-acl-entry per ciascuna delle voci aggiunte, utilizzando gli stessi parametri. Ad esempio, per consentire nuovamente l'eliminazione
dell'argomento:
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='*'
Risoluzione dei problemi relativi alle ACL
L'autorizzatore standard Apache Kafka scrive i log di controllo per impostazione predefinita in caso di
negazione dell'autorizzazione. Se ricevi un errore di autorizzazione Kafka, puoi
confermare l'entità, la risorsa e l'operazione che è stata negata cercando
StandardAuthorizerData logAuditMessage nei log del cluster.
Ad esempio, ecco un log del cluster di esempio.
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