File: install-multifactor

package info (click to toggle)
webauth 4.7.0-8
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 7,932 kB
  • sloc: ansic: 28,341; sh: 12,031; perl: 8,361; xml: 6,856; makefile: 459; php: 7
file content (564 lines) | stat: -rw-r--r-- 28,461 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
               Configuration of WebKDC Multifactor Support

Introduction

  In addition to the default support for password and web server
  authentication, WebAuth also supports multifactor authentication:
  requiring users accessing all or some WebAuth-protected sites to
  authenticate with multiple forms of authentication.  Generally, a
  combination of a password equivalent and some sort of cryptographic code
  generated by a device carried by the user is used, but WebAuth is
  agnostic about how the multifactor authentication is done.

  This document provides an overview of the multifactor authentication
  philosophy in WebAuth and supplemental information about how to deploy
  it.

  There are some pieces of the multifactor authentication support in
  WebAuth that can be used "out of the box" with only the software
  included in the WebAuth source package.  However, most features,
  including OTP (one-time password) support, will require an additional
  piece of site-specific middleware that currently you will need to write
  yourself.  This is described below under "User Information Service,"
  including the protocol that the WebKDC expects it to speak.  The future
  intention is to provide a simple sample implementation adequate for
  small sites to serve as a basis for customization.

Definitions

  The WebAuth documentation and code uses the following terms to describe
  multifactor authentication and related information:

  factor
      A factor is either a method of authentication (password, OTP) or
      information about authentication derived from the other factors
      (multifactor, which indicates the user authenticated with more than
      one general type of factor).  Factors are one- or two-letter codes,
      with multiple factors shown by separating them with commas.  The
      definition of all the factor codes is in the protocol specification.
      Note that authentication by presenting a WebLogin single sign-on
      cookie is itself a factor (the "c" or cookie factor).

  initial factors
      The initial factors are the factors the user used to do initial
      authentication: the authentication they performed to get their
      single sign-on cookie, having no previous authentication tokens (or
      after having been forced to reauthenticate).  A user will retain the
      same initial factors through the life of their single sign-on
      cookies.

  session factors
      The session factors are the factors that the user used to
      authenticate to a specific web site.  If the user was prompted for
      initial authentication to reach that web site, they will be the same
      as the initial factors.  However, they may be something else, such
      as "c" (cookie) if the user used a single sign-on cookie, or "k"
      (Kerberos) if the user authenticated to WebLogin using Kerberos with
      Negotiate-Auth.  In the latter case, the initial factors should be
      whatever methods the user used to obtain their initial Kerberos
      ticket-granting ticket on their local system.

  persistent factor
      This is a factor stored in a separate cookie in the user's browser
      that persists for longer than the expiration time of their single
      sign-on credentials.  It is used, for example, to set a cookie in a
      browser that has been vetted by some means (such as a previous
      multifactor authentication) that will add an additional
      authentication factor to subsequent authentications from that
      browser.

  level of assurance
      This is a site-defined numeric value that is intended to encapsulate
      in one number a combination of the identity proofing of the user (how
      much confirmation the organization has that the person is who they
      say they are) and the strength of their authentication method.  It's
      primarily intended for use with applications subject to regulatory
      requirements for particular levels of assurance.  For example, see
      NIST Special Publication 800-63 at:

      <http://csrc.nist.gov/publications/nistpubs/800-63-1/SP-800-63-1.pdf>

      which provides recommendations by the US government.  How (or
      whether) to use level of assurance numbers and what the numbers mean
      is entirely up to each site, except that higher numbers must be
      stronger than lower numbers.  WebAuth only passes the numbers around
      and does not originate them.

  random multifactor
      WebAuth supports a mechanism in which a given WebAuth-protected site
      can require multifactor authentication occasionally but not all the
      time.  This is called "random multifactor."  The frequency of the
      random requirement is determined by the site-provided user
      information service; WebAuth only tells it that random multifactor
      was requested and leaves it to the information service to decide
      whether that means multifactor authentication should be required.

  WebAuth currently recognizes three major types of initial authentication
  factors: password ("p"), OTP ("o"), and X.509 ("x").  However, both OTP
  and X.509 authentication may be done via different methods with varying
  levels of security.  For example, a tamper-resistant hardware smart card
  with a PIN and a certificate installed in the user's browser may both
  show up as X.509, but the former is much more secure than the latter.

  WebAuth therefore supports any number of site-defined variants of both
  OTP and X.509 factors formed by adding a number after "o" or "x".  For
  example, "o1" may be a printed list of one-time authentication codes,
  and "o3" may be Google Authenticator running on a smart phone.  The
  meaning of these factors are entirely site-defined, except that they
  should be in order of ascending strength ("o3" should be stronger, or at
  least equally strong, as "o2").

