Enforce Centralized Governance with Confluent Cloud Gateway
To enforce centralized governance on your Apache Kafka® traffic, you must configure
Confluent Cloud Gateway (Confluent Gateway) to communicate with Confluent Cloud Schema Registry and enable
governance for record keys and values in the gateway.yaml file.
For an overview of how centralized governance enforcement works, see Enforce Data Governance Centrally with Confluent Gateway.
To configure governance with Confluent for Kubernetes, see Enforce Centralized Governance for Confluent Gateway using Confluent for Kubernetes.
Prerequisites
Ensure your environment meets the following requirements:
Gateway version: Deploy Confluent Gateway version 1.4 or later.
Confluent Cloud Schema Registry: To use schema rules, including encryption, enable the Stream Governance Advanced package for your environment.
Schema format: Use Confluent Cloud Schema Registry serializers that produce the standard Confluent wire format, which is a magic byte
0x00followed by a four-byte schema ID, or that carry a schema GUID in a record header.Confluent Gateway validates records serialized with Apache Avro®, JSON Schema, or Protobuf. For more information, see Serializer and Deserializer Development.
Gateway authentication: Provision Confluent Gateway with valid Confluent Cloud Schema Registry credentials, an API key and secret, using basic authentication.
Access control: Grant Confluent Gateway read access to Confluent Cloud Schema Registry so it can read the schemas for all topics that flow through it.
Encryption rules (optional): If you use encryption rules, complete the following:
Create the key encryption key (KEK) that your rules reference. For more information, see Create a KEK.
If you don’t share the KEK with Confluent, ensure that Confluent Gateway can reach the key management service (KMS) that holds the KEK.
Step 1: Configure the Confluent Cloud Schema Registry connection
Connect Confluent Gateway to Confluent Cloud Schema Registry so that Confluent Gateway can retrieve schemas and validate incoming records.
gateway:
policies:
dataGovernance:
schemaRegistryUrls: --- [1]
- "https://psrc-xxxxx.us-east-2.aws.confluent.cloud"
schemaRegistryConfigs: --- [2]
config.providers: "env" --- [3]
config.providers.env.class: "org.apache.kafka.common.config.provider.EnvVarConfigProvider"
basic.auth.credentials.source: "USER_INFO" --- [4]
basic.auth.user.info: "${env:SR_API_KEY}:${env:SR_API_SECRET}" --- [5]
context: null --- [6]
key:
enabled: false
value:
enabled: true
[1]
schemaRegistryUrls: A list of one or more Confluent Cloud Schema Registry URLs. A single Confluent Cloud Schema Registry cluster typically has one URL. If you list more than one and the primary URL is unreachable, Confluent Gateway connects to the next URL in the list.[2]
schemaRegistryConfigs: A container for all configurations passed to the Confluent Cloud Schema Registry client, including security protocols, timeouts, and authentication details such as basic authentication.[3]
config.providers: The configuration providers that Confluent Gateway uses to resolve${...}placeholders inschemaRegistryConfigs. Confluent Gateway resolves placeholders only inschemaRegistryConfigs, not elsewhere in the Confluent Gateway configuration. Confluent Gateway leaves placeholders unresolved unless you declare a provider. You can use the Kafka built-in providers:EnvVarConfigProvider,FileConfigProvider, andDirectoryConfigProvider. For more information, see Configuration Providers. This example declaresenvto read values from environment variables.[4]
basic.auth.credentials.source: The source of the credentials for basic authentication. Set this toUSER_INFOto read the username and password from thebasic.auth.user.infoproperty.[5]
basic.auth.user.info: The credentials that Confluent Gateway uses to authenticate to Confluent Cloud Schema Registry, in<SR-API-KEY>:<SR-API-SECRET>format. In production, resolve the values from environment variables or a secrets provider instead of using plain text.[6]
context: The Confluent Cloud Schema Registry context to use for schema lookups. Use a context to isolate schemas by environment or tenant. Whencontextis set tonull(the default), Confluent Gateway uses the default Confluent Cloud Schema Registry context.
You must include the key and value blocks. For more information, see
Step 2: Enable governance for record keys and values.
Step 2: Enable governance for record keys and values
Use the enabled setting to enable or disable governance for the record key
and the record value. Confluent Gateway evaluates the record key and value
independently, so you can govern only the one that has a schema. For example,
if your record values use Apache Avro® but your record keys are plain strings,
enable governance for record values only.
gateway:
policies:
dataGovernance:
key:
enabled: false # record keys are plain strings, no schema
value:
enabled: true
This example disables governance for record keys, which are plain strings with no schema, and enables it for record values.
Set enabled explicitly for both key and value. Neither setting has
a default value.
When
enabledistruefor the record key or value, Confluent Gateway performs schema ID enforcement and deep schema validation for it on the produce and fetch paths. If the schema delegates encryption rules to Confluent Gateway, Confluent Gateway also runs them. For more information, see Step 4: Configure schema rules and encryption.When
enabledisfalsefor the record key or value, Confluent Gateway forwards it unchanged.
For JSON Schema, Confluent Gateway validates the payload against schema constraints,
such as minimum and enum, only when you set
json.fail.invalid.schema to "true" in schemaRegistryConfigs.
Note
If your schemas use enableAt: GATEWAY and you set enabled to
false, Confluent Gateway doesn’t encrypt records while governance is off.
Step 3: Configure governance per topic
Add per-topic overrides to change the governance settings for specific topics.
By default, the key and value settings apply to all topics.
In this example, governance is on for values globally. Confluent Gateway bypasses
governance for the public-events topic and uses the RECORD subject
name strategy for the orders topic.
gateway:
policies:
dataGovernance:
schemaRegistryUrls:
- "https://psrc-xxxxx.us-east-2.aws.confluent.cloud"
key:
enabled: false
value:
enabled: true --- [1]
topics:
- name: "public-events" --- [2]
value:
enabled: false --- [3]
- name: "orders" --- [2]
value:
subjectNameStrategy: RECORD --- [4]
[1]
value.enabled: The global setting applied to all topics not listed undertopics.[2]
topics[].name: The name of the Kafka topic to override.[3]
topics[].value.enabled: Enables or disables governance for record values on this topic. Overrides the globalvalue.enabledsetting.[4]
topics[].value.subjectNameStrategy: The subject name strategy for record values on this topic. Overrides the globalvalue.subjectNameStrategysetting. Valid values areTOPIC(default),RECORD, andTOPIC_RECORD. For how each strategy builds the subject name, see Subject name strategy in the Confluent Cloud Schema Registry documentation.
Each entry must override at least one setting for key or value.
Confluent Gateway applies the global value to any setting you omit. Use the key
block to override settings for record keys on a topic.
Note
Per-topic overrides take precedence over the global settings. Setting a
topic’s enabled to false disables governance for the record key
or value on that topic even when you enable it globally.
Step 4: Configure schema rules and encryption
Confluent Gateway applies schema rules defined in Confluent Cloud Schema Registry to records on topics where governance is enabled and the schema delegates the rules to Confluent Gateway. You typically use these rules for field-level or full-payload encryption, where Confluent Gateway encrypts or decrypts sensitive data before it reaches the broker.
Before you configure schema rules, complete the encryption prerequisites.
Configure Confluent Gateway for encryption
To configure encryption, enable governance for the record key or value that contains the sensitive data. Then register the rule executors that run the Confluent Cloud Schema Registry encryption rules.
gateway:
policies:
dataGovernance:
schemaRegistryConfigs:
rule.executors: "encryptField,encryptPayload" --- [1]
rule.executors.encryptField.class: "io.confluent.kafka.schemaregistry.encryption.FieldEncryptionExecutor"
rule.executors.encryptField.param.secret: "<base64-kms-secret>" --- [2]
rule.executors.encryptPayload.class: "io.confluent.kafka.schemaregistry.encryption.EncryptionExecutor"
rule.executors.encryptPayload.param.secret: "<base64-kms-secret>"
key:
enabled: false
value:
enabled: false --- [3]
topics: --- [4]
- name: "payments"
value:
enabled: true
[1]
rule.executors: The executors that Confluent Gateway runs.Register
encryptField(FieldEncryptionExecutor) for field-levelENCRYPTrules.Register
encryptPayload(EncryptionExecutor) for full-payloadENCRYPT_PAYLOADrules.
[2]
rule.executors.<name>.param.secret: The Base64-encoded secret the local KMS provider uses to derive encryption keys. In production, provide this through an environment variable or a secrets provider instead of a plain-text value. For how to set up the local key, see Configure the KMS provider.[3]
value.enabled: Enables or disables governance for record values for all topics. This example sets it tofalseso that governance applies only to the topics you override in [4]. Encryption rules run only for record keys and values that have governance enabled.[4]
topics: (Optional) The per-topic overrides. Use overrides to limit governance to topics that carry sensitive data. This example enables governance for record values on thepaymentstopic only.
If the KEK uses a cloud key management service (KMS), such as AWS KMS,
Azure Key Vault, or Google Cloud KMS, and you don’t share the KEK with Confluent,
also set the credentials that Confluent Gateway uses to access the KMS as
rule.executors.<executor_name>.param.<setting> properties in
schemaRegistryConfigs. For the settings of each KMS, see
Configuration Parameters for Client-Side Field Level Encryption.
Choose where encryption runs
Encryption rules in a schema’s rule set include an enableAt setting.
Confluent Gateway runs the rules only when enableAt is GATEWAY or ALL, or
isn’t set. To have Confluent Gateway manage encryption, set enableAt to
GATEWAY.
Define the schema rules
Define the encryption logic in the schema ruleSet in Confluent Cloud Schema Registry. Set
enableAt to GATEWAY. Confluent Gateway fetches this definition and applies it
to incoming records automatically.
In the following example, Confluent Gateway encrypts only the fields tagged with
personally identifiable information (PII) by using a local KMS provider.
The "schema" value is the JSON-encoded schema definition, in which
each sensitive field carries the PII tag. For details on how to
tag fields in Avro, JSON Schema, or Protobuf, see
Data contracts.
{
"schema": "...",
"ruleSet": {
"domainRules": [{
"name": "encryptPII",
"kind": "TRANSFORM",
"type": "ENCRYPT",
"mode": "WRITEREAD",
"tags": ["PII"],
"params": {
"encrypt.kek.name": "demo-kek",
"encrypt.kms.type": "local-kms",
"encrypt.kms.key.id": "demo-key"
}
}],
"enableAt": "GATEWAY"
}
}
On the produce path, Confluent Gateway encrypts the tagged fields before writing them to Kafka. On the fetch path, Confluent Gateway decrypts the tagged fields. Untagged fields are unchanged.
Encrypt the full payload (optional)
A full-payload rule encrypts the entire record value rather than specific
tagged fields. Define an ENCRYPT_PAYLOAD rule in the encodingRules
array. Register the encryptPayload executor in Confluent Gateway.
{
"schema": "...",
"ruleSet": {
"encodingRules": [{
"name": "encryptPayload",
"kind": "TRANSFORM",
"type": "ENCRYPT_PAYLOAD",
"mode": "WRITEREAD",
"params": {
"encrypt.kek.name": "demo-kek-payload",
"encrypt.kms.type": "local-kms",
"encrypt.kms.key.id": "demo-key"
}
}],
"enableAt": "GATEWAY"
}
}
Confluent Gateway encrypts the entire serialized value on the produce path and decrypts it on the fetch path.
Step 5: Verify centralized governance enforcement
Run a few tests to confirm Confluent Gateway enforces your governance policies.
Verify schema validation
To verify that Confluent Gateway rejects noncompliant data before it reaches the broker, produce a record that violates the schema. For example, send a record with a missing schema ID. Or, send a record with a valid schema ID and a payload that doesn’t conform to the schema.
Expected result
Confluent Gateway rejects the record before it reaches the broker and returns an
INVALID_RECORD error.
The producer receives an
InvalidRecordException.Confluent Gateway logs a message similar to the following:
Schema validation failed; rejecting record
Verify encryption
To verify that Confluent Gateway encrypts records on the produce path and decrypts
them on the fetch path, use a topic whose schema has an encryption rule with
enableAt set to GATEWAY. Produce a plaintext record to that topic.
Consume the
record from two separate endpoints to verify the encryption behavior:
Directly from the Kafka cluster: The data is encrypted. Field-level rules encrypt the tagged fields, and full-payload rules encrypt the entire record value.
Through Confluent Cloud Gateway: Confluent Gateway returns the original plaintext.
Handle errors and monitor governance enforcement
Confluent Gateway returns specific error codes for validation and decryption failures and logs each failure. Confluent Gateway also emits metrics for governance enforcement. Use the following reference to handle errors and monitor governance enforcement activity.
Error handling and response codes
When Confluent Gateway detects a policy violation or a schema mismatch, it returns specific error codes. These error codes let client applications handle failures without losing their connection. For example:
Produce path, validation failure: If a record fails validation, Confluent Gateway returns an
INVALID_RECORDerror to the producer and rejects the entire produce request, not only the failing record. The connection remains open.Produce path, Schema Registry or KMS unavailable: If Confluent Gateway can’t reach Confluent Cloud Schema Registry or the KMS, or Confluent Cloud Schema Registry rejects the credentials, it returns a
REQUEST_TIMED_OUTerror, and the producer can retry the request.Produce path, unexpected error: If Confluent Gateway encounters an unexpected error, such as an unexpected response from Confluent Cloud Schema Registry, it returns an
UNKNOWN_SERVER_ERRORerror to the producer and rejects the entire produce request.Fetch path, any failure: If Confluent Gateway can’t validate or decrypt a record, for example, because the KMS is unreachable, it logs an error. Confluent Gateway then sets an
UNKNOWN_SERVER_ERRORcode on the affected partition and returns empty records for that partition. Confluent Gateway returns the other partitions normally in the same fetch response and doesn’t deliver data that failed validation or decryption to the consumer.
Metrics
Confluent Gateway records the gateway.governance.data.latency timer for each
partition it validates. The timer’s count is the number of validated
partitions. The timer has the following tags:
route: The Confluent Gateway route name.topic: The Kafka topic name.mode:produceorfetch.outcome:successorrejected.failure.origin: The origin of the failure, ornoneon success. Prometheus renders this tag asfailure_origin.
Confluent Gateway increments the gateway.governance.data.skipped counter, tagged
with route, topic, and mode, for partitions that need no
validation. A rise in this counter for a topic that you expect to be governed
indicates that governance is effectively off for that topic.
When a schema carries rules, such as field encryption, Confluent Gateway also publishes
the following per-rule metrics, tagged with rule_type, rule_mode,
subject, and rule_name:
gateway.governance.data.rule.executions.totalgateway.governance.data.rule.success.totalgateway.governance.data.rule.failure.totalgateway.governance.data.rule.skipped.totalgateway.governance.data.rule.actions.totalgateway.governance.data.rule.last.success.timestamp.ms