Thanks, Ron!  I will take a look.

Regards,
Robert

On Tue, May 15, 2018 at 5:59 PM, Ron Dagostino <rndg...@gmail.com> wrote:

> Hi Robert.  Regarding your comment "use the lease duration to schedule a
> configuration reload in the future", you might be interested in the code
> that does refresh for OAuth Bearer Tokens in KIP-255; specifically, the
> class
> org.apache.kafka.common.security.oauthbearer.internal.expiring.
> ExpiringCredentialRefreshingLogin.
> The class performs JAAS logins/relogins based on the expiration time of a
> retrieved expiring credential.  The implementation of that class is
> inspired by the code that currently does refresh for Kerberos tickets but
> is more reusable.  I don't know if you will leverage JAAS for defining how
> to go get a credential (you could since you have to provide credentials to
> authenticate to the remote systems anyway), but regardless, that class
> should be useful at least in some minimal sense if not more than that.  See
> https://github.com/apache/kafka/pull/4994.
>
> Ron
>
> Ron
>
> On Tue, May 15, 2018 at 8:01 PM, Robert Yokota <rayok...@gmail.com> wrote:
>
> > Hi Colin,
> >
> > Thanks for the feedback!
> >
> >
> > > The KIP says that "Vault is very popular and has been described as 'the
> > current gold standard in secret management and provisioning'."  I think
> > this might be a bit too much detail -- we don't really need to
> > > favorites, right? :)
> >
> > I've removed this line :)
> >
> >
> > > I think we should make the substitution part of the generic
> configuration
> > code, rather than specific to individual ConfigProviders.  We don't
> really
> > want it to work differently for Vault vs. KeyWhiz vs.
> > > AWS secrets, etc. etc.
> >
> > Yes, the ConfigProviders merely serve up key-value pairs.  A helper class
> > like ConfigTransformer would perform the variable substitutions if
> desired.
> >
> >
> > > We should also spell out exactly how substitution works.
> >
> > By one-level of indirection I just meant a simple replacement of
> variables
> > (which are the indirect references).  So if you have foo=${bar} and
> > bar=${baz} and your file contains bar=hello, baz=world, then the final
> > result would be foo=hello and bar=world.  I've added this example to the
> > KIP.
> >
> > You can see this as the DEFAULT_PATTERN in the ConfigTransformer.  The
> > ConfigTransformer only provides one level of indirection.
> >
> >
> > > We should also spell out how this interacts with KIP-226
> configurations.
> >
> > Yes, I mention at the beginning that KIP-226 could use the ConfigProvider
> > but not the ConfigTransformer.
> >
> >
> > > Maybe a good generic interface would be like this:
> >
> > I've added the subscription APIs but would like to keep the other APIs
> as I
> > will need them for integration with Vault.  With Vault I obtain the lease
> > duration at the time the key is obtained, so at that time I would want to
> > use the lease duration to schedule a configuration reload in the future.
> > This is similar to how the integration between Vault and the Spring
> > Framework works.   Also, the lease duration would be included in the
> > metadata map vs. the data map.  Finally, I need an additional "path" or
> > "bucket" parameter, which is used by Vault to indicate which set of
> > key-values are to be retrieved.
> >
> >
> > > With regard to ConfigTransformer: do we need to include all this code
> in
> > the KIP?  Seems like an implementation detail.
> >
> > I use the ConfigTransformer to show how the pattern ${provider:key} is
> > defined and how the substitution only involves one level of indirection.
> > If you feel it does not add anything to the text, I can remove it.
> >
> >
> > > Is there a way to avoid this couping?
> >
> > I'd have to look into it and get back to you.  However, I assume that the
> > answer is not relevant for this KIP :)
> >
> >
> > Thanks,
> > Robert
> >
> >
> >
> >
> >
> > On Tue, May 15, 2018 at 4:04 PM, Colin McCabe <cmcc...@apache.org>
> wrote:
> >
> > > Hi Robert,
> > >
> > > Thanks for posting this.  In the past we've been kind of reluctant to
> add
> > > more complexity to configuration.  I think Connect does have a clear
> need
> > > for this kind of functionality, though.  As you mention, Connect
> > integrates
> > > with external systems, which are very likely to have passwords stored
> in
> > > Vault, KeyWhiz or some other external system.
> > >
> > > The KIP says that "Vault is very popular and has been described as 'the
> > > current gold standard in secret management and provisioning'."  I think
> > > this might be a bit too much detail -- we don't really need to pick
> > > favorites, right? :)
> > >
> > > I think we should make configuration consistent between the broker and
> > > Connect.  If people can use constructs like
> > jdbc.config.key="${vault:jdbc.user}${vault:jdbc.password}"
> > > in Connect, they'll want to do it on the broker too, in a consistent
> way.
> > >
> > > If I understand correctly, ConfigProvider represents an external
> > > configuration source, such as VaultConfigProvider,
> KeyWhizConfigProvider,
> > > etc.
> > >
> > > I think we should make the substitution part of the generic
> configuration
> > > code, rather than specific to individual ConfigProviders.  We don't
> > really
> > > want it to work differently for Vault vs. KeyWhiz vs. AWS secrets, etc.
> > etc.
> > >
> > > We should also spell out exactly how substitution works.  For example,
> is
> > > substitution limited to 1 level deep?  In other words, If I have
> > > foo="${bar}" and bar=${baz}, probably foo should just be set equal to
> > > "${baz}" rather than chasing more than one level of indirection.
> > >
> > > We should also spell out how this interacts with KIP-226
> configurations.
> > > I would suggest that KIP-226 variables not be subjected to
> substitution.
> > > The reason is because in theory substitution could lead to different
> > > results on different brokers, since the different brokers may not have
> > the
> > > same ConfigProviders configured.  Also, having substitutions in the
> > KIP-226
> > > configuration makes it more difficult for the admin to understand what
> > the
> > > centrally managed configuration is.
> > >
> > > It seems the main goal is the ability to load a batch of key/value
> pairs
> > > from the ConfigProvider, and the ability to subscribe to notifications
> > > about changes to certain parameters.  Maybe a good generic interface
> > would
> > > be like this:
> > >
> > >  > public interface ConfigProvider extends Closeable {
> > > >      // batched get is potentially more efficient
> > >  >     Map<String, String> get(Collection<String> keys);
> > > >
> > > >    // The ConfigProvider is responsible for making this callback
> > > whenever the key changes.
> > > >    // Some ConfigProviders may want to have a background thread with
> a
> > > configurable update interval.
> > >  >     void subscribe(String key, ConfigurationChangeCallback
> callback);
> > > >
> > > >        // Inverse of subscribe
> > >  >     void unsubscribe(String key);
> > > >
> > > >    // Close all subscriptions and clean up all resources
> > >  >     void close();
> > >  > }
> > >  >
> > >  > interface ConfigurationChangeCallback {
> > >  >     void onChange(String key, String value);
> > >  > }
> > >
> > > With regard to ConfigTransformer: do we need to include all this code
> in
> > > the KIP?  Seems like an implementation detail.
> > >
> > > > Other connectors such as the S3 connector are tightly coupled with a
> > > particular secret manager, and may
> > > > wish to handle rotation on their own.
> > >
> > > Is there a way to avoid this couping?  Seems like some users might want
> > to
> > > use their own secret manager here.
> > >
> > > best,
> > > Colin
> > >
> > >
> > > On Wed, May 9, 2018, at 16:32, Robert Yokota wrote:
> > > > Hi Magesh,
> > > >
> > > > I updated the KIP with a link to a PR for a working prototype.  The
> > > > prototype does not yet use the Connect plugin machinery for class
> > loader
> > > > isolation, but should give you an idea of what the final
> implementation
> > > > will look like.  Here is the link:
> > > > https://github.com/apache/kafka/pull/4990/files.
> > > >
> > > > I also added an example of a FileConfigProvider to the KIP.
> > > >
> > > > Thanks,
> > > > Robert
> > > >
> > > > On Wed, May 9, 2018 at 10:04 AM, Robert Yokota <rayok...@gmail.com>
> > > wrote:
> > > >
> > > > > Hi Magesh,
> > > > >
> > > > > Thanks for the feedback!
> > > > >
> > > > > I will put together a PR to demonstrate what the implementation
> might
> > > look
> > > > > like, as well as a reference FileConfigProvider.
> > > > >
> > > > > 1.  The delayMs for a (potentially) scheduled reload is determined
> by
> > > the
> > > > > ConfigProvider.  For example, a (hypothetical) VaultConfigProvider,
> > > upon
> > > > > contacting Vault for a particular secret, might also obtain a lease
> > > > > duration indicating that the secret expires in 1 hour. The
> > > > > VaultConfigProvider could then call scheduleConfigReload with
> delayMs
> > > set
> > > > > to 3600000ms (1 hour).  This would cause the Connector to restart
> in
> > an
> > > > > hour, forcing it to reload the configs and re-resolve all indirect
> > > > > references.
> > > > >
> > > > > 2. Yes, the start() methods in SourceTask and SinkTask would get
> the
> > > > > configs with all the indirect references resolved.   Those config()
> > > methods
> > > > > are for Connectors that want to get the latest configs (with all
> > > indirect
> > > > > references re-resolved) at some time after start().  For example,
> if
> > a
> > > Task
> > > > > encountered some security exception because a secret expired, it
> > could
> > > call
> > > > > config() to get the config with the latest values.  This is
> assuming
> > > that
> > > > > the Task can gracefully recover from the security exception.
> > > > >
> > > > > 3. Yes, that is up to the ConfigProvider implementation and is out
> of
> > > > > scope.  If the ConfigProvider also needs some kind of secrets or
> > other
> > > > > data, it could possibly be passed in through the param properties
> > > > > ("config.providers.vault.param.auth=/run/myauth").  For example
> > Docker
> > > > > might generate the auth info for Vault in an in-memory tmpfs file
> > that
> > > > > could then be passed as a param.
> > > > >
> > > > > Thanks,
> > > > > Robert
> > > > >
> > > > >
> > > > >
> > > > > On Tue, May 8, 2018 at 10:10 PM, Magesh Nandakumar <
> > > mage...@confluent.io>
> > > > > wrote:
> > > > >
> > > > >> Hi Robert,
> > > > >>
> > > > >> Thanks for the KIP. I think, this will be a great addition to the
> > > > >> framework. I think, will be great if the KIP can elaborate a
> little
> > > bit
> > > > >> more on how implementations would look like with an example.
> > > > >> Also, would be good to provide a reference implementation as well.
> > > > >>
> > > > >> The other questions I had were
> > > > >>
> > > > >> 1.  How would the framework get the delayMs for void
> > > scheduleConfigReload(
> > > > >> long delayMs);
> > > > >> 2. Would the start methods in SourceTask and SinkTask get the
> > configs
> > > with
> > > > >> all the indirect references resolved. If so, trying to understand
> > > > >> the intent of the config() in SourceTaskContext and the
> > > SinkTaskContext
> > > > >> 3. What if the provider itself needs some kind of secrets to be
> > > configured
> > > > >> to connect to it? I assume that's out of scope for this proposal
> but
> > > > >> wanted
> > > > >> to clarify it.
> > > > >>
> > > > >> Thanks
> > > > >> Magesh
> > > > >>
> > > > >> On Tue, May 8, 2018 at 1:52 PM, Robert Yokota <rayok...@gmail.com
> >
> > > wrote:
> > > > >>
> > > > >> > Hi,
> > > > >> >
> > > > >> > I would like to start a discussion for KIP-297 to externalize
> > > secrets
> > > > >> from
> > > > >> > Kafka Connect configurations.  Any feedback is appreciated.
> > > > >> > <
> > > > >> > https://cwiki.apache.org/confluence/display/KAFKA/KIP-
> > > > >> > 297%3A+Externalizing+Secrets+for+Connect+Configurations
> > > > >> > >
> > > > >> >
> > > > >> > JIRA: <https://issues.apache.org/jira/browse/KAFKA-6886>
> > > > >> >
> > > > >> > Thanks in advance,
> > > > >> > Robert
> > > > >> >
> > > > >>
> > > > >
> > > > >
> > >
> >
>

Reply via email to