On Fri, Apr 24, 2015 at 11:16:05AM +0200, Pavel Reichl wrote:
> On 04/22/2015 11:09 AM, Sumit Bose wrote:
> >On Tue, Apr 21, 2015 at 03:39:11PM +0200, Pavel Reichl wrote:
> >>Hello,
> >>
> >>I have prepared wiki page with proposal how to implement the feature from 
> >>the subject.
> >>
> >>https://fedorahosted.org/sssd/wiki/DesignDocs/CachedAuthentication
> >>
> >>For your convenience I paste the content here.
> >Hi Pavel,
> >
> >thank you for taking care of this, please find comments in-line.
> >
> >bye,
> >Sumit
> Thank you very much for comments, I'll update the page, but please see the
> responses inline first.
> >
> >>Thanks!
> >>
> >>  = Authenticate against cache in SSSD =
> >>
> >>Related ticket(s):
> >>  * https://fedorahosted.org/sssd/ticket/1807
> >>
> >>=== Problem statement ===
> >>SSSD should allow cache authentication instead of authenticating directly 
> >>against network server every time. Authenticating against the network many 
> >>times can cause excessive application latency.
> >>
> >>=== Use cases ===
> >>In environments with tens of thousands of users log in process may become 
> >>inappropriately long, when servers are running under high workload (e.g. 
> >>during classes, when may users log in simultaneously).
> >>
> >>=== Overview of the solution ===
> >>Add new domain option `cached_authentication_timeout` describing how long 
> >>can be cached credentials used for cached authentication before on-line 
> >>authentication must be performed. Update PAM responder functionality for 
> >>forwarding requests to domains by checking if request can be served from 
> >>cache and if so execute same code branch as for off-line authentication 
> >>instead of contacting the domain.
> >>
> >>=== Implementation details ===
> >>
> >>* extend ''struct pam_auth_req''
> >>  * add new field `use_cached_auth` (default value is false)
> >>* extend ''pam_dom_forwarder()''
> >>  * obtain value of domain option `cached_authentication_timeout`
> >I think you can add a new element to pam_ctx for this like we currently
> >do this e.g. with id_timeout.
> Yes, it will be better than parsing the value every time from confdb,
> although as Jakub stated I intend to set this value per domain so
> sss_domain_info will be changed instead of pam_ctx.
> >
> >Please check if cached_authentication_timeout is not larger than
> >offline_credentials_expiration (given in days) and use the smaller of
> >the two.
> Sure, I wanted just to document behavior but this is better.
> >
> >>  * do not forward request to domain if
> >>   * domain uses cached credentials and
> >>   * `cached_authentication_timeout` is greater than 0 and
> >>   * last online log in of user who is being authenticated is not stale (< 
> >> ''now()'' - `cached_authentication_timeout`) and
> >>   * PAM request can be handled from cache (PAM command is 
> >> SSS_PAM_AUTHENTICATE or SSS_PAM_ACCT_MGMT)
> >I think for SSS_PAM_ACCT_MGMT you have to forward the request to the
> >backends because otherwise you skip access control completely. Even if
> >offline the access control validation is done in the backends and we do
> >not save a result to the cache mainly because there might no be a single
> >result. E.g. access control might depend on the service and just knowing
> >that access was granted for service A does not help to determine if
> >access for service B should be granted as well. Nevertheless the backend
> >might have added sufficient information to the cache to do the
> >evaluation for service B even if offline.
> Understood, thanks for explaining.
> >
> >To speed up access control as well we could add a flag like
> >'may_use_cached_data' in the request to the backend which tells the
> >backend the cached data can be used for the evaluation. But I think this
> >would be a different RFE. The one at hand should only handle
> >SSS_PAM_AUTHENTICATE.
> OK, I'll file a ticket and we can defer it on Thursday.  :-)
> >
> >
> >>    * then set `use_cached_auth` to true
> >>    * call ''pam_reply()''
> >>* extend ''pam_reply()''
> >>  * extend condition for entering into block processing case when 
> >> pam_status is PAM_AUTHINFO_UNAVAIL even for `use_cached_auth` being true
> >>  * while in this block and if PAM command is SSS_PAM_AUTHENTICATE then set 
> >> `use_cached_auth` to false to avoid cyclic recursion call of 
> >> ''pam_reply()'' which is subsequently called from 
> >> ''pam_handle_cached_login()''.
> >>* introduce function ''sysdb_get_user_lastlogin()''
> >>  * returning time of last online performed log in for given user
> >but only if pam_verbosity is high enough
> Sorry, I think I badly described this. sysdb_get_user_lastlogin() would be
> used just to obtain value of last online login from sysdb while deciding in
> pam_dom_forwarder() whether authentication can be served from cache or BE
> must be contacted. No output to console should happen here.
> >
> >>=== Configuration changes ===
> >>A new domain option `cached_authentication_timeout` will be added. The 
> >>value of this option is time period for which cached authentication can be 
> >>used. After this period is exceeded on-line authentication must be 
> >>performed. The default value would be 0, which implies that this feature is 
> >>by default disabled.
> >>
> >>=== How To Test ===
> >>1. set `cached_authentication_timeout` in sssd.conf to some non-null value 
> >>(e.g. 120)
> >>1. erase SSSD caches and restart SSSD
> >>1. log in as user from domain which stores credentials and then log out and 
> >>log in again. The second log in should use cached credentials. Output 
> >>should by similar to this, especially note the line starting with: 
> >>'''Authenticated with cached credentials'''
> >>{{{
> >>devel@dev $ su john
> >>Password:
> >>john@dev $ exit
> >>devel@dev $ su john
> >>Password:
> >>Authenticated with cached credentials, your cached password will expire at: 
> >>Wed 22 Apr 2015 08:47:29 AM EDT.
> >as mentioned above I think this message should not be send by default
> >because it might irritate the user.
> Yes, I will update design page that pam_verbosity must be set to see this.
> (I don't intend to add any console output)
> >
> >>john@dev $
> >>}}}
> >>1. for the `cached_authentication_timeout` seconds since the 1st log in all 
> >>subsequent log in attempts (for the same user) should be served from cache 
> >>and domain should not be contacted, this can be verified by changing 
> >>password at server.
> >>1. after passing more than `cached_authentication_timeout` seconds since 
> >>the 1st log in an on-line log in should be performed and new password must 
> >>be used.
> >I wonder what should happen after a local password change. We save the
> >hash of the new password to the cache but I think we do not change the
> >last online auth time here. Shall we do cached authentication with the
> >new password immediately here or shall we go to the backend at least
> >once to make sure the backend knows about the new password. I think I
> >would prefer the latter.
> I think we should definitely do online log in next time user try to log in.
> Question is how?
> 1) I'm worried that if SYSDB_LAST_ONLINE_AUTH was set to 0 after local
> password change we would disable not even cached log in but even off line
> log in.
> 2) I could introduce SYSDB_LAST_ONLINE_AUTH_WITH_CURRENT_TOKEN that would
> behave as SYSDB_LAST_ONLINE_AUTH but could be set to 0 as proposed in 1)