Authentication Interfaces

  There are multiple places within a deployed WebAuth system where a user
  may authenticate.  Each one needs to be separately configured for
  multifactor support to make a complete and coherent system.

  The primary authentication interface used by most sites is the WebLogin
  service, where the user is prompted for a username and password via an
  HTML form.  The WebKDC understands that authentication method and gives
  it initial factors of "p" (password) by default.  By default, no level
  of assurance is expressed for those logins.  This method can support an
  additional prompt for a one-time password if the WebKDC has been
  configured with an appropriate user information service that knows how
  to validate an OTP.  For more information on that, see "User Information
  Service" and "OTP Validation" below.

  There are two other authentication interfaces provided by WebAuth,
  however, and these can be made multifactor-aware without requiring a
  user information service.  Some sites may be able to deploy multifactor
  using just these interfaces and not have to create a user information
  service.

  The first is the support in WebLogin for trusting and reusing
  authentication information provided by the web server.  This is the
  support used to allow authentication via Negotiate-Auth and is described
  in docs/install-spnego.  By default, such authentications are given
  initial and session authentication factors of "u" (unknown).  However,
  WebLogin allows one to provide a (Perl) callback function named
  remuser_factors in the WebLogin configuration, which is passed the
  username of the user authenticating and has access to the full web
  server environment (including, for example, the environment variables
  set by a web server that has performed a successful client-side
  certificate authentication).  This function returns the initial and
  session factors and level of assurance.  Using this function, sites can
  map authentications done by the web server, which is the easiest way to
  implement X.509 authentication, to appropriate factors and level of
  assurance for their site.  For more information, see the description of
  the remuser_factors function in docs/weblogin-config.

  The second is the WebKDC interface that allows obtaining a webkdc-proxy
  token (the contents of a single sign-on cookie) directly using Kerberos
  authentication.  Here too, the default initial authentication factor is
  "u" (unknown), but the WebKdcKerberosFactors Apache directive can be
  used to set the initial factors for this method of authentication.
  Unlike with WebLogin's use of web server authentication, there is no way
  to programmatically map different users to different factors or to set a
  level of assurance for this method of authentication.

