I doubt the LB solution will work for Kafka. Client needs to connect to the leader of a partition to produce/consume messages. If we put a LB in front of all brokers which means all brokers share the same LB how does the LB figure out the leader? On Mon, Nov 21, 2016 at 10:26 PM Martin Gainty <mgai...@hotmail.com> wrote:
> > > > > ________________________________ > From: Zac Harvey <zac.har...@welltok.com> > Sent: Monday, November 21, 2016 8:59 AM > To: users@kafka.apache.org > Subject: Re: Can Kafka/SSL be terminated at a load balancer? > > Thanks again Rajini, > > > Using these configs, would clients connect to the load balancer over > SSL/9093? And then would I configure the load balancer to forward traffic > from SSL/9093 to plaintext/9093? > > MG>Zach > > MG>i could be wrong but SSL port != plaintext port ..but consider: > > MG>consider recent testcase where all traffic around a certain location > gets bogged with DOS attacks > > MG>what are the legitimate role(s) of the LB when SSL Traffic and HTTP1.1 > Traffic and FTP Traffic are ALL blocked? > > MG>LB should never be stripping SSL headers to redirect to PlainText > because you are not rerouting to a faster route > > MG>most net engineers worth their salt will configure their routers to > static routes to loop around bogged-down routers > > MG>WDYT? > > Thanks again, just still a little uncertain about the traffic/ports coming > into the load balancer! > > > Best, > > Zac > > ________________________________ > From: Rajini Sivaram <rajinisiva...@googlemail.com> > Sent: Monday, November 21, 2016 8:48:41 AM > To: users@kafka.apache.org > Subject: Re: Can Kafka/SSL be terminated at a load balancer? > > Zac, > > Yes, that is correct. Ruby clients will not be authenticated by Kafka. They > talk SSL to the load balancer and the load balancer uses PLAINTEXT without > authentication to talk to Kafka. > > On Mon, Nov 21, 2016 at 1:29 PM, Zac Harvey <zac.har...@welltok.com> > wrote: > > > *Awesome* explanation Rajini - thank you! > > > > > > Just to confirm: the SASL/PLAIN configs would only be for the interbroker > > communication, correct? Meaning, beyond your recommended changes to > > server.properties, and the addition of the new jaas.conf file, the > > producers (Ruby clients) wouldn't need to authenticate, correct? > > > > > > Thanks again for all the great help so far, you've already helped me more > > than you know! > > > > > > Zac > > > > ________________________________ > > From: Rajini Sivaram <rajinisiva...@googlemail.com> > > Sent: Monday, November 21, 2016 3:53:47 AM > > To: users@kafka.apache.org > > Subject: Re: Can Kafka/SSL be terminated at a load balancer? > > > > Zac, > > > > *advertised.listeners* is used to make client connections from > > producers/consumers as well as for client-side connections for > inter-broker > > communication. In your scenario, setting it to *PLAINTEXT://mykafka01* > > would work for inter-broker, bypassing the load balancer, but clients > would > > also then attempt to connect directly to *mykafka01*. Setting it to > > *SSL://mybalancer01* would work for producers/consumers, but brokers > would > > try to connect to *mybalancer01* using PLAINTEXT. Unfortunately neither > > works for both. You need two endpoints, one for inter-broker that > bypasses > > *mybalancer01* and another for clients that uses *mybalancer01*. With the > > current Kafka configuration, you would require two security protocols to > > enable two endpoints. > > > > You could enable SSL in Kafka (using self-signed certificates if you > need) > > for one of the two endpoints to overcome this limitation. But presumably > > you have a secure internal network running Kafka and want to avoid the > cost > > of encryption in Kafka. The simplest solution I can think of is to use > > SASL_PLAINTEXT using SASL/PLAIN for inter-broker as a workaround. The > > configuration options in server.properties would look like: > > > > listeners=PLAINTEXT://:9093,SASL_PLAINTEXT://:9092 > > > > advertised.listeners=PLAINTEXT://mybalancer01.example.com:9093 > > ,SASL_PLAINTEXT://mykafka01.example.com:9092 > > > > security.inter.broker.protocol=SASL_PLAINTEXT > > > > sasl.enabled.mechanisms=PLAIN > > > > sasl.mechanism.inter.broker.protocol=PLAIN > > > > > > You also need a JAAS configuration file configured for the broker JVM ( > > *KAFKA_OPTS="-Djava.security.auth.login.config=/kafka/jaas.conf"*) . See > > https://kafka.apache.org/documentation#security_sasl for configuring > > SASL.* > > jaas.conf* would look something like: > > > > KafkaServer { > > > > org.apache.kafka.common.security.plain.PlainLoginModule required > > > > username="kafka" > > > > user_kafka="kafka-password" > > > > password="kafka-password"; > > > > }; > > > > > > Hope that helps. > > > > > > On Fri, Nov 18, 2016 at 6:39 PM, Zac Harvey <zac.har...@welltok.com> > > wrote: > > > > > Thanks again Rajini! > > > > > > > > > One last followup question, if you don't mind. You said that my > > > server.properties file should look something like this: > > > > > > > > > listeners=SSL://:9093 > > > advertised.listeners=SSL://mybalancer01.example.com:9093 > > > security.inter.broker.protocol=SSL > > > > > > However, please remember that I'm looking for the load balancer to > > > terminate SSL, meaning that (my desired) communication between the load > > > balancer and Kafka would be over plaintext (not SSL). In other words: > > > > > > Ruby Producers/Clients <----SSL:9093----> Load Balancer <---- > > > Plaintext:9092 ----> Kafka > > > > > > So producers/client connect to the load balancer over SSL and port > 9093, > > > but then the load balancer communicates with Kafka over plaintext and > > port > > > 9092. > > > > > > I also don't need inter broker communication to be SSL; it can be > > > plaintext. > > > > > > If this is the case, do I still need to change server.properties, or > can > > I > > > leave it like so: > > > > > > listeners=plaintext://:9092 > > > advertised.listeners=plaintext://mybalancer01.example.com:9092 > > > > > > Or could it just be: > > > > > > listeners=plaintext://:9092 > > > advertised.listeners=plaintext://mykafka01.example.com:9092 > > > > > > Thanks again! > > > Zac > > > > > > > > > > > > > > > > > > ________________________________ > > > From: Rajini Sivaram <rajinisiva...@googlemail.com> > > > Sent: Friday, November 18, 2016 9:57:22 AM > > > To: users@kafka.apache.org > > > Subject: Re: Can Kafka/SSL be terminated at a load balancer? > > > > > > You should set advertised.listeners rather than the older > > > advertised.host.name property in server.properties: > > > > > > > > > - listeners=SSL://:9093 > > > - advertised.listeners=SSL://mybalancer01.example.com:9093 > > > - security.inter.broker.protocol=SSL > > > > > > > > > If your listeners are on particular interfaces, you can set address in > > the > > > 'listeners' property too. > > > > > > > > > If you want inter-broker communication to bypass the SSL proxy, you > would > > > need another security protocol that can be used for inter-broker > > > communication (PLAINTEXT in the example below). > > > > > > > > > > > > - listeners=SSL://:9093,PLAINTEXT://:9092 > > > - advertised.listeners=SSL://mybalancer01.example.com:9093, > > PLAINTEXT:// > > > mykafka01.example.com:9092 > > > - security.inter.broker.protocol=PLAINTEXT > > > > > > I haven't used the Ruby clients, so I am not sure about client > > > configuration. With Java clients, if you don't specify truststore, the > > > default trust stores are used, so with trusted CA-signed certificates, > no > > > additional client configuration is required. You can test your > > installation > > > using the console producer and consumer that are shipped with Kafka to > > make > > > sure it is working before you run with Ruby clients. > > > > > > > > > > > > On Fri, Nov 18, 2016 at 1:23 PM, Zac Harvey <zac.har...@welltok.com> > > > wrote: > > > > > > > > > > > Thanks Rajini, > > > > > > > > > > > > So currently one of our Kafka nodes is 'mykafka01.example.com', and > in > > > > its server.properties file, I have advertised.host.name=mykafka01 > > > > .example.com. Our load balancer lives at mybalancer01.example.com, > and > > > > this what producers will connect to (over SSL) to send messages to > > Kafka. > > > > > > > > > > > > It sounds like you're saying I need to change my Kafka node's > > > > server.properties to have advertised.host.name=mybalance > > r01.example.com, > > > > yes? If not, can you perhaps provide a quick snippet of the changes I > > > would > > > > need to make to server.properties? > > > > > > > > > > > > Again, the cert served by the balancer will be a highly-trusted (root > > > > CA-signed) certificate that all clients will natively trust. > > > Interestingly > > > > enough, most (if not all) the Kafka producers/clients will be written > > in > > > > Ruby (using the zendesk Kafka-Ruby gem<https://github.com/ > > > > zendesk/ruby-kafka>), so there wont be any JKS configuration options > > > > available for those Ruby clients. > > > > > > > > > > > > Besides making the change to server.properties that I mentioned > above, > > > are > > > > there any other client-side configs that will need to be made for the > > > Ruby > > > > clients to connect over SSL? > > > > > > > > > > > > Thank you enormously here! > > > > > > > > > > > > Best, > > > > > > > > Zac > > > > > > > > > > > > ________________________________ > > > > From: Rajini Sivaram <rajinisiva...@googlemail.com> > > > > Sent: Friday, November 18, 2016 5:15:13 AM > > > > To: users@kafka.apache.org > > > > Subject: Re: Can Kafka/SSL be terminated at a load balancer? > > > > > > > > Zac, > > > > > > > > Kafka has its own built-in load-balancing mechanism based on > partition > > > > assignment. Requests are processed by partition leaders, distributing > > > load > > > > across the brokers in the cluster. If you want to put a proxy like > > > HAProxy > > > > with SSL termination in front of your brokers for added security, you > > can > > > > do that. You can have completely independent trust chain between > > > > clients->proxy and proxy->broker. You need to configure Kafka brokers > > > with > > > > the proxy host as the host in the advertised listeners for the > security > > > > protocol used by clients. > > > > > > > > On Thu, Nov 17, 2016 at 9:44 PM, Zac Harvey <zac.har...@welltok.com> > > > > wrote: > > > > > > > > > We have two Kafka nodes and for reasons outside of this question, > > would > > > > > like to set up a load balancer to terminate SSL with producers > > > (clients). > > > > > The SSL cert hosted by the load balancer will be signed by > > trusted/root > > > > CA > > > > > that clients should natively trust. > > > > > > > > > > > > > > > Is this possible to do, or does Kafka somehow require SSL to be > setup > > > > > directly on the Kafka servers themselves? > > > > > > > > > > > > > > > Thanks! > > > > > > > > > > > > > > > > > > > > > -- > > > > Regards, > > > > > > > > Rajini > > > > > > > > > > > > > > > > -- > > > Regards, > > > > > > Rajini > > > > > > > > > > > -- > > Regards, > > > > Rajini > > > > > > -- > Regards, > > Rajini >