Hi Clement

So assuming there are two classes - SslFactory and SslEngineFactory like I
suggested in my detailed post before this, we can use
config.getConfiguredInstance() in SslFactory for SslEngineFactory class
configuration and then followed by init() method. I don't see a challenge
there. Can you please provide your input on my detailed post along with
this recent point I am making?

Thanks
Maulin

On Thu, Sep 19, 2019 at 5:04 PM Maulin Vasavada <maulin.vasav...@gmail.com>
wrote:

> Hi Clement,
>
> Thanks for pointing to AbstractConfig. Now I understand what you were
> saying. I'll respond by tonight with more thoughts.
>
> Thanks
> Maulin
>
> On Thu, Sep 19, 2019 at 5:46 AM Pellerin, Clement <
> clement_pelle...@ibi.com> wrote:
>
>> I appreciate the effort you put into this.
>>
>> Lets do this in steps. You had a question on getConfiguredInstance().
>>
>> The method getConfiguredInstance(key, Class) implemented in
>> AbstractConfig is how the MetricsReporter and other extension points are
>> intantiated. Creating the extension point this way calls the default
>> constructor which is good. Since the (Re)Configurable interface dictates
>> the signature of the configure() method, that forces the addition of a new
>> init(...) method to pass the other constructor arguments.
>>
>> Do we agree on that before we move on to other issues?
>>
>> -----Original Message-----
>> From: Maulin Vasavada [mailto:maulin.vasav...@gmail.com]
>> Sent: Wednesday, September 18, 2019 4:37 PM
>> To: dev@kafka.apache.org
>> Subject: Re: [DISCUSS] KIP-519: Make SSL context/engine configuration
>> extensible
>>
>> Hi Clement
>>
>> Here are my thoughts based on my latest re-write attempt and learnings,
>>
>> 1. I think that it will be a great value to keep both classes separate -
>> SslFactory and SslEngineFactory and having method reconfigurableConfigs()
>> in the SslEngineFactory. Here is the reasoning,
>>
>> a.  It is kind of a Decorator pattern to me - even without named like one
>> SslFactory is acting as a decorator/surrogate to the SslEngineFactory and
>> helping it get created and re-created as needed based on the
>> terms/conditions specified by SslEngineFactory (via
>> reconfigurableConfigs()
>> method)
>>
>> b. SslEngineFactory will be pluggable class. By keeping the SslFactory
>> reconfigurable with delegation of reconfigurableConfigs() to
>> SslEngineFactory it allows the implementation of SslEngineFactory to be
>> worry free of - How Kafka manages reconfigurations. The contract is -
>> Kafka's SslFactory will ask the implementation to provide which
>> configurations it is ready to be reconfigured for. Rest of the logic for
>> triggering and reconfiguring and validation is in SslFactory.
>>
>> c. The current validation in SslFactory about inter-broker-ssl handshake
>> AND verifying that certificate chain doesn't change via dynamic config
>> changes is rightly owned by SslFactory. We should not give flexibility to
>> SslEngineFactory to decide if they want that validation or not.
>>
>> d. If SslEngineFactory fails to be re-created with new dynamic config
>> changes the constructor will throw some exception and the SslFactory will
>> fail the validateReconfiguration() call resulting in no-change. Hence the
>> validation if the new config is right is still controlled by the
>> SslEngineFactory without necessarily having explicit validate method
>> (assuming if you had a point about - we should keep validation of changed
>> configs in the pluggable class)
>>
>>
>> 2. About the keystore validation in SslFactory - as I mentioned in above
>> points,
>>
>> a. I feel it is Kafka's policy that it wants to mandate that validation
>> regardless of the SslEngineFactory's implementation. I feel that
>> regardless
>> of customized implementation it is doing a 'logical' enforcement. I don't
>> see many cases where you will end up changing certificate chain (I can't
>> say the same about SANs entries though. see my below points). Hence that
>> validation is reasonable to be generally enforced for dynamic config
>> changes. If you change something violating that validation, you can avoid
>> making such changes via dynamic configuration and do a rolling restarts of
>> the boxes.
>>
>> b. If the implementation doesn't use keystore then automatically no
>> validation will happen. Hence I don't see any issue with
>> SslEngineFactory's
>> implementations not having requirement to use keystores.
>>
>> c. There could be an argument however about - what it validates currently
>> and is there a scope of change. Example: It validates SANs entries and
>> that
>> to me is a challenge because I have had scenarios where I kept adding more
>> VIPs in my certs SANs entries without really changing any certificate
>> chain. The existing validation will fail that setup unnecessarily. Given
>> that - there could be change in SslFactory but that doesn't still make
>> that
>> validation eligible to go to SslEngineFactory implementations.
>>
>>
>> 3. I am still in two minds about your point on - not using existing SSL
>> Reconfigurable configs to be used by SslFactory on top of
>> SslEngineFactory's reconfigurable configs. The reason for that is-
>>
>> a. I agree with you on that we should not worry about existing SSL
>> reconfigurable configs in new changed code for SslFactory. Why depend on
>> something you really don't need. However, Rajini's point is- if we decide
>> to add more configs in the SSL reconfigurable configs which may be common
>> across SslEngineFactory's implementations, it will make it easier. Again,
>> just to make it easier we should not do it upfront. So now you see why I
>> am
>> double minded on it while more leaning toward your suggestion.
>>
>> 4. I think I totally miss what you refer by
>> config.getConfiguredInstance(key, Class). Which Kafka existing class you
>> are referring to when you do that? Do we have that in KafkaConfig? If you
>> can clarify me on that I can think more about your input on it.
>>
>> 5. Now above all means-
>>
>> a. We will have createEngine(), reconfigurableConfigs(), keystore(),
>> truststore() methods in the SslEngineFactory interface. However the return
>> type for keystore and truststore method can't be existing SecurityStore.
>> For that I already thought of the replacement with KeystoreHolder class
>> which only contains references to java's KeyStore object and Kafka's
>> Password object making it feasible for us to return non-implementation
>> specific return type.
>>
>> b. We didn't talk about shouldBeRebuilt() so far at all given other
>> important conflicts to resolve. We will get to it once we can hash out
>> other stuff.
>>
>> 6. On Rajini's point on 'push notifications' for client side code when the
>> key/trust store changes,
>>
>> " - For client-side, custom SslEngineFactory implementations could
>>    reconfigure themselves, we don't really need SslFactory to be involved
>>    at all."
>>
>> I think I am missing something. If we just have SslEngineFactory
>> reconfigure itself it will generate new SSLContext and in-turn new
>> SSLEgnine but how will it communicate that to the ChannelBuilders? Don't
>> they have to refresh the reference to the SslEngineFactory via
>> SslFactory's
>> reconfigure() method in order to pick up that change?
>>
>>
>> Thanks
>> Maulin
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> On Tue, Sep 17, 2019 at 4:49 AM Pellerin, Clement <
>> clement_pelle...@ibi.com>
>> wrote:
>>
>> > Good point about the two callers of SslFactory. We can move the
>> SslEngine
>> > validation to a separate class and call it in both places. That
>> SslEngine
>> > validation class would not be part of the public API and therefore we
>> don't
>> > need to fuss about its API.
>> >
>> > -----Original Message-----
>> > From: Maulin Vasavada [mailto:maulin.vasav...@gmail.com]
>> > Sent: Tuesday, September 17, 2019 2:28 AM
>> > To: dev@kafka.apache.org
>> > Subject: Re: [DISCUSS] KIP-519: Make SSL context/engine configuration
>> > extensible
>> >
>> > Hi Clement/Rajini
>> >
>> > When I read your responses - I swing between both of your suggestions
>> :) I
>> > see both of your points. Let me ponder little bit more and give me take
>> in
>> > a day or so.
>> >
>> > I tend to agree with Clement in a sense that we need to define clear
>> > responsibilities of classes. Right now I feel it's not clear. Also, I
>> tend
>> > to agree to both of you about keystore/truststore validation - the
>> conflict
>> > I've to propose a clean agreeable solution to.
>> >
>> > One clarification to Clement is - there are two classes using SslFactory
>> > today - SslChannelBuilder and SaslChannelBuilder so we have to keep
>> that in
>> > mind. However, once we have clear responsibilities of classes, that
>> should
>> > automatically clear what goes where.
>> >
>> > Thanks
>> > Maulin
>> >
>>
>

Reply via email to