User Information Service

  The WebLogin callback and WebKdcKerberosFactors Apache directive will
  not be sufficient for most sites deploying multifactor authentication.
  Sites that want more flexibility, or that want to add OTP verification
  to the WebLogin flow, will need to provide a user information service.

  There are two components to the user information service: a "userinfo"
  call that returns general information about the user, including their
  configured factors and level of assurance, and a "validate" call that is
  used for OTP validation.  The second will be described in the next
  section.

  Currently, the only supported protocol for contacting the user
  information service is via remctl.  remctl is a Kerberos-authenticated
  protocol for executing remote commands and is available as free
  software.  For more information see the remctl distribution page:

      <http://www.eyrie.org/~eagle/software/remctl/>

  The location of the user information service is configured with the
  WebKDC Apache configuration directives WebKdcUserInfoURL and
  WebKdcUserInfoPrincipal.  A typical WebKdcUserInfoURL setting would be:

      WebKdcUserInfoURL remctl://userdb.example.com/user

  The protocol currently must be remctl.  The host and port of the service
  can be specified in the normal URL syntax.  The part after the slash is
  the remctl command name to use.

  The WebKdcUserInfoPrincipal directive can normally be omitted and is
  used only if the remctl server uses an authentication Kerberos principal
  other than the host principal for the system on which it's running.

  The user information service must provide a remctl command with a
  subcommand of "webkdc-userinfo" that takes the following arguments in
  order:

  username
      The username of the user attempting to authenticate.

  ip
      The IP address from which the user is coming (generally the IP
      address that is accessing the WebLogin server).  127.0.0.1 will be
      sent as the IP address if the WebKDC cannot determine the client's
      IP address for some reason.

  timestamp
      The timestamp of the authentication in seconds since UNIX epoch.
      This will currently always be the current time.

  random-multifactor
      A flag that will be 0 if random multifactor was not requested and 1
      if it was requested.

  url
      The URL to which the user would go after successful authentication.
      This is the return URL parameter from the WebAuth request token, so
      it may not match the URL to which the user went to trigger the
      authentication attempt.  This parameter will be ommitted if the
      WebKDC has no URL information (usually not the case).  If there is
      no URL information but factors (the next parameter) are present, it
      will be the empty string.

  factors
      A comma-separated list of initial authentication factor codes that
      the user has already established with the WebLogin server at the
      time of the call.  This parameter was added in WebAuth 4.5.0; older
      versions of the WebKDC will not send it.

  If the remctl command exits with a non-zero status, this will be taken
  as a fatal error and the user's authentication will be aborted.  The
  error can be reported on standard error.  If it exits with a zero
  status, it must provide an XML document on standard output with
  something like the following contents:

      <authdata user="{username}">
        <!-- List of authentication factors the user has available. -->
        <factors>
          <factor>p</factor>
          <factor>m</factor>
          <factor>o</factor>
          <factor>o3</factor>
        </factors>

        <!-- Optional. List of additional factors to add to successful
             logins. -->
        <additional-factors>
          <factor>h</factor>
        </additional-factors>

        <!-- Optional.  Present if specific factors should be required
             regardless of whether they were requested by the destination
             site. -->
        <required-factors>
          <factor>o3</factor>
        </required-factors>

        <!-- Optional.  Present if any persistent factors with a creation
             date prior to the timestamp should be invalidated.  If the
             WebKDC invalidates any factor information based on this
             cutoff, it should then retry the userinfo call with a
             modified factors parameter reflecting that change.  {time} is
             seconds since epoch. -->
        <persistent-factors>
          <valid-threshold>{time}</valid-threshold>
        </persistent-factors>

        <!-- Optional.  If present, contains possibly suspicious recent
             logins that the user should be notified of.  name and
             timestamp may be omitted.  If present, {time} is the seconds
             since epoch timestamp of the last login from that
             location. -->
        <login-history>
          <host name="{host}" timestamp="{time}">{ip}</host>
          <host name="{host}" timestamp="{time}">{ip}</host>
        </login-history>

        <!-- Optional.  If present, indicates that the user will not be
             able to assert a level of assurance higher than this
             number. -->
        <max-loa>{max-loa-value}</max-loa>

        <!-- Optional.  Contains the expiration time of the user's
             password in seconds since epoch, used to prompt the user
             to change their password. -->
        <password-expires>{expiration-time}</password-expires>

        <!-- Optional.  May contain a message for the user to display on
             the first load of the multifactor authentication page.
        <user-message>{message-for-user}</user-message>

        <!-- Optional.  May contain a string-serialized object that
             will be returned on a subsequent request to the
             validate service.  May be deserilized in WebLogin and
             used to change WebLogin behavior, for example - display
             a custom message to the user. -->
        <login-state>{custom-state-object}</login-state>
      </authdata>

  {username} should match the user for which the information is being
  retrieved.

  All elements are optional except for <factors>, which should list all
  factors that the user is capable of providing (based on local knowledge
  of user configuration).  The list of factors should normally always
  include "p" (password).  If the user is capable of multifactor, be sure
  to include "m" (multifactor) in the list of factors.  Do not include
  "rm" (random multifactor); this is handled specially.

  If <additional-factors> is present, those factors will be added to any
  successful authentication.  This is primarily intended as a mechanism to
  add the "h" (human-verified) factor temporarily for a user after local
  support staff have confirmed their identity as a way of giving that user
  a multifactor factor when they've lost their multifactor authentication
  method.  However, it can be used for any scenario where the user
  information service knows, via some external means, that a successful
  authentication (either password or OTP) for that user should add some
  additional factors besides the normal ones.

  If <required-factors> is present, the WebKDC will add the factors
  present to those required by the WebAuth-protected site.  This can be
  used to force multifactor authentication even if the WebAuth-protected
  site doesn't require it.  This is how random multifactor should be
  implemented by the user information service.  If the random multifactor
  flag is 1 and the user is selected, include a required factor (generally
  the m factor) within this tag.  The user information service should also
  remember that the user was selected for random multifactor and continue
  to require it every time the random multifactor flag is true until the
  user successfully authenticates with multifactor, since otherwise the
  user may just reload the login page until they get lucky again.

  For backward compatibility, the <multifactor-required /> tag, if present
  without <required-factors>, is treated as equivalent to a required
  factor of m.

  The optional <login-history> section provides information for the
  WebLogin server to show the user about recent logins.

  The <max-loa> attribute specifies the maximum level of assurance that
  the user can obtain.  This can be omitted if level of assurance isn't
  used.  If the level of assurance requested by a WebAuth-protected site
  is higher than this value, the WebLogin server will show an error page
  instead of prompting the user for multifactor authentication.

  The optional <password-expires> attribute provides the time, in seconds
  since epoch, when the user's password will expire.  It's used to display
  a warning and a prompt to the user to change their password on the
  WebLogin confirmation screen.

  The optional <user-message> element may contain a message to provide
  the user with any additional information from the userinfo service.  It
  can be used to explain the reasoning for an unexpected multifactor
  enforcement, or any other messaging specific to this step of the
  authenication process.  It will be passed, via the WebKDC and WebLogin,
  to the template for the multifactor authentication page or confirmation
  page (depending on whether a multifactor authentication is required).

  The optional <login-state> element may contain a simple value or a string
  serialized object that can be used to retain state for a subsequent call
  to the validate service.  The object may be deserialized in WebLogin by
  assigning a deserialization function to the WebLogin config variable
  LOGIN_STATE_UNSERIALIZE.  An example function can be found within the
  weblogin-config documentation.  Whether deserialized or not, the resulting
  object can be accessed within the WebLogin templates by the name
  "login_state".

  Alternately, the user information service may reject this
  authentication.  In this case, it should return the much simpler
  response:

      <authdata user="{username}">
        <error>{message-for-user}</error>
      </authdata>

  The {message-for-user} should be an HTML-formatted message that will be
  displayed to the user as a fatal error message by WebLogin.  Normally,
  this should be inside a CDATA block to protect the HTML markup.

  For information about how this information is handled by the WebLogin
  system, see "WebLogin Templates" below.

