GSS-API Naming ExtensionsSun Microsystems5300 Riata Trace CtAustinTX78727USNicolas.Williams@sun.comStockholm universityAvdelningen för IT och MediaSE-106 91Stockholmleifj@it.su.sehttp://people.su.se/~leifj/
Security
KITTEN WORKING GROUPInternet-DraftThe Generic Security Services API (GSS-API)
provides a simple naming architecture that supports
name-based authorization. This document introduces new
APIs that extend the GSS-API naming model to support
name attribute transfer between GSS-API peers.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 .As described in the
GSS-API's naming architecture suffers from certain
limitations. This document proposes concrete GSS-API
extensions as outlined in .A number of extensions to the GSS-API and its C Bindings are described
herein with the goal of making authorization
information, and other information that can be modeled
as "name attributes" available as such to applications.
For example, Kerberos V authorization data elements,
both, in their raw forms as well as mapped to more
useful value types, can be made available to GSS-API
applications through these interfaces.The model is that GSS names have attributes. The
attributes of a name may be authenticated by the
credential whence the name comes, or may have been set
locally on a GSS name for the purpose of "asserting" the
attribute during credential acquisition or security
context exchange. Name attributes' values are network
representations thereof (e.g., the actual value octets
of the contents of an X.509 certificate extension, for
example) and are intended to be useful for constructing
portable access control facilities. Applications may
often require language- or platform-specific data types,
rather than network representations of name attributes,
so a function is provided to obtain objects of such
types associated with names and name attributes.A given GSS name object's name attributes may be
authenticated, mapped and/or critical. These flags
are explained below.An attribute is 'authenticated' iff there is a secure
association between the attribute (and its values) and
the trusted source of the peer credential. Examples of
authenticated attributes are (any part of) the signed
portion of an X.509 certificate or AD-KDCIssued
authorization-data elements in Kerberos V Tickets. Note
that the fact that an attribute is authenticated does
not imply anything about the semantics of the attribute
nor that the trusted credential source authorized any
one semantic of the attribute. Such interpretations MAY
be the result of applying local policy to the attribute.That a given name's given attribute is 'mapped' means
that it was obtained through some mapping mechanism
applied to another attribute of the name that was not,
itself, mapped. For example, such attributes as
platform-specific internal identifiers may sometimes be
mapped from other name attributes.Name attributes may be "critical," meaning that
applications that do not understand them MUST reject
security contexts where the peer has such unknown,
critical attributes.[NOTE(leifj): The criticality flag seems to have limited
applicability in practice. As written the security context
should not be established unless all critically marked
naming attributes are supported and understood. But what
happens if the peer doesn't understand naming extensions
at all. It seems more reasonable to state that name
attribute extensions MUST only be used to as a basis for
authorization decisions.][NOTE(leifj): The mapped flag also seems to have limited
applicability in practice - interpretation of the attribute
will be entierly up to the peer anyway which will need to
know much more about the attribute than the fact than its
value is derived.]Some name attributes (e.g., numeric user or group
identifiers) may be useful as subjects of access
control list (ACL) entries, some may not (e.g., time of day
login restrictions). The GSS_Inquire_name_attribute()
function indicates this.To facilitate the development of portable applications
that make use of name attributes to construct and
evaluate portable ACLs the GSS-API makes name attribute
values available in canonical network encodings
thereof.To facilitate the development of platform- or
language-specific applications that need access to
native types of representations of name attributes an
optional facility is provided, GSS_Map_name_to_any().[NOTE: This entire section should probably be split into
one or more separate Internet-Drafts. It is here in the
-00 of this I-D to help readers understand how to
mechanism-specific name attributes would be accessed
through these GSS-API extensions.]Kerberos V
and the Simple Public-Key GSS-API Mechanism, SPKM , both support the concept and
encoding of containers of "authorization-data" as
described in .PKIX supports a number of
authorization-data-like features, like Extended Key
Usage values (EKUs) and certificate extensions.The authorization data can be accessed through the
GSS-API name attributes facility defined herein.Authorization-data non-container elements asserted in
Kerberos V AP-REQ Authenticators MUST be mapped into
asserted GSS-API name
attributes; if not contained in AD-IF-RELEVANT then
they MUST be mapped into critical GSS-API name
attributes. AD-AND-OR authorization-data elements
MUST be mapped into a single critical attribute,
(TBD).Authorization-data included in Kerberos V Tickets
that is not contained in AD-KDCIssued (with valid
signature) MUST be mapped into asserted GSS-API name
attributes. Conversely, authorization-data elements
in Kerberos V Tickets contained by AD-KDCIssued MUST
be mapped into authenticated GSS-API
name attributes
As with authorization-data elements in
Authenticators, authorization-data elements in
Tickets not contained in AD-IF-RELEVANT are to be mapped
to critical name
attributes, and similarly with AD-AND-OR (see
above).The OIDs for authorization-data elements are to be
the authorization-data element's 'ad-type' positive integer
ID, relative to the base OID <TBD> Negative values
are reserved for local experiments. [NOTE: what
about negative ad-type's? OID arcs are positive
integers... ad-type is an Int32, so clearly
something can be done.]PKI certificate extensions MAY/SHOULD/MUST (see
comment above) be represented as authenticated GSS-API
name attributes with the same OIDs, and if they be
marked critical in the certificate then they MUST be
mapped as critical
GSS-API name attributes. SubjectAltNames and EKUs,
specifically, MUST be represented as authenticated GSS-API
name attributes; see below. Certificate extensions
MUST be represented as GSS-API name attributes whose OIDs
are the same as the extensions'Extended Key Usage extensions, specifically, MUST
be mapped as described above, except that GSS-API
name attributes for EKUs MUST have NULL values
(i.e., zero-length OCTET STRINGs).PKI certificate key usages (KUs, but not EKUs), MUST
NOT be represented as GSS-API name attributes.PKI certificate subjectAltNames MUST be mapped as
authenticated, non-critical GSS-API name
attributes.PKI certificate extensions MUST be represented as authenticated GSS-API
name attributes with the same OIDs, and if they be
marked critical in the certificate then they MUST be
mapped as critical
GSS-API name attributes.Extended Key Usage extensions, specifically, MUST
be mapped as described above, except that GSS-API
name attributes for EKUs MUST have NULL values
(i.e., zero-length OCTET STRINGs).Any X.509 certificate extension not covered above SHOULD
be represented as GSS-AOI name attributes with the OID of the
X.509 extension and with OCTET STRING values containing the
encoded value of the extension.
Attributes contained in SAML attribute assertions are
mapped to GSS-API name attributes with OIDs derived from
the SAML attributes:
If the SAML attribute is an OID the same OID
is used.If the SAML attribute is a URN or a URI then
the name MUST be mapped to a corresponding OID by
means of an IANA registry.Inputs:
name NAME,display_as_name_type OBJECT IDENTIFIEROutputs:
major_status INTEGER,minor_status INTEGER,display_name STRINGReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the given name
could not be displayed using the syntax of the
given name type.GSS_S_FAILURE indicates a general error.This function displays a given name using the given name
syntax, if possible. This operation may require mapping
MNs to generic name syntaxes or generic name syntaxes to
mechanism-specific name syntaxes; such mappings may not
always be feasible and MAY be inexact or lossy,
therefore this function may fail.Inputs:
name NAMEOutputs:
major_status INTEGER,minor_status INTEGER,name_is_MN BOOLEAN,mn_mech OBJECT IDENTIFIER,asserted_attrs SET OF OBJECT IDENTIFIER,authenticated_attrs SET OF OBJECT IDENTIFIER,critical_attrs SET OF OBJECT IDENTIFIER,all_attrs SET OF OBJECT IDENTIFIER,Return major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_FAILURE indicates a general error.This function outputs the sets of attributes of a name,
that are authenticated, asserted or critical. It also
indicates if a given NAME is an MN or not and, if it is,
what mechanism it's an MN of.Inputs:
name NAME,attr OBJECT IDENTIFIEROutputs:
major_status INTEGER,minor_status INTEGER,authenticated BOOLEAN, -- TRUE iff authenticated
by the trusted peer credential source.negative BOOLEAN,mapped BOOLEAN,critical BOOLEAN,values SET OF OCTET STRING,display_values SET OF STRINGReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the given
attribute OID is not known or set.GSS_S_FAILURE indicates a general error.This function outputs the value(s) associated with a
given GSS name object for a given name attribute.NOTE: This function relies on the GSS-API notion of
"SET OF" allowing for order preservation; this has
been discussed on the KITTEN WG mailing list and the
consensus seems to be that, indeed, that was always
the intention. It should be noted however that the
order presented does not always reflect an underlying
order of the mechanism specific source of the attribute
values.The C-bindings of GSS_Get_name_attribute() requires
one function call per-attribute value, for
multi-valued name attributes. This is done by using
a single gss_buffer_t for each value and an
input/output integer parameter to distinguish
initial and subsequent calls and to indicate when
all values have been obtained.The 'more' input/output parameter should point to an
integer variable whose value, on first call to
gss_name_attribute_get() MUST be -1, and whose
value upon function call return will be non-zero to
indicate that additional values remain, or zero to
indicate that no values remain. The caller should
not modify this parameter after the initial call.Inputs:
name NAME,critical BOOLEAN,negative BOOLEAN,attr OBJECT IDENTIFIER,values SET OF OCTET STRINGOutputs:
major_status INTEGER,minor_status INTEGERReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the given
attribute OID is not known or could not be
set.GSS_S_FAILURE indicates a general error.NOTE: This function relies on the GSS-API notion of
"SET OF" allowing for order preservation; this has
been discussed on the KITTEN WG mailing list and the
consensus seems to be that, indeed, that was always
the intention. It should be noted that underlying
mechanisms may not respect the given order.The C-bindings of GSS_Set_name_attribute() requires
one function call per-attribute value, for
multi-valued name attributes -- each call adds one
value. To replace an attribute's every value delete
the attribute's values first with
GSS_Delete_name_attribute().Inputs:
name NAME,attr OBJECT IDENTIFIER,Outputs:
major_status INTEGER,minor_status INTEGERReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the given
attribute OID is not known.GSS_S_UNAUTHORIZED indicates that a forbidden delete
operation was attempted eg deleting a negative attribute.GSS_S_FAILURE indicates a general error.Deletion of negative authenticated attributes from NAME
objects MUST NOT be allowed and must result in a GSS_S_UNAUTHORIZED.Inputs:
name NAMEOutputs:
major_status INTEGER,minor_status INTEGER,exp_composite_name OCTET STRINGReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_FAILURE indicates a general error.This function outputs a token which can be imported with
GSS_Import_name(), using GSS_C_NT_COMPOSITE_EXPORT as
the name type and which preserves any name attribute
information associated with the input name (which
GSS_Export_name() may well not). The token format is no
specified here as this facility is intended for
inter-process communication only; however, all such
tokens MUST start with a two-octet token ID, hex 04 02,
in network byte order.The OID for GSS_C_NT_COMPOSITE_EXPORT is <TBD>.Inputs:
name NAME,authenticated BOOLEAN, -- if TRUE only authenticated attributes will be includedtype_id OBJECT IDENTIFIEROutputs:
major_status INTEGER,minor_status INTEGER,output ANY DEFINED BY type_idReturn major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the mapping or
conversion could not be done. The minor status
code may provide additional information.GSS_S_FAILURE indicates a general error. The
minor status code may provide additional
information.Whereas name attribute's values are encoded in some
network representation applications often require
native, language- and/or platform-specific data types.
This function provides access to such types.Note the new C bindings type, gss_any_t. We define
it as a pointer to an incompletely declared
struct.Inputs:
name NAME,type_id OBJECT IDENTIFIER,input ANY DEFINED BY type_idOutputs:
major_status INTEGER,minor_status INTEGER,Return major_status codes:
GSS_S_COMPLETE indicates no error.GSS_S_UNAVAILABLE indicates that the mapping or
conversion could not be done. The minor status
code may provide additional information.GSS_S_FAILURE indicates a general error. The
minor status code may provide additional
information.This function releases, if possible, the objects of
language- and/or platform-specific types output by
GSS_Map_name_to_any(). If such types have native
release functions applications MAY use either those or
this function to release the given object.This document creates a namespace of GSS-API name
attributes. Attributes are named by OID, so no single
authority might be needed for allocation, however, in
the interest of providing the community with an
authority for name attribute OID allocation and a way to
find the existing set of name attributes, the IANA
should establish both, a single OID off of which name
attributes could be allocated, and a registry of known
GSS name attributes.GSS-API name attribute registry entries should contain
all the information that GSS_Inquire_name_attribute()
may return about the given name attributes and their
OIDs:
a name attribute OID (this is a unique key)a name attribute symbolic name, starting with
"GSS_C_NA_" (this is a unique key)a brief description, in Englishwhether the attribute is useful as the subject of
access control list entrieswhether the attribute is useful as an indicator
of trustan optional normative reference to documentation
for the given name attributeThe allocation and registration policy should be first
come, first served. Registry entries' OIDs need not be
based on the base OID given above.This document extends the GSS-API naming model to include support
for name attributes. The intention is that name attributes are to be
used as a basis for (among other things) authorization decisions or
application personalization for applications relying on GSS-API security
contexts.The security of the application may be critically dependent
on the security of the attributes. This document classifies attributes
as asserted or authenticated. Only authenticated attributes MUST be
used if the attribute has security implications for the application
(eg authorization decisions) since asserted attributes may easily be
controlled by the peer directly.It is important to understand the meaning of 'authenticated' in this
setting. It does not mean that any semantic of the attribute is claimed
to be true. The only implication is that a trusted third party has
asserted the attribute as opposed to the attribute being asserte by
the peer itself. Any additional semantics is always the result of
applying policy. For instance in a given deployment the mail attribute
of the subject may be authenticated and sourced from an email system
where 'correct' values are kept. In another setting users may be allowed
to modify their mail addresses freely. In both cases the 'mail' attribute
may be authenticated by virtue of being included in signed SAML attribute
assertions lor by other means authenticated by the underlying mechanism.When the underlying security mechanism does not provide a permanent
unique identity (eg anonymous kerberos) the GSS-API naming extensions may
be used to provide a replacement permanent unique identity attribute which
in this case may be unique for each relying party. This is analogous to
the Liberty Alliance targetedID attribute and has similar security
implications.Desired Enhancements to GSSAPI Naming