Instead of keep diverging in different directions, it would be helpful if you guys take my detailed posts with 1st to 4th points I mentioned and start referring/commenting on each of those if you agree with them or not.
On Mon, Aug 19, 2019 at 10:45 PM Maulin Vasavada <maulin.vasav...@gmail.com> wrote: > Hi Colin > > When I refer to "standard" or "custom" algorithms I am following Java > security Provider Terminology. You can refer to > https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#TrustManagerFactory > link I provided earlier in the emails. It says PKIX is the default > Algorithm for TrustManagerFactory. > > 1. For SPIFFE, I am not sure why you are saying 'it does not implement > custom algorithms' because the following file clearly indicates that it > does use custom algorithm- > > > https://github.com/spiffe/java-spiffe/blob/master/src/main/java/spiffe/provider/SpiffeProvider.java#L17 > > > Algorithm value: > https://github.com/spiffe/java-spiffe/blob/master/src/main/java/spiffe/provider/SpiffeProviderConstants.java#L6 > > @Harsha do you want to chime in since you use that provider? > > 2. I already mentioned in my 3rd point, in my previous post, why using > ssl.provider does NOT work. I updated KIP-486 in "rejected alternatives" > also why ssl.provider does not work. > > 3. Security.insertProviderAt() comments were based on assumption if > KIP-492 changes are done and we use that mechanism to configure providers > instead of ssl.provider configuration. > > Can you read my all the points, I mentioned in my previous post, very > carefully? I am covering all the aspects in explaining. I am open to still > discuss more to clarify any doubts. > > Thanks > Maulin > > > > On Mon, Aug 19, 2019 at 9:52 AM Colin McCabe <cmcc...@apache.org> wrote: > >> Hi Maulin, >> >> A lot of JSSE providers don't implement custom algorithms. Spire is a >> good example of a JSSE provider that doesn't, and yet is still useful to >> many people. Your JSSE provider can work fine even if it doesn't implement >> a custom algorithm. >> >> Maybe I'm missing something, but I don't understand the discussion of >> Security.insertProviderAt() that you included. SslEngineBuilder doesn't >> use that API to get the security provider. Instead, it calls >> "SSLContext.getInstance(protocol, provider)", where provider is the name of >> the provider. >> >> best, >> Colin >> >> >> On Sat, Aug 17, 2019, at 20:13, Maulin Vasavada wrote: >> > On top of everything above I feel strongly to add the 4th point which is >> > based on Java APIs for TrustManagerFactory.init(KeyStore) ( >> > >> https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/TrustManagerFactory.html#init(java.security.KeyStore) >> ) >> > and KeyManagerFactory.init(KeyStore, char[]) ( >> > >> https://docs.oracle.com/javase/7/docs/api/javax/net/ssl/KeyManagerFactory.html#init(java.security.KeyStore,%20char[]) >> > ). >> > >> > 4. The above APIs are intended to support providing "trust/key material" >> > from the user without having to write their own >> TrustManager/KeyManagers. >> > To quote from the TrustManagerFactory.init()'s documentation >> "Initializes >> > this factory with a source of certificate authorities and related trust >> > material." >> > To quote from the KeyManagerFactory.init()'s documentation "Initializes >> > this factory with a source of key material." >> > >> > Based on this it is clear that there is a flexibility provided by Java >> to >> > to enable developers to provide the required trust/key material loaded >> from >> > "anywhere" without requiring them to write custom provider OR trust/key >> > managers. This same flexibility is reflected in Kafka code also where it >> > loads the trust/keys from a local file and doesn't require writing a >> > Provider necessarily. If we do NOT have a custom algorithm, it makes >> less >> > sense to write a Provider. >> > >> > Thanks >> > Maulin >> > >> > >> > >> > >> > >> > >> > On Thu, Aug 15, 2019 at 11:45 PM Maulin Vasavada < >> maulin.vasav...@gmail.com> >> > wrote: >> > >> > > Hi Harsha/Colin >> > > >> > > I did the sample with a custom Provider for TrustStoreManager and >> tried >> > > using ssl.provider Kafka config AND the way KIP-492 is suggesting (by >> > > adding Provider programmatically instead of relying on >> > > ssl.provider+java.security. The below sample is followed by my >> detailed >> > > findings. I'll appreciate if you can go through it carefully and see >> if you >> > > see my point. >> > > >> > > package providertest; >> > > >> > > import java.security.Provider; >> > > >> > > public class MyProvider extends Provider { >> > > >> > > private static final String name = "MyProvider"; >> > > private static double version = 1.0d; >> > > private static String info = "Maulin's SSL Provider v"+version; >> > > >> > > public MyProvider() { >> > > super(name, version, info); >> > > this.put("TrustManagerFactory.PKIX", >> "providertest.MyTrustManagerFactory"); >> > > } >> > > } >> > > >> > > >> > > >> > > *Details:* >> > > >> > > KIP-492 documents that it will use Security.addProvider() assuming it >> will >> > > add it as position '0' which is not a correct assumption. The >> > > addProvider()'s documentation says it will add it to the last >> available >> > > position. You may want to correct that to say >> > > Security.insertProviderAt(provider, 1). >> > > >> > > Now coming back to our specific discussion, >> > > >> > > 1. SPIFFE example uses Custom Algorithm - spiffe. Hence when you add >> that >> > > provider in the provider list via Security.addProvider() the position >> where >> > > it gets added doesn't matter (even if you don't end up adding it as >> first >> > > entry) since that is the ONLY provider for SPIFFE specific algorithm >> you >> > > might have. >> > > >> > > We do *not* have custom algorithm for Key/Trust StoreMangers. Which >> means >> > > we have to use X509, PKIX etc "Standard Algorithms" (( >> > > >> https://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html >> )) >> > > in our provider to override the TrustStoreManager (see my sample >> code) and >> > > KeyStoreManger and KeyManager. This creates another challenge >> mentioned in >> > > the below point. >> > > >> > > 2. In order to make our Provider for loading custom TrustStore work, >> we >> > > have to add the provider as 'first' in the list since there are >> others with >> > > the same algorithm. >> > > >> > > However, the programatic way of adding provider >> > > (Security.insertProviderAt()) is *not* deterministic for ordering >> since >> > > different code can call the method for a different provider and >> depending >> > > upon the order of the call our provider can be first or pushed down >> the >> > > list. This can happen very well in any client application using >> Kafka. This >> > > is specially problematic for a case when you want to guarantee order >> for a >> > > Provider having "Standard Algorithms". >> > > >> > > If we add our provider in java.security file that definitely >> guarantees >> > > the order(unless somebody calls removeProvider() which is less >> likely). But >> > > if we add our provider in java.security file it will defeat the >> purpose of >> > > the KIP-492. >> > > >> > > In the gist - Apache Kafka must not rely on "un-deterministic" method >> to >> > > rely on Provider ordering. >> > > >> > > 3. If we just use existing ssl.provider kafka configuration then our >> > > provider will be used in SSLContext.getInstance(protocol, provider) >> call in >> > > SslFactory.java and if our provider does not have implementation for >> > > SSLContext.TLS/TLSv1.1/TLSv1.2 etc it breaks (we tested it). Example: >> In >> > > MyProvider sample above you see that I didn't add SSLContext.TLSv1 as >> > > "Service+Algorithm" and that didn't work for me. In SPIFFE provider >> you >> > > don't have this challenge since you are planning to bypass >> ssl.provider as >> > > you mention in the KIP-492. >> > > >> > > >> > > *Overall summary,* >> > > >> > > 1. Any provider based mechanisms- a) existing ssl.provider and >> b)KIP-492, >> > > for loading key/trust store using "Standard Algorithms" do not work >> > > >> > > 2. Approach suggested in our KIP-486 works without any issue and it is >> > > *not* our context specific solve >> > > >> > > 3. Based on above we feel KIP-492 and KIP-486 are complimentary >> changes >> > > and not contradicting or redundent. >> > > >> > > If you want we can do a joint session somehow to walk through the >> sample I >> > > have and various experiments I did. I would encourage you to do >> similar >> > > exercise by writing a Provider for "Standard Algorithm" for >> > > TrustStoreManager (like our needs) and see what you find since only >> writing >> > > samples can bring out the complexity/challenges we face. >> > > >> > > Thanks >> > > Maulin >> > > >> > > On Wed, Aug 14, 2019 at 11:15 PM Maulin Vasavada < >> > > maulin.vasav...@gmail.com> wrote: >> > > >> > >> Just to update - still working on it. Get to work only on and off on >> it :( >> > >> >> > >> On Thu, Aug 8, 2019 at 4:05 PM Maulin Vasavada < >> maulin.vasav...@gmail.com> >> > >> wrote: >> > >> >> > >>> Hi Harsha >> > >>> >> > >>> Let me try to write samples and will let you know. >> > >>> >> > >>> Thanks >> > >>> Maulin >> > >>> >> > >>> On Thu, Aug 8, 2019 at 4:00 PM Harsha Ch <harsha...@gmail.com> >> wrote: >> > >>> >> > >>>> Hi Maulin, >> > >>>> With java security providers can be as custom you would >> like >> > >>>> it to >> > >>>> be. If you only want to to implement a custom way of loading the >> > >>>> keystore and truststore and not implement any protocol/encryption >> > >>>> handling >> > >>>> you can leave them empty and no need to implement. >> > >>>> Have you looked into the links I pasted before? >> > >>>> >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeKeyStore.java >> > >>>> >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeTrustManager.java >> > >>>> >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeProvider.java >> > >>>> >> > >>>> Can you please tell me which methods are too complex in above to >> > >>>> implement >> > >>>> or unnecessary? You are changing anything in SSL/TLS >> implementations >> > >>>> provided by >> > >>>> >> > >>>> All of the implementations delegating the checks to the default >> > >>>> implementation anyway. >> > >>>> Spire agent is an example, its nothing but a GRPC server listening >> on a >> > >>>> unix domain socket . Above code is making a RPC call to the local >> > >>>> daemon to >> > >>>> get the certificate and keys. The mechanics are pretty much same >> as what >> > >>>> you are asking for. >> > >>>> >> > >>>> Thanks, >> > >>>> Harsha >> > >>>> >> > >>>> On Thu, Aug 8, 2019 at 3:47 PM Maulin Vasavada < >> > >>>> maulin.vasav...@gmail.com> >> > >>>> wrote: >> > >>>> >> > >>>> > Imagine a scenario like - We know we have a custom KMS and as a >> Kafka >> > >>>> owner >> > >>>> > we want to comply to using that KMS source to load keys/certs. >> As a >> > >>>> Kafka >> > >>>> > owner we know how to integrate with KMS but doesn't necessarily >> have >> > >>>> to >> > >>>> > know anything about cipher suites, algorithms, and SSL/TLS >> > >>>> implementation. >> > >>>> > Going the Provider way requires to know lot more than we should, >> > >>>> isn't it? >> > >>>> > Not that we would have concern/shy-away knowing those details - >> but >> > >>>> if we >> > >>>> > don't have to - why should we? >> > >>>> > >> > >>>> > On Thu, Aug 8, 2019 at 3:23 PM Maulin Vasavada < >> > >>>> maulin.vasav...@gmail.com> >> > >>>> > wrote: >> > >>>> > >> > >>>> > > Hi Harsha >> > >>>> > > >> > >>>> > > We don't have spire (or similar) agents and we do not have >> > >>>> keys/certs >> > >>>> > > locally on any brokers. To elaborate more on my previous email, >> > >>>> > > >> > >>>> > > I agree that Java security Providers are used in much broader >> sense >> > >>>> - to >> > >>>> > > have a particular implementation of an algorithm, use specific >> > >>>> cipher >> > >>>> > > suites for SSL , OR in our current team's case have a >> particular >> > >>>> way to >> > >>>> > > leverage pre-generated SSL sessions. However, the scope of our >> KIP >> > >>>> (486) >> > >>>> > is >> > >>>> > > much restricted than that. We merely intend to provide a custom >> > >>>> > > keystore/truststore for our SSL connections and not really >> worry >> > >>>> about >> > >>>> > > underlying specific SSL/TLS implementation. This simplifies >> it a >> > >>>> lot for >> > >>>> > > us to keep the concerns separate and clear. >> > >>>> > > >> > >>>> > > I feel our approach is more complimentary such that it allows >> for >> > >>>> using >> > >>>> > > keystores of choice while retaining the flexibility to use any >> > >>>> > > underlying/available Provider for actually making the SSL call. >> > >>>> > > >> > >>>> > > We agree with KIP-492's approach based on Providers (and Java's >> > >>>> > > recommendation), but also strongly believe that our approach >> can >> > >>>> > compliment >> > >>>> > > it very effectively for reasons explained above. >> > >>>> > > >> > >>>> > > Thanks >> > >>>> > > Maulin >> > >>>> > > >> > >>>> > > On Thu, Aug 8, 2019 at 3:05 PM Harsha Chintalapani < >> ka...@harsha.io >> > >>>> > >> > >>>> > > wrote: >> > >>>> > > >> > >>>> > >> Hi Maulin, >> > >>>> > >> >> > >>>> > >> On Thu, Aug 08, 2019 at 2:04 PM, Maulin Vasavada < >> > >>>> > >> maulin.vasav...@gmail.com> >> > >>>> > >> wrote: >> > >>>> > >> >> > >>>> > >> > Hi Harsha >> > >>>> > >> > >> > >>>> > >> > The reason we rejected the SslProvider route is that - we >> only >> > >>>> needed >> > >>>> > a >> > >>>> > >> > custom way to load keys/certs. Not touch any policy that >> existing >> > >>>> > >> Providers >> > >>>> > >> > govern like SunJSSE Provider. >> > >>>> > >> > >> > >>>> > >> >> > >>>> > >> We have exactly the same requirements to load certs and keys >> > >>>> through >> > >>>> > spire >> > >>>> > >> agent. We used security.provider to do that exactly. I am not >> sure >> > >>>> why >> > >>>> > you >> > >>>> > >> would be modifying any policies provided by default SunJSSE >> > >>>> provider. >> > >>>> > Can >> > >>>> > >> you give me an example of having custom provider that will >> > >>>> override an >> > >>>> > >> existing policy in SunJSSE provider. >> > >>>> > >> >> > >>>> > >> As pointed out earlier, this kip >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> > >>>> >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-492%3A+Add+java+security+providers+in+Kafka+Security+config >> > >>>> > >> allows >> > >>>> > >> you to load security.provider through config. >> > >>>> > >> Take a look at the examples I gave before >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeProvider.java >> > >>>> > >> It registers KeyManagerFactory and TrustManagerFactory and >> Keystore >> > >>>> > >> algorithm. >> > >>>> > >> Implement your custom way of loading Keystore in here >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeKeyStore.java >> > >>>> > >> >> > >>>> > >> and Trust manager like here >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> > >>>> >> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeTrustManager.java >> > >>>> > >> >> > >>>> > >> In your Kafka client you can set the security.provider to >> your >> > >>>> custom >> > >>>> > >> implementation and with this fix >> > >>>> > >> https://issues.apache.org/jira/browse/KAFKA-8191 you can set >> > >>>> > >> keyManagerAlgorigthm and trustManagerAlgorithm configs. >> > >>>> > >> >> > >>>> > >> All of this is in your clients and broker side and do not >> need to >> > >>>> touch >> > >>>> > >> any >> > >>>> > >> policy changes at JVM level. You'll register the providers in >> the >> > >>>> > priority >> > >>>> > >> order and can still have SunJSSE provider and have your custom >> > >>>> provider >> > >>>> > to >> > >>>> > >> implement the key and trust managers. >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> The ask here is different than KIP-492. We don't have any >> need to >> > >>>> > >> > modify/specify the algorithm parameter. Does that make >> sense? >> > >>>> > >> > >> > >>>> > >> >> > >>>> > >> The ask in KIP is introducing new interfaces where the KIP's >> > >>>> > >> goal/motivation can be achieved through the security.provider >> and >> > >>>> we >> > >>>> > >> worked >> > >>>> > >> on similar goal without touching any Keystore or Truststore >> > >>>> interfaces. >> > >>>> > >> My advise is against changing or introducing new interfaces >> when >> > >>>> it can >> > >>>> > >> work through security.provider. >> > >>>> > >> >> > >>>> > >> Thanks, >> > >>>> > >> Harsha >> > >>>> > >> >> > >>>> > >> >> > >>>> > >> Thanks >> > >>>> > >> > Maulin >> > >>>> > >> > >> > >>>> > >> > On Thu, Aug 8, 2019 at 7:48 AM Harsha Chintalapani < >> > >>>> ka...@harsha.io> >> > >>>> > >> > wrote: >> > >>>> > >> > >> > >>>> > >> > In your KIP you added security. provider as rejected >> alternative >> > >>>> and >> > >>>> > >> > specified "its not the correct way". Do you mind explaining >> why >> > >>>> its >> > >>>> > >> not? I >> > >>>> > >> > didn't find any evidence in Java docs to say so. Contrary >> to your >> > >>>> > >> statement >> > >>>> > >> > it does say in the java docs >> > >>>> > >> > " However, please note that a provider can be used to >> implement >> > >>>> any >> > >>>> > >> > security service in Java that uses a pluggable architecture >> with >> > >>>> a >> > >>>> > >> choice >> > >>>> > >> > of implementations that fit underneath." >> > >>>> > >> > >> > >>>> > >> > Java Security Providers have been used by other projects to >> > >>>> provide >> > >>>> > such >> > >>>> > >> > integration . I am not sure if you looked into Spiffe >> project to >> > >>>> > >> > efficiently distribute certificates but here is an example >> of >> > >>>> Java >> > >>>> > >> provider >> > >>>> > >> > >> > >>>> > >> > >> > >>>> https://github.com/spiffe/spiffe-example/blob/master/java-spiffe/ >> > >>>> > >> > >> > >>>> > >> >> > >>>> > >> > >>>> >> spiffe-security-provider/src/main/java/spiffe/api/provider/SpiffeProvider. >> > >>>> > >> > java which >> > >>>> > >> > obtains certificates from local daemons. >> > >>>> > >> > These integrations are being used in Tomcat, Jetty etc.. We >> are >> > >>>> also >> > >>>> > >> using >> > >>>> > >> > Security provider to do the same in our Kafka clusters. So >> > >>>> unless I >> > >>>> > see >> > >>>> > >> > more evidence why security.provider doesn't work for you >> adding >> > >>>> new >> > >>>> > >> > interfaces while there exists more cleaner way of achieving >> the >> > >>>> goals >> > >>>> > of >> > >>>> > >> > this KIP is unnecessary and breaks the well known security >> > >>>> interfaces >> > >>>> > >> > provided by Java itself. >> > >>>> > >> > >> > >>>> > >> > Thanks, >> > >>>> > >> > Harsha >> > >>>> > >> > >> > >>>> > >> > On Thu, Aug 08, 2019 at 6:54 AM, Harsha Chintalapani < >> > >>>> ka...@harsha.io >> > >>>> > > >> > >>>> > >> > wrote: >> > >>>> > >> > >> > >>>> > >> > Hi Maulin, >> > >>>> > >> > Not sure if you looked at my previous replies. This >> > >>>> > >> > >> > >>>> > >> > changes >> > >>>> > >> > >> > >>>> > >> > are not required as there is already security Provider to do >> > >>>> what you >> > >>>> > >> are >> > >>>> > >> > proposing. This KIP >> > >>>> > https://cwiki.apache.org/confluence/display/KAFKA/ >> > >>>> > >> > >> KIP-492%3A+Add+java+security+providers+in+Kafka+Security+config >> > >>>> also >> > >>>> > >> > addresses easy registration of such providers. >> > >>>> > >> > >> > >>>> > >> > Thanks, >> > >>>> > >> > Harsha >> > >>>> > >> > >> > >>>> > >> > On Wed, Aug 07, 2019 at 11:31 PM, Maulin Vasavada >> > >>>> > >> <maulin.vasavada@gmail. >> > >>>> > >> > com> wrote: >> > >>>> > >> > >> > >>>> > >> > Bump! Can somebody please review this? >> > >>>> > >> > >> > >>>> > >> > On Tue, Jul 16, 2019 at 1:51 PM Maulin Vasavada < >> > >>>> > >> > >> > >>>> > >> > maulin.vasav...@gmail.com> >> > >>>> > >> > >> > >>>> > >> > wrote: >> > >>>> > >> > >> > >>>> > >> > Bump! Can somebody please review this? >> > >>>> > >> > >> > >>>> > >> > >> > >>>> > >> >> > >>>> > > >> > >>>> > >> > >>>> >> > >>> >> > >> >