OTP Validation

  Most sites will probably want to use some one-time password system as a
  second factor, since it's the easiest and cheapest to deploy to a large
  number of people.  WebAuth uses a call to the user information service
  similar to the userinfo call to validate any OTP.  The user information
  service can then take any steps it wishes to do OTP validation: use OATH
  libraries or tools to check the code against a stored seed, call out to
  a separate appliance, check a web service, or whatever else is required
  to integrate with a local OTP system.

  To do OTP validation, the user information service must provide a remctl
  command with a subcommand of "webkdc-validate" that takes the following
  arguments in order:

  username
      The username of the user attempting to authenticate.

  ip
      The IP address from which the user is coming (generally the IP
      address that is accessing the WebLogin server).  127.0.0.1 will be
      sent as the IP address if the WebKDC cannot determine the client's
      IP address for some reason.

  code
      The OTP to validate.

  type
      The OTP type to validate.  This parameter may be omitted if the
      WebKDC doesn't know what type of OTP the user is trying to use.

  login-state
      The state object returned from a previous call to the userinfo
      or validate service.  It may be absent if no login-state exists.

  If the remctl command exits with a non-zero status, this will be taken
  as a fatal internal error and the user's authentication will be aborted.
  (This should not be used for an invalid OTP; see below.)  The error can
  be reported on standard error.  If it exits with a zero status, it must
  provide an XML document on standard output with something like the
  following contents:

      <authdata user="{username}">
        <success>yes|no</success>
        <factors>
          <expiration>{expiration}</expiration>
          <factor>o</factor>
          <factor>o3</factor>
        </factors>
        <persistent-factors>
          <valid-threshold>{time}</valid-threshold>
          <expiration>{expiration}</expiration>
          <factor>d</factor>
        <persistent-factors>
        <loa>{loa-value}</loa>
        <user-message>{message-for-user}</user-message>
        <login-state>{custom-state-object}</login-state>
      </authdata>

  {username} should match the user for which the information is being
  retrieved.

  The correctness of the OTP is given by the <success> attribute, which
  should have a value of "yes" if the OTP was correct and "no" if it was
  not (or if the OTP login was rejected for some other reason; see below).

  If correct, the <factors> attribute should be included, listing all of
  the authentication factors that this successful authentication
  represents.  Normally, this will include "o" (some OTP) along with a
  specific numbered OTP factor if there are multiple types of OTP
  available.  {expiration} indicates when (in seconds since UNIX epoch)
  this authentication should expire.  If you have no site-specific reason
  to choose otherwise, ten hours from the current time is a reasonable
  default.

  If this authentication should result in setting a persistent factor
  cookie in the authenticating browser, the factors that should go into
  that persistent factor cookie should be listed in the
  <persistent-factors> element.  Otherwise, that element should be
  omitted.  (These will be set as persistent initial authentication
  factors; setting persistent session authentication factors is not
  currently supported.)  Here similarly the {expiration} value indicates
  the time (in seconds since UNIX epoch) when the persistent factors
  should expire.  The <invalid-before> element is optional; if present, it
  indicates that the WebKDC should also discard all webkdc-factor tokens
  with a creation date prior to the time given (in seconds since UNIX
  epoch).

  If level of assurance is being used, the optional <loa> attribute should
  return the level of assurance this authentication indicates.  This
  should assume that the user also authenticated with a password, since
  the WebLogin server will only do OTP authentication after successful
  password authentication.

  The optional <user-message> element may contain a message to provide
  the user with any additional information about specific actions they
  should take as a result of this OTP validation attempt, or an
  an informational message about the state of this validation.

  As explained above for the userinfo service, the optional <login-state>
  element may contain a simple value or a string serialized object that can
  be used to retain state for a subsequent call to the validate service.
  The object's deserialization process and function are identical to the
  userinfo case, however this object is most useful for repeated subsequent
  calls to the validate service.  This allows the validate service to
  maintain state for a series of user interactions, where stateful
  interaction is required to implement a number of token-specific features,
  for example - the reset of a PIN code, or the initialization of a hardware
  token.

  On failure, behavior depends on whether <user-message> is present.  If
  it is not present, <success>no</success> indicates that the OTP code was
  not correct.  This will be logged as a failed authentication and the
  user will be prompted to re-enter the code.  If <user-message> is
  present, this instead indicates that the validation service rejected the
  authentication for some reason either more complex or requiring more
  explanation than simply "the OTP code was wrong."  The user will still
  be prompted to enter an OTP code, but the contents of <user-message>
  will be made availed to the WebLogin template for display to the user.
  This will be logged as a rejected authentication.

