Hi, Boyang, Thanks for the reply.
For the metric, we just need to define a metric of meter type and of name NumRequestsForwardingToControllerPerSec. Meter exposes a few standard JMX attributes including an accumulated total and rates ( https://metrics.dropwizard.io/2.2.0/apidocs/com/yammer/metrics/core/Meter.html ). Jun On Wed, Jun 10, 2020 at 10:38 AM Boyang Chen <reluctanthero...@gmail.com> wrote: > Thanks Jun for the suggestions! I have addressed suggestion and simplified > the metrics part. > > On Tue, Jun 9, 2020 at 5:46 PM Jun Rao <j...@confluent.io> wrote: > > > Hi, Boyang, > > > > Thanks for the KIP. Just a few comments on the metrics. > > > > 1. It would be useful to document the full JMX metric names (package, > type, > > etc) of the new metrics. Also, for rates on the server side, we > > typically use Yammer Meter. > > > > Sounds good. > > 2. For num-messages-redirected-rate, would num-requests-redirected-rate be > > better? > > > > Actually for the scope of this KIP, we are no longer needing to have a > separate tracking > of forwarded request rate, because the Envelope RPC is dropped. > > > > 3. num-client-forwarding-to-controller-rate: Is that based on clientId, > > client IP, client request version or sth else? How do you plan to > implement > > that since it seems to require tracking the current unique client set > > somehow. An alternative approach is to maintain a > > num-requests-redirected-rate metric with a client tag. > > > The clientId tag approach makes sense, will add to the KIP. > > Jun > > > > > > > > On Mon, Jun 8, 2020 at 9:36 AM Boyang Chen <reluctanthero...@gmail.com> > > wrote: > > > > > Hey there, > > > > > > If no more question is raised, I will go ahead and start the vote > > shortly. > > > > > > On Thu, Jun 4, 2020 at 12:39 PM Boyang Chen < > reluctanthero...@gmail.com> > > > wrote: > > > > > > > Hey there, > > > > > > > > bumping this thread for any further KIP-590 discussion, since it's > been > > > > quiet for a while. > > > > > > > > Boyang > > > > > > > > On Thu, May 21, 2020 at 10:31 AM Boyang Chen < > > reluctanthero...@gmail.com > > > > > > > > wrote: > > > > > > > >> Thanks David, I agree the wording here is not clear, and the fellow > > > >> broker should just send a new CreateTopicRequest in this case. > > > >> > > > >> In the meantime, we had some offline discussion about the Envelope > API > > > as > > > >> well. Although it provides certain privileges like data embedding > and > > > >> principal embedding, it creates a security hole by letting a > malicious > > > user > > > >> impersonate any forwarding broker, thus pretending to be any admin > > user. > > > >> Passing the principal around also increases the vulnerability, > > compared > > > >> with other standard ways such as passing a verified token, but it is > > > >> unfortunately not fully supported with Kafka security. > > > >> > > > >> So for the security concerns, we are abandoning the Envelope > approach > > > and > > > >> fallback to just forward the raw admin requests. The authentication > > will > > > >> happen on the receiving broker side instead of on the controller, so > > > that > > > >> we are able to stripped off the principal fields and only include > the > > > >> principal in header as optional field for audit logging purpose. > > > >> Furthermore, we shall propose adding a separate endpoint for > > > >> broker-controller communication which should be recommended to > enable > > > >> secure connections so that a malicious client could not pretend to > be > > a > > > >> broker and perform impersonation. > > > >> > > > >> Let me know your thoughts. > > > >> > > > >> Best, > > > >> Boyang > > > >> > > > >> On Tue, May 19, 2020 at 12:17 AM David Jacot <dja...@confluent.io> > > > wrote: > > > >> > > > >>> Hi Boyang, > > > >>> > > > >>> I've got another question regarding the auto topic creation case. > The > > > KIP > > > >>> says: "Currently the target broker shall just utilize its own ZK > > client > > > >>> to > > > >>> create > > > >>> internal topics, which is disallowed in the bridge release. For > above > > > >>> scenarios, > > > >>> non-controller broker shall just forward a CreateTopicRequest to > the > > > >>> controller > > > >>> instead and let controller take care of the rest, while waiting for > > the > > > >>> response > > > >>> in the meantime." There will be no request to forward in this case, > > > >>> right? > > > >>> Instead, > > > >>> a CreateTopicsRequest is created and sent to the controller node. > > > >>> > > > >>> When the CreateTopicsRequest is sent as a side effect of the > > > >>> MetadataRequest, > > > >>> it would be good to know the principal and the clientId in the > > > controller > > > >>> (quota, > > > >>> audit, etc.). Do you plan to use the Envelope API for this case as > > well > > > >>> or > > > >>> to call > > > >>> the regular API directly? Another was to phrase it would be: Shall > > the > > > >>> internal > > > >>> CreateTopicsRequest be sent with the original metadata (principal, > > > >>> clientId, etc.) > > > >>> of the MetadataRequest or as an admin request? > > > >>> > > > >>> Best, > > > >>> David > > > >>> > > > >>> On Fri, May 8, 2020 at 2:04 AM Guozhang Wang <wangg...@gmail.com> > > > wrote: > > > >>> > > > >>> > Just to adds a bit more FYI here related to the last question > from > > > >>> David: > > > >>> > in KIP-595 while implementing the new requests we are also > adding a > > > >>> > "KafkaNetworkChannel" which is used for brokers to send vote / > > fetch > > > >>> > records, so besides the discussion on listeners I think > > > implementation > > > >>> wise > > > >>> > we can also consider consolidating a lot of those into the same > > > >>> call-trace > > > >>> > as well -- of course this is not related to public APIs so maybe > > just > > > >>> needs > > > >>> > to be coordinated among developments: > > > >>> > > > > >>> > 1. Broker -> Controller: ISR Change, Topic Creation, Admin > Redirect > > > >>> > (KIP-497). > > > >>> > 2. Controller -> Broker: LeaderAndISR / MetadataUpdate; though > > these > > > >>> are > > > >>> > likely going to be deprecated post KIP-500. > > > >>> > 3. Txn Coordinator -> Broker: TxnMarker > > > >>> > > > > >>> > > > > >>> > Guozhang > > > >>> > > > > >>> > On Wed, May 6, 2020 at 8:58 PM Boyang Chen < > > > reluctanthero...@gmail.com > > > >>> > > > > >>> > wrote: > > > >>> > > > > >>> > > Hey David, > > > >>> > > > > > >>> > > thanks for the feedbacks! > > > >>> > > > > > >>> > > On Wed, May 6, 2020 at 2:06 AM David Jacot < > dja...@confluent.io> > > > >>> wrote: > > > >>> > > > > > >>> > > > Hi Boyang, > > > >>> > > > > > > >>> > > > While re-reading the KIP, I've got few small > > questions/comments: > > > >>> > > > > > > >>> > > > 1. When auto topic creation is enabled, brokers will send a > > > >>> > > > CreateTopicRequest > > > >>> > > > to the controller instead of writing to ZK directly. It means > > > that > > > >>> > > > creation of these > > > >>> > > > topics are subject to be rejected with an error if a > > > >>> CreateTopicPolicy > > > >>> > is > > > >>> > > > used. Today, > > > >>> > > > it bypasses the policy entirely. I suppose that clusters > > allowing > > > >>> auto > > > >>> > > > topic creation > > > >>> > > > don't have a policy in place so it is not a big deal. I > suggest > > > to > > > >>> call > > > >>> > > > out explicitly the > > > >>> > > > limitation in the KIP though. > > > >>> > > > > > > >>> > > > That's a good idea, will add to the KIP. > > > >>> > > > > > >>> > > > > > >>> > > > 2. In the same vein as my first point. How do you plan to > > handle > > > >>> errors > > > >>> > > > when internal > > > >>> > > > topics are created by a broker? Do you plan to retry > retryable > > > >>> errors > > > >>> > > > indefinitely? > > > >>> > > > > > > >>> > > > I checked a bit on the admin client handling of the create > > topic > > > >>> RPC. > > > >>> > It > > > >>> > > seems that > > > >>> > > the only retriable exceptions at the moment are NOT_CONTROLLER > > and > > > >>> > > REQUEST_TIMEOUT. > > > >>> > > So I guess we just need to retry on these exceptions? > > > >>> > > > > > >>> > > > > > >>> > > > 3. Could you clarify which listener will be used for the > > internal > > > >>> > > requests? > > > >>> > > > Do you plan > > > >>> > > > to use the control plane listener or perhaps the inter-broker > > > >>> listener? > > > >>> > > > > > > >>> > > > As we discussed in the KIP, currently the internal design for > > > >>> > > broker->controller channel has not been > > > >>> > > done yet, and I feel it makes sense to consolidate redirect RPC > > and > > > >>> > > internal topic creation RPC to this future channel, > > > >>> > > which are details to be filled in the near future, right now > some > > > >>> > > controller refactoring effort is still WIP. > > > >>> > > > > > >>> > > > > > >>> > > > Thanks, > > > >>> > > > David > > > >>> > > > > > > >>> > > > On Mon, May 4, 2020 at 9:37 AM Sönke Liebau > > > >>> > > > <soenke.lie...@opencore.com.invalid> wrote: > > > >>> > > > > > > >>> > > > > Ah, I see, thanks for the clarification! > > > >>> > > > > > > > >>> > > > > Shouldn't be an issue I think. My understanding of KIPs was > > > >>> always > > > >>> > that > > > >>> > > > > they are mostly intended as a place to discuss and agree > > > changes > > > >>> up > > > >>> > > > front, > > > >>> > > > > whereas tracking the actual releases that things go into > > should > > > >>> be > > > >>> > > > handled > > > >>> > > > > in Jira. > > > >>> > > > > So maybe we just create new jiras for any subsequent work > and > > > >>> either > > > >>> > > link > > > >>> > > > > those or make them subtasks (even though this jira is > > already a > > > >>> > subtask > > > >>> > > > > itself), that should allow us to properly track all > releases > > > that > > > >>> > work > > > >>> > > > goes > > > >>> > > > > into. > > > >>> > > > > > > > >>> > > > > Thanks for your work on this!! > > > >>> > > > > > > > >>> > > > > Best, > > > >>> > > > > Sönke > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > On Sat, 2 May 2020 at 00:31, Boyang Chen < > > > >>> reluctanthero...@gmail.com > > > >>> > > > > > >>> > > > > wrote: > > > >>> > > > > > > > >>> > > > > > Sure thing Sonke, what I suggest is that usual KIPs get > > > >>> accepted to > > > >>> > > go > > > >>> > > > > into > > > >>> > > > > > next release. It could span for a couple of releases > > because > > > of > > > >>> > > > > engineering > > > >>> > > > > > time, but no change has to be shipped in specific future > > > >>> releases, > > > >>> > > like > > > >>> > > > > the > > > >>> > > > > > backward incompatible change for KafkaPrincipal. But I > > guess > > > >>> it's > > > >>> > not > > > >>> > > > > > really a blocker, as long as we stated clearly in the KIP > > how > > > >>> we > > > >>> > are > > > >>> > > > > going > > > >>> > > > > > to roll things out, and let it partially finish in 2.6. > > > >>> > > > > > > > > >>> > > > > > Boyang > > > >>> > > > > > > > > >>> > > > > > On Fri, May 1, 2020 at 2:32 PM Sönke Liebau > > > >>> > > > > > <soenke.lie...@opencore.com.invalid> wrote: > > > >>> > > > > > > > > >>> > > > > > > Hi Boyang, > > > >>> > > > > > > > > > >>> > > > > > > thanks for the update, sounds reasonable to me. Making > > it a > > > >>> > > breaking > > > >>> > > > > > change > > > >>> > > > > > > is definitely the safer route to go. > > > >>> > > > > > > > > > >>> > > > > > > Just one quick question regarding your mail, I didn't > > fully > > > >>> > > > understand > > > >>> > > > > > what > > > >>> > > > > > > you mean by "I think this is the first time we need to > > > >>> introduce > > > >>> > a > > > >>> > > > KIP > > > >>> > > > > > > without having it > > > >>> > > > > > > fully accepted in next release." - could you perhaps > > > explain > > > >>> > that > > > >>> > > > some > > > >>> > > > > > > more very briefly? > > > >>> > > > > > > > > > >>> > > > > > > Best regards, > > > >>> > > > > > > Sönke > > > >>> > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > On Fri, 1 May 2020 at 23:03, Boyang Chen < > > > >>> > > reluctanthero...@gmail.com > > > >>> > > > > > > > >>> > > > > > > wrote: > > > >>> > > > > > > > > > >>> > > > > > > > Hey Tom, > > > >>> > > > > > > > > > > >>> > > > > > > > thanks for the suggestion. As long as we could > > correctly > > > >>> > > serialize > > > >>> > > > > the > > > >>> > > > > > > > principal and embed in the Envelope, I think we could > > > still > > > >>> > > > leverage > > > >>> > > > > > the > > > >>> > > > > > > > controller to do the client request authentication. > > > >>> Although > > > >>> > this > > > >>> > > > > pays > > > >>> > > > > > an > > > >>> > > > > > > > extra round trip if the authorization is doomed to > fail > > > on > > > >>> the > > > >>> > > > > receiver > > > >>> > > > > > > > side, having a centralized processing unit is more > > > >>> favorable > > > >>> > such > > > >>> > > > as > > > >>> > > > > > > > ensuring the audit log is consistent instead of > > > scattering > > > >>> > > between > > > >>> > > > > > > > forwarder and receiver. > > > >>> > > > > > > > > > > >>> > > > > > > > Boyang > > > >>> > > > > > > > > > > >>> > > > > > > > On Wed, Apr 29, 2020 at 9:50 AM Tom Bentley < > > > >>> > tbent...@redhat.com > > > >>> > > > > > > >>> > > > > > wrote: > > > >>> > > > > > > > > > > >>> > > > > > > > > Hi Boyang, > > > >>> > > > > > > > > > > > >>> > > > > > > > > Thanks for the update. In the EnvelopeRequest > > handling > > > >>> > section > > > >>> > > of > > > >>> > > > > the > > > >>> > > > > > > KIP > > > >>> > > > > > > > > it might be worth saying explicitly that > > authorization > > > >>> of the > > > >>> > > > > request > > > >>> > > > > > > > will > > > >>> > > > > > > > > happen as normal. Otherwise what you're proposing > > makes > > > >>> sense > > > >>> > > to > > > >>> > > > > me. > > > >>> > > > > > > > > > > > >>> > > > > > > > > Thanks again, > > > >>> > > > > > > > > > > > >>> > > > > > > > > Tom > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > On Wed, Apr 29, 2020 at 5:27 PM Boyang Chen < > > > >>> > > > > > > reluctanthero...@gmail.com> > > > >>> > > > > > > > > wrote: > > > >>> > > > > > > > > > > > >>> > > > > > > > > > Thanks for the proposed idea Sonke. I reviewed it > > and > > > >>> had > > > >>> > > some > > > >>> > > > > > > offline > > > >>> > > > > > > > > > discussion with Colin, Rajini and Mathew. > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > We do need to add serializability to the > > > >>> PrincipalBuilder > > > >>> > > > > > interface, > > > >>> > > > > > > > but > > > >>> > > > > > > > > we > > > >>> > > > > > > > > > should not make any default implementation which > > > could > > > >>> go > > > >>> > > wrong > > > >>> > > > > and > > > >>> > > > > > > > messy > > > >>> > > > > > > > > > up with the security in a production environment > if > > > the > > > >>> > user > > > >>> > > > > > neglects > > > >>> > > > > > > > it. > > > >>> > > > > > > > > > Instead we need to make it required and backward > > > >>> > > incompatible. > > > >>> > > > > So I > > > >>> > > > > > > > > > integrated your proposed methods and expand the > > > >>> Envelope > > > >>> > RPC > > > >>> > > > > with a > > > >>> > > > > > > > > couple > > > >>> > > > > > > > > > of more fields for audit log purpose as well. > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > Since the KafkaPrincipal builder serializability > > is a > > > >>> > binary > > > >>> > > > > > > > incompatible > > > >>> > > > > > > > > > change, I propose (also stated in the KIP) the > > > >>> following > > > >>> > > > > > > implementation > > > >>> > > > > > > > > > plan: > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > 1. For next *2.x* release: > > > >>> > > > > > > > > > 1. Get new admin client forwarding changes > > > >>> > > > > > > > > > 2. Get the Envelope RPC implementation > > > >>> > > > > > > > > > 3. Get the forwarding path working and > > validate > > > >>> the > > > >>> > > > > function > > > >>> > > > > > > with > > > >>> > > > > > > > > > fake principals in testing environment, > > without > > > >>> > actual > > > >>> > > > > > > triggering > > > >>> > > > > > > > > in > > > >>> > > > > > > > > > the > > > >>> > > > > > > > > > production system > > > >>> > > > > > > > > > 2. For next *3.0 *release: > > > >>> > > > > > > > > > 1. Introduce serializability to > > > PrincipalBuilder > > > >>> > > > > > > > > > 2. Turn on forwarding path in production > and > > > >>> perform > > > >>> > > > > > end-to-end > > > >>> > > > > > > > > > testing > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > I think this is the first time we need to > > introduce a > > > >>> KIP > > > >>> > > > without > > > >>> > > > > > > > having > > > >>> > > > > > > > > it > > > >>> > > > > > > > > > fully accepted in next release. Let me know if > this > > > >>> sounds > > > >>> > > > > > > reasonable. > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > On Fri, Apr 24, 2020 at 1:00 AM Sönke Liebau > > > >>> > > > > > > > > > <soenke.lie...@opencore.com.invalid> wrote: > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > After thinking on this a little bit, maybe this > > > >>> would be > > > >>> > an > > > >>> > > > > > option: > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > add default methods serialize and deserialize > to > > > the > > > >>> > > > > > > > > > KafkaPrincipalBuilder > > > >>> > > > > > > > > > > interface, these could be very short: > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > default String serialize(KafkaPrincipal > > principal) > > > { > > > >>> > > > > > > > > > > return principal.toString(); > > > >>> > > > > > > > > > > } > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > default KafkaPrincipal deserialize(String > > > >>> > principalString) > > > >>> > > { > > > >>> > > > > > > > > > > return > > > >>> > > > SecurityUtils.parseKafkaPrincipal(principalString); > > > >>> > > > > > > > > > > } > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > This would mean that all existing > implementations > > > of > > > >>> that > > > >>> > > > > > interface > > > >>> > > > > > > > > > > are unaffected, as this code is pretty much > what > > is > > > >>> > > currently > > > >>> > > > > > being > > > >>> > > > > > > > > > > used when their principals need to be > serialized. > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > But it offers people using custom principals > the > > > >>> chance > > > >>> > to > > > >>> > > > > > override > > > >>> > > > > > > > > > > these methods and ensure that all information > > gets > > > >>> > > serialized > > > >>> > > > > for > > > >>> > > > > > > > > > > delegation tokens or request forwarding. > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > Wherever we need to de/serialize principals > (for > > > >>> example > > > >>> > in > > > >>> > > > the > > > >>> > > > > > > > > > > DelegationTokenManager [1]) we obtain an > instance > > > of > > > >>> the > > > >>> > > > > > configured > > > >>> > > > > > > > > > > PrincipalBuilder class and use that to do the > > > actual > > > >>> > work. > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > What do you think? > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > Best regards, > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > Sönke > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > [1] > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > > > https://github.com/apache/kafka/blob/33d06082117d971cdcddd4f01392006b543f3c01/core/src/main/scala/kafka/server/DelegationTokenManager.scala#L122 > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > On Thu, 23 Apr 2020 at 17:42, Boyang Chen < > > > >>> > > > > > > > reluctanthero...@gmail.com> > > > >>> > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > Thanks all, > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > IIUC, the necessity of doing the audit log on > > the > > > >>> > > > controller > > > >>> > > > > > side > > > >>> > > > > > > > is > > > >>> > > > > > > > > > > > because we need to make sure the authorized > > > >>> resource > > > >>> > > > > > > modifications > > > >>> > > > > > > > > > > > eventually arrive on the target broker side, > > but > > > is > > > >>> > that > > > >>> > > > > really > > > >>> > > > > > > > > > > necessary? > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > I'm thinking the possibility of doing the > audit > > > >>> log on > > > >>> > > the > > > >>> > > > > > > > forwarding > > > >>> > > > > > > > > > > > broker side, which could simplify the > > discussion > > > of > > > >>> > > > principal > > > >>> > > > > > > > > > > serialization > > > >>> > > > > > > > > > > > here. The other option I could think of is to > > > >>> serialize > > > >>> > > the > > > >>> > > > > > > entire > > > >>> > > > > > > > > > audit > > > >>> > > > > > > > > > > > log message if we were supposed to approve, > and > > > >>> pass it > > > >>> > > as > > > >>> > > > > part > > > >>> > > > > > > of > > > >>> > > > > > > > > the > > > >>> > > > > > > > > > > > Envelope. > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > Let me know if you think either of these > > > approaches > > > >>> > would > > > >>> > > > > work. > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > On Thu, Apr 23, 2020 at 7:01 AM Sönke Liebau > > > >>> > > > > > > > > > > > <soenke.lie...@opencore.com.invalid> wrote: > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > > I agree that this would be useful to have > and > > > >>> > shouldn't > > > >>> > > > > > create > > > >>> > > > > > > > > issues > > > >>> > > > > > > > > > > in > > > >>> > > > > > > > > > > > > 99% of all cases. But it would be a > breaking > > > >>> change > > > >>> > to > > > >>> > > a > > > >>> > > > > > public > > > >>> > > > > > > > > API. > > > >>> > > > > > > > > > > > > I had a quick look at the two large > projects > > > that > > > >>> > come > > > >>> > > to > > > >>> > > > > > mind > > > >>> > > > > > > > > which > > > >>> > > > > > > > > > > > might > > > >>> > > > > > > > > > > > > be affected: Ranger and Sentry - both seem > to > > > >>> operate > > > >>> > > > > > directly > > > >>> > > > > > > > with > > > >>> > > > > > > > > > > > > KafkaPrincipal instead of subclassing it. > But > > > >>> anybody > > > >>> > > who > > > >>> > > > > > > > > > > > > extended KafkaPrincipal would probably need > > to > > > >>> update > > > >>> > > > their > > > >>> > > > > > > > code.. > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > Writing this sparked the thought that this > > > issue > > > >>> > should > > > >>> > > > > also > > > >>> > > > > > > > > concern > > > >>> > > > > > > > > > > > > delegation tokens, as Principals need to be > > > >>> > stored/sent > > > >>> > > > > > around > > > >>> > > > > > > > for > > > >>> > > > > > > > > > > those > > > >>> > > > > > > > > > > > > too. > > > >>> > > > > > > > > > > > > Had a brief look at the code and for > > Delegation > > > >>> > Tokens > > > >>> > > we > > > >>> > > > > > seem > > > >>> > > > > > > to > > > >>> > > > > > > > > use > > > >>> > > > > > > > > > > > > SecurityUtils#parseKafkaPrincipal[1] which > > > would > > > >>> > ignore > > > >>> > > > any > > > >>> > > > > > > > > > additional > > > >>> > > > > > > > > > > > > information from custom Principals. > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > We'll probably want to at least add a note > on > > > >>> that to > > > >>> > > the > > > >>> > > > > > docs > > > >>> > > > > > > - > > > >>> > > > > > > > > > unless > > > >>> > > > > > > > > > > > it > > > >>> > > > > > > > > > > > > is there already, I've only looked for > about > > 30 > > > >>> > > seconds.. > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > Best regards, > > > >>> > > > > > > > > > > > > Sönke > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > [1] > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > > > https://github.com/apache/kafka/blob/e9fcfe4fb7b9ae2f537ce355fe2ab51a58034c64/clients/src/main/java/org/apache/kafka/common/utils/SecurityUtils.java#L52 > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > On Thu, 23 Apr 2020 at 14:35, Colin McCabe > < > > > >>> > > > > > cmcc...@apache.org > > > >>> > > > > > > > > > > >>> > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > Hmm... Maybe we need to add some way to > > > >>> serialize > > > >>> > and > > > >>> > > > > > > > deserialize > > > >>> > > > > > > > > > > > > > KafkaPrincipal subclasses to/from string. > > We > > > >>> could > > > >>> > > > add a > > > >>> > > > > > > > method > > > >>> > > > > > > > > to > > > >>> > > > > > > > > > > > > > KafkaPrincipalBuilder#deserialize and a > > > method > > > >>> > > > > > > > > > > > KafkaPrincipal#serialize, > > > >>> > > > > > > > > > > > > I > > > >>> > > > > > > > > > > > > > suppose. > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > best, > > > >>> > > > > > > > > > > > > > Colin > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > On Thu, Apr 23, 2020, at 02:14, Tom > Bentley > > > >>> wrote: > > > >>> > > > > > > > > > > > > > > Hi folks, > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > Colin wrote: > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > The final broker knows it can trust > the > > > >>> > principal > > > >>> > > > > name > > > >>> > > > > > in > > > >>> > > > > > > > the > > > >>> > > > > > > > > > > > > envelope > > > >>> > > > > > > > > > > > > > > > (since EnvelopeRequest requires > > > >>> CLUSTERACTION > > > >>> > on > > > >>> > > > > > > CLUSTER). > > > >>> > > > > > > > > So > > > >>> > > > > > > > > > it > > > >>> > > > > > > > > > > > can > > > >>> > > > > > > > > > > > > > use > > > >>> > > > > > > > > > > > > > > > that principal name for authorization > > > >>> (given > > > >>> > who > > > >>> > > > you > > > >>> > > > > > are, > > > >>> > > > > > > > > what > > > >>> > > > > > > > > > > can > > > >>> > > > > > > > > > > > > you > > > >>> > > > > > > > > > > > > > > > do?) The forwarded principal name > will > > > >>> also be > > > >>> > > > used > > > >>> > > > > > for > > > >>> > > > > > > > > > logging. > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > My understanding (and I'm happy to be > > > >>> corrected) > > > >>> > is > > > >>> > > > > that > > > >>> > > > > > a > > > >>> > > > > > > > > custom > > > >>> > > > > > > > > > > > > > > authoriser might rely on the > > KafkaPrincipal > > > >>> > > instance > > > >>> > > > > > being > > > >>> > > > > > > a > > > >>> > > > > > > > > > > subclass > > > >>> > > > > > > > > > > > > of > > > >>> > > > > > > > > > > > > > > KafkaPrincipal (e.g. the subclass has > > extra > > > >>> > fields > > > >>> > > > with > > > >>> > > > > > the > > > >>> > > > > > > > > > > > principal's > > > >>> > > > > > > > > > > > > > > "roles"). So you can't construct a > > > >>> KafkaPrinicpal > > > >>> > > on > > > >>> > > > > the > > > >>> > > > > > > > > > controller > > > >>> > > > > > > > > > > > > which > > > >>> > > > > > > > > > > > > > > would be guaranteed to work for > arbitrary > > > >>> > > > authorizers. > > > >>> > > > > > You > > > >>> > > > > > > > have > > > >>> > > > > > > > > > to > > > >>> > > > > > > > > > > > > > perform > > > >>> > > > > > > > > > > > > > > authorization on the first broker > > > (rejecting > > > >>> some > > > >>> > > of > > > >>> > > > > the > > > >>> > > > > > > > > batched > > > >>> > > > > > > > > > > > > > requests), > > > >>> > > > > > > > > > > > > > > forward the authorized ones to the > > > >>> controller, > > > >>> > > which > > > >>> > > > > then > > > >>> > > > > > > has > > > >>> > > > > > > > > to > > > >>> > > > > > > > > > > > trust > > > >>> > > > > > > > > > > > > > that > > > >>> > > > > > > > > > > > > > > the authorization has been done and > make > > > the > > > >>> ZK > > > >>> > > > writes > > > >>> > > > > > > > without > > > >>> > > > > > > > > > > > > > > authorization. Because the controller > > > cannot > > > >>> > invoke > > > >>> > > > the > > > >>> > > > > > > > > > authorizer > > > >>> > > > > > > > > > > > that > > > >>> > > > > > > > > > > > > > > means that the authorizer audit logging > > (on > > > >>> the > > > >>> > > > > > controller) > > > >>> > > > > > > > > would > > > >>> > > > > > > > > > > not > > > >>> > > > > > > > > > > > > > > include these operations. But they > would > > be > > > >>> in > > > >>> > the > > > >>> > > > > audit > > > >>> > > > > > > > > logging > > > >>> > > > > > > > > > > from > > > >>> > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > original broker, so the information > would > > > >>> not be > > > >>> > > > lost. > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > There's also a problem with using the > > > >>> constructed > > > >>> > > > > > principal > > > >>> > > > > > > > for > > > >>> > > > > > > > > > > other > > > >>> > > > > > > > > > > > > > > logging (i.e. non authorizer logging) > on > > > the > > > >>> > > > > controller: > > > >>> > > > > > > > > There's > > > >>> > > > > > > > > > > > > nothing > > > >>> > > > > > > > > > > > > > > stopping a custom KafkaPrincipal > subclass > > > >>> from > > > >>> > > > > overriding > > > >>> > > > > > > > > > > toString() > > > >>> > > > > > > > > > > > to > > > >>> > > > > > > > > > > > > > > return something different from > > > >>> > "${type}:${name}". > > > >>> > > If > > > >>> > > > > > > you're > > > >>> > > > > > > > > > > > building a > > > >>> > > > > > > > > > > > > > > "fake" KafkaPrincipal on the controller > > > from > > > >>> the > > > >>> > > type > > > >>> > > > > and > > > >>> > > > > > > > name > > > >>> > > > > > > > > > then > > > >>> > > > > > > > > > > > its > > > >>> > > > > > > > > > > > > > > toString() would be "wrong". A solution > > to > > > >>> this > > > >>> > > would > > > >>> > > > > be > > > >>> > > > > > to > > > >>> > > > > > > > > also > > > >>> > > > > > > > > > > > > > serialize > > > >>> > > > > > > > > > > > > > > the toString() into the envelope and > have > > > >>> some > > > >>> > > > > > > > > > > ProxiedKafkaPrincipal > > > >>> > > > > > > > > > > > > > class > > > >>> > > > > > > > > > > > > > > which you instantiate on the controller > > > >>> which has > > > >>> > > > > > > overridden > > > >>> > > > > > > > > > > toString > > > >>> > > > > > > > > > > > > to > > > >>> > > > > > > > > > > > > > > return the right value. Obviously you > > could > > > >>> > > optimize > > > >>> > > > > this > > > >>> > > > > > > > using > > > >>> > > > > > > > > > an > > > >>> > > > > > > > > > > > > > optional > > > >>> > > > > > > > > > > > > > > field so you only serialize the > > toString() > > > >>> if it > > > >>> > > > > differed > > > >>> > > > > > > > from > > > >>> > > > > > > > > > the > > > >>> > > > > > > > > > > > > value > > > >>> > > > > > > > > > > > > > > you'd get from > KafkaPrincipal.toString(). > > > >>> Maybe > > > >>> > > > > non-audit > > > >>> > > > > > > > > logging > > > >>> > > > > > > > > > > > using > > > >>> > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > wrong string value of a principal is > > > >>> sufficiently > > > >>> > > > minor > > > >>> > > > > > > that > > > >>> > > > > > > > > this > > > >>> > > > > > > > > > > > isn't > > > >>> > > > > > > > > > > > > > > even worth trying to solve. > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > Kind regards, > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > Tom > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > On Wed, Apr 22, 2020 at 10:59 PM Sönke > > > Liebau > > > >>> > > > > > > > > > > > > > > <soenke.lie...@opencore.com.invalid> > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > Hi Colin, > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > thanks for your summary! Just one > > > question > > > >>> - > > > >>> > and > > > >>> > > I > > > >>> > > > > may > > > >>> > > > > > be > > > >>> > > > > > > > > > missing > > > >>> > > > > > > > > > > > an > > > >>> > > > > > > > > > > > > > > > obvious point here.. > > > >>> > > > > > > > > > > > > > > > You write: > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > "The initial broker should do > > > >>> authentication > > > >>> > (who > > > >>> > > > are > > > >>> > > > > > > you?) > > > >>> > > > > > > > > and > > > >>> > > > > > > > > > > > come > > > >>> > > > > > > > > > > > > up > > > >>> > > > > > > > > > > > > > > > with a principal name. Then it > creates > > > an > > > >>> > > envelope > > > >>> > > > > > > > request, > > > >>> > > > > > > > > > > which > > > >>> > > > > > > > > > > > > will > > > >>> > > > > > > > > > > > > > > > contain that principal name, and > sends > > it > > > >>> along > > > >>> > > > with > > > >>> > > > > > the > > > >>> > > > > > > > > > > unmodified > > > >>> > > > > > > > > > > > > > > > original request to the final broker. > > > >>> [... ] > > > >>> > > The > > > >>> > > > > > final > > > >>> > > > > > > > > broker > > > >>> > > > > > > > > > > > knows > > > >>> > > > > > > > > > > > > > it > > > >>> > > > > > > > > > > > > > > > can trust the principal name in the > > > >>> envelope > > > >>> > > (since > > > >>> > > > > > > > > > > EnvelopeRequest > > > >>> > > > > > > > > > > > > > > > requires CLUSTERACTION on CLUSTER). > So > > > it > > > >>> can > > > >>> > > use > > > >>> > > > > that > > > >>> > > > > > > > > > principal > > > >>> > > > > > > > > > > > > name > > > >>> > > > > > > > > > > > > > for > > > >>> > > > > > > > > > > > > > > > authorization (given who you are, > what > > > can > > > >>> you > > > >>> > > > do?) " > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > My understanding is, that you don't > > want > > > to > > > >>> > > > serialize > > > >>> > > > > > the > > > >>> > > > > > > > > > > Principal > > > >>> > > > > > > > > > > > > > (due to > > > >>> > > > > > > > > > > > > > > > the discussed issues with custom > > > >>> principals) > > > >>> > but > > > >>> > > > > reduce > > > >>> > > > > > > the > > > >>> > > > > > > > > > > > principal > > > >>> > > > > > > > > > > > > > down > > > >>> > > > > > > > > > > > > > > > to a string representation that would > > be > > > >>> used > > > >>> > for > > > >>> > > > > > logging > > > >>> > > > > > > > and > > > >>> > > > > > > > > > > > > > > > authorization? > > > >>> > > > > > > > > > > > > > > > If that understanding is correct > then I > > > >>> don't > > > >>> > > think > > > >>> > > > > we > > > >>> > > > > > > > could > > > >>> > > > > > > > > > use > > > >>> > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > regular Authorizer on the target > > broker, > > > >>> > because > > > >>> > > > that > > > >>> > > > > > > would > > > >>> > > > > > > > > > need > > > >>> > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > actual > > > >>> > > > > > > > > > > > > > > > principal object to work on. > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > Also, a thought that just occurred to > > me, > > > >>> we > > > >>> > > might > > > >>> > > > > > > actually > > > >>> > > > > > > > > > need > > > >>> > > > > > > > > > > to > > > >>> > > > > > > > > > > > > log > > > >>> > > > > > > > > > > > > > > > different principal strings for the > > case > > > of > > > >>> > > queries > > > >>> > > > > > like > > > >>> > > > > > > > > > > > AlterConfigs > > > >>> > > > > > > > > > > > > > > > (mentioned by Rajini) which may > contain > > > >>> > multiple > > > >>> > > > > > > resources. > > > >>> > > > > > > > > > Take > > > >>> > > > > > > > > > > an > > > >>> > > > > > > > > > > > > > LDAP > > > >>> > > > > > > > > > > > > > > > authorizer that grants access based > on > > > >>> group > > > >>> > > > > > membership - > > > >>> > > > > > > > the > > > >>> > > > > > > > > > > same > > > >>> > > > > > > > > > > > > > > > alterconfig request may contain > > resources > > > >>> that > > > >>> > > are > > > >>> > > > > > > > authorized > > > >>> > > > > > > > > > > based > > > >>> > > > > > > > > > > > > on > > > >>> > > > > > > > > > > > > > > > group1 as well as resources > authorized > > > >>> based on > > > >>> > > > > > > membership > > > >>> > > > > > > > in > > > >>> > > > > > > > > > > > group 2 > > > >>> > > > > > > > > > > > > > .. > > > >>> > > > > > > > > > > > > > > > And in all cases we'd need to log the > > > >>> specific > > > >>> > > > > reason I > > > >>> > > > > > > > > think.. > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > Basically I think that we might have > a > > > hard > > > >>> > time > > > >>> > > > > > properly > > > >>> > > > > > > > > > > > authorizing > > > >>> > > > > > > > > > > > > > and > > > >>> > > > > > > > > > > > > > > > logging without being able to forward > > the > > > >>> > entire > > > >>> > > > > > > > principal.. > > > >>> > > > > > > > > > but > > > >>> > > > > > > > > > > > > > again, I > > > >>> > > > > > > > > > > > > > > > might be heading down an entirely > wrong > > > >>> path > > > >>> > here > > > >>> > > > :) > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > Best regards, > > > >>> > > > > > > > > > > > > > > > Sönke > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > On Wed, 22 Apr 2020 at 23:13, > Guozhang > > > >>> Wang < > > > >>> > > > > > > > > > wangg...@gmail.com> > > > >>> > > > > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > Colin, Boyang: thanks for the > > updates, > > > I > > > >>> > agree > > > >>> > > > that > > > >>> > > > > > an > > > >>> > > > > > > > > > > > > > EnvelopeRequest > > > >>> > > > > > > > > > > > > > > > > would be a less vulnerable approach > > > than > > > >>> > > optional > > > >>> > > > > > > fields, > > > >>> > > > > > > > > and > > > >>> > > > > > > > > > > I'm > > > >>> > > > > > > > > > > > > > just > > > >>> > > > > > > > > > > > > > > > > wondering if we would keep the > > > >>> > EnvelopeRequest > > > >>> > > > for > > > >>> > > > > a > > > >>> > > > > > > long > > > >>> > > > > > > > > > > time. I > > > >>> > > > > > > > > > > > > was > > > >>> > > > > > > > > > > > > > > > > thinking that, potentially if we > > > require > > > >>> > > clients > > > >>> > > > to > > > >>> > > > > > be > > > >>> > > > > > > on > > > >>> > > > > > > > > > newer > > > >>> > > > > > > > > > > > > > version > > > >>> > > > > > > > > > > > > > > > > when talking to a 3.0+ (assuming > 3.0 > > is > > > >>> the > > > >>> > > > bridge > > > >>> > > > > > > > release) > > > >>> > > > > > > > > > > > > brokers, > > > >>> > > > > > > > > > > > > > then > > > >>> > > > > > > > > > > > > > > > > we do not need to keep this code > for > > > too > > > >>> > long, > > > >>> > > > but > > > >>> > > > > I > > > >>> > > > > > > > think > > > >>> > > > > > > > > > that > > > >>> > > > > > > > > > > > > > would be > > > >>> > > > > > > > > > > > > > > > a > > > >>> > > > > > > > > > > > > > > > > very hasty compatibility breaking > so > > > >>> maybe we > > > >>> > > > > indeed > > > >>> > > > > > > need > > > >>> > > > > > > > > to > > > >>> > > > > > > > > > > keep > > > >>> > > > > > > > > > > > > > this > > > >>> > > > > > > > > > > > > > > > > forwarding mechanism many years. > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > Regarding future use cases, I think > > the > > > >>> > example > > > >>> > > > > that > > > >>> > > > > > > > Boyang > > > >>> > > > > > > > > > > > > > mentioned may > > > >>> > > > > > > > > > > > > > > > > not be very practical honestly, > > because > > > >>> when > > > >>> > > > > there's > > > >>> > > > > > a > > > >>> > > > > > > > > > > > connectivity > > > >>> > > > > > > > > > > > > > > > issue, > > > >>> > > > > > > > > > > > > > > > > it is either a network partition > > > between > > > >>> > > > > "controller, > > > >>> > > > > > > A | > > > >>> > > > > > > > > B", > > > >>> > > > > > > > > > > or > > > >>> > > > > > > > > > > > > > > > > "controller | A, B". In other > words, > > if > > > >>> the > > > >>> > > > > > controller > > > >>> > > > > > > > can > > > >>> > > > > > > > > > talk > > > >>> > > > > > > > > > > > to > > > >>> > > > > > > > > > > > > A, > > > >>> > > > > > > > > > > > > > > > then > > > >>> > > > > > > > > > > > > > > > > very likely A would not be able to > > talk > > > >>> to B > > > >>> > > > > > either... > > > >>> > > > > > > > > > anyways, > > > >>> > > > > > > > > > > > > > since the > > > >>> > > > > > > > > > > > > > > > > forwarding would be there for a > > > >>> sufficiently > > > >>> > > long > > > >>> > > > > > > time, I > > > >>> > > > > > > > > > think > > > >>> > > > > > > > > > > > > > keeping > > > >>> > > > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > additional envelope makes sense. > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > Guozhang > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > On Wed, Apr 22, 2020 at 1:47 PM > > Boyang > > > >>> Chen < > > > >>> > > > > > > > > > > > > > reluctanthero...@gmail.com> > > > >>> > > > > > > > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > Thanks Colin for the summary! And > > > >>> Guozhang, > > > >>> > > > > > regarding > > > >>> > > > > > > > the > > > >>> > > > > > > > > > > > future > > > >>> > > > > > > > > > > > > > use > > > >>> > > > > > > > > > > > > > > > > cases, > > > >>> > > > > > > > > > > > > > > > > > consider a scenario where there > are > > > >>> > temporary > > > >>> > > > > > > > > connectivity > > > >>> > > > > > > > > > > > issue > > > >>> > > > > > > > > > > > > > > > between > > > >>> > > > > > > > > > > > > > > > > > controller to a fellow broker A, > > the > > > >>> > > controller > > > >>> > > > > > could > > > >>> > > > > > > > > then > > > >>> > > > > > > > > > > > > leverage > > > >>> > > > > > > > > > > > > > > > > another > > > >>> > > > > > > > > > > > > > > > > > healthy broker B to do a > forwarding > > > >>> request > > > >>> > > to > > > >>> > > > A > > > >>> > > > > in > > > >>> > > > > > > > order > > > >>> > > > > > > > > > to > > > >>> > > > > > > > > > > > > > maintain a > > > >>> > > > > > > > > > > > > > > > > > communication. > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > Even for KIP-590 scope, the > > > forwarding > > > >>> > > > mechanism > > > >>> > > > > > > shall > > > >>> > > > > > > > > not > > > >>> > > > > > > > > > be > > > >>> > > > > > > > > > > > > > transit > > > >>> > > > > > > > > > > > > > > > as > > > >>> > > > > > > > > > > > > > > > > we > > > >>> > > > > > > > > > > > > > > > > > do need to support older version > of > > > >>> admin > > > >>> > > > clients > > > >>> > > > > > > for a > > > >>> > > > > > > > > > > couple > > > >>> > > > > > > > > > > > of > > > >>> > > > > > > > > > > > > > years > > > >>> > > > > > > > > > > > > > > > > > IIUC. > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > Boyang > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > On Wed, Apr 22, 2020 at 1:29 PM > > Colin > > > >>> > McCabe > > > >>> > > < > > > >>> > > > > > > > > > > > cmcc...@apache.org > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > Hi all, > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > I guess the way I see this > > working > > > is > > > >>> > that > > > >>> > > > the > > > >>> > > > > > > > request > > > >>> > > > > > > > > > gets > > > >>> > > > > > > > > > > > > sent > > > >>> > > > > > > > > > > > > > from > > > >>> > > > > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > > > client, to the initial broker, > > and > > > >>> then > > > >>> > > > > forwarded > > > >>> > > > > > > to > > > >>> > > > > > > > > the > > > >>> > > > > > > > > > > > final > > > >>> > > > > > > > > > > > > > > > broker. > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > The initial broker should do > > > >>> > authentication > > > >>> > > > > (who > > > >>> > > > > > > are > > > >>> > > > > > > > > > you?) > > > >>> > > > > > > > > > > > and > > > >>> > > > > > > > > > > > > > come > > > >>> > > > > > > > > > > > > > > > up > > > >>> > > > > > > > > > > > > > > > > > > with a principal name. Then it > > > >>> creates > > > >>> > an > > > >>> > > > > > envelope > > > >>> > > > > > > > > > > request, > > > >>> > > > > > > > > > > > > > which > > > >>> > > > > > > > > > > > > > > > will > > > >>> > > > > > > > > > > > > > > > > > > contain that principal name, > and > > > >>> sends it > > > >>> > > > along > > > >>> > > > > > > with > > > >>> > > > > > > > > the > > > >>> > > > > > > > > > > > > > unmodified > > > >>> > > > > > > > > > > > > > > > > > > original request to the final > > > >>> broker. (I > > > >>> > > > agree > > > >>> > > > > > > with > > > >>> > > > > > > > > Tom > > > >>> > > > > > > > > > > and > > > >>> > > > > > > > > > > > > > Rajini > > > >>> > > > > > > > > > > > > > > > > that > > > >>> > > > > > > > > > > > > > > > > > we > > > >>> > > > > > > > > > > > > > > > > > > can't forward the information > > > needed > > > >>> to > > > >>> > do > > > >>> > > > > > > > > authentication > > > >>> > > > > > > > > > > on > > > >>> > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > final > > > >>> > > > > > > > > > > > > > > > > > > broker, but I also think we > don't > > > >>> need > > > >>> > to, > > > >>> > > > > since > > > >>> > > > > > we > > > >>> > > > > > > > can > > > >>> > > > > > > > > > do > > > >>> > > > > > > > > > > it > > > >>> > > > > > > > > > > > > on > > > >>> > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > > > initial broker.) > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > The final broker knows it can > > trust > > > >>> the > > > >>> > > > > principal > > > >>> > > > > > > > name > > > >>> > > > > > > > > in > > > >>> > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > envelope > > > >>> > > > > > > > > > > > > > > > > > > (since EnvelopeRequest requires > > > >>> > > CLUSTERACTION > > > >>> > > > > on > > > >>> > > > > > > > > > CLUSTER). > > > >>> > > > > > > > > > > > So > > > >>> > > > > > > > > > > > > > it can > > > >>> > > > > > > > > > > > > > > > > use > > > >>> > > > > > > > > > > > > > > > > > > that principal name for > > > authorization > > > >>> > > (given > > > >>> > > > > who > > > >>> > > > > > > you > > > >>> > > > > > > > > are, > > > >>> > > > > > > > > > > > what > > > >>> > > > > > > > > > > > > > can > > > >>> > > > > > > > > > > > > > > > you > > > >>> > > > > > > > > > > > > > > > > > > do?) The forwarded principal > > name > > > >>> will > > > >>> > > also > > > >>> > > > be > > > >>> > > > > > > used > > > >>> > > > > > > > > for > > > >>> > > > > > > > > > > > > logging. > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > One question is why we need an > > > >>> > > > EnvelopeRequest. > > > >>> > > > > > > > Well, > > > >>> > > > > > > > > if > > > >>> > > > > > > > > > > we > > > >>> > > > > > > > > > > > > > don't > > > >>> > > > > > > > > > > > > > > > have > > > >>> > > > > > > > > > > > > > > > > > an > > > >>> > > > > > > > > > > > > > > > > > > EnvelopeRequest, we need > > somewhere > > > >>> else > > > >>> > to > > > >>> > > > put > > > >>> > > > > > the > > > >>> > > > > > > > > > > forwarded > > > >>> > > > > > > > > > > > > > > > principal > > > >>> > > > > > > > > > > > > > > > > > > name. I don't think overriding > > an > > > >>> > existing > > > >>> > > > > field > > > >>> > > > > > > > (like > > > >>> > > > > > > > > > > > > > clientId) is > > > >>> > > > > > > > > > > > > > > > a > > > >>> > > > > > > > > > > > > > > > > > good > > > >>> > > > > > > > > > > > > > > > > > > option for this. It's messy, > and > > > >>> loses > > > >>> > > > > > > information. > > > >>> > > > > > > > > It > > > >>> > > > > > > > > > > also > > > >>> > > > > > > > > > > > > > raises > > > >>> > > > > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > > > question of how the final > broker > > > >>> knows > > > >>> > that > > > >>> > > > the > > > >>> > > > > > > > > clientId > > > >>> > > > > > > > > > in > > > >>> > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > received > > > >>> > > > > > > > > > > > > > > > > > > message is not "really" a > > clientId, > > > >>> but > > > >>> > is > > > >>> > > a > > > >>> > > > > > > > principal > > > >>> > > > > > > > > > > name. > > > >>> > > > > > > > > > > > > > Without > > > >>> > > > > > > > > > > > > > > > > an > > > >>> > > > > > > > > > > > > > > > > > > envelope, there's no way to > > clearly > > > >>> mark > > > >>> > a > > > >>> > > > > > request > > > >>> > > > > > > as > > > >>> > > > > > > > > > > > > forwarded, > > > >>> > > > > > > > > > > > > > so > > > >>> > > > > > > > > > > > > > > > > > there's > > > >>> > > > > > > > > > > > > > > > > > > no reason for the final broker > to > > > >>> treat > > > >>> > > this > > > >>> > > > > > > > > differently > > > >>> > > > > > > > > > > > than a > > > >>> > > > > > > > > > > > > > > > regular > > > >>> > > > > > > > > > > > > > > > > > > clientId (or whatever). > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > We talked about using optional > > > >>> fields to > > > >>> > > > > contain > > > >>> > > > > > > the > > > >>> > > > > > > > > > > > forwarded > > > >>> > > > > > > > > > > > > > > > > principal > > > >>> > > > > > > > > > > > > > > > > > > name, but this is also messy > and > > > >>> > > potentially > > > >>> > > > > > > > dangerous. > > > >>> > > > > > > > > > > > Older > > > >>> > > > > > > > > > > > > > > > brokers > > > >>> > > > > > > > > > > > > > > > > > will > > > >>> > > > > > > > > > > > > > > > > > > simply ignore the optional > > fields, > > > >>> which > > > >>> > > > could > > > >>> > > > > > > result > > > >>> > > > > > > > > in > > > >>> > > > > > > > > > > them > > > >>> > > > > > > > > > > > > > > > executing > > > >>> > > > > > > > > > > > > > > > > > > operations as the wrong > > principal. > > > >>> Of > > > >>> > > > course, > > > >>> > > > > > this > > > >>> > > > > > > > > would > > > >>> > > > > > > > > > > > > > require a > > > >>> > > > > > > > > > > > > > > > > > > misconfiguration in order to > > > happen, > > > >>> but > > > >>> > it > > > >>> > > > > still > > > >>> > > > > > > > seems > > > >>> > > > > > > > > > > > better > > > >>> > > > > > > > > > > > > > to set > > > >>> > > > > > > > > > > > > > > > > up > > > >>> > > > > > > > > > > > > > > > > > > the system so that this > > > >>> misconfiguration > > > >>> > is > > > >>> > > > > > > detected, > > > >>> > > > > > > > > > > rather > > > >>> > > > > > > > > > > > > than > > > >>> > > > > > > > > > > > > > > > > > silently > > > >>> > > > > > > > > > > > > > > > > > > ignored. > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > It's true that the need for > > > >>> forwarding is > > > >>> > > > > > > "temporary" > > > >>> > > > > > > > > in > > > >>> > > > > > > > > > > some > > > >>> > > > > > > > > > > > > > sense, > > > >>> > > > > > > > > > > > > > > > > > since > > > >>> > > > > > > > > > > > > > > > > > > we only need it for older > > clients. > > > >>> > > However, > > > >>> > > > we > > > >>> > > > > > > will > > > >>> > > > > > > > > want > > > >>> > > > > > > > > > > to > > > >>> > > > > > > > > > > > > > support > > > >>> > > > > > > > > > > > > > > > > > these > > > >>> > > > > > > > > > > > > > > > > > > older clients for many years to > > > come. > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > I agree that the usefulness of > > > >>> > > > EnvelopeRequest > > > >>> > > > > is > > > >>> > > > > > > > > limited > > > >>> > > > > > > > > > > by > > > >>> > > > > > > > > > > > it > > > >>> > > > > > > > > > > > > > > > being a > > > >>> > > > > > > > > > > > > > > > > > > superuser-only request at the > > > moment. > > > >>> > > > Perhaps > > > >>> > > > > > > there > > > >>> > > > > > > > > are > > > >>> > > > > > > > > > > some > > > >>> > > > > > > > > > > > > > changes > > > >>> > > > > > > > > > > > > > > > > to > > > >>> > > > > > > > > > > > > > > > > > > how custom principals work that > > > would > > > >>> > allow > > > >>> > > > us > > > >>> > > > > to > > > >>> > > > > > > get > > > >>> > > > > > > > > > > around > > > >>> > > > > > > > > > > > > > this in > > > >>> > > > > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > > > future. We should think about > > that > > > >>> so > > > >>> > that > > > >>> > > > we > > > >>> > > > > > have > > > >>> > > > > > > > > this > > > >>> > > > > > > > > > > > > > > > functionality > > > >>> > > > > > > > > > > > > > > > > in > > > >>> > > > > > > > > > > > > > > > > > > the future if it's needed. > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > best, > > > >>> > > > > > > > > > > > > > > > > > > Colin > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > On Wed, Apr 22, 2020, at 11:21, > > > >>> Guozhang > > > >>> > > Wang > > > >>> > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > > Hello Gwen, > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > The purpose here is for > > > maintaining > > > >>> > > > > > compatibility > > > >>> > > > > > > > old > > > >>> > > > > > > > > > > > > clients, > > > >>> > > > > > > > > > > > > > who > > > >>> > > > > > > > > > > > > > > > do > > > >>> > > > > > > > > > > > > > > > > > not > > > >>> > > > > > > > > > > > > > > > > > > > have functionality to do > > > re-routing > > > >>> > admin > > > >>> > > > > > > requests > > > >>> > > > > > > > > > > > > themselves. > > > >>> > > > > > > > > > > > > > New > > > >>> > > > > > > > > > > > > > > > > > > clients > > > >>> > > > > > > > > > > > > > > > > > > > can of course do this > > themselves > > > by > > > >>> > > > detecting > > > >>> > > > > > > who's > > > >>> > > > > > > > > the > > > >>> > > > > > > > > > > > > > controller. > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > Hello Colin / Boyang, > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > Regarding the usage of the > > > >>> envelope, > > > >>> > I'm > > > >>> > > > > > curious > > > >>> > > > > > > > what > > > >>> > > > > > > > > > are > > > >>> > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > potential > > > >>> > > > > > > > > > > > > > > > > > > > future use cases that would > > > require > > > >>> > > request > > > >>> > > > > > > > > forwarding > > > >>> > > > > > > > > > > and > > > >>> > > > > > > > > > > > > > hence > > > >>> > > > > > > > > > > > > > > > > > envelope > > > >>> > > > > > > > > > > > > > > > > > > > would be useful? Originally I > > > >>> thought > > > >>> > > that > > > >>> > > > > the > > > >>> > > > > > > > > > forwarding > > > >>> > > > > > > > > > > > > > mechanism > > > >>> > > > > > > > > > > > > > > > > is > > > >>> > > > > > > > > > > > > > > > > > > only > > > >>> > > > > > > > > > > > > > > > > > > > temporary as we need it for > the > > > >>> bridge > > > >>> > > > > release, > > > >>> > > > > > > and > > > >>> > > > > > > > > > > moving > > > >>> > > > > > > > > > > > > > forward > > > >>> > > > > > > > > > > > > > > > we > > > >>> > > > > > > > > > > > > > > > > > > will > > > >>> > > > > > > > > > > > > > > > > > > > get rid of this to simplify > the > > > >>> code > > > >>> > > base. > > > >>> > > > If > > > >>> > > > > > we > > > >>> > > > > > > do > > > >>> > > > > > > > > > have > > > >>> > > > > > > > > > > > > valid > > > >>> > > > > > > > > > > > > > use > > > >>> > > > > > > > > > > > > > > > > > cases > > > >>> > > > > > > > > > > > > > > > > > > in > > > >>> > > > > > > > > > > > > > > > > > > > the future which makes us > > believe > > > >>> that > > > >>> > > > > request > > > >>> > > > > > > > > > forwarding > > > >>> > > > > > > > > > > > > would > > > >>> > > > > > > > > > > > > > > > > > actually > > > >>> > > > > > > > > > > > > > > > > > > be > > > >>> > > > > > > > > > > > > > > > > > > > a permanent feature retained > on > > > the > > > >>> > > broker > > > >>> > > > > > side, > > > >>> > > > > > > > I'm > > > >>> > > > > > > > > on > > > >>> > > > > > > > > > > > board > > > >>> > > > > > > > > > > > > > with > > > >>> > > > > > > > > > > > > > > > > > adding > > > >>> > > > > > > > > > > > > > > > > > > > the envelope request > protocol. > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > Guozhang > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > On Wed, Apr 22, 2020 at 8:22 > AM > > > >>> Gwen > > > >>> > > > Shapira > > > >>> > > > > < > > > >>> > > > > > > > > > > > > > g...@confluent.io> > > > >>> > > > > > > > > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > Hey Boyang, > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > Sorry if this was already > > > >>> discussed, > > > >>> > > but > > > >>> > > > I > > > >>> > > > > > > didn't > > > >>> > > > > > > > > see > > > >>> > > > > > > > > > > > this > > > >>> > > > > > > > > > > > > as > > > >>> > > > > > > > > > > > > > > > > > rejected > > > >>> > > > > > > > > > > > > > > > > > > > > alternative: > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > Until now, we always did > > client > > > >>> side > > > >>> > > > > routing > > > >>> > > > > > - > > > >>> > > > > > > > the > > > >>> > > > > > > > > > > client > > > >>> > > > > > > > > > > > > > itself > > > >>> > > > > > > > > > > > > > > > > > found > > > >>> > > > > > > > > > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > > > > > controller via metadata and > > > >>> directed > > > >>> > > > > requests > > > >>> > > > > > > > > > > > accordingly. > > > >>> > > > > > > > > > > > > > > > Brokers > > > >>> > > > > > > > > > > > > > > > > > that > > > >>> > > > > > > > > > > > > > > > > > > > > were not the controller, > > > rejected > > > >>> > those > > > >>> > > > > > > requests. > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > Why did we decide to move > to > > > >>> broker > > > >>> > > side > > > >>> > > > > > > routing? > > > >>> > > > > > > > > Was > > > >>> > > > > > > > > > > the > > > >>> > > > > > > > > > > > > > > > > client-side > > > >>> > > > > > > > > > > > > > > > > > > > > option discussed and > rejected > > > >>> > somewhere > > > >>> > > > > and I > > > >>> > > > > > > > > missed > > > >>> > > > > > > > > > > it? > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > Gwen > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > On Fri, Apr 3, 2020, 4:45 > PM > > > >>> Boyang > > > >>> > > Chen > > > >>> > > > < > > > >>> > > > > > > > > > > > > > > > > reluctanthero...@gmail.com > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > wrote: > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > Hey all, > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > I would like to start off > > the > > > >>> > > > discussion > > > >>> > > > > > for > > > >>> > > > > > > > > > > KIP-590, a > > > >>> > > > > > > > > > > > > > > > follow-up > > > >>> > > > > > > > > > > > > > > > > > > > > > initiative after KIP-500: > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > > > https://cwiki.apache.org/confluence/display/KAFKA/KIP-590%3A+Redirect+Zookeeper+Mutation+Protocols+to+The+Controller > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > This KIP proposes to > > migrate > > > >>> > existing > > > >>> > > > > > > Zookeeper > > > >>> > > > > > > > > > > > mutation > > > >>> > > > > > > > > > > > > > paths, > > > >>> > > > > > > > > > > > > > > > > > > including > > > >>> > > > > > > > > > > > > > > > > > > > > > configuration, security > and > > > >>> quota > > > >>> > > > > changes, > > > >>> > > > > > to > > > >>> > > > > > > > > > > > > > controller-only > > > >>> > > > > > > > > > > > > > > > by > > > >>> > > > > > > > > > > > > > > > > > > always > > > >>> > > > > > > > > > > > > > > > > > > > > > routing these alterations > > to > > > >>> the > > > >>> > > > > > controller. > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > Let me know your > thoughts! > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > Best, > > > >>> > > > > > > > > > > > > > > > > > > > > > Boyang > > > >>> > > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > -- > > > >>> > > > > > > > > > > > > > > > > > > > -- Guozhang > > > >>> > > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > -- > > > >>> > > > > > > > > > > > > > > > > -- Guozhang > > > >>> > > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > -- > > > >>> > > > > > > > > > > > > > > > Sönke Liebau > > > >>> > > > > > > > > > > > > > > > Partner > > > >>> > > > > > > > > > > > > > > > Tel. +49 179 7940878 > > > >>> > > > > > > > > > > > > > > > OpenCore GmbH & Co. KG - > > > >>> Thomas-Mann-Straße 8 - > > > >>> > > > 22880 > > > >>> > > > > > > > Wedel - > > > >>> > > > > > > > > > > > Germany > > > >>> > > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > -- > > > >>> > > > > > > > > > > > > Sönke Liebau > > > >>> > > > > > > > > > > > > Partner > > > >>> > > > > > > > > > > > > Tel. +49 179 7940878 > > > >>> > > > > > > > > > > > > OpenCore GmbH & Co. KG - Thomas-Mann-Straße > > 8 - > > > >>> 22880 > > > >>> > > > > Wedel - > > > >>> > > > > > > > > Germany > > > >>> > > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > -- > > > >>> > > > > > > > > > > Sönke Liebau > > > >>> > > > > > > > > > > Partner > > > >>> > > > > > > > > > > Tel. +49 179 7940878 > > > >>> > > > > > > > > > > OpenCore GmbH & Co. KG - Thomas-Mann-Straße 8 - > > > 22880 > > > >>> > > Wedel - > > > >>> > > > > > > Germany > > > >>> > > > > > > > > > > > > > >>> > > > > > > > > > > > > >>> > > > > > > > > > > > >>> > > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > > > > >>> > > > > > > -- > > > >>> > > > > > > Sönke Liebau > > > >>> > > > > > > Partner > > > >>> > > > > > > Tel. +49 179 7940878 > > > >>> > > > > > > OpenCore GmbH & Co. KG - Thomas-Mann-Straße 8 - 22880 > > > Wedel - > > > >>> > > Germany > > > >>> > > > > > > > > > >>> > > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> > > > > -- > > > >>> > > > > Sönke Liebau > > > >>> > > > > Partner > > > >>> > > > > Tel. +49 179 7940878 > > > >>> > > > > OpenCore GmbH & Co. KG - Thomas-Mann-Straße 8 - 22880 > Wedel - > > > >>> Germany > > > >>> > > > > > > > >>> > > > > > > >>> > > > > > >>> > > > > >>> > > > > >>> > -- > > > >>> > -- Guozhang > > > >>> > > > > >>> > > > >> > > > > > >