
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@24943 ec53bebd-3082-4978-b11e-865c3cabbd6b
1233 lines
41 KiB
Plaintext
1233 lines
41 KiB
Plaintext
|
||
|
||
|
||
Network Working Group S. Josefsson
|
||
Internet-Draft SJD AB
|
||
Intended status: Standards Track N. Williams
|
||
Expires: September 24, 2009 Sun Microsystems
|
||
March 23, 2009
|
||
|
||
|
||
Using GSS-API Mechanisms in SASL: The GS2 Mechanism Family
|
||
draft-ietf-sasl-gs2-11
|
||
|
||
Status of this Memo
|
||
|
||
This Internet-Draft is submitted to IETF in full conformance with the
|
||
provisions of BCP 78 and BCP 79. This document may contain material
|
||
from IETF Documents or IETF Contributions published or made publicly
|
||
available before November 10, 2008. The person(s) controlling the
|
||
copyright in some of this material may not have granted the IETF
|
||
Trust the right to allow modifications of such material outside the
|
||
IETF Standards Process. Without obtaining an adequate license from
|
||
the person(s) controlling the copyright in such materials, this
|
||
document may not be modified outside the IETF Standards Process, and
|
||
derivative works of it may not be created outside the IETF Standards
|
||
Process, except to format it for publication as an RFC or to
|
||
translate it into languages other than English.
|
||
|
||
Internet-Drafts are working documents of the Internet Engineering
|
||
Task Force (IETF), its areas, and its working groups. Note that
|
||
other groups may also distribute working documents as Internet-
|
||
Drafts.
|
||
|
||
Internet-Drafts are draft documents valid for a maximum of six months
|
||
and may be updated, replaced, or obsoleted by other documents at any
|
||
time. It is inappropriate to use Internet-Drafts as reference
|
||
material or to cite them other than as "work in progress."
|
||
|
||
The list of current Internet-Drafts can be accessed at
|
||
http://www.ietf.org/ietf/1id-abstracts.txt.
|
||
|
||
The list of Internet-Draft Shadow Directories can be accessed at
|
||
http://www.ietf.org/shadow.html.
|
||
|
||
This Internet-Draft will expire on September 24, 2009.
|
||
|
||
Copyright Notice
|
||
|
||
Copyright (c) 2009 IETF Trust and the persons identified as the
|
||
document authors. All rights reserved.
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 1]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
This document is subject to BCP 78 and the IETF Trust's Legal
|
||
Provisions Relating to IETF Documents in effect on the date of
|
||
publication of this document (http://trustee.ietf.org/license-info).
|
||
Please review these documents carefully, as they describe your rights
|
||
and restrictions with respect to this document.
|
||
|
||
Abstract
|
||
|
||
This document describes how to use a Generic Security Service
|
||
Application Program Interface (GSS-API) mechanism in the the Simple
|
||
Authentication and Security Layer (SASL) framework. This is done by
|
||
defining a new SASL mechanism family, called GS2. This mechanism
|
||
family offers a number of improvements over the previous "SASL/
|
||
GSSAPI" mechanism: it is more general, uses fewer messages for the
|
||
authentication phase in some cases, and supports negotiable use of
|
||
channel binding. Only GSS-API mechanisms that support channel
|
||
binding are supported.
|
||
|
||
See <http://josefsson.org/sasl-gs2-*/> for more information.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 2]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
Table of Contents
|
||
|
||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
|
||
2. Conventions used in this document . . . . . . . . . . . . . . 5
|
||
3. Mechanism name . . . . . . . . . . . . . . . . . . . . . . . . 5
|
||
3.1. Generating SASL mechanism names from GSS-API OIDs . . . . 5
|
||
3.2. Computing mechanism names manually . . . . . . . . . . . . 5
|
||
3.3. Examples . . . . . . . . . . . . . . . . . . . . . . . . . 6
|
||
4. SASL Authentication Exchange Message Format . . . . . . . . . 7
|
||
4.1. SASL Messages . . . . . . . . . . . . . . . . . . . . . . 7
|
||
5. Channel Bindings . . . . . . . . . . . . . . . . . . . . . . . 9
|
||
6. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
|
||
7. Authentication Conditions . . . . . . . . . . . . . . . . . . 11
|
||
8. GSS-API Parameters . . . . . . . . . . . . . . . . . . . . . . 11
|
||
9. Naming . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
|
||
10. GSS_Mechanism_SASLname call . . . . . . . . . . . . . . . . . 11
|
||
10.1. gss_mechanism_saslname . . . . . . . . . . . . . . . . . . 13
|
||
11. GSS_Inquire_mech_for_SASLname call . . . . . . . . . . . . . . 13
|
||
11.1. gss_inquire_mech_for_saslname . . . . . . . . . . . . . . 15
|
||
12. Security Layers . . . . . . . . . . . . . . . . . . . . . . . 15
|
||
13. Interoperability with the SASL "GSSAPI" mechanism . . . . . . 16
|
||
13.1. The interoperability problem . . . . . . . . . . . . . . . 16
|
||
13.2. Resolving the problem . . . . . . . . . . . . . . . . . . 16
|
||
13.3. Additional Recommendations . . . . . . . . . . . . . . . . 16
|
||
14. Mechanisms that negotiate other mechanisms . . . . . . . . . . 17
|
||
14.1. The interoperability problem . . . . . . . . . . . . . . . 17
|
||
14.2. Security problem . . . . . . . . . . . . . . . . . . . . . 17
|
||
14.3. Resolving the problems . . . . . . . . . . . . . . . . . . 17
|
||
15. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17
|
||
16. Security Considerations . . . . . . . . . . . . . . . . . . . 18
|
||
17. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 19
|
||
18. References . . . . . . . . . . . . . . . . . . . . . . . . . . 19
|
||
18.1. Normative References . . . . . . . . . . . . . . . . . . . 19
|
||
18.2. Informative References . . . . . . . . . . . . . . . . . . 20
|
||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 21
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 3]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
1. Introduction
|
||
|
||
Generic Security Service Application Program Interface (GSS-API)
|
||
[RFC2743] is a framework that provides security services to
|
||
applications using a variety of authentication "mechanisms". Simple
|
||
Authentication and Security Layer (SASL) [RFC4422] is a framework to
|
||
provide authentication and "security layers" for connection based
|
||
protocols, also using a variety of mechanisms. This document
|
||
describes how to use a GSS-API mechanism as though it were a SASL
|
||
mechanism. This facility is called "GS2" -- a moniker that indicates
|
||
that this is the second GSS-API->SASL mechanism bridge. The original
|
||
GSS-API->SASL mechanism bridge was specified by [RFC2222], now
|
||
[RFC4752]; we shall sometimes refer to the original bridge as "GS1"
|
||
in this document.
|
||
|
||
All GSS-API mechanisms are implicitly registered for use within SASL
|
||
by this specification. The SASL mechanisms defined in this document
|
||
are known as the "GS2 family of mechanisms".
|
||
|
||
The GS1 bridge failed to gain wide deployment for any GSS-API
|
||
mechanism other than The "Kerberos V GSS-API mechanism" [RFC1964]
|
||
[RFC4121], and has a number of problems that lead us to desire a new
|
||
bridge. Specifically: a) GS1 was not round-trip optimized, b) GS1
|
||
did not support channel binding [RFC5056]. These problems and the
|
||
opportunity to create the next SASL password-based mechanism, SCRAM
|
||
[I-D.newman-auth-scram], as a GSS-API mechanism used by SASL
|
||
applications via GS2, provide the motivation for GS2.
|
||
|
||
In particular, the current consensus of the SASL community appears to
|
||
be that SASL "security layers" (i.e., confidentiality and integrity
|
||
protection of application data after authentication) are too complex
|
||
and, since SASL applications tend to have an option to run over a
|
||
Transport Layer Security (TLS) [RFC5246] channel, redundant and best
|
||
replaced with channel binding.
|
||
|
||
GS2 is designed to be as simple as possible. It adds to GSS-API
|
||
security context token exchanges only the bare minimum to support
|
||
SASL semantics and negotiation of use of channel binding.
|
||
Specifically, GS2 adds a small header (2 bytes or 4 bytes plus the
|
||
length of the client requested SASL authorization ID (authzid)) to
|
||
the initial context token and to the application channel binding
|
||
data, and it uses SASL mechanism negotiation to implement channel
|
||
binding negotiation. All GS2 plaintext is protected via the use of
|
||
GSS-API channel binding. Additionally, to simplify the
|
||
implementation of GS2 mechanisms for implementors who will not
|
||
implement a GSS-API framework, we compress the initial security
|
||
context token header required by [RFC2743] (see section 3.1).
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 4]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
2. Conventions used in this document
|
||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
||
document are to be interpreted as described in [RFC2119].
|
||
|
||
|
||
3. Mechanism name
|
||
|
||
3.1. Generating SASL mechanism names from GSS-API OIDs
|
||
|
||
There are two SASL mechanism names for any GSS-API mechanism used
|
||
through this facility. One denotes that the server supports channel
|
||
binding. The other denotes that it does not.
|
||
|
||
The SASL mechanism name for a GSS-API mechanism is that which is
|
||
provided by that mechanism when it was specified, if one was
|
||
specified. This name denotes that the server does not support
|
||
channel binding. Add the suffix "-PLUS" and the resulting name
|
||
denotes that the server does support channel binding. SASL
|
||
implementations can use the GSS_Mechanism_Name call (see below) to
|
||
query for the SASL mechanism name of a GSS-API mechanism.
|
||
|
||
For GSS-API mechanisms whose SASL names are not defined together with
|
||
the GSS-API mechanism or in this document, the SASL mechanism name is
|
||
concatenation of the string "GS2-" and the Base32 encoding [RFC4648]
|
||
(with an upper case alphabet) of the first 55 bits of the binary
|
||
SHA-1 hash [FIPS.180-1.1995] string computed over the ASN.1 DER
|
||
encoding [CCITT.X690.2002], including the tag and length octets, of
|
||
the GSS-API mechanism's Object Identifier. The Base32 rules on
|
||
padding characters and characters outside of the base32 alphabet are
|
||
not relevant to this use of Base32. If any padding or non-alphabet
|
||
characters are encountered, the name is not a GS2 family mechanism
|
||
name. This name denotes that the server does not support channel
|
||
binding. Add the suffix "-PLUS" and the resulting name denotes that
|
||
the server does support channel binding.
|
||
|
||
3.2. Computing mechanism names manually
|
||
|
||
The hash-derived GS2 SASL mechanism name may be computed manually.
|
||
This is useful when the set of supported GSS-API mechanisms is known
|
||
in advance. It also obliterate the need to implement Base32, SHA-1
|
||
and DER in the SASL mechanism. The computed mechanism name can be
|
||
used directly in the implementation, and the implementation need not
|
||
concern itself with that the mechanism is part of a mechanism family.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 5]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
3.3. Examples
|
||
|
||
The OID for the SPKM-1 mechanism [RFC2025] is 1.3.6.1.5.5.1.1. The
|
||
ASN.1 DER encoding of the OID, including the tag and length, is (in
|
||
hex) 06 07 2b 06 01 05 05 01 01. The SHA-1 hash of the ASN.1 DER
|
||
encoding is (in hex) 1c f8 f4 2b 5a 9f 80 fa e9 f8 31 22 6d 5d 9d 56
|
||
27 86 61 ad. Convert the first 7 octets to binary, drop the last
|
||
bit, and re-group them in groups of 5, and convert them back to
|
||
decimal, which results in these computations:
|
||
|
||
hex:
|
||
1c f8 f4 2b 5a 9f 80
|
||
|
||
binary:
|
||
00011100 11111000 11110100 00101011 01011010
|
||
10011111 1000000
|
||
|
||
binary in groups of 5:
|
||
00011 10011 11100 01111 01000 01010 11010 11010
|
||
10011 11110 00000
|
||
|
||
decimal of each group:
|
||
3 19 28 15 8 10 26 26 19 30 0
|
||
|
||
base32 encoding:
|
||
D T 4 P I K 2 2 T 6 A
|
||
|
||
The last step translate each decimal value using table 3 in Base32
|
||
[RFC4648]. Thus the SASL mechanism name for the SPKM-1 GSSAPI
|
||
mechanism is "GS2-DT4PIK22T6A".
|
||
|
||
The OID for the Kerberos V5 GSS-API mechanism [RFC1964] is
|
||
1.2.840.113554.1.2.2 and its DER encoding is (in hex) 06 09 2A 86 48
|
||
86 F7 12 01 02 02. The SHA-1 hash is 82 d2 73 25 76 6b d6 c8 45 aa
|
||
93 25 51 6a fc ff 04 b0 43 60. Convert the first ten octets to
|
||
binary, and re-group them in groups of 5, and convert them back to
|
||
decimal, which results in these computations:
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 6]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
hex:
|
||
82 d2 73 25 76 6b d6
|
||
|
||
binary:
|
||
10000010 11010010 01110011 00100101 01110110
|
||
01101011 1101011
|
||
|
||
binary in groups of 5:
|
||
10000 01011 01001 00111 00110 01001 01011 10110
|
||
01101 01111 01011
|
||
|
||
decimal of each group:
|
||
16 11 9 7 6 9 11 22 13 15 11
|
||
|
||
base32 encoding:
|
||
Q L J H G J L W N P L
|
||
|
||
The last step translate each decimal value using table 3 in Base32
|
||
[RFC4648]. Thus the SASL mechanism name for the Kerberos V5 GSSAPI
|
||
mechanism would be "GS2-QLJHGJLWNPL" and (because this mechanism
|
||
supports channel binding) "GS2-QLJHGJLWNPL-PLUS". But instead, we
|
||
assign the Kerberos V mechanism a non-hash-derived mechanism name:
|
||
"KerberosV-GS2" and "KerberosV-GS2-PLUS" (see Section 15).
|
||
|
||
|
||
4. SASL Authentication Exchange Message Format
|
||
|
||
4.1. SASL Messages
|
||
|
||
During the SASL authentication exchange for GS2, a number of messages
|
||
following the following format is sent between the client and server.
|
||
This number is the same as the number of context tokens that the GSS-
|
||
API mechanism would normally require in order to establish a security
|
||
context (or to fail to do so).
|
||
|
||
Note that when using a GS2 mechanism the SASL client is always a GSS-
|
||
API initiator and the SASL server is always a GSS-API acceptor. Thus
|
||
the SASL client calls GSS_Init_sec_context() and the server calls
|
||
GSS_Accept_sec_context().
|
||
|
||
All the SASL authentication messages exchanged are exactly the same
|
||
as the security context tokens of the GSS-API mechanism, except for
|
||
the initial security context token.
|
||
|
||
Also, the server SHOULD refrain from sending GSS-API error tokens
|
||
(tokens output by GSS_Init_sec_context() or GSS_Accept_sec_context()
|
||
along with a major status code other than GSS_S_COMPLETE or
|
||
GSS_S_CONTINUE_NEEDED) as SASL applications handle error conditions.
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 7]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
The initial security context token is modified as follows:
|
||
o The [RFC2743] section 3.1 initial context token header MUST be
|
||
removed if present, and its presence is noted (see below). On the
|
||
server side this header MUST be recomputed and restored prior to
|
||
passing the token to GSS_Accept_sec_context().
|
||
o A GS2 header MUST be prefixed to the resulting initial context
|
||
token. This header has the form given below in ABNF [RFC5234].
|
||
|
||
UTF8-1-safe = %x01-2B / %x2D-3C / %x3E-7F
|
||
;; As UTF8-1 in RFC 3629 except
|
||
;; NUL, "=", and ",".
|
||
UTF8-2 = <as defined in RFC 3629 (STD 63)>
|
||
UTF8-3 = <as defined in RFC 3629 (STD 63)>
|
||
UTF8-4 = <as defined in RFC 3629 (STD 63)>
|
||
UTF8-char-safe = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4
|
||
|
||
saslname = 1*(UTF8-char-safe / "=2C" / "=3D")
|
||
gs2-authzid = "a=" saslname
|
||
;; GS2 has to transport an authzid since
|
||
;; the GSS-API has no equivalent
|
||
gs2-std-mech = "F"
|
||
;; "F" means the mechanism is NOT is a
|
||
;; standard GSS-API mechanism in that the
|
||
;; RFC2743 section 3.1 header was missing
|
||
gs2-cb-flag = "n" / "y" / "p"
|
||
;; GS2 channel binding (CB) flag
|
||
;; "n" -> client does not support CB
|
||
;; "y" -> client supports CB, thinks the server
|
||
;; does not
|
||
;; "p" -> client supports and used CB
|
||
gs2-header = [gs2-std-mech] gs2-cb-flag [gs2-authzid] ","
|
||
;; The GS2 header is gs2-header.
|
||
;; gs2-std-mech is present if the GSS-API
|
||
;; mechanism's initial context token did not
|
||
;; have the standard header defined in
|
||
;; [RFC2743] section 3.1.
|
||
|
||
The GS2 header is also prepended to the application's channel binding
|
||
data. If the application did not provide channel binding data then
|
||
the GS2 header is used as though it were application-provided channel
|
||
binding data.
|
||
|
||
The "gs2-authzid" holds the SASL authorization identity. It is
|
||
encoded using UTF-8 [RFC3629] with three exceptions:
|
||
o The NUL characters is forbidden as required by section 3.4.1 of
|
||
[RFC4422].
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 8]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
o The server MUST replace any occurance of "," (comma) in the string
|
||
with "=2C".
|
||
o The server MUST replace any occurance of "=" (comma) in the string
|
||
with "=3D".
|
||
|
||
If a server sends a string that does not conform to this syntax, the
|
||
client MUST reject authentication.
|
||
|
||
|
||
5. Channel Bindings
|
||
|
||
If the server supports channel binding then it must list both forms
|
||
of the SASL mechanism name for each GSS-API mechanism supported via
|
||
GS2 (i.e., GSS-API mechanisms that support channel binding).
|
||
|
||
If the client supports channel binding and the server does not (i.e.,
|
||
the server did not advertise the -PLUS names) then the client MUST
|
||
either fail authentication or it MUST set the channel binding flag in
|
||
the GS2 initial security context token to "y" and MUST NOT include
|
||
application channel binding data in the GSS-API channel binding input
|
||
to GSS_Init_sec_context().
|
||
|
||
If the client supports channel binding and the server also does then
|
||
the client MUST set the channel binding flag in the GS2 initial
|
||
security context token to "p" and MUST include application channel
|
||
binding data in the GSS-API channel binding input to
|
||
GSS_Init_sec_context().
|
||
|
||
If the client does not support channel binding then it MUST set the
|
||
channel binding flag in the GS2 initial security context token to "n"
|
||
and MUST NOT include application channel binding data in the GSS-API
|
||
channel binding input to GSS_Init_sec_context().
|
||
|
||
Upon receipt of the initial authentication message the server checks
|
||
the channel binding flag in the GS2 header and constructs a channel
|
||
binding data input for GSS_Accept_sec_context() accordingly. If the
|
||
client channel binding flag was "n" then the server MUST NOT include
|
||
application channel binding data in the GSS-API channel binding input
|
||
to GSS_Accept_sec_context(). If the client channel binding flag was
|
||
"y" and the server does support channel binding then the server MUST
|
||
fail authentication. If the client channel binding flag was "p" the
|
||
server MUST include application channel binding data in the GSS-API
|
||
channel binding input to GSS_Accept_sec_context().
|
||
|
||
For more discussions of channel bindings, and the syntax of the
|
||
channel binding data for various security protocols, see [RFC5056].
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 9]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
6. Examples
|
||
|
||
Example #1: a one round-trip GSS-API context token exchange, no
|
||
channel binding, optional authzid given.
|
||
|
||
C: Request authentication exchange
|
||
S: Empty Challenge
|
||
C: nauthzid=someuser, <initial context token with standard
|
||
header removed>
|
||
S: Send reply context token as is
|
||
C: Empty message
|
||
S: Outcome of authentication exchange
|
||
|
||
Example #2: a one and one half round-trip GSS-API context token
|
||
exchange.
|
||
|
||
C: Request authentication exchange
|
||
S: Empty Challenge
|
||
C: nauthzid=someuser, <initial context token with standard
|
||
header removed>
|
||
S: Send reply context token as is
|
||
C: Send reply context token as is
|
||
S: Outcome of authentication exchange
|
||
|
||
Example #3: a two round-trip GSS-API context token exchange.
|
||
|
||
C: Request authentication exchange
|
||
S: Empty Challenge
|
||
C: nauthzid=someuser, <initial context token with standard
|
||
header removed>
|
||
S: Send reply context token as is
|
||
C: Send reply context token as is
|
||
S: Send reply context token as is
|
||
C: Empty message
|
||
S: Outcome of authentication exchange
|
||
|
||
Example #4: using channel binding.
|
||
|
||
C: Request authentication exchange
|
||
S: Empty Challenge
|
||
C: yauthzid=someuser, <initial context token with standard
|
||
header removed>
|
||
S: Send reply context token as is
|
||
...
|
||
|
||
GSS-API authentication is always initiated by the client. The SASL
|
||
framework allows either the client and server to initiate
|
||
authentication. In GS2 the server will send an initial empty
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 10]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
challenge (zero byte string) if it has not yet received a token from
|
||
the client. See section 3 of [RFC4422].
|
||
|
||
|
||
7. Authentication Conditions
|
||
|
||
Authentication MUST NOT succeed if any one of the following
|
||
conditions are true:
|
||
|
||
o GSS_Init/Accept_sec_context() return anything other than
|
||
GSS_S_CONTINUE_NEEDED or GSS_S_COMPLETE.
|
||
o If the client's GS2 channel binding flag was "y" and the server
|
||
supports channel binding.
|
||
o If the client requires use of channel binding and the server did
|
||
not advertise support for channel binding.
|
||
o Authorization of client principal (i.e., src_name in
|
||
GSS_Accept_sec_context()) to requested authzid failed.
|
||
o If the client is not authorized to the requested authzid or an
|
||
authzid could not be derived from the client's initiator principal
|
||
name.
|
||
|
||
|
||
8. GSS-API Parameters
|
||
|
||
GS2 does not use any GSS-API per-message tokens. Therefore the
|
||
setting of req_flags related to per-message tokens is irrelevant.
|
||
|
||
|
||
9. Naming
|
||
|
||
There's no requirement that any particular GSS-API name-types be
|
||
used. However, typically SASL servers will have host-based acceptor
|
||
principal names (see [RFC2743] section 4.1) and clients will
|
||
typically have username initiator principal names (see [RFC2743]
|
||
section 4.2).
|
||
|
||
|
||
10. GSS_Mechanism_SASLname call
|
||
|
||
To allow SASL implementations to query for the SASL mechanism name of
|
||
a GSS-API mechanism, we specify a new GSS-API function for this
|
||
purpose.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 11]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
Inputs:
|
||
|
||
o desired_mech OBJECT IDENTIFIER
|
||
|
||
Outputs:
|
||
|
||
o sasl_mech_name OCTET STRING -- SASL name for this mechanism
|
||
(really, ASCII)
|
||
|
||
o mech_name UTF-8 STRING -- name of this mechanism, possibly
|
||
localized
|
||
|
||
o mech_description UTF-8 STRING -- possibly localized
|
||
description of this mechanism.
|
||
|
||
Return major_status codes:
|
||
|
||
o GSS_S_COMPLETE indicates successful completion, and that output
|
||
parameters holds correct information.
|
||
|
||
o GSS_S_BAD_MECH indicates that a disred_mech was unsupported by
|
||
the GSS-API implementation.
|
||
|
||
The GSS_Mechanism_SASLname call is used to get the SASL mechanism
|
||
name for a GSS-API mechanism. It also returns a name and
|
||
description of the mechanism in a human readable form.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 12]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
10.1. gss_mechanism_saslname
|
||
|
||
The C binding for the GSS_Mechanism_SASLname call is as follows.
|
||
|
||
OM_uint32 gss_mechanism_saslname(
|
||
OM_uint32 *minor_status,
|
||
const gss_OID desired_mech,
|
||
gss_buffer_t sasl_mech_name,
|
||
gss_buffer_t mech_name,
|
||
gss_buffer_t mech_description,
|
||
);
|
||
|
||
Purpose:
|
||
|
||
Output the SASL mechanism name of a GSS-API mechanism. Also output
|
||
a name and description of the mechanism in a human readable form.
|
||
|
||
Parameters:
|
||
|
||
minor_status Integer, modify
|
||
Mechanism specific status code.
|
||
|
||
Function value: GSS status code
|
||
|
||
GSS_S_COMPLETE Successful completion
|
||
|
||
GSS_S_BAD_MECH The desired_mech OID is unsupported
|
||
|
||
|
||
11. GSS_Inquire_mech_for_SASLname call
|
||
|
||
To allow SASL clients to more efficiently identify which GSS-API
|
||
mechanism a particular SASL mechanism name refers to we specify a new
|
||
GSS-API utility function for this purpose.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 13]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
Inputs:
|
||
|
||
o sasl_mech_name OCTET STRING -- SASL name of mechanism
|
||
(really, ASCII)
|
||
|
||
Outputs:
|
||
|
||
o mech_type OBJECT IDENTIFIER -- must be explicit mechanism,
|
||
and not "default" specifier
|
||
|
||
Return major_status codes:
|
||
|
||
o GSS_S_COMPLETE indicates successful completion, and that output
|
||
parameters holds correct information.
|
||
|
||
o GSS_S_BAD_MECH indicates that no supported GSS-API mechanism
|
||
had the indicated sasl_mech_name.
|
||
|
||
The GSS_Inquire_mech_for_SASLname call is used to get the GSS-API
|
||
mechanism OID associated with a SASL mechanism name.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 14]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
11.1. gss_inquire_mech_for_saslname
|
||
|
||
The C binding for the GSS_Inquire_mech_for_SASLname call is as
|
||
follows.
|
||
|
||
OM_uint32 gss_inquire_mech_for_saslname(
|
||
OM_uint32 *minor_status,
|
||
const gss_buffer_t sasl_mech_name,
|
||
gss_OID *mech_type
|
||
);
|
||
|
||
Purpose:
|
||
|
||
Output GSS-API mechanism OID of mechanism associated with given
|
||
sasl_mech_name.
|
||
|
||
Parameters:
|
||
|
||
minor_status Integer, modify
|
||
Mechanism specific status code.
|
||
|
||
Function value: GSS status code
|
||
|
||
GSS_S_COMPLETE Successful completion
|
||
|
||
GSS_S_BAD_MECH The desired_mech OID is unsupported
|
||
|
||
|
||
12. Security Layers
|
||
|
||
GS2 does not currently support SASL security layers. Applications
|
||
that need integrity protection or confidentiality and integrity
|
||
protection MUST use either channel binding to a secure external
|
||
channel or a SASL mechanism that does provide security layers.
|
||
|
||
NOTE WELL: the GS2 client's first authentication message MUST always
|
||
start with "F", "n", "y" or "p", otherwise the server MUST fail
|
||
authentication. This will allow us to add support for security
|
||
layers in the future if it were to become necessary. Note that
|
||
adding security layer support to GS2 must not break existing SASL/GS2
|
||
applications, which can be accomplished by making security layers
|
||
optional.
|
||
|
||
[A sketch of how to add sec layer support... Add a way for the
|
||
client to: a) make an offer of sec layers and max buffer, b) make an
|
||
opportunistic selection of sec layer and buffer size, both in the
|
||
first client authentication message, and starting with a character
|
||
other than "F", "n", "y" or "p". The server could accept the
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 15]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
opportunistic proposal (reply token prefixed with a byte indicating
|
||
acceptance) or reject it along with an indication of the server's
|
||
acceptable sec layers and max buffer size. In the latter case the
|
||
GSS-API security context token exchange must be abandoned and
|
||
recommenced, although this would be a detail of the GS2 bridge not
|
||
exposed to the SASL application. The negotiation would be protected
|
||
via GSS channel binding, as with the rest of GS2.]
|
||
|
||
|
||
13. Interoperability with the SASL "GSSAPI" mechanism
|
||
|
||
The Kerberos V5 GSS-API [RFC1964] mechanism is currently used in SASL
|
||
under the name "GSSAPI", see GSSAPI mechanism [RFC4752]. The
|
||
Kerberos V5 mechanism may also be used with the GS2 family. This
|
||
causes an interopability problem, which is discussed and resolved
|
||
below.
|
||
|
||
13.1. The interoperability problem
|
||
|
||
The SASL "GSSAPI" mechanism is not wire-compatible with the Kerberos
|
||
V GSS-API mechanism used as a SASL GS2 mechanism.
|
||
|
||
If a client (or server) only support Kerberos V5 under the "GSSAPI"
|
||
name and the server (or client) only support Kerberos V5 under the
|
||
GS2 family, the mechanism negotiation will fail.
|
||
|
||
13.2. Resolving the problem
|
||
|
||
If the Kerberos V5 mechanism is supported under GS2 in a server, the
|
||
server SHOULD also support Kerberos V5 through the "GSSAPI"
|
||
mechanism, to avoid interoperability problems with older clients.
|
||
|
||
Reasons for violating this recommendation may include security
|
||
considerations regarding the absent features in the GS2 mechanism.
|
||
The SASL "GSSAPI" mechanism lacks support for channel bindings, which
|
||
means that using an external secure channel may not be sufficient
|
||
protection against active attackers (see [RFC5056], [mitm]).
|
||
|
||
13.3. Additional Recommendations
|
||
|
||
If the application requires security layers then it MUST prefer the
|
||
SASL "GSSAPI" mechanism over "KerberosV-GS2".
|
||
|
||
If the application can use channel binding to an external channel
|
||
then it is RECOMMENDED that it select Kerberos V5 through the GS2
|
||
mechanism rather than the "GSSAPI" mechanism.
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 16]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
14. Mechanisms that negotiate other mechanisms
|
||
|
||
A GSS-API mechanism that negotiate other mechanisms interact badly
|
||
with the SASL mechanism negotiation. There are two problems. The
|
||
first is an interoperability problem and the second is a security
|
||
concern. The problems are described and resolved below.
|
||
|
||
14.1. The interoperability problem
|
||
|
||
If a client implement GSS-API mechanism X, potentially negotiated
|
||
through a GSS-API mechanism Y, and the server also implement GSS-API
|
||
mechanism X negotiated through a GSS-API mechanism Z, the
|
||
authentication negotiation will fail.
|
||
|
||
14.2. Security problem
|
||
|
||
If a client's policy is to first prefer GSSAPI mechanism X, then non-
|
||
GSSAPI mechanism Y, then GSSAPI mechanism Z, and if a server supports
|
||
mechanisms Y and Z but not X, then if the client attempts to
|
||
negotiate mechanism X by using a GSS-API mechanism that negotiate
|
||
other mechanisms (such as SPNEGO), it may end up using mechanism Z
|
||
when it ideally should have used mechanism Y. For this reason, the
|
||
use of GSS-API mechanisms that negotiate other mechanisms are
|
||
disallowed under GS2.
|
||
|
||
14.3. Resolving the problems
|
||
|
||
GSS-API mechanisms that negotiate other mechanisms MUST NOT be used
|
||
with the GS2 SASL mechanism. Specifically SPNEGO [RFC4178] MUST NOT
|
||
be used as a GS2 mechanism. To make this easier for SASL
|
||
implementations we assign a symbolic SASL mechanism name to the
|
||
SPNEGO GSS-API mechanism: "SPNEGO". SASL client implementations MUST
|
||
NOT choose the SPNEGO mechanism under any circumstances. [What about
|
||
SASL apps that don't do mechanism negotiation? Probably none exist.
|
||
But if any did then presumably it would OK to use the SPNEGO
|
||
mechanism, no? -Nico]
|
||
|
||
The GSS_C_MA_MECH_NEGO attribute of GSS_Inquire_attrs_for_mech()
|
||
[I-D.ietf-kitten-extended-mech-inquiry] can be used to identify such
|
||
mechanisms.
|
||
|
||
|
||
15. IANA Considerations
|
||
|
||
The SASL names for the Kerberos V GSS-API mechanism [RFC4121]
|
||
[RFC1964] used via GS2 SHALL be "KerberosV-GS2" and "KerberosV-GS2-
|
||
PLUS".
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 17]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
The SASL names for the SPNEGO GSS-API mechanism used via GS2 SHALL be
|
||
"SPNEGO" and "SPNEGO-PLUS". As described in Section 14 the SASL
|
||
"SPNEGO" and "SPNEGO-PLUS" MUST NOT be used. These names are
|
||
provided as a convienience for SASL library implementors.
|
||
|
||
The IANA is advised that SASL mechanism names starting with "GS2-"
|
||
are reserved for SASL mechanisms which conform to this document. The
|
||
IANA is directed to place a statement to that effect in the sasl-
|
||
mechanisms registry.
|
||
|
||
The IANA is further advised that SASL mechanisms MUST NOT end in
|
||
"-PLUS" except as a version of another mechanism name simply suffixed
|
||
with "-PLUS".
|
||
|
||
Subject: Registration of SASL mechanism GS2-*
|
||
SASL mechanism prefix: GS2-
|
||
Security considerations: RFC [THIS-DOC]
|
||
Published specification: RFC [THIS-DOC]
|
||
Person & email address to contact for further information:
|
||
Simon Josefsson <simon@josefsson.org>
|
||
Intended usage: COMMON
|
||
Owner/Change controller: iesg@ietf.org
|
||
Note: Compare with the GSSAPI and GSS-SPNEGO mechanisms.
|
||
|
||
|
||
16. Security Considerations
|
||
|
||
Security issues are also discussed throughout this memo.
|
||
|
||
The security provided by a GS2 mechanism depends on the security of
|
||
the GSS-API mechanism. The GS2 mechanism family depends on channel
|
||
binding support, so GSS-API mechanisms that do not support channel
|
||
binding cannot be successfully used as SASL mechanisms via the GS2
|
||
bridge.
|
||
|
||
Because GS2 does not support security layers it is strongly
|
||
RECOMMENDED that channel binding to a secure external channel be
|
||
used. Successful channel binding eliminates the possibility of man-
|
||
in-the-middle (MITM) attacks, provided that the external channel and
|
||
its channel binding data are secure and provided that the GSS-API
|
||
mechanism used is secure. Authentication failure because of channel
|
||
binding failure may indicate that an MITM attack was attempted, but
|
||
note that a real MITM attacker would likely attempt to close the
|
||
connection to the client or simulate network partition , thus MITM
|
||
attack detection is heuristic.
|
||
|
||
Use of channel binding will also protect the SASL mechanism
|
||
negotiation -- if there is no MITM then the external secure channel
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 18]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
will have protected the SASL mechanism negotiation.
|
||
|
||
The channel binding data MAY be sent (byt the actual GSS-API
|
||
mechanism used) without confidentiality protection and knowledge of
|
||
it is assumed to provide no advantage to an MITM (who can, in any
|
||
case, compute the channel binding data independently). If the
|
||
external channel does not provide confidentiality protection and the
|
||
GSS-API mechanism does not provide confidentiality protection for the
|
||
channel binding data, then passive attackers (eavesdroppers) can
|
||
recover the channel binding data. See [RFC5056].
|
||
|
||
When constructing the input_name_string for GSS_Import_name() with
|
||
the GSS_C_NT_HOSTBASED_SERVICE name type, the client SHOULD NOT
|
||
canonicalize the server's fully qualified domain name using an
|
||
insecure or untrusted directory service, such as the Domain Name
|
||
System [RFC1034] without DNSSEC [RFC4033].
|
||
|
||
GS2 does not directly use any cryptographic algorithms, therefore it
|
||
is automatically "algorithm agile", or, as agile as the GSS-API
|
||
mechanisms that are available for use in SASL apoplications via GS2.
|
||
|
||
The security considerations of SASL [RFC4422], the GSS-API [RFC2743],
|
||
channel binding [RFC5056], any external channels (such as TLS,
|
||
[RFC5246], channel binding types (see the IANA channel binding type
|
||
registry), and GSS-API mechanisms (such as the Kerberos V mechanism
|
||
[RFC4121] [RFC1964]), may also apply.
|
||
|
||
|
||
17. Acknowledgements
|
||
|
||
The history of GS2 can be traced to the "GSSAPI" mechanism originally
|
||
specified by RFC2222. This document was derived from
|
||
draft-ietf-sasl-gssapi-02 which was prepared by Alexey Melnikov with
|
||
significant contributions from John G. Myers, although the majority
|
||
of this document has been rewritten by the current authors.
|
||
|
||
Contributions of many members of the SASL mailing list are gratefully
|
||
acknowledged. In particular, ideas and feedback from Sam Hartman,
|
||
Jeffrey Hutzelman, Alexey Melnikov, and Tom Yu improved the document
|
||
and the protocol.
|
||
|
||
|
||
18. References
|
||
|
||
18.1. Normative References
|
||
|
||
[FIPS.180-1.1995]
|
||
National Institute of Standards and Technology, "Secure
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 19]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
Hash Standard", FIPS PUB 180-1, April 1995,
|
||
<http://www.itl.nist.gov/fipspubs/fip180-1.htm>.
|
||
|
||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
|
||
Requirement Levels", BCP 14, RFC 2119, March 1997.
|
||
|
||
[RFC2743] Linn, J., "Generic Security Service Application Program
|
||
Interface Version 2, Update 1", RFC 2743, January 2000.
|
||
|
||
[RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
|
||
10646", STD 63, RFC 3629, November 2003.
|
||
|
||
[RFC4422] Melnikov, A. and K. Zeilenga, "Simple Authentication and
|
||
Security Layer (SASL)", RFC 4422, June 2006.
|
||
|
||
[RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
|
||
Encodings", RFC 4648, October 2006.
|
||
|
||
[RFC5056] Williams, N., "On the Use of Channel Bindings to Secure
|
||
Channels", RFC 5056, November 2007.
|
||
|
||
[RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
|
||
Specifications: ABNF", STD 68, RFC 5234, January 2008.
|
||
|
||
[CCITT.X690.2002]
|
||
International International Telephone and Telegraph
|
||
Consultative Committee, "ASN.1 encoding rules:
|
||
Specification of basic encoding Rules (BER), Canonical
|
||
encoding rules (CER) and Distinguished encoding rules
|
||
(DER)", CCITT Recommendation X.690, July 2002.
|
||
|
||
18.2. Informative References
|
||
|
||
[RFC1034] Mockapetris, P., "Domain names - concepts and facilities",
|
||
STD 13, RFC 1034, November 1987.
|
||
|
||
[RFC1964] Linn, J., "The Kerberos Version 5 GSS-API Mechanism",
|
||
RFC 1964, June 1996.
|
||
|
||
[RFC2025] Adams, C., "The Simple Public-Key GSS-API Mechanism
|
||
(SPKM)", RFC 2025, October 1996.
|
||
|
||
[RFC2222] Myers, J., "Simple Authentication and Security Layer
|
||
(SASL)", RFC 2222, October 1997.
|
||
|
||
[RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S.
|
||
Rose, "DNS Security Introduction and Requirements",
|
||
RFC 4033, March 2005.
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 20]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
[RFC4121] Zhu, L., Jaganathan, K., and S. Hartman, "The Kerberos
|
||
Version 5 Generic Security Service Application Program
|
||
Interface (GSS-API) Mechanism: Version 2", RFC 4121,
|
||
July 2005.
|
||
|
||
[RFC4178] Zhu, L., Leach, P., Jaganathan, K., and W. Ingersoll, "The
|
||
Simple and Protected Generic Security Service Application
|
||
Program Interface (GSS-API) Negotiation Mechanism",
|
||
RFC 4178, October 2005.
|
||
|
||
[RFC4752] Melnikov, A., "The Kerberos V5 ("GSSAPI") Simple
|
||
Authentication and Security Layer (SASL) Mechanism",
|
||
RFC 4752, November 2006.
|
||
|
||
[RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security
|
||
(TLS) Protocol Version 1.2", RFC 5246, August 2008.
|
||
|
||
[I-D.newman-auth-scram]
|
||
Menon-Sen, A., Melnikov, A., and C. Newman, "Salted
|
||
Challenge Response (SCRAM) SASL Mechanism",
|
||
draft-newman-auth-scram-10 (work in progress),
|
||
February 2009.
|
||
|
||
[I-D.ietf-kitten-extended-mech-inquiry]
|
||
Williams, N., "Extended Generic Security Service Mechanism
|
||
Inquiry APIs", draft-ietf-kitten-extended-mech-inquiry-04
|
||
(work in progress), March 2008.
|
||
|
||
[mitm] Asokan, N., Niemi, V., and K. Nyberg, "Man-in-the-Middle
|
||
in Tunneled Authentication",
|
||
WWW http://www.saunalahti.fi/~asokan/research/mitm.html.
|
||
|
||
|
||
Authors' Addresses
|
||
|
||
Simon Josefsson
|
||
SJD AB
|
||
Hagagatan 24
|
||
Stockholm 113 47
|
||
SE
|
||
|
||
Email: simon@josefsson.org
|
||
URI: http://josefsson.org/
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 21]
|
||
|
||
Internet-Draft SASL GS2-* March 2009
|
||
|
||
|
||
Nicolas Williams
|
||
Sun Microsystems
|
||
5300 Riata Trace Ct
|
||
Austin, TX 78727
|
||
USA
|
||
|
||
Email: Nicolas.Williams@sun.com
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Josefsson & Williams Expires September 24, 2009 [Page 22]
|
||
|