On Tue, Nov 10, 2009 at 08:54:52AM -0600, Douglas E. Engert wrote:
> 
> 
>  Will Fiveash wrote:
> > On Mon, Nov 09, 2009 at 02:20:45PM -0800, Gary Winiger wrote:
> >>>>>  I want to see an updated pam_krb5(5) man page explaining how to use 
> >>>>> PKINIT  and including the example PAM stacks for use of PKINIT.
> >> I'd like to propose a different tact.  This seem to be to suggest a
> >> separate PAM service module.  Has that been considered?
> > I considered it but there would be a lot of redundant code (well
> > depending on how the code is organized) and not much gain.
> >> I'd suggest something like pam_pkinit(5) that interacts with the current
> >> way the PAM stack is configured for pam_krb5(5).
> 
>  That sounds a lot like pam_krb5 pkinit i.e. the same module with a 
>  parameter?

I agree.

> >>
> >>    * pam_pkinit would sit on the PAM stacks above pam_authtok_get(5)
> >>
> >>    * If the KDC and krb5.conf(5) are configured for PKINIT and there's
> >>      no present user (PAM_USER), pam_pkinit:pam_sm_authenticate()
> >>      prompts for the type of login desired:
> >>            "Public Key," "Password," ...
> 
>  add in "smart card" as Public Key might not involve a smart card.

Understood.  Note that my current implementation of pam_krb5 PKINIT
support does the following in regards to prompting:

- If the token does not set CKF_LOGIN_REQUIRED and no suitable cert is
  found pam_krb5 does not prompt for anything and returns either failure
  or ignore depending on the presence of the passwd_fallback argument.

- If the token does not set CKF_LOGIN_REQUIRED and a suitable cert is
  found then the pam_krb5 will prompt for the user's PIN when trying to
  access their private key.  Again the return will depend on PKINIT
  succeeding or failing and the presence of the passwd_fallback
  argument.

- If the token sets CKF_LOGIN_REQUIRED then the pam_krb5 will prompt for
  the user's PIN immediately before searching for a suitable cert.

Currently there is no prompt reminder to alert the user to insert their
token/smartcard.  If there is consensus that this is needed I can add
what Gary has proposed (keeping in mind what you wrote above).  Note
that the result of such prompting will only affect the behavior of the
instance of pam_krb5 that is issuing that prompt.

> >>      If it is "Public Key", do the pkinit thing
> >>      If it is "Password", return PAM_IGNORE.
>
>  The above sounds more like a replacement for pam_authtok_get which
>  prompts for the type authentication the user would like to request. I
>  like the idea of a new pam_authtok_get that is more generic and
>  prompts for the type of authentication the user wishes to try. Maybe
>  it presents a menu of choices and the sets some PAM_AUTH_TYPE
>  variable usable by other pam modules or pass back to pam to alter the
>  path through the stack to select only some modules.  Think more then
>  just Kerberos... (This could also get around the issue of APM a
>  trying a password against multiple authentication data bases, like
>  Kerberos/AD, then local. If the local password is used,AD will
>  consider this a strike against the user, and my lock the account.)
>
>  You guys are just focusing on login, you need to also focus on screen
>  lock/unlock.  With xscreensaver, The application puts up a window,
>  and passes in PAM_USER and pam_conv to pam_start. It then times out
>  the window if no input. So you can not rely on PAM_USER being present
>  or not, as it will be present.

My implementation does not rely on the presence of PAM_USER as an
indication of whether to do PKINIT or password based preauth.  It relies
on whether PAM_AUTHTOK (i.e. the password) is set to make this
determination.  It should work properly with a xscreensaver.

>  I will make another pitch at this,  put pam_authtok_get first, and if
>  the password entered is "PKI", "PKINIT", "smart card" or some other
>  key phrase (blank?), then pam_krb5 will try PKINIT. You only need one
>  pam_krb5 on the stack too, and if the pam_authtok_get changes, you
>  don't have to change pam_krb5.

What if there is another required module below pam_krb5 that requires a
password?

>  This is what Russ's open source pam_krb5 does, if PAM_AUTHTOK is a blank,
>  and the try_pkinit parameter is set, it will try pkinit.

How would his implementation work with the current behavior of Solaris
pam_authtok_get given that is the module that is responsible for
prompting for a user's password?  From what I can tell there are
auth stack configuration that it would not be suitable for since it
prompts for the user's password in some cases.

I think the bottom line here is that a number of people are
uncomfortable with > 1 instance of pam_krb5 in an auth stack.  However
in order to avoid this and also avoid an unnecessary prompt for password
from pam_authtok_get means that pam_authtok_get must also be modified
which I believe isn't necessary since my implementation of pam_krb5
PKINIT supports all reasonable auth configurations without any
modification to pam_authtok_get.

I would also point out that pam_krb5 is already position dependent in
regards to pam_authtok_get.  If you stack the current pam_krb5 above
pam_authtok_get it will always return failure.  My point being that
someone configuring PAM auth stacks must know what they are doing in
regards to the ordering of the PAM modules.

> > I can easily modify my implementation to do that prompting if people are
> > okay with it doing that regardless of whether the user has a token or
> > not.
> >>    * If the KDC and krb5.conf(5) are configured for PKINIT and there
> >>      is a present user (PAM_USER), pam_pkinit:pam_sm_authenticate()
> >>      determines if the user had done the pkinit thing.
> >>      If yes, do the pkinit thing for reauthentication.
> >>      If not, return PAM_IGNORE.
> >>
> >>    * If the KDC and krb5.conf(5) are not configured for PKINIT,
> >>      return PAM_SYSTEM_ERR (or possibly PAM_IGNORE).
> >>
> >>    * for pam_pkinit:pam_sm_setcred(), return PAM_IGNORE.
> >>
> >>    * pass sufficient information in PAM_USER, PAM_AUTHTOK and        
> >> SUNW-KRB5-AUTH-DATA pam_data for pam_krb5(5) to know what
> >>      to do.  Or add another pam_krb pam_data_item ala
> >>      KRB5_AUTOMIGRATE_DATA.  Note the definition of pam_authtok_get(5)
> >>      is to only prompt for the user name if PAM_USER is not set an
> >>      only prompt for an authtok (using PAM_PROMPT) if PAM_AUTHTOK
> >>      is not set.
> >>
> >> Why should it be that account management and password change are 
> >> disallowed?
> > They are not disallowed.  It's just that pam_krb5 doing PKINIT does not
> > have support for changing the token PIN at this point.  Is that a common
> > issue for smartcard users?
> 
>  I would not try and change the PIN. It could also be the PIN needs
>  to be entered on a PIN PAD reader, so the PIN never enters the computer.
> 
>  PINs don't expire, but can be turned off if to many incorrect guesses in a 
>  row,
>  In that case the smart card administrator needs to reset the PIN.

That makes sense.  Note that there are warning prompts issued if the
token returns errors when C_login is tried with incorrect PINs :

    if (tip->flags & CKF_USER_PIN_LOCKED)
        (void) strlcat(prompt, gettext(" (Warning: PIN locked)"), prompt_len);
    else if (tip->flags & CKF_USER_PIN_FINAL_TRY)
        (void) strlcat(prompt, gettext(" (Warning: PIN final try)"), 
prompt_len);
    else if (tip->flags & CKF_USER_PIN_COUNT_LOW)
        (void) strlcat(prompt, gettext(" (Warning: PIN count low)"), 
prompt_len);

-- 
Will Fiveash
Sun Microsystems Inc.
http://opensolaris.org/os/project/kerberos/
Sent from mutt, a sweet ASCII MUA

Reply via email to