WebLogin Templates

  Enabling multifactor adds additional cases that should be handled by the
  WebLogin templates, including a new template (multifactor.tmpl) that's
  used to prompt for multifactor authentication.  For complete
  information, see docs/weblogin-config.  This documentation will only
  touch on the highlights.

  The current templates and WebLogin page flow mostly assume that the user
  will use OTP as their multifactor authentication method.  If the user
  has not authenticated and Negotiate-Auth is not in use, the user will
  always first be presented with a password authentication screen as
  normal.  After the user authenticates, the user information service will
  be consulted and that information checked against the requested factors
  and level of assurance by the destination WebAuth-protected site.  If
  the site requests factors the user is not capable of providing, or a
  level of assurance higher than the user is capable of providing, the
  user will be taken directly to an error page.

  Error pages due to insufficient factors or level of assurance will
  include the login cancel link if one was provided.  WebAuth servers that
  require multifactor normally should set WebAuthLoginCanceledURL to a
  page that explains the situation to users without multifactor
  configured, including any site-specific information about how the user
  should proceed.

  The sample multifactor.tmpl handles OTP prompting, but the user's
  configured factors and the factors requested by the destination site are
  provided to the template as template variables.  This allows the page to
  be completely customized for the situation, including ones that don't
  involve prompting for an OTP.  For example, if the user needs to do
  X.509 authentication, the template could display a page telling the user
  to insert their smart card and then go to a different login link that
  will attempt to do a client-side certificate authentication.

OTP and SMS

  One inexpensive and easy-to-deploy method of providing multifactor to
  users is to send an OTP via SMS to a user's cell phone.  In order to use
  this method of OTP, it's best if the user has a way of saying that
  they're ready to do the authentication when they're ready for the
  message to be sent.  This is supported in the WebLogin code, and an
  example of how to use it is shown in the sample multifactor.tmpl
  template.

  To send the SMS message, there must be a remctl service that the
  WebLogin server can contact and tell to send the SMS message.  Normally
  this is provided by the same user information service that does OTP
  validation.  The WebLogin server must be configured with information
  about how to contact that remctl service; since it doesn't share
  configuration with the WebKDC, the WebKdcUserInfoURL parameter is not
  used for this purpose.  See docs/weblogin-config for information on how
  to configure the WebLogin server to send an OTP.

License

  Copyright 2011, 2012, 2013
    The Board of Trustees of the Leland Stanford Junior University

  Copying and distribution of this file, with or without modification, are
  permitted in any medium without royalty provided the copyright notice
  and this notice are preserved.  This file is offered as-is, without any
  warranty.