Table of Contents |
---|
Status
Current state: "Under Discussion" Accepted
Discussion thread: here [Change the link from the KIP proposal email archive to your own email thread]
...
sasl.jaas.config will be supported for brokers to enable dynamic SASL configuration of brokers. The property will use the same format as clients and may specify with one or more login context entries (one for each supported SASL mechanism)login context specified as the config value. The mechanism name corresponding to the config must be specified as prefix in lower-case (e.g. scram-sha-256.sasl.jaas.config)
. If multple mechanisms are enabled on a listener, separate configs must be provided for each enabled mechanism. The property may be preceded by listener name if multiple listeners are configured to use SASL. (e.g listener.name.sasl_ssl.plain.sasl.jaas.config
)
Format: One login context entry Format: One or more login context entries using the same format JAAS configuration:
...
Code Block | ||||
---|---|---|---|---|
| ||||
listener.name.sasl_ssl.plain.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required user_alice=”alice-secret”; \ listener.name.sasl_ssl.scram-sha-256.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required; |
...
- Name:
password.encoder
.secret
Type:Password
- Name:
password.encoder
.keyfactoryold.algorithmsecret
Type:Password (only used when
password.encoder
.secret
is rotated) - Name:
Type:password.encoder
.keyfactory.algorithmString
Default:PBKDF2WithHmacSHA512
if available, otherwisePBKDF2WithHmacSHA1
(e.String
Default:PBKDF2WithHmacSHA512
if available, otherwisePBKDF2WithHmacSHA1
(e.g. Java7) - Name:
Type:password.encoder
.cipher.algorithmString
Default:AES/CBC/PKCS5Padding
(AES-256 if available, AES-128 otherwise) - Name:
Type: Integer Default:password.encoder
.key.length256
if supported,128
otherwise - Name:
Default:
Type: Integerpassword.encoder
.iterations2048
4096
The secret will not be dynamically configurable and hence will never be stored in ZooKeeper. All the dynamic password configs are per-broker configs and hence there is no requirement to maintain the same secret across all brokers. To change password.encoder
.secret
, each broker must be restarted with an updated server.properties that contains the new secret in the config password.encoder
.secret
as well as all current dynamically configured passwords for that broker. Updates to passwords from then on will use the new secretthe old secret in the config password.encoder
.old.secret
. The broker will decode all passwords in ZooKeeper using password.encoder
.old.secret
and update the values in ZooKeeper after re-encoding using password.encoder
.secret.
The config
will be used only if the passwords in ZooKeeper are encoded using the old value and will be ignored otherwise.password.encoder
.old.secret
Broker configuration in ZooKeeper will be protected using ACLs and will no longer be world-readable by default. It is expected that secure deployments of Kafka will also use network segmentation to limit ZooKeeper access.
...
Code Block | ||||
---|---|---|---|---|
| ||||
DescribeConfigs Request (Version: 1) => [resource [config_name]] include_synonyms resource => resource_type resource_name resource_type => INT8 resource_name => STRING config_name => STRING include_synonyms => BOOLEAN DescribeConfigs Response (Version: 1) => throttle_time_ms [entities] throttle_time_ms => INT32 entities => error_code error_message resource [configs] error_code => INT16 error_message => STRING resource => resource_type resource_name resource_type => INT8 resource_name => STRING configs => [config_entry [synonym]] <= Added [synonym] config_entry => config_name => STRING config_value => NULLABLE_STRING read_only => BOOLEAN config_source => INT8 <= Replaced boolean is_default with more generic config_source (see below for values) is_sensitive => BOOLEAN synonym => <= NEW config_name => STRING config_value => NULLABLE_STRING config_source => INT8 <= may be one of (TOPIC|DYNAMIC_BROKER|DYNAMIC_DEFAULT_BROKER|STATIC_BROKER|DEFAULT) |
Public Interface Changes
When MetadataRequest
version is increased after 1.1.0 release, a new error code ENDPOINT_NOT_FOUND_ON_LEADER
A new interface Reconfigurable
will be added to notify clients when a listener is available on the broker used to obtain metadata, but not on the leader of a partition. This could be a transient error when listeners are added and will be retried in the same way as LEADER_NOT_AVAILABLE
. Broker will continue to return LEADER_NOT_AVAILABLE
to clients using older version of MetadataRequest
. In 1.1.0, brokers will return LEADER_NOT_AVAILABLE
instead of UNKNOWN_SERVER_ERROR
in older versions.
Public Interface Changes
A new interface Reconfigurable
will be added to notify reconfigurable objects of configuration changes. For example, metrics reporters that support reconfiguration can implement the interface Reconfigurable
to enable reconfiguration without broker restart. reconfigurable objects of configuration changes. For example, metrics reporters that support reconfiguration can implement the interface Reconfigurable
to enable reconfiguration without broker restart. The interface will also be implemented by all internal classes which support reconfiguration (e.g. ChannelBuilder
)
...
Code Block | ||
---|---|---|
| ||
public enum ConfigSource { DYNAMIC_TOPIC_CONFIG, // dynamic topic config that is configured for a specific topic DYNAMIC_BROKER_CONFIG, // dynamic broker config that is configured for a specific broker DYNAMIC_DEFAULT_BROKER_CONFIG, // dynamic broker config that is configured as default for all brokers in the cluster STATIC_BROKER_CONFIG, // static broker config provided as broker properties at start up (e.g. server.properties file) DEFAULT_CONFIG // built-in default configuration for configs that have a // built-in default configuration for configs that have a default value } |
Tools
kafka-configs.sh
will be updated to configure defaults and overrides for dynamic configuration options for the entity type brokers
.
default value
} |
Tools
kafka-configs.sh
will be updated to configure defaults and overrides for dynamic configuration options for the entity type brokers
. This will be done using the new AdminClient that talks to brokers rather than to ZooKeeper so that password encryption and config validation need to be implemented only in the broker. The full migration of ConfigCommand to use the new AdminClient will be done under KIP-248.
Two new options will be added to kafka-configs.sh under this KIP to enable broker config describe and update using the new AdminClient.
- --bootstrap-server <host>:<port>
- --command-config <config-file>
Example:
Add/update broker-specific config for broker with broker id 0:
bin/kafka-configs configs.sh --zookeeper bootstrap-server localhost:2181 9092 --command-config /path/adminclient.props --alter --add-config 'ssl.keystore.location=keystore1.jks,ssl.keystore.password=password1' --entity-name 0 --entity-type brokers
Add/update cluster-wide default config:
bin/kafka-configs --zookeeper localhost:2181 configs.sh --bootstrap-server localhost:9092
--command-config /path/adminclient.props
--alter --add-config 'unclean.leader.election.enable=false' --entity-default --entity-type brokers
Delete broker-specific config (the actual config will revert to its default value, see precedence of configs):
bin/kafka-configs.sh --zookeeper localhost bootstrap-server localhost:9092
--alter --delete-config unclean.leader.election.enable --entity-type brokers --entity-name 0--command-config /path/adminclient.props
...
- SSL configs will be updated by reconfiguring
ChannelBuilder
and creating a newSslFactory
. If SSL is used for inter-broker communication, inconsistent changes (e.g changing CA) should be made by adding a new listener with the new properties. This is true for SASL as well. - SASL configuration updates will be supported using the dynamic JAAS configuration option
sasl.jaas.config
- Updates to
advertised.listeners
will re-register the new listener in ZK. This update will be not allowed for the listener used in inter-broker communication. In addition to this,AdminClient
will not allow updates to the listener that was used to make the alter request. - When changes are made to listeners, additional logic will be required in the controller to broadcast the updated metadata to all brokers.
- All the security configs can be dynamically configured for new listeners. In the initial implementation, only some configs will be dynamically updatable for existing listeners (e.g. SSL keystores). Support for updating other security configs dynamically for existing listeners will be added later.
Limitations:
- Configuration updates will not be allowed for the listener used in inter-broker communication. This KIP will not allow dynamic updates to inter-broker security protocol or listener name. Support for changing inter-broker security configuration without a restart will be done in a follow-on KIP along with additional validation to ensure that all brokers have enabled the new config.
...