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. > > >