Ivan, thank you very much for the review and proposals!

I've made more descriptive JavaDoc; take a look, please.

> Please think about driving creating IEP on security API overhaul prior to
2.9.
Yes, I'll create IEP on security API soon. I also have some ideas about how
we can improve Ignite's security.

Thank you!

пт, 27 мар. 2020 г. в 11:41, Ivan Rakov <ivan.glu...@gmail.com>:

> Denis,
>
> In general, code changes look good to me. If we decide to keep security API
> in its current state for a while, I highly recommend to extend its
> documentation. We don't have descriptive javadocs or articles about
> security API so far, so I expect that next contributors will face
> difficulties in untangling security logic. Let's help them a bit.
> See more details in my JIRA comment:
> https://issues.apache.org/jira/browse/IGNITE-12759
>
> On Thu, Mar 26, 2020 at 5:54 PM Ivan Rakov <ivan.glu...@gmail.com> wrote:
>
> > Denis,
> >
> > I'll review your PR. If this issue is a subject to be included in 2.8.1
> in
> > emergency mode, I'm ok with the current API changes.
> > Please think about driving creating IEP on security API overhaul prior to
> > 2.9. I believe that you are the most suitable Ignite community member to
> > drive this activity. I'd love to share some ideas as well.
> >
> > On Tue, Mar 24, 2020 at 2:04 PM Denis Garus <garus....@gmail.com> wrote:
> >
> >> Hi, guys!
> >>
> >>
> >> I agree that we should rework the security API, but it can take a long
> >> time.
> >>
> >> And currently, our users have certain impediments that are blockers for
> >> their job.
> >>
> >> I think we have to fix bugs that IEP-41 [1] contains as soon as possible
> >> to
> >> support our users.
> >>
> >>  From my point of view, IEP-41 is the best place to track bug fixing.
> >>
> >>
> >>
> >>    1.
> >>
> >>
> https://cwiki.apache.org/confluence/display/IGNITE/IEP-41%3A+Security+Context+of+thin+client+on+remote+nodes
> >>
> >>
> >> вт, 24 мар. 2020 г. в 12:26, Ivan Rakov <ivan.glu...@gmail.com>:
> >>
> >> > Alexey,
> >> >
> >> > That can be another version of our plan. If everyone agrees that
> >> > SecurityContext and SecuritySubject should be merged, such fix of thin
> >> > clients' issue will bring us closer to the final solution.
> >> > Denis, what do you think?
> >> >
> >> > On Tue, Mar 24, 2020 at 10:38 AM Alexei Scherbakov <
> >> > alexey.scherbak...@gmail.com> wrote:
> >> >
> >> > > Why can't we start gradually changing security API right now ?
> >> > > I see no point in delaying with.
> >> > > All changes will go to next 2.9 release anyway.
> >> > >
> >> > > My proposal:
> >> > > 1. Get rid of security context. Doing this will bring security API
> to
> >> > more
> >> > > or less consistent state.
> >> > > 2. Remove IEP-41 because it's no longer needed because of change [1]
> >> > > 3. Propose an IEP to make security API avoid using internals.
> >> > >
> >> > >
> >> > >
> >> > > пн, 23 мар. 2020 г. в 19:53, Denis Garus <garus....@gmail.com>:
> >> > >
> >> > > > Hello, Alexei, Ivan!
> >> > > >
> >> > > > >> Seems like security API is indeed a bit over-engineered
> >> > > >
> >> > > > Nobody has doubt we should do a reworking of
> GridSecurityProcessor.
> >> > > > But this point is outside of scope thin client's problem that we
> are
> >> > > > solving.
> >> > > > I think we can create new IEP that will accumulate all ideas of
> >> > Ignite's
> >> > > > security improvements.
> >> > > >
> >> > > > >> Presence of the separate #securityContext(UUID) highlights that
> >> user
> >> > > > indeed should care
> >> > > > >> about propagation of thin clients' contexts between the cluster
> >> > nodes.
> >> > > >
> >> > > > I agree with Ivan. I've implemented both variants,
> >> > > > and I like one with #securityContext(UUID) more.
> >> > > >
> >> > > > Could you please take a look at PR [1] for the issue [2]?
> >> > > >
> >> > > > 1. https://github.com/apache/ignite/pull/7523
> >> > > > 2. https://issues.apache.org/jira/browse/IGNITE-12759
> >> > > >
> >> > > > пн, 23 мар. 2020 г. в 11:45, Ivan Rakov <ivan.glu...@gmail.com>:
> >> > > >
> >> > > > > Alex, Denis,
> >> > > > >
> >> > > > > Seems like security API is indeed a bit over-engineered.
> >> > > > >
> >> > > > > Let's get rid of SecurityContext and use SecuritySubject
> instead.
> >> > > > > > SecurityContext is just a POJO wrapper over
> >> > > > > > SecuritySubject's
> >> > > > > > org.apache.ignite.plugin.security.SecuritySubject#permissions.
> >> > > > > > It's functionality can be easily moved to SecuritySubject.
> >> > > > >
> >> > > > > I totally agree. Both subject and context are implemented by
> >> plugin
> >> > > > > provider, and I don't see any reason to keep both abstractions,
> >> > > > especially
> >> > > > > if we are going to get rid of transferring subject in node
> >> attributes
> >> > > > > (argument that subject is more lightweight won't work anymore).
> >> > > > >
> >> > > > > Also, there's kind of mess in node authentication logic. There
> >> are at
> >> > > > least
> >> > > > > two components responsible for it: DiscoverySpiNodeAuthenticator
> >> > (which
> >> > > > is
> >> > > > > forcibly set by GridDiscoveryManager, but in fact public) and
> >> > > > > GridSecurityProcessor (which performs actual node auth logic,
> but
> >> > > > private).
> >> > > > > I also don't understand why we need both
> >> > > > > #authenticate(AuthenticationContext) and
> >> > #authenticateNode(ClusterNode,
> >> > > > > SecurityCredentials) methods while it's possible to set explicit
> >> > > > > SecuritySubjectType.REMOTE_NODE in AuthenticationContext (this
> is
> >> > > > arguable;
> >> > > > > perhaps there are strong reasons).
> >> > > > >
> >> > > > > Finally, areas of responsibility between IgniteSecurity and
> >> > > > > GridSecurityProcessor are kind of mixed. As far as I understand,
> >> the
> >> > > > first
> >> > > > > is responsible for Ignite-internal management of security logic
> >> > > (keeping
> >> > > > > thread-local context, caching security contexts, etc; we don't
> >> expect
> >> > > > > IgniteSecurity to be replaced by plugin provider) and the latter
> >> is
> >> > > > > responsible for user-custom authentication / authorization
> logic.
> >> To
> >> > be
> >> > > > > honest, it took plenty of time to figure this out for me.
> >> > > > >
> >> > > > > From my point of view, we should make GridSecurityProcessor
> >> interface
> >> > > > > public, rename it (it requires plenty of time to find the
> >> difference
> >> > > from
> >> > > > > IgniteSecurity), make its API as simple and non-duplicating as
> >> > possible
> >> > > > and
> >> > > > > clarify its area of responsibility (e.g. should it be
> responsible
> >> for
> >> > > > > propagation of successfully authenticated subject among all
> nodes
> >> or
> >> > > > not?)
> >> > > > > to make it easy to embed custom security logic in Ignite.
> >> > > > >
> >> > > > > Regarding thin clients fix: implementation made by Denis suits
> >> better
> >> > > to
> >> > > > > the very implicit contract that it's better to change API
> >> contracts
> >> > of
> >> > > an
> >> > > > > internal IgniteSecurity than of internal GridSecurityProcessor
> >> (which
> >> > > > > actually mustn't be internal).
> >> > > > >
> >> > > > > > My approach doesn't require any IEPs, just minor change in
> code
> >> and
> >> > > to
> >> > > > > >
> >> > > > > >
> >> > > > >
> >> > > >
> >> > >
> >> >
> >>
> org.apache.ignite.internal.processors.security.IgniteSecurity#authenticate(AuthenticationContext)
> >> > > > > > contract.
> >> > > > >
> >> > > > > Looks like a misuse of #authenticate method to me. It should
> >> perform
> >> > > > > initial authentication based on credentials (this may include
> >> queries
> >> > > to
> >> > > > > external authentication subsystem, e.g. LDAP). User may want to
> >> don't
> >> > > > > authenticate thin client on every node (this will increase the
> >> number
> >> > > of
> >> > > > > requests to auth subsystem unless user implicitly implements
> >> > > propagation
> >> > > > of
> >> > > > > thin clients' contexts between nodes and make #authenticate
> >> > > cluster-wide
> >> > > > > idempotent: first call should perform actual authentication,
> next
> >> > calls
> >> > > > > should retrieve context of already authenticated client).
> >> Presence of
> >> > > the
> >> > > > > separate #securityContext(UUID) highlights that user indeed
> should
> >> > care
> >> > > > > about propagation of thin clients' contexts between the cluster
> >> > nodes.
> >> > > > >
> >> > > > > --
> >> > > > > Ivan
> >> > > > >
> >> > > > > On Fri, Mar 20, 2020 at 12:22 PM Veena Mithare <
> >> > > v.mith...@cmcmarkets.com
> >> > > > >
> >> > > > > wrote:
> >> > > > >
> >> > > > > > Hi Alexei, Denis,
> >> > > > > >
> >> > > > > > One of the main usecases of thin client authentication is to
> be
> >> > able
> >> > > to
> >> > > > > > audit the changes done using the thin client user.
> >> > > > > > To enable that :
> >> > > > > > We really need to resolve this concern as well :
> >> > > > > > https://issues.apache.org/jira/browse/IGNITE-12781
> >> > > > > >
> >> > > > > > ( Incorrect security subject id is  associated with a
> cache_put
> >> > event
> >> > > > > > when the originator of the event is a thin client. )
> >> > > > > >
> >> > > > > > Regards,
> >> > > > > > Veena
> >> > > > > >
> >> > > > > >
> >> > > > > > -----Original Message-----
> >> > > > > > From: Alexei Scherbakov <alexey.scherbak...@gmail.com>
> >> > > > > > Sent: 18 March 2020 08:11
> >> > > > > > To: dev <dev@ignite.apache.org>
> >> > > > > > Subject: Re: Security Subject of thin client on remote nodes
> >> > > > > >
> >> > > > > > Denis Garus,
> >> > > > > >
> >> > > > > > Both variants are capable of solving the thin client security
> >> > context
> >> > > > > > problem.
> >> > > > > >
> >> > > > > > My approach doesn't require any IEPs, just minor change in
> code
> >> and
> >> > > to
> >> > > > > >
> >> > > > > >
> >> > > > >
> >> > > >
> >> > >
> >> >
> >>
> org.apache.ignite.internal.processors.security.IgniteSecurity#authenticate(AuthenticationContext)
> >> > > > > > contract.
> >> > > > > > We can add appropriate documentation to emphasize this.
> >> > > > > > The argument "fragile" is not very convincing for me.
> >> > > > > >
> >> > > > > > I think we should collect more opinions before proceeding with
> >> IEP.
> >> > > > > >
> >> > > > > > Considering a fact we actually *may not care* about
> >> compatibility
> >> > > (I've
> >> > > > > > already explained why), I'm thinking of another approach.
> >> > > > > > Let's get rid of SecurityContext and use SecuritySubject
> >> instead.
> >> > > > > > SecurityContext is just a POJO wrapper over SecuritySubject's
> >> > > > > > org.apache.ignite.plugin.security.SecuritySubject#permissions.
> >> > > > > > It's functionality can be easily moved to SecuritySubject.
> >> > > > > >
> >> > > > > > What do you think?
> >> > > > > >
> >> > > > > >
> >> > > > > >
> >> > > > > > пн, 16 мар. 2020 г. в 15:47, Denis Garus <garus....@gmail.com
> >:
> >> > > > > >
> >> > > > > > >  Hello, Alexei!
> >> > > > > > >
> >> > > > > > > I agree with you if we may not care about compatibility at
> >> all,
> >> > > then
> >> > > > > > > we can solve the problem much more straightforward way.
> >> > > > > > >
> >> > > > > > > In your case, the method GridSecurityProcessor#authenticate
> >> will
> >> > > have
> >> > > > > > > an implicit contract:
> >> > > > > > > [ if actx.subject() != null then
> >> > > > > > >       returns SecurityContext
> >> > > > > > > else
> >> > > > > > >       do authenticate ]
> >> > > > > > >
> >> > > > > > > It looks fragile.
> >> > > > > > >
> >> > > > > > > When we extend the GridSecurityProcessor, there isn't this
> >> > problem:
> >> > > > > > > we have the explicit contract and can make default
> >> implementation
> >> > > > that
> >> > > > > > > throws an unsupported operation exception to enforcing
> >> > > compatibility
> >> > > > > > > check.
> >> > > > > > >
> >> > > > > > > In any case, we need to change GridSecurityProcessor
> >> > > implementation.
> >> > > > > > >
> >> > > > > > > But I think your proposal to try to find a security context
> in
> >> > the
> >> > > > > > > node's attributes first is right for backward compatibility
> >> when
> >> > > > > > > Ignite users don't use thin clients.
> >> > > > > > >
> >> > > > > > > Summary:
> >> > > > > > > I suggest adding a new method to GridSecurityProcessor
> >> because it
> >> > > has
> >> > > > > > > a clear contract and enforces compatibility check natural
> way.
> >> > > > > > >
> >> > > > > > > вс, 15 мар. 2020 г. в 17:13, Alexei Scherbakov <
> >> > > > > > > alexey.scherbak...@gmail.com
> >> > > > > > > >:
> >> > > > > > >
> >> > > > > > > > Denis Garus,
> >> > > > > > > >
> >> > > > > > > > I've looked at the IEP proposed by you and currently I'm
> >> > thinking
> >> > > > > > > > it's
> >> > > > > > > not
> >> > > > > > > > immediately required.
> >> > > > > > > >
> >> > > > > > > > The problem of missing SecurityContexts of thin clients
> can
> >> be
> >> > > > > > > > solved
> >> > > > > > > much
> >> > > > > > > > easily.
> >> > > > > > > >
> >> > > > > > > > Below is the stub of a fix, it requires correct
> >> implementation
> >> > of
> >> > > > > > > > method
> >> > > > > > > >
> >> > > > > > >
> >> > > >
> >> org.apache.ignite.internal.processors.security.IgniteSecurityProcessor
> >> > > > > > > #authenticatedSubject
> >> > > > > > > > by GridSecurityProcessor:
> >> > > > > > > >
> >> > > > > > > > /** {@inheritDoc} */
> >> > > > > > > >     @Override public OperationSecurityContext
> >> withContext(UUID
> >> > > > > nodeId)
> >> > > > > > {
> >> > > > > > > >         try {
> >> > > > > > > >             SecurityContext ctx0 = secCtxs.get(nodeId);
> >> > > > > > > >
> >> > > > > > > >             if (ctx0 == null) {
> >> > > > > > > >                 ClusterNode node =
> >> > > > > > > > Optional.ofNullable(ctx.discovery().node(nodeId))
> >> > > > > > > >                         .orElseGet(() ->
> >> > > > > > > > ctx.discovery().historicalNode(nodeId));
> >> > > > > > > >
> >> > > > > > > >                 // This is a cluster node.
> >> > > > > > > >                 if (node != null)
> >> > > > > > > >                     ctx0 = nodeSecurityContext(marsh,
> >> > > > > > > > U.resolveClassLoader(ctx.config()), findNode(nodeId));
> >> > > > > > > >                 else {
> >> > > > > > > >                     // This is already authenticated thin
> >> > client.
> >> > > > > > > >                     SecuritySubject subj =
> >> > > > > > > > authenticatedSubject(nodeId);
> >> > > > > > > >
> >> > > > > > > >                     assert subj != null : "Subject is null
> >> " +
> >> > > > > > > > nodeId;
> >> > > > > > > >
> >> > > > > > > >                     AuthenticationContext actx = new
> >> > > > > > > > AuthenticationContext();
> >> > > > > > > >                     actx.subject(subj);
> >> > > > > > > >
> >> > > > > > > >                     ctx0 = secPrc.authenticate(actx);
> >> > > > > > > >                 }
> >> > > > > > > >             }
> >> > > > > > > >
> >> > > > > > > >             secCtxs.putIfAbsent(nodeId, ctx0);
> >> > > > > > > >
> >> > > > > > > >             return withContext(ctx0);
> >> > > > > > > >         } catch (IgniteCheckedException e) {
> >> > > > > > > >             throw new IgniteException(e);
> >> > > > > > > >         }
> >> > > > > > > >
> >> > > > > > > > The idea is to create a thin client SecurityContext on a
> >> node
> >> > not
> >> > > > > > > > having
> >> > > > > > > a
> >> > > > > > > > local context using existing SecuritySubject data.
> >> > > > > > > >
> >> > > > > > > > Method
> >> > > > > > > >
> >> > > > > > >
> >> > > >
> >> org.apache.ignite.internal.processors.security.GridSecurityProcessor#a
> >> > > > > > > uthenticate
> >> > > > > > > > should check for not null SecuritySubject field and just
> >> > recreate
> >> > > > > > > > SecurityContext using passed info (because it's already
> >> > > > > authenticated).
> >> > > > > > > >
> >> > > > > > > > We have all necessary information in SecuritySubject
> >> returned
> >> > by
> >> > > > > > > >
> >> > > > > > > >
> >> > > > > > >
> >> > > >
> >> org.apache.ignite.internal.processors.security.IgniteSecurityProcessor
> >> > > > > > > #authenticatedSubject
> >> > > > > > > > by GridSecurityProcessor method.
> >> > > > > > > >
> >> > > > > > > > Because it is internal API,  we may not care about
> >> > compatibility
> >> > > at
> >> > > > > > > > all, but nevertheless it is possible to add compatibility
> >> check
> >> > > in
> >> > > > > > > > the method above. If a feature is not supported the
> >> operations
> >> > > from
> >> > > > > > > > thin clients should be forbidden.
> >> > > > > > > >
> >> > > > > > > > You proposal has the similar problem: if
> >> GridSecurityProcessor
> >> > > does
> >> > > > > > > > not support retriving context for thin clients, such
> clients
> >> > will
> >> > > > > > > > not be able to proceed with operation.
> >> > > > > > > >
> >> > > > > > > > Still, the cleanup of security API is necessary and should
> >> be
> >> > > done
> >> > > > > > > > in 3.0
> >> > > > > > > >
> >> > > > > > > >
> >> > > > > > > >
> >> > > > > > > > чт, 12 мар. 2020 г. в 16:48, VeenaMithare <
> >> > > > v.mith...@cmcmarkets.com
> >> > > > > >:
> >> > > > > > > >
> >> > > > > > > > > HI ,
> >> > > > > > > > >
> >> > > > > > > > > Created this jira :
> >> > > > > > > > > https://issues.apache.org/jira/browse/IGNITE-12781
> >> > > > > > > > >
> >> > > > > > > > > regards,
> >> > > > > > > > > Veena.
> >> > > > > > > > >
> >> > > > > > > > >
> >> > > > > > > > >
> >> > > > > > > > > --
> >> > > > > > > > > Sent from:
> >> > > > http://apache-ignite-developers.2346864.n4.nabble.com/
> >> > > > > > > > >
> >> > > > > > > >
> >> > > > > > > >
> >> > > > > > > > --
> >> > > > > > > >
> >> > > > > > > > Best regards,
> >> > > > > > > > Alexei Scherbakov
> >> > > > > > > >
> >> > > > > > >
> >> > > > > >
> >> > > > > >
> >> > > > > > --
> >> > > > > >
> >> > > > > > Best regards,
> >> > > > > > Alexei Scherbakov
> >> > > > > > ________________________________
> >> > > > > >
> >> > > > > >
> >> > > > > > Spread bets and CFDs are complex instruments and come with a
> >> high
> >> > > risk
> >> > > > of
> >> > > > > > losing money rapidly due to leverage. 70.5% of retail investor
> >> > > accounts
> >> > > > > > lose money when spread betting and/or trading CFDs with this
> >> > > provider.
> >> > > > > You
> >> > > > > > should consider whether you understand how spread bets and
> CFDs
> >> > work
> >> > > > and
> >> > > > > > whether you can afford to take the high risk of losing your
> >> money.
> >> > > > > >
> >> > > > > > Professional clients: Losses can exceed deposits when spread
> >> > betting
> >> > > > and
> >> > > > > > trading CFDs. Countdowns carry a level of risk to your capital
> >> as
> >> > you
> >> > > > > could
> >> > > > > > lose all of your investment. These products may not be
> suitable
> >> for
> >> > > all
> >> > > > > > clients therefore ensure you understand the risks and seek
> >> > > independent
> >> > > > > > advice. Invest only what you can afford to lose.
> >> > > > > >
> >> > > > > > CMC Markets UK plc (173730) and CMC Spreadbet plc (170627) are
> >> > > > authorised
> >> > > > > > and regulated by the Financial Conduct Authority in the United
> >> > > Kingdom.
> >> > > > > CMC
> >> > > > > > Markets UK plc and CMC Spreadbet plc are registered in England
> >> and
> >> > > > Wales
> >> > > > > > with Company Numbers 02448409 and 02589529 and with their
> >> > registered
> >> > > > > > offices at 133 Houndsditch, London, EC3A 7BX.
> >> > > > > >
> >> > > > > > The content of this e-mail (including any attachments) is
> >> strictly
> >> > > > > > confidential and is for the sole use of the intended
> >> addressee(s).
> >> > If
> >> > > > you
> >> > > > > > are not the intended recipient of this e-mail please notify
> the
> >> > > sender
> >> > > > > > immediately and delete this e-mail from your system. Any
> >> > disclosure,
> >> > > > > > copying, dissemination or use of its content (including any
> >> > > > attachments)
> >> > > > > is
> >> > > > > > strictly prohibited. CMC Markets UK plc and CMC Spreadbet plc
> >> > reserve
> >> > > > the
> >> > > > > > right to intercept and monitor the content of the e-mail
> >> messages
> >> > to
> >> > > > and
> >> > > > > > from its systems.
> >> > > > > >
> >> > > > > > E-mails may be interfered with or may contain viruses or other
> >> > > defects
> >> > > > > for
> >> > > > > > which CMC Markets UK plc and CMC Spreadbet plc accept no
> >> > > > responsibility.
> >> > > > > It
> >> > > > > > is the responsibility of the recipient to carry out a virus
> >> check
> >> > on
> >> > > > the
> >> > > > > > e-mail and any attachment(s).
> >> > > > > >
> >> > > > > > This communication is not intended as an offer or solicitation
> >> for
> >> > > the
> >> > > > > > purchase or sale of a financial instrument or as an official
> >> > > > confirmation
> >> > > > > > of any transaction unless specifically presented as such.
> >> > > > > >
> >> > > > > > CMC Markets UK plc and CMC Spreadbet plc are registered in
> >> England
> >> > > and
> >> > > > > > Wales with Company Numbers 02448409 and 02589529 and with
> their
> >> > > > > registered
> >> > > > > > offices at 133 Houndsditch, London, EC3A 7BX.
> >> > > > > >
> >> > > > >
> >> > > >
> >> > >
> >> > >
> >> > > --
> >> > >
> >> > > Best regards,
> >> > > Alexei Scherbakov
> >> > >
> >> >
> >>
> >
>

Reply via email to