Having an extra attribute for this is a good idea and since we have to
read the user entry anyways and already write some updated attributes
back in the offline authentication code-path, it will have minimal extra
costs.

bye,
Sumit

> >
> >Please add test with wrong password as well to check if
> >offline_failed_login_attempts and offline_failed_login_delay are
> >respected here as well (I have not doubt about this because the same
> >code patch will be used but better be on the save side and be able to
> >detect regression early).
> Sure.
> >
> >As an alternative we might want to send the request to the backend if
> >cached authentication fails. This would cover the case where the user
> >changed the password on the server and tries to login in to a system
> >where the cached_authentication_timeout is not expired yet with the new
> >password.
> Yes, I agree that we must do that.
> 1) We could  just set SYSDB_LAST_ONLINE_AUTH (or
> SYSDB_LAST_ONLINE_AUTH_WITH_CURRENT_TOKEN) to 0 and require on line log in
> next time.
> 2) Try online log in immediately. I suppose this is preferred because it
> provides better user experience.
> >
> >>=== Authors ===
> >>* Pavel Reichl <prei...@redhat.com>
> >>
> >>_______________________________________________
> >>sssd-devel mailing list
> >>sssd-devel@lists.fedorahosted.org
> >>https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
> >_______________________________________________
> >sssd-devel mailing list
> >sssd-devel@lists.fedorahosted.org
> >https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
> 
> _______________________________________________
> sssd-devel mailing list
> sssd-devel@lists.fedorahosted.org
> https://lists.fedorahosted.org/mailman/listinfo/sssd-devel
_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/mailman/listinfo/sssd-devel

Reply via email to