b55aed018f
kinit should be able to get a initial message from FOO.SE. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@844 ec53bebd-3082-4978-b11e-865c3cabbd6b
6275 lines
269 KiB
Plaintext
6275 lines
269 KiB
Plaintext
|
|
|
|
|
|
|
|
|
|
|
|
Network Working Group J. Kohl
|
|
Request for Comments: 1510 Digital Equipment Corporation
|
|
C. Neuman
|
|
ISI
|
|
September 1993
|
|
|
|
|
|
The Kerberos Network Authentication Service (V5)
|
|
|
|
Status of this Memo
|
|
|
|
This RFC specifies an Internet standards track protocol for the
|
|
Internet community, and requests discussion and suggestions for
|
|
improvements. Please refer to the current edition of the "Internet
|
|
Official Protocol Standards" for the standardization state and status
|
|
of this protocol. Distribution of this memo is unlimited.
|
|
|
|
Abstract
|
|
|
|
This document gives an overview and specification of Version 5 of the
|
|
protocol for the Kerberos network authentication system. Version 4,
|
|
described elsewhere [1,2], is presently in production use at MIT's
|
|
Project Athena, and at other Internet sites.
|
|
|
|
Overview
|
|
|
|
Project Athena, Athena, Athena MUSE, Discuss, Hesiod, Kerberos,
|
|
Moira, and Zephyr are trademarks of the Massachusetts Institute of
|
|
Technology (MIT). No commercial use of these trademarks may be made
|
|
without prior written permission of MIT.
|
|
|
|
This RFC describes the concepts and model upon which the Kerberos
|
|
network authentication system is based. It also specifies Version 5
|
|
of the Kerberos protocol.
|
|
|
|
The motivations, goals, assumptions, and rationale behind most design
|
|
decisions are treated cursorily; for Version 4 they are fully
|
|
described in the Kerberos portion of the Athena Technical Plan [1].
|
|
The protocols are under review, and are not being submitted for
|
|
consideration as an Internet standard at this time. Comments are
|
|
encouraged. Requests for addition to an electronic mailing list for
|
|
discussion of Kerberos, kerberos@MIT.EDU, may be addressed to
|
|
kerberos-request@MIT.EDU. This mailing list is gatewayed onto the
|
|
Usenet as the group comp.protocols.kerberos. Requests for further
|
|
information, including documents and code availability, may be sent
|
|
to info-kerberos@MIT.EDU.
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 1]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Background
|
|
|
|
The Kerberos model is based in part on Needham and Schroeder's
|
|
trusted third-party authentication protocol [3] and on modifications
|
|
suggested by Denning and Sacco [4]. The original design and
|
|
implementation of Kerberos Versions 1 through 4 was the work of two
|
|
former Project Athena staff members, Steve Miller of Digital
|
|
Equipment Corporation and Clifford Neuman (now at the Information
|
|
Sciences Institute of the University of Southern California), along
|
|
with Jerome Saltzer, Technical Director of Project Athena, and
|
|
Jeffrey Schiller, MIT Campus Network Manager. Many other members of
|
|
Project Athena have also contributed to the work on Kerberos.
|
|
Version 4 is publicly available, and has seen wide use across the
|
|
Internet.
|
|
|
|
Version 5 (described in this document) has evolved from Version 4
|
|
based on new requirements and desires for features not available in
|
|
Version 4. Details on the differences between Kerberos Versions 4
|
|
and 5 can be found in [5].
|
|
|
|
Table of Contents
|
|
|
|
1. Introduction ....................................... 5
|
|
1.1. Cross-Realm Operation ............................ 7
|
|
1.2. Environmental assumptions ........................ 8
|
|
1.3. Glossary of terms ................................ 9
|
|
2. Ticket flag uses and requests ...................... 12
|
|
2.1. Initial and pre-authenticated tickets ............ 12
|
|
2.2. Invalid tickets .................................. 12
|
|
2.3. Renewable tickets ................................ 12
|
|
2.4. Postdated tickets ................................ 13
|
|
2.5. Proxiable and proxy tickets ...................... 14
|
|
2.6. Forwardable tickets .............................. 15
|
|
2.7. Other KDC options ................................ 15
|
|
3. Message Exchanges .................................. 16
|
|
3.1. The Authentication Service Exchange .............. 16
|
|
3.1.1. Generation of KRB_AS_REQ message ............... 17
|
|
3.1.2. Receipt of KRB_AS_REQ message .................. 17
|
|
3.1.3. Generation of KRB_AS_REP message ............... 17
|
|
3.1.4. Generation of KRB_ERROR message ................ 19
|
|
3.1.5. Receipt of KRB_AS_REP message .................. 19
|
|
3.1.6. Receipt of KRB_ERROR message ................... 20
|
|
3.2. The Client/Server Authentication Exchange ........ 20
|
|
3.2.1. The KRB_AP_REQ message ......................... 20
|
|
3.2.2. Generation of a KRB_AP_REQ message ............. 20
|
|
3.2.3. Receipt of KRB_AP_REQ message .................. 21
|
|
3.2.4. Generation of a KRB_AP_REP message ............. 23
|
|
3.2.5. Receipt of KRB_AP_REP message .................. 23
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 2]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
3.2.6. Using the encryption key ....................... 24
|
|
3.3. The Ticket-Granting Service (TGS) Exchange ....... 24
|
|
3.3.1. Generation of KRB_TGS_REQ message .............. 25
|
|
3.3.2. Receipt of KRB_TGS_REQ message ................. 26
|
|
3.3.3. Generation of KRB_TGS_REP message .............. 27
|
|
3.3.3.1. Encoding the transited field ................. 29
|
|
3.3.4. Receipt of KRB_TGS_REP message ................. 31
|
|
3.4. The KRB_SAFE Exchange ............................ 31
|
|
3.4.1. Generation of a KRB_SAFE message ............... 31
|
|
3.4.2. Receipt of KRB_SAFE message .................... 32
|
|
3.5. The KRB_PRIV Exchange ............................ 33
|
|
3.5.1. Generation of a KRB_PRIV message ............... 33
|
|
3.5.2. Receipt of KRB_PRIV message .................... 33
|
|
3.6. The KRB_CRED Exchange ............................ 34
|
|
3.6.1. Generation of a KRB_CRED message ............... 34
|
|
3.6.2. Receipt of KRB_CRED message .................... 34
|
|
4. The Kerberos Database .............................. 35
|
|
4.1. Database contents ................................ 35
|
|
4.2. Additional fields ................................ 36
|
|
4.3. Frequently Changing Fields ....................... 37
|
|
4.4. Site Constants ................................... 37
|
|
5. Message Specifications ............................. 38
|
|
5.1. ASN.1 Distinguished Encoding Representation ...... 38
|
|
5.2. ASN.1 Base Definitions ........................... 38
|
|
5.3. Tickets and Authenticators ....................... 42
|
|
5.3.1. Tickets ........................................ 42
|
|
5.3.2. Authenticators ................................. 47
|
|
5.4. Specifications for the AS and TGS exchanges ...... 49
|
|
5.4.1. KRB_KDC_REQ definition ......................... 49
|
|
5.4.2. KRB_KDC_REP definition ......................... 56
|
|
5.5. Client/Server (CS) message specifications ........ 58
|
|
5.5.1. KRB_AP_REQ definition .......................... 58
|
|
5.5.2. KRB_AP_REP definition .......................... 60
|
|
5.5.3. Error message reply ............................ 61
|
|
5.6. KRB_SAFE message specification ................... 61
|
|
5.6.1. KRB_SAFE definition ............................ 61
|
|
5.7. KRB_PRIV message specification ................... 62
|
|
5.7.1. KRB_PRIV definition ............................ 62
|
|
5.8. KRB_CRED message specification ................... 63
|
|
5.8.1. KRB_CRED definition ............................ 63
|
|
5.9. Error message specification ...................... 65
|
|
5.9.1. KRB_ERROR definition ........................... 66
|
|
6. Encryption and Checksum Specifications ............. 67
|
|
6.1. Encryption Specifications ........................ 68
|
|
6.2. Encryption Keys .................................. 71
|
|
6.3. Encryption Systems ............................... 71
|
|
6.3.1. The NULL Encryption System (null) .............. 71
|
|
6.3.2. DES in CBC mode with a CRC-32 checksum (descbc-crc)71
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 3]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
6.3.3. DES in CBC mode with an MD4 checksum (descbc-md4) 72
|
|
6.3.4. DES in CBC mode with an MD5 checksum (descbc-md5) 72
|
|
6.4. Checksums ........................................ 74
|
|
6.4.1. The CRC-32 Checksum (crc32) .................... 74
|
|
6.4.2. The RSA MD4 Checksum (rsa-md4) ................. 75
|
|
6.4.3. RSA MD4 Cryptographic Checksum Using DES
|
|
(rsa-md4-des) ......................................... 75
|
|
6.4.4. The RSA MD5 Checksum (rsa-md5) ................. 76
|
|
6.4.5. RSA MD5 Cryptographic Checksum Using DES
|
|
(rsa-md5-des) ......................................... 76
|
|
6.4.6. DES cipher-block chained checksum (des-mac)
|
|
6.4.7. RSA MD4 Cryptographic Checksum Using DES
|
|
alternative (rsa-md4-des-k) ........................... 77
|
|
6.4.8. DES cipher-block chained checksum alternative
|
|
(des-mac-k) ........................................... 77
|
|
7. Naming Constraints ................................. 78
|
|
7.1. Realm Names ...................................... 77
|
|
7.2. Principal Names .................................. 79
|
|
7.2.1. Name of server principals ...................... 80
|
|
8. Constants and other defined values ................. 80
|
|
8.1. Host address types ............................... 80
|
|
8.2. KDC messages ..................................... 81
|
|
8.2.1. IP transport ................................... 81
|
|
8.2.2. OSI transport .................................. 82
|
|
8.2.3. Name of the TGS ................................ 82
|
|
8.3. Protocol constants and associated values ......... 82
|
|
9. Interoperability requirements ...................... 86
|
|
9.1. Specification 1 .................................. 86
|
|
9.2. Recommended KDC values ........................... 88
|
|
10. Acknowledgments ................................... 88
|
|
11. References ........................................ 89
|
|
12. Security Considerations ........................... 90
|
|
13. Authors' Addresses ................................ 90
|
|
A. Pseudo-code for protocol processing ................ 91
|
|
A.1. KRB_AS_REQ generation ............................ 91
|
|
A.2. KRB_AS_REQ verification and KRB_AS_REP generation 92
|
|
A.3. KRB_AS_REP verification .......................... 95
|
|
A.4. KRB_AS_REP and KRB_TGS_REP common checks ......... 96
|
|
A.5. KRB_TGS_REQ generation ........................... 97
|
|
A.6. KRB_TGS_REQ verification and KRB_TGS_REP generation 98
|
|
A.7. KRB_TGS_REP verification ......................... 104
|
|
A.8. Authenticator generation ......................... 104
|
|
A.9. KRB_AP_REQ generation ............................ 105
|
|
A.10. KRB_AP_REQ verification ......................... 105
|
|
A.11. KRB_AP_REP generation ........................... 106
|
|
A.12. KRB_AP_REP verification ......................... 107
|
|
A.13. KRB_SAFE generation ............................. 107
|
|
A.14. KRB_SAFE verification ........................... 108
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 4]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
A.15. KRB_SAFE and KRB_PRIV common checks ............. 108
|
|
A.16. KRB_PRIV generation ............................. 109
|
|
A.17. KRB_PRIV verification ........................... 110
|
|
A.18. KRB_CRED generation ............................. 110
|
|
A.19. KRB_CRED verification ........................... 111
|
|
A.20. KRB_ERROR generation ............................ 112
|
|
|
|
1. Introduction
|
|
|
|
Kerberos provides a means of verifying the identities of principals,
|
|
(e.g., a workstation user or a network server) on an open
|
|
(unprotected) network. This is accomplished without relying on
|
|
authentication by the host operating system, without basing trust on
|
|
host addresses, without requiring physical security of all the hosts
|
|
on the network, and under the assumption that packets traveling along
|
|
the network can be read, modified, and inserted at will. (Note,
|
|
however, that many applications use Kerberos' functions only upon the
|
|
initiation of a stream-based network connection, and assume the
|
|
absence of any "hijackers" who might subvert such a connection. Such
|
|
use implicitly trusts the host addresses involved.) Kerberos
|
|
performs authentication under these conditions as a trusted third-
|
|
party authentication service by using conventional cryptography,
|
|
i.e., shared secret key. (shared secret key - Secret and private are
|
|
often used interchangeably in the literature. In our usage, it takes
|
|
two (or more) to share a secret, thus a shared DES key is a secret
|
|
key. Something is only private when no one but its owner knows it.
|
|
Thus, in public key cryptosystems, one has a public and a private
|
|
key.)
|
|
|
|
The authentication process proceeds as follows: A client sends a
|
|
request to the authentication server (AS) requesting "credentials"
|
|
for a given server. The AS responds with these credentials,
|
|
encrypted in the client's key. The credentials consist of 1) a
|
|
"ticket" for the server and 2) a temporary encryption key (often
|
|
called a "session key"). The client transmits the ticket (which
|
|
contains the client's identity and a copy of the session key, all
|
|
encrypted in the server's key) to the server. The session key (now
|
|
shared by the client and server) is used to authenticate the client,
|
|
and may optionally be used to authenticate the server. It may also
|
|
be used to encrypt further communication between the two parties or
|
|
to exchange a separate sub-session key to be used to encrypt further
|
|
communication.
|
|
|
|
The implementation consists of one or more authentication servers
|
|
running on physically secure hosts. The authentication servers
|
|
maintain a database of principals (i.e., users and servers) and their
|
|
secret keys. Code libraries provide encryption and implement the
|
|
Kerberos protocol. In order to add authentication to its
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 5]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
transactions, a typical network application adds one or two calls to
|
|
the Kerberos library, which results in the transmission of the
|
|
necessary messages to achieve authentication.
|
|
|
|
The Kerberos protocol consists of several sub-protocols (or
|
|
exchanges). There are two methods by which a client can ask a
|
|
Kerberos server for credentials. In the first approach, the client
|
|
sends a cleartext request for a ticket for the desired server to the
|
|
AS. The reply is sent encrypted in the client's secret key. Usually
|
|
this request is for a ticket-granting ticket (TGT) which can later be
|
|
used with the ticket-granting server (TGS). In the second method,
|
|
the client sends a request to the TGS. The client sends the TGT to
|
|
the TGS in the same manner as if it were contacting any other
|
|
application server which requires Kerberos credentials. The reply is
|
|
encrypted in the session key from the TGT.
|
|
|
|
Once obtained, credentials may be used to verify the identity of the
|
|
principals in a transaction, to ensure the integrity of messages
|
|
exchanged between them, or to preserve privacy of the messages. The
|
|
application is free to choose whatever protection may be necessary.
|
|
|
|
To verify the identities of the principals in a transaction, the
|
|
client transmits the ticket to the server. Since the ticket is sent
|
|
"in the clear" (parts of it are encrypted, but this encryption
|
|
doesn't thwart replay) and might be intercepted and reused by an
|
|
attacker, additional information is sent to prove that the message
|
|
was originated by the principal to whom the ticket was issued. This
|
|
information (called the authenticator) is encrypted in the session
|
|
key, and includes a timestamp. The timestamp proves that the message
|
|
was recently generated and is not a replay. Encrypting the
|
|
authenticator in the session key proves that it was generated by a
|
|
party possessing the session key. Since no one except the requesting
|
|
principal and the server know the session key (it is never sent over
|
|
the network in the clear) this guarantees the identity of the client.
|
|
|
|
The integrity of the messages exchanged between principals can also
|
|
be guaranteed using the session key (passed in the ticket and
|
|
contained in the credentials). This approach provides detection of
|
|
both replay attacks and message stream modification attacks. It is
|
|
accomplished by generating and transmitting a collision-proof
|
|
checksum (elsewhere called a hash or digest function) of the client's
|
|
message, keyed with the session key. Privacy and integrity of the
|
|
messages exchanged between principals can be secured by encrypting
|
|
the data to be passed using the session key passed in the ticket, and
|
|
contained in the credentials.
|
|
|
|
The authentication exchanges mentioned above require read-only access
|
|
to the Kerberos database. Sometimes, however, the entries in the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 6]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
database must be modified, such as when adding new principals or
|
|
changing a principal's key. This is done using a protocol between a
|
|
client and a third Kerberos server, the Kerberos Administration
|
|
Server (KADM). The administration protocol is not described in this
|
|
document. There is also a protocol for maintaining multiple copies of
|
|
the Kerberos database, but this can be considered an implementation
|
|
detail and may vary to support different database technologies.
|
|
|
|
1.1. Cross-Realm Operation
|
|
|
|
The Kerberos protocol is designed to operate across organizational
|
|
boundaries. A client in one organization can be authenticated to a
|
|
server in another. Each organization wishing to run a Kerberos
|
|
server establishes its own "realm". The name of the realm in which a
|
|
client is registered is part of the client's name, and can be used by
|
|
the end-service to decide whether to honor a request.
|
|
|
|
By establishing "inter-realm" keys, the administrators of two realms
|
|
can allow a client authenticated in the local realm to use its
|
|
authentication remotely (Of course, with appropriate permission the
|
|
client could arrange registration of a separately-named principal in
|
|
a remote realm, and engage in normal exchanges with that realm's
|
|
services. However, for even small numbers of clients this becomes
|
|
cumbersome, and more automatic methods as described here are
|
|
necessary). The exchange of inter-realm keys (a separate key may be
|
|
used for each direction) registers the ticket-granting service of
|
|
each realm as a principal in the other realm. A client is then able
|
|
to obtain a ticket-granting ticket for the remote realm's ticket-
|
|
granting service from its local realm. When that ticket-granting
|
|
ticket is used, the remote ticket-granting service uses the inter-
|
|
realm key (which usually differs from its own normal TGS key) to
|
|
decrypt the ticket-granting ticket, and is thus certain that it was
|
|
issued by the client's own TGS. Tickets issued by the remote ticket-
|
|
granting service will indicate to the end-service that the client was
|
|
authenticated from another realm.
|
|
|
|
A realm is said to communicate with another realm if the two realms
|
|
share an inter-realm key, or if the local realm shares an inter-realm
|
|
key with an intermediate realm that communicates with the remote
|
|
realm. An authentication path is the sequence of intermediate realms
|
|
that are transited in communicating from one realm to another.
|
|
|
|
Realms are typically organized hierarchically. Each realm shares a
|
|
key with its parent and a different key with each child. If an
|
|
inter-realm key is not directly shared by two realms, the
|
|
hierarchical organization allows an authentication path to be easily
|
|
constructed. If a hierarchical organization is not used, it may be
|
|
necessary to consult some database in order to construct an
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 7]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
authentication path between realms.
|
|
|
|
Although realms are typically hierarchical, intermediate realms may
|
|
be bypassed to achieve cross-realm authentication through alternate
|
|
authentication paths (these might be established to make
|
|
communication between two realms more efficient). It is important
|
|
for the end-service to know which realms were transited when deciding
|
|
how much faith to place in the authentication process. To facilitate
|
|
this decision, a field in each ticket contains the names of the
|
|
realms that were involved in authenticating the client.
|
|
|
|
1.2. Environmental assumptions
|
|
|
|
Kerberos imposes a few assumptions on the environment in which it can
|
|
properly function:
|
|
|
|
+ "Denial of service" attacks are not solved with Kerberos. There
|
|
are places in these protocols where an intruder intruder can
|
|
prevent an application from participating in the proper
|
|
authentication steps. Detection and solution of such attacks
|
|
(some of which can appear to be not-uncommon "normal" failure
|
|
modes for the system) is usually best left to the human
|
|
administrators and users.
|
|
|
|
+ Principals must keep their secret keys secret. If an intruder
|
|
somehow steals a principal's key, it will be able to masquerade
|
|
as that principal or impersonate any server to the legitimate
|
|
principal.
|
|
|
|
+ "Password guessing" attacks are not solved by Kerberos. If a
|
|
user chooses a poor password, it is possible for an attacker to
|
|
successfully mount an offline dictionary attack by repeatedly
|
|
attempting to decrypt, with successive entries from a
|
|
dictionary, messages obtained which are encrypted under a key
|
|
derived from the user's password.
|
|
|
|
+ Each host on the network must have a clock which is "loosely
|
|
synchronized" to the time of the other hosts; this
|
|
synchronization is used to reduce the bookkeeping needs of
|
|
application servers when they do replay detection. The degree
|
|
of "looseness" can be configured on a per-server basis. If the
|
|
clocks are synchronized over the network, the clock
|
|
synchronization protocol must itself be secured from network
|
|
attackers.
|
|
|
|
+ Principal identifiers are not recycled on a short-term basis. A
|
|
typical mode of access control will use access control lists
|
|
(ACLs) to grant permissions to particular principals. If a
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 8]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
stale ACL entry remains for a deleted principal and the
|
|
principal identifier is reused, the new principal will inherit
|
|
rights specified in the stale ACL entry. By not re-using
|
|
principal identifiers, the danger of inadvertent access is
|
|
removed.
|
|
|
|
1.3. Glossary of terms
|
|
|
|
Below is a list of terms used throughout this document.
|
|
|
|
|
|
Authentication Verifying the claimed identity of a
|
|
principal.
|
|
|
|
|
|
Authentication header A record containing a Ticket and an
|
|
Authenticator to be presented to a
|
|
server as part of the authentication
|
|
process.
|
|
|
|
|
|
Authentication path A sequence of intermediate realms transited
|
|
in the authentication process when
|
|
communicating from one realm to another.
|
|
|
|
Authenticator A record containing information that can
|
|
be shown to have been recently generated
|
|
using the session key known only by the
|
|
client and server.
|
|
|
|
|
|
Authorization The process of determining whether a
|
|
client may use a service, which objects
|
|
the client is allowed to access, and the
|
|
type of access allowed for each.
|
|
|
|
|
|
Capability A token that grants the bearer permission
|
|
to access an object or service. In
|
|
Kerberos, this might be a ticket whose
|
|
use is restricted by the contents of the
|
|
authorization data field, but which
|
|
lists no network addresses, together
|
|
with the session key necessary to use
|
|
the ticket.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 9]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Ciphertext The output of an encryption function.
|
|
Encryption transforms plaintext into
|
|
ciphertext.
|
|
|
|
|
|
Client A process that makes use of a network
|
|
service on behalf of a user. Note that
|
|
in some cases a Server may itself be a
|
|
client of some other server (e.g., a
|
|
print server may be a client of a file
|
|
server).
|
|
|
|
|
|
Credentials A ticket plus the secret session key
|
|
necessary to successfully use that
|
|
ticket in an authentication exchange.
|
|
|
|
|
|
KDC Key Distribution Center, a network service
|
|
that supplies tickets and temporary
|
|
session keys; or an instance of that
|
|
service or the host on which it runs.
|
|
The KDC services both initial ticket and
|
|
ticket-granting ticket requests. The
|
|
initial ticket portion is sometimes
|
|
referred to as the Authentication Server
|
|
(or service). The ticket-granting
|
|
ticket portion is sometimes referred to
|
|
as the ticket-granting server (or service).
|
|
|
|
Kerberos Aside from the 3-headed dog guarding
|
|
Hades, the name given to Project
|
|
Athena's authentication service, the
|
|
protocol used by that service, or the
|
|
code used to implement the authentication
|
|
service.
|
|
|
|
|
|
Plaintext The input to an encryption function or
|
|
the output of a decryption function.
|
|
Decryption transforms ciphertext into
|
|
plaintext.
|
|
|
|
|
|
Principal A uniquely named client or server
|
|
instance that participates in a network
|
|
communication.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 10]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Principal identifier The name used to uniquely identify each
|
|
different principal.
|
|
|
|
|
|
Seal To encipher a record containing several
|
|
fields in such a way that the fields
|
|
cannot be individually replaced without
|
|
either knowledge of the encryption key
|
|
or leaving evidence of tampering.
|
|
|
|
|
|
Secret key An encryption key shared by a principal
|
|
and the KDC, distributed outside the
|
|
bounds of the system, with a long lifetime.
|
|
In the case of a human user's
|
|
principal, the secret key is derived
|
|
from a password.
|
|
|
|
|
|
Server A particular Principal which provides a
|
|
resource to network clients.
|
|
|
|
|
|
Service A resource provided to network clients;
|
|
often provided by more than one server
|
|
(for example, remote file service).
|
|
|
|
|
|
Session key A temporary encryption key used between
|
|
two principals, with a lifetime limited
|
|
to the duration of a single login "session".
|
|
|
|
|
|
Sub-session key A temporary encryption key used between
|
|
two principals, selected and exchanged
|
|
by the principals using the session key,
|
|
and with a lifetime limited to the duration
|
|
of a single association.
|
|
|
|
|
|
Ticket A record that helps a client authenticate
|
|
itself to a server; it contains the
|
|
client's identity, a session key, a
|
|
timestamp, and other information, all
|
|
sealed using the server's secret key.
|
|
It only serves to authenticate a client
|
|
when presented along with a fresh
|
|
Authenticator.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 11]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
2. Ticket flag uses and requests
|
|
|
|
Each Kerberos ticket contains a set of flags which are used to
|
|
indicate various attributes of that ticket. Most flags may be
|
|
requested by a client when the ticket is obtained; some are
|
|
automatically turned on and off by a Kerberos server as required.
|
|
The following sections explain what the various flags mean, and gives
|
|
examples of reasons to use such a flag.
|
|
|
|
2.1. Initial and pre-authenticated tickets
|
|
|
|
The INITIAL flag indicates that a ticket was issued using the AS
|
|
protocol and not issued based on a ticket-granting ticket.
|
|
Application servers that want to require the knowledge of a client's
|
|
secret key (e.g., a passwordchanging program) can insist that this
|
|
flag be set in any tickets they accept, and thus be assured that the
|
|
client's key was recently presented to the application client.
|
|
|
|
The PRE-AUTHENT and HW-AUTHENT flags provide addition information
|
|
about the initial authentication, regardless of whether the current
|
|
ticket was issued directly (in which case INITIAL will also be set)
|
|
or issued on the basis of a ticket-granting ticket (in which case the
|
|
INITIAL flag is clear, but the PRE-AUTHENT and HW-AUTHENT flags are
|
|
carried forward from the ticket-granting ticket).
|
|
|
|
2.2. Invalid tickets
|
|
|
|
The INVALID flag indicates that a ticket is invalid. Application
|
|
servers must reject tickets which have this flag set. A postdated
|
|
ticket will usually be issued in this form. Invalid tickets must be
|
|
validated by the KDC before use, by presenting them to the KDC in a
|
|
TGS request with the VALIDATE option specified. The KDC will only
|
|
validate tickets after their starttime has passed. The validation is
|
|
required so that postdated tickets which have been stolen before
|
|
their starttime can be rendered permanently invalid (through a hot-
|
|
list mechanism).
|
|
|
|
2.3. Renewable tickets
|
|
|
|
Applications may desire to hold tickets which can be valid for long
|
|
periods of time. However, this can expose their credentials to
|
|
potential theft for equally long periods, and those stolen
|
|
credentials would be valid until the expiration time of the
|
|
ticket(s). Simply using shortlived tickets and obtaining new ones
|
|
periodically would require the client to have long-term access to its
|
|
secret key, an even greater risk. Renewable tickets can be used to
|
|
mitigate the consequences of theft. Renewable tickets have two
|
|
"expiration times": the first is when the current instance of the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 12]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
ticket expires, and the second is the latest permissible value for an
|
|
individual expiration time. An application client must periodically
|
|
(i.e., before it expires) present a renewable ticket to the KDC, with
|
|
the RENEW option set in the KDC request. The KDC will issue a new
|
|
ticket with a new session key and a later expiration time. All other
|
|
fields of the ticket are left unmodified by the renewal process.
|
|
When the latest permissible expiration time arrives, the ticket
|
|
expires permanently. At each renewal, the KDC may consult a hot-list
|
|
to determine if the ticket had been reported stolen since its last
|
|
renewal; it will refuse to renew such stolen tickets, and thus the
|
|
usable lifetime of stolen tickets is reduced.
|
|
|
|
The RENEWABLE flag in a ticket is normally only interpreted by the
|
|
ticket-granting service (discussed below in section 3.3). It can
|
|
usually be ignored by application servers. However, some
|
|
particularly careful application servers may wish to disallow
|
|
renewable tickets.
|
|
|
|
If a renewable ticket is not renewed by its expiration time, the KDC
|
|
will not renew the ticket. The RENEWABLE flag is reset by default,
|
|
but a client may request it be set by setting the RENEWABLE option
|
|
in the KRB_AS_REQ message. If it is set, then the renew-till field
|
|
in the ticket contains the time after which the ticket may not be
|
|
renewed.
|
|
|
|
2.4. Postdated tickets
|
|
|
|
Applications may occasionally need to obtain tickets for use much
|
|
later, e.g., a batch submission system would need tickets to be valid
|
|
at the time the batch job is serviced. However, it is dangerous to
|
|
hold valid tickets in a batch queue, since they will be on-line
|
|
longer and more prone to theft. Postdated tickets provide a way to
|
|
obtain these tickets from the KDC at job submission time, but to
|
|
leave them "dormant" until they are activated and validated by a
|
|
further request of the KDC. If a ticket theft were reported in the
|
|
interim, the KDC would refuse to validate the ticket, and the thief
|
|
would be foiled.
|
|
|
|
The MAY-POSTDATE flag in a ticket is normally only interpreted by the
|
|
ticket-granting service. It can be ignored by application servers.
|
|
This flag must be set in a ticket-granting ticket in order to issue a
|
|
postdated ticket based on the presented ticket. It is reset by
|
|
default; it may be requested by a client by setting the ALLOW-
|
|
POSTDATE option in the KRB_AS_REQ message. This flag does not allow
|
|
a client to obtain a postdated ticket-granting ticket; postdated
|
|
ticket-granting tickets can only by obtained by requesting the
|
|
postdating in the KRB_AS_REQ message. The life (endtime-starttime)
|
|
of a postdated ticket will be the remaining life of the ticket-
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 13]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
granting ticket at the time of the request, unless the RENEWABLE
|
|
option is also set, in which case it can be the full life (endtime-
|
|
starttime) of the ticket-granting ticket. The KDC may limit how far
|
|
in the future a ticket may be postdated.
|
|
|
|
The POSTDATED flag indicates that a ticket has been postdated. The
|
|
application server can check the authtime field in the ticket to see
|
|
when the original authentication occurred. Some services may choose
|
|
to reject postdated tickets, or they may only accept them within a
|
|
certain period after the original authentication. When the KDC issues
|
|
a POSTDATED ticket, it will also be marked as INVALID, so that the
|
|
application client must present the ticket to the KDC to be validated
|
|
before use.
|
|
|
|
2.5. Proxiable and proxy tickets
|
|
|
|
At times it may be necessary for a principal to allow a service to
|
|
perform an operation on its behalf. The service must be able to take
|
|
on the identity of the client, but only for a particular purpose. A
|
|
principal can allow a service to take on the principal's identity for
|
|
a particular purpose by granting it a proxy.
|
|
|
|
The PROXIABLE flag in a ticket is normally only interpreted by the
|
|
ticket-granting service. It can be ignored by application servers.
|
|
When set, this flag tells the ticket-granting server that it is OK to
|
|
issue a new ticket (but not a ticket-granting ticket) with a
|
|
different network address based on this ticket. This flag is set by
|
|
default.
|
|
|
|
This flag allows a client to pass a proxy to a server to perform a
|
|
remote request on its behalf, e.g., a print service client can give
|
|
the print server a proxy to access the client's files on a particular
|
|
file server in order to satisfy a print request.
|
|
|
|
In order to complicate the use of stolen credentials, Kerberos
|
|
tickets are usually valid from only those network addresses
|
|
specifically included in the ticket (It is permissible to request or
|
|
issue tickets with no network addresses specified, but we do not
|
|
recommend it). For this reason, a client wishing to grant a proxy
|
|
must request a new ticket valid for the network address of the
|
|
service to be granted the proxy.
|
|
|
|
The PROXY flag is set in a ticket by the TGS when it issues a
|
|
proxy ticket. Application servers may check this flag and require
|
|
additional authentication from the agent presenting the proxy in
|
|
order to provide an audit trail.
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 14]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
2.6. Forwardable tickets
|
|
|
|
Authentication forwarding is an instance of the proxy case where the
|
|
service is granted complete use of the client's identity. An example
|
|
where it might be used is when a user logs in to a remote system and
|
|
wants authentication to work from that system as if the login were
|
|
local.
|
|
|
|
The FORWARDABLE flag in a ticket is normally only interpreted by the
|
|
ticket-granting service. It can be ignored by application servers.
|
|
The FORWARDABLE flag has an interpretation similar to that of the
|
|
PROXIABLE flag, except ticket-granting tickets may also be issued
|
|
with different network addresses. This flag is reset by default, but
|
|
users may request that it be set by setting the FORWARDABLE option in
|
|
the AS request when they request their initial ticket-granting
|
|
ticket.
|
|
|
|
This flag allows for authentication forwarding without requiring the
|
|
user to enter a password again. If the flag is not set, then
|
|
authentication forwarding is not permitted, but the same end result
|
|
can still be achieved if the user engages in the AS exchange with the
|
|
requested network addresses and supplies a password.
|
|
|
|
The FORWARDED flag is set by the TGS when a client presents a ticket
|
|
with the FORWARDABLE flag set and requests it be set by specifying
|
|
the FORWARDED KDC option and supplying a set of addresses for the new
|
|
ticket. It is also set in all tickets issued based on tickets with
|
|
the FORWARDED flag set. Application servers may wish to process
|
|
FORWARDED tickets differently than non-FORWARDED tickets.
|
|
|
|
2.7. Other KDC options
|
|
|
|
There are two additional options which may be set in a client's
|
|
request of the KDC. The RENEWABLE-OK option indicates that the
|
|
client will accept a renewable ticket if a ticket with the requested
|
|
life cannot otherwise be provided. If a ticket with the requested
|
|
life cannot be provided, then the KDC may issue a renewable ticket
|
|
with a renew-till equal to the the requested endtime. The value of
|
|
the renew-till field may still be adjusted by site-determined limits
|
|
or limits imposed by the individual principal or server.
|
|
|
|
The ENC-TKT-IN-SKEY option is honored only by the ticket-granting
|
|
service. It indicates that the to-be-issued ticket for the end
|
|
server is to be encrypted in the session key from the additional
|
|
ticket-granting ticket provided with the request. See section 3.3.3
|
|
for specific details.
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 15]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
3. Message Exchanges
|
|
|
|
The following sections describe the interactions between network
|
|
clients and servers and the messages involved in those exchanges.
|
|
|
|
3.1. The Authentication Service Exchange
|
|
|
|
Summary
|
|
|
|
Message direction Message type Section
|
|
1. Client to Kerberos KRB_AS_REQ 5.4.1
|
|
2. Kerberos to client KRB_AS_REP or 5.4.2
|
|
KRB_ERROR 5.9.1
|
|
|
|
The Authentication Service (AS) Exchange between the client and the
|
|
Kerberos Authentication Server is usually initiated by a client when
|
|
it wishes to obtain authentication credentials for a given server but
|
|
currently holds no credentials. The client's secret key is used for
|
|
encryption and decryption. This exchange is typically used at the
|
|
initiation of a login session, to obtain credentials for a Ticket-
|
|
Granting Server, which will subsequently be used to obtain
|
|
credentials for other servers (see section 3.3) without requiring
|
|
further use of the client's secret key. This exchange is also used
|
|
to request credentials for services which must not be mediated
|
|
through the Ticket-Granting Service, but rather require a principal's
|
|
secret key, such as the password-changing service. (The password-
|
|
changing request must not be honored unless the requester can provide
|
|
the old password (the user's current secret key). Otherwise, it
|
|
would be possible for someone to walk up to an unattended session and
|
|
change another user's password.) This exchange does not by itself
|
|
provide any assurance of the the identity of the user. (To
|
|
authenticate a user logging on to a local system, the credentials
|
|
obtained in the AS exchange may first be used in a TGS exchange to
|
|
obtain credentials for a local server. Those credentials must then
|
|
be verified by the local server through successful completion of the
|
|
Client/Server exchange.)
|
|
|
|
The exchange consists of two messages: KRB_AS_REQ from the client to
|
|
Kerberos, and KRB_AS_REP or KRB_ERROR in reply. The formats for these
|
|
messages are described in sections 5.4.1, 5.4.2, and 5.9.1.
|
|
|
|
In the request, the client sends (in cleartext) its own identity and
|
|
the identity of the server for which it is requesting credentials.
|
|
The response, KRB_AS_REP, contains a ticket for the client to present
|
|
to the server, and a session key that will be shared by the client
|
|
and the server. The session key and additional information are
|
|
encrypted in the client's secret key. The KRB_AS_REP message
|
|
contains information which can be used to detect replays, and to
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 16]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
associate it with the message to which it replies. Various errors
|
|
can occur; these are indicated by an error response (KRB_ERROR)
|
|
instead of the KRB_AS_REP response. The error message is not
|
|
encrypted. The KRB_ERROR message also contains information which can
|
|
be used to associate it with the message to which it replies. The
|
|
lack of encryption in the KRB_ERROR message precludes the ability to
|
|
detect replays or fabrications of such messages.
|
|
|
|
In the normal case the authentication server does not know whether
|
|
the client is actually the principal named in the request. It simply
|
|
sends a reply without knowing or caring whether they are the same.
|
|
This is acceptable because nobody but the principal whose identity
|
|
was given in the request will be able to use the reply. Its critical
|
|
information is encrypted in that principal's key. The initial
|
|
request supports an optional field that can be used to pass
|
|
additional information that might be needed for the initial exchange.
|
|
This field may be used for preauthentication if desired, but the
|
|
mechanism is not currently specified.
|
|
|
|
3.1.1. Generation of KRB_AS_REQ message
|
|
|
|
The client may specify a number of options in the initial request.
|
|
Among these options are whether preauthentication is to be performed;
|
|
whether the requested ticket is to be renewable, proxiable, or
|
|
forwardable; whether it should be postdated or allow postdating of
|
|
derivative tickets; and whether a renewable ticket will be accepted
|
|
in lieu of a non-renewable ticket if the requested ticket expiration
|
|
date cannot be satisfied by a nonrenewable ticket (due to
|
|
configuration constraints; see section 4). See section A.1 for
|
|
pseudocode.
|
|
|
|
The client prepares the KRB_AS_REQ message and sends it to the KDC.
|
|
|
|
3.1.2. Receipt of KRB_AS_REQ message
|
|
|
|
If all goes well, processing the KRB_AS_REQ message will result in
|
|
the creation of a ticket for the client to present to the server.
|
|
The format for the ticket is described in section 5.3.1. The
|
|
contents of the ticket are determined as follows.
|
|
|
|
3.1.3. Generation of KRB_AS_REP message
|
|
|
|
The authentication server looks up the client and server principals
|
|
named in the KRB_AS_REQ in its database, extracting their respective
|
|
keys. If required, the server pre-authenticates the request, and if
|
|
the pre-authentication check fails, an error message with the code
|
|
KDC_ERR_PREAUTH_FAILED is returned. If the server cannot accommodate
|
|
the requested encryption type, an error message with code
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 17]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
KDC_ERR_ETYPE_NOSUPP is returned. Otherwise it generates a "random"
|
|
session key ("Random" means that, among other things, it should be
|
|
impossible to guess the next session key based on knowledge of past
|
|
session keys. This can only be achieved in a pseudo-random number
|
|
generator if it is based on cryptographic principles. It would be
|
|
more desirable to use a truly random number generator, such as one
|
|
based on measurements of random physical phenomena.).
|
|
|
|
If the requested start time is absent or indicates a time in the
|
|
past, then the start time of the ticket is set to the authentication
|
|
server's current time. If it indicates a time in the future, but the
|
|
POSTDATED option has not been specified, then the error
|
|
KDC_ERR_CANNOT_POSTDATE is returned. Otherwise the requested start
|
|
time is checked against the policy of the local realm (the
|
|
administrator might decide to prohibit certain types or ranges of
|
|
postdated tickets), and if acceptable, the ticket's start time is set
|
|
as requested and the INVALID flag is set in the new ticket. The
|
|
postdated ticket must be validated before use by presenting it to the
|
|
KDC after the start time has been reached.
|
|
|
|
The expiration time of the ticket will be set to the minimum of the
|
|
following:
|
|
|
|
+The expiration time (endtime) requested in the KRB_AS_REQ
|
|
message.
|
|
|
|
+The ticket's start time plus the maximum allowable lifetime
|
|
associated with the client principal (the authentication
|
|
server's database includes a maximum ticket lifetime field
|
|
in each principal's record; see section 4).
|
|
|
|
+The ticket's start time plus the maximum allowable lifetime
|
|
associated with the server principal.
|
|
|
|
+The ticket's start time plus the maximum lifetime set by
|
|
the policy of the local realm.
|
|
|
|
If the requested expiration time minus the start time (as determined
|
|
above) is less than a site-determined minimum lifetime, an error
|
|
message with code KDC_ERR_NEVER_VALID is returned. If the requested
|
|
expiration time for the ticket exceeds what was determined as above,
|
|
and if the "RENEWABLE-OK" option was requested, then the "RENEWABLE"
|
|
flag is set in the new ticket, and the renew-till value is set as if
|
|
the "RENEWABLE" option were requested (the field and option names are
|
|
described fully in section 5.4.1). If the RENEWABLE option has been
|
|
requested or if the RENEWABLE-OK option has been set and a renewable
|
|
ticket is to be issued, then the renew-till field is set to the
|
|
minimum of:
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 18]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
+Its requested value.
|
|
|
|
+The start time of the ticket plus the minimum of the two
|
|
maximum renewable lifetimes associated with the principals'
|
|
database entries.
|
|
|
|
+The start time of the ticket plus the maximum renewable
|
|
lifetime set by the policy of the local realm.
|
|
|
|
The flags field of the new ticket will have the following options set
|
|
if they have been requested and if the policy of the local realm
|
|
allows: FORWARDABLE, MAY-POSTDATE, POSTDATED, PROXIABLE, RENEWABLE.
|
|
If the new ticket is postdated (the start time is in the future), its
|
|
INVALID flag will also be set.
|
|
|
|
If all of the above succeed, the server formats a KRB_AS_REP message
|
|
(see section 5.4.2), copying the addresses in the request into the
|
|
caddr of the response, placing any required pre-authentication data
|
|
into the padata of the response, and encrypts the ciphertext part in
|
|
the client's key using the requested encryption method, and sends it
|
|
to the client. See section A.2 for pseudocode.
|
|
|
|
3.1.4. Generation of KRB_ERROR message
|
|
|
|
Several errors can occur, and the Authentication Server responds by
|
|
returning an error message, KRB_ERROR, to the client, with the
|
|
error-code and e-text fields set to appropriate values. The error
|
|
message contents and details are described in Section 5.9.1.
|
|
|
|
3.1.5. Receipt of KRB_AS_REP message
|
|
|
|
If the reply message type is KRB_AS_REP, then the client verifies
|
|
that the cname and crealm fields in the cleartext portion of the
|
|
reply match what it requested. If any padata fields are present,
|
|
they may be used to derive the proper secret key to decrypt the
|
|
message. The client decrypts the encrypted part of the response
|
|
using its secret key, verifies that the nonce in the encrypted part
|
|
matches the nonce it supplied in its request (to detect replays). It
|
|
also verifies that the sname and srealm in the response match those
|
|
in the request, and that the host address field is also correct. It
|
|
then stores the ticket, session key, start and expiration times, and
|
|
other information for later use. The key-expiration field from the
|
|
encrypted part of the response may be checked to notify the user of
|
|
impending key expiration (the client program could then suggest
|
|
remedial action, such as a password change). See section A.3 for
|
|
pseudocode.
|
|
|
|
Proper decryption of the KRB_AS_REP message is not sufficient to
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 19]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
verify the identity of the user; the user and an attacker could
|
|
cooperate to generate a KRB_AS_REP format message which decrypts
|
|
properly but is not from the proper KDC. If the host wishes to
|
|
verify the identity of the user, it must require the user to present
|
|
application credentials which can be verified using a securely-stored
|
|
secret key. If those credentials can be verified, then the identity
|
|
of the user can be assured.
|
|
|
|
3.1.6. Receipt of KRB_ERROR message
|
|
|
|
If the reply message type is KRB_ERROR, then the client interprets it
|
|
as an error and performs whatever application-specific tasks are
|
|
necessary to recover.
|
|
|
|
3.2. The Client/Server Authentication Exchange
|
|
|
|
Summary
|
|
|
|
Message direction Message type Section
|
|
Client to Application server KRB_AP_REQ 5.5.1
|
|
[optional] Application server to client KRB_AP_REP or 5.5.2
|
|
KRB_ERROR 5.9.1
|
|
|
|
The client/server authentication (CS) exchange is used by network
|
|
applications to authenticate the client to the server and vice versa.
|
|
The client must have already acquired credentials for the server
|
|
using the AS or TGS exchange.
|
|
|
|
3.2.1. The KRB_AP_REQ message
|
|
|
|
The KRB_AP_REQ contains authentication information which should be
|
|
part of the first message in an authenticated transaction. It
|
|
contains a ticket, an authenticator, and some additional bookkeeping
|
|
information (see section 5.5.1 for the exact format). The ticket by
|
|
itself is insufficient to authenticate a client, since tickets are
|
|
passed across the network in cleartext(Tickets contain both an
|
|
encrypted and unencrypted portion, so cleartext here refers to the
|
|
entire unit, which can be copied from one message and replayed in
|
|
another without any cryptographic skill.), so the authenticator is
|
|
used to prevent invalid replay of tickets by proving to the server
|
|
that the client knows the session key of the ticket and thus is
|
|
entitled to use it. The KRB_AP_REQ message is referred to elsewhere
|
|
as the "authentication header."
|
|
|
|
3.2.2. Generation of a KRB_AP_REQ message
|
|
|
|
When a client wishes to initiate authentication to a server, it
|
|
obtains (either through a credentials cache, the AS exchange, or the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 20]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
TGS exchange) a ticket and session key for the desired service. The
|
|
client may re-use any tickets it holds until they expire. The client
|
|
then constructs a new Authenticator from the the system time, its
|
|
name, and optionally an application specific checksum, an initial
|
|
sequence number to be used in KRB_SAFE or KRB_PRIV messages, and/or a
|
|
session subkey to be used in negotiations for a session key unique to
|
|
this particular session. Authenticators may not be re-used and will
|
|
be rejected if replayed to a server (Note that this can make
|
|
applications based on unreliable transports difficult to code
|
|
correctly, if the transport might deliver duplicated messages. In
|
|
such cases, a new authenticator must be generated for each retry.).
|
|
If a sequence number is to be included, it should be randomly chosen
|
|
so that even after many messages have been exchanged it is not likely
|
|
to collide with other sequence numbers in use.
|
|
|
|
The client may indicate a requirement of mutual authentication or the
|
|
use of a session-key based ticket by setting the appropriate flag(s)
|
|
in the ap-options field of the message.
|
|
|
|
The Authenticator is encrypted in the session key and combined with
|
|
the ticket to form the KRB_AP_REQ message which is then sent to the
|
|
end server along with any additional application-specific
|
|
information. See section A.9 for pseudocode.
|
|
|
|
3.2.3. Receipt of KRB_AP_REQ message
|
|
|
|
Authentication is based on the server's current time of day (clocks
|
|
must be loosely synchronized), the authenticator, and the ticket.
|
|
Several errors are possible. If an error occurs, the server is
|
|
expected to reply to the client with a KRB_ERROR message. This
|
|
message may be encapsulated in the application protocol if its "raw"
|
|
form is not acceptable to the protocol. The format of error messages
|
|
is described in section 5.9.1.
|
|
|
|
The algorithm for verifying authentication information is as follows.
|
|
If the message type is not KRB_AP_REQ, the server returns the
|
|
KRB_AP_ERR_MSG_TYPE error. If the key version indicated by the Ticket
|
|
in the KRB_AP_REQ is not one the server can use (e.g., it indicates
|
|
an old key, and the server no longer possesses a copy of the old
|
|
key), the KRB_AP_ERR_BADKEYVER error is returned. If the USE-
|
|
SESSION-KEY flag is set in the ap-options field, it indicates to the
|
|
server that the ticket is encrypted in the session key from the
|
|
server's ticket-granting ticket rather than its secret key (This is
|
|
used for user-to-user authentication as described in [6]). Since it
|
|
is possible for the server to be registered in multiple realms, with
|
|
different keys in each, the srealm field in the unencrypted portion
|
|
of the ticket in the KRB_AP_REQ is used to specify which secret key
|
|
the server should use to decrypt that ticket. The KRB_AP_ERR_NOKEY
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 21]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
error code is returned if the server doesn't have the proper key to
|
|
decipher the ticket.
|
|
|
|
The ticket is decrypted using the version of the server's key
|
|
specified by the ticket. If the decryption routines detect a
|
|
modification of the ticket (each encryption system must provide
|
|
safeguards to detect modified ciphertext; see section 6), the
|
|
KRB_AP_ERR_BAD_INTEGRITY error is returned (chances are good that
|
|
different keys were used to encrypt and decrypt).
|
|
|
|
The authenticator is decrypted using the session key extracted from
|
|
the decrypted ticket. If decryption shows it to have been modified,
|
|
the KRB_AP_ERR_BAD_INTEGRITY error is returned. The name and realm
|
|
of the client from the ticket are compared against the same fields in
|
|
the authenticator. If they don't match, the KRB_AP_ERR_BADMATCH
|
|
error is returned (they might not match, for example, if the wrong
|
|
session key was used to encrypt the authenticator). The addresses in
|
|
the ticket (if any) are then searched for an address matching the
|
|
operating-system reported address of the client. If no match is
|
|
found or the server insists on ticket addresses but none are present
|
|
in the ticket, the KRB_AP_ERR_BADADDR error is returned.
|
|
|
|
If the local (server) time and the client time in the authenticator
|
|
differ by more than the allowable clock skew (e.g., 5 minutes), the
|
|
KRB_AP_ERR_SKEW error is returned. If the server name, along with
|
|
the client name, time and microsecond fields from the Authenticator
|
|
match any recently-seen such tuples, the KRB_AP_ERR_REPEAT error is
|
|
returned (Note that the rejection here is restricted to
|
|
authenticators from the same principal to the same server. Other
|
|
client principals communicating with the same server principal should
|
|
not be have their authenticators rejected if the time and microsecond
|
|
fields happen to match some other client's authenticator.). The
|
|
server must remember any authenticator presented within the allowable
|
|
clock skew, so that a replay attempt is guaranteed to fail. If a
|
|
server loses track of any authenticator presented within the
|
|
allowable clock skew, it must reject all requests until the clock
|
|
skew interval has passed. This assures that any lost or re-played
|
|
authenticators will fall outside the allowable clock skew and can no
|
|
longer be successfully replayed (If this is not done, an attacker
|
|
could conceivably record the ticket and authenticator sent over the
|
|
network to a server, then disable the client's host, pose as the
|
|
disabled host, and replay the ticket and authenticator to subvert the
|
|
authentication.). If a sequence number is provided in the
|
|
authenticator, the server saves it for later use in processing
|
|
KRB_SAFE and/or KRB_PRIV messages. If a subkey is present, the
|
|
server either saves it for later use or uses it to help generate its
|
|
own choice for a subkey to be returned in a KRB_AP_REP message.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 22]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
The server computes the age of the ticket: local (server) time minus
|
|
the start time inside the Ticket. If the start time is later than
|
|
the current time by more than the allowable clock skew or if the
|
|
INVALID flag is set in the ticket, the KRB_AP_ERR_TKT_NYV error is
|
|
returned. Otherwise, if the current time is later than end time by
|
|
more than the allowable clock skew, the KRB_AP_ERR_TKT_EXPIRED error
|
|
is returned.
|
|
|
|
If all these checks succeed without an error, the server is assured
|
|
that the client possesses the credentials of the principal named in
|
|
the ticket and thus, the client has been authenticated to the server.
|
|
See section A.10 for pseudocode.
|
|
|
|
3.2.4. Generation of a KRB_AP_REP message
|
|
|
|
Typically, a client's request will include both the authentication
|
|
information and its initial request in the same message, and the
|
|
server need not explicitly reply to the KRB_AP_REQ. However, if
|
|
mutual authentication (not only authenticating the client to the
|
|
server, but also the server to the client) is being performed, the
|
|
KRB_AP_REQ message will have MUTUAL-REQUIRED set in its ap-options
|
|
field, and a KRB_AP_REP message is required in response. As with the
|
|
error message, this message may be encapsulated in the application
|
|
protocol if its "raw" form is not acceptable to the application's
|
|
protocol. The timestamp and microsecond field used in the reply must
|
|
be the client's timestamp and microsecond field (as provided in the
|
|
authenticator). [Note: In the Kerberos version 4 protocol, the
|
|
timestamp in the reply was the client's timestamp plus one. This is
|
|
not necessary in version 5 because version 5 messages are formatted
|
|
in such a way that it is not possible to create the reply by
|
|
judicious message surgery (even in encrypted form) without knowledge
|
|
of the appropriate encryption keys.] If a sequence number is to be
|
|
included, it should be randomly chosen as described above for the
|
|
authenticator. A subkey may be included if the server desires to
|
|
negotiate a different subkey. The KRB_AP_REP message is encrypted in
|
|
the session key extracted from the ticket. See section A.11 for
|
|
pseudocode.
|
|
|
|
3.2.5. Receipt of KRB_AP_REP message
|
|
|
|
If a KRB_AP_REP message is returned, the client uses the session key
|
|
from the credentials obtained for the server (Note that for
|
|
encrypting the KRB_AP_REP message, the sub-session key is not used,
|
|
even if present in the Authenticator.) to decrypt the message, and
|
|
verifies that the timestamp and microsecond fields match those in the
|
|
Authenticator it sent to the server. If they match, then the client
|
|
is assured that the server is genuine. The sequence number and subkey
|
|
(if present) are retained for later use. See section A.12 for
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 23]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
pseudocode.
|
|
|
|
3.2.6. Using the encryption key
|
|
|
|
After the KRB_AP_REQ/KRB_AP_REP exchange has occurred, the client and
|
|
server share an encryption key which can be used by the application.
|
|
The "true session key" to be used for KRB_PRIV, KRB_SAFE, or other
|
|
application-specific uses may be chosen by the application based on
|
|
the subkeys in the KRB_AP_REP message and the authenticator
|
|
(Implementations of the protocol may wish to provide routines to
|
|
choose subkeys based on session keys and random numbers and to
|
|
orchestrate a negotiated key to be returned in the KRB_AP_REP
|
|
message.). In some cases, the use of this session key will be
|
|
implicit in the protocol; in others the method of use must be chosen
|
|
from a several alternatives. We leave the protocol negotiations of
|
|
how to use the key (e.g., selecting an encryption or checksum type)
|
|
to the application programmer; the Kerberos protocol does not
|
|
constrain the implementation options.
|
|
|
|
With both the one-way and mutual authentication exchanges, the peers
|
|
should take care not to send sensitive information to each other
|
|
without proper assurances. In particular, applications that require
|
|
privacy or integrity should use the KRB_AP_REP or KRB_ERROR responses
|
|
from the server to client to assure both client and server of their
|
|
peer's identity. If an application protocol requires privacy of its
|
|
messages, it can use the KRB_PRIV message (section 3.5). The KRB_SAFE
|
|
message (section 3.4) can be used to assure integrity.
|
|
|
|
3.3. The Ticket-Granting Service (TGS) Exchange
|
|
|
|
Summary
|
|
|
|
Message direction Message type Section
|
|
1. Client to Kerberos KRB_TGS_REQ 5.4.1
|
|
2. Kerberos to client KRB_TGS_REP or 5.4.2
|
|
KRB_ERROR 5.9.1
|
|
|
|
The TGS exchange between a client and the Kerberos Ticket-Granting
|
|
Server is initiated by a client when it wishes to obtain
|
|
authentication credentials for a given server (which might be
|
|
registered in a remote realm), when it wishes to renew or validate an
|
|
existing ticket, or when it wishes to obtain a proxy ticket. In the
|
|
first case, the client must already have acquired a ticket for the
|
|
Ticket-Granting Service using the AS exchange (the ticket-granting
|
|
ticket is usually obtained when a client initially authenticates to
|
|
the system, such as when a user logs in). The message format for the
|
|
TGS exchange is almost identical to that for the AS exchange. The
|
|
primary difference is that encryption and decryption in the TGS
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 24]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
exchange does not take place under the client's key. Instead, the
|
|
session key from the ticket-granting ticket or renewable ticket, or
|
|
sub-session key from an Authenticator is used. As is the case for
|
|
all application servers, expired tickets are not accepted by the TGS,
|
|
so once a renewable or ticket-granting ticket expires, the client
|
|
must use a separate exchange to obtain valid tickets.
|
|
|
|
The TGS exchange consists of two messages: A request (KRB_TGS_REQ)
|
|
from the client to the Kerberos Ticket-Granting Server, and a reply
|
|
(KRB_TGS_REP or KRB_ERROR). The KRB_TGS_REQ message includes
|
|
information authenticating the client plus a request for credentials.
|
|
The authentication information consists of the authentication header
|
|
(KRB_AP_REQ) which includes the client's previously obtained ticket-
|
|
granting, renewable, or invalid ticket. In the ticket-granting
|
|
ticket and proxy cases, the request may include one or more of: a
|
|
list of network addresses, a collection of typed authorization data
|
|
to be sealed in the ticket for authorization use by the application
|
|
server, or additional tickets (the use of which are described later).
|
|
The TGS reply (KRB_TGS_REP) contains the requested credentials,
|
|
encrypted in the session key from the ticket-granting ticket or
|
|
renewable ticket, or if present, in the subsession key from the
|
|
Authenticator (part of the authentication header). The KRB_ERROR
|
|
message contains an error code and text explaining what went wrong.
|
|
The KRB_ERROR message is not encrypted. The KRB_TGS_REP message
|
|
contains information which can be used to detect replays, and to
|
|
associate it with the message to which it replies. The KRB_ERROR
|
|
message also contains information which can be used to associate it
|
|
with the message to which it replies, but the lack of encryption in
|
|
the KRB_ERROR message precludes the ability to detect replays or
|
|
fabrications of such messages.
|
|
|
|
3.3.1. Generation of KRB_TGS_REQ message
|
|
|
|
Before sending a request to the ticket-granting service, the client
|
|
must determine in which realm the application server is registered
|
|
[Note: This can be accomplished in several ways. It might be known
|
|
beforehand (since the realm is part of the principal identifier), or
|
|
it might be stored in a nameserver. Presently, however, this
|
|
information is obtained from a configuration file. If the realm to
|
|
be used is obtained from a nameserver, there is a danger of being
|
|
spoofed if the nameservice providing the realm name is not
|
|
authenticated. This might result in the use of a realm which has
|
|
been compromised, and would result in an attacker's ability to
|
|
compromise the authentication of the application server to the
|
|
client.]. If the client does not already possess a ticket-granting
|
|
ticket for the appropriate realm, then one must be obtained. This is
|
|
first attempted by requesting a ticket-granting ticket for the
|
|
destination realm from the local Kerberos server (using the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 25]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
KRB_TGS_REQ message recursively). The Kerberos server may return a
|
|
TGT for the desired realm in which case one can proceed.
|
|
Alternatively, the Kerberos server may return a TGT for a realm which
|
|
is "closer" to the desired realm (further along the standard
|
|
hierarchical path), in which case this step must be repeated with a
|
|
Kerberos server in the realm specified in the returned TGT. If
|
|
neither are returned, then the request must be retried with a
|
|
Kerberos server for a realm higher in the hierarchy. This request
|
|
will itself require a ticket-granting ticket for the higher realm
|
|
which must be obtained by recursively applying these directions.
|
|
|
|
Once the client obtains a ticket-granting ticket for the appropriate
|
|
realm, it determines which Kerberos servers serve that realm, and
|
|
contacts one. The list might be obtained through a configuration file
|
|
or network service; as long as the secret keys exchanged by realms
|
|
are kept secret, only denial of service results from a false Kerberos
|
|
server.
|
|
|
|
As in the AS exchange, the client may specify a number of options in
|
|
the KRB_TGS_REQ message. The client prepares the KRB_TGS_REQ
|
|
message, providing an authentication header as an element of the
|
|
padata field, and including the same fields as used in the KRB_AS_REQ
|
|
message along with several optional fields: the enc-authorization-
|
|
data field for application server use and additional tickets required
|
|
by some options.
|
|
|
|
In preparing the authentication header, the client can select a sub-
|
|
session key under which the response from the Kerberos server will be
|
|
encrypted (If the client selects a sub-session key, care must be
|
|
taken to ensure the randomness of the selected subsession key. One
|
|
approach would be to generate a random number and XOR it with the
|
|
session key from the ticket-granting ticket.). If the sub-session key
|
|
is not specified, the session key from the ticket-granting ticket
|
|
will be used. If the enc-authorization-data is present, it must be
|
|
encrypted in the sub-session key, if present, from the authenticator
|
|
portion of the authentication header, or if not present in the
|
|
session key from the ticket-granting ticket.
|
|
|
|
Once prepared, the message is sent to a Kerberos server for the
|
|
destination realm. See section A.5 for pseudocode.
|
|
|
|
3.3.2. Receipt of KRB_TGS_REQ message
|
|
|
|
The KRB_TGS_REQ message is processed in a manner similar to the
|
|
KRB_AS_REQ message, but there are many additional checks to be
|
|
performed. First, the Kerberos server must determine which server
|
|
the accompanying ticket is for and it must select the appropriate key
|
|
to decrypt it. For a normal KRB_TGS_REQ message, it will be for the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 26]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
ticket granting service, and the TGS's key will be used. If the TGT
|
|
was issued by another realm, then the appropriate inter-realm key
|
|
must be used. If the accompanying ticket is not a ticket granting
|
|
ticket for the current realm, but is for an application server in the
|
|
current realm, the RENEW, VALIDATE, or PROXY options are specified in
|
|
the request, and the server for which a ticket is requested is the
|
|
server named in the accompanying ticket, then the KDC will decrypt
|
|
the ticket in the authentication header using the key of the server
|
|
for which it was issued. If no ticket can be found in the padata
|
|
field, the KDC_ERR_PADATA_TYPE_NOSUPP error is returned.
|
|
|
|
Once the accompanying ticket has been decrypted, the user-supplied
|
|
checksum in the Authenticator must be verified against the contents
|
|
of the request, and the message rejected if the checksums do not
|
|
match (with an error code of KRB_AP_ERR_MODIFIED) or if the checksum
|
|
is not keyed or not collision-proof (with an error code of
|
|
KRB_AP_ERR_INAPP_CKSUM). If the checksum type is not supported, the
|
|
KDC_ERR_SUMTYPE_NOSUPP error is returned. If the authorization-data
|
|
are present, they are decrypted using the sub-session key from the
|
|
Authenticator.
|
|
|
|
If any of the decryptions indicate failed integrity checks, the
|
|
KRB_AP_ERR_BAD_INTEGRITY error is returned.
|
|
|
|
3.3.3. Generation of KRB_TGS_REP message
|
|
|
|
The KRB_TGS_REP message shares its format with the KRB_AS_REP
|
|
(KRB_KDC_REP), but with its type field set to KRB_TGS_REP. The
|
|
detailed specification is in section 5.4.2.
|
|
|
|
The response will include a ticket for the requested server. The
|
|
Kerberos database is queried to retrieve the record for the requested
|
|
server (including the key with which the ticket will be encrypted).
|
|
If the request is for a ticket granting ticket for a remote realm,
|
|
and if no key is shared with the requested realm, then the Kerberos
|
|
server will select the realm "closest" to the requested realm with
|
|
which it does share a key, and use that realm instead. This is the
|
|
only case where the response from the KDC will be for a different
|
|
server than that requested by the client.
|
|
|
|
By default, the address field, the client's name and realm, the list
|
|
of transited realms, the time of initial authentication, the
|
|
expiration time, and the authorization data of the newly-issued
|
|
ticket will be copied from the ticket-granting ticket (TGT) or
|
|
renewable ticket. If the transited field needs to be updated, but
|
|
the transited type is not supported, the KDC_ERR_TRTYPE_NOSUPP error
|
|
is returned.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 27]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
If the request specifies an endtime, then the endtime of the new
|
|
ticket is set to the minimum of (a) that request, (b) the endtime
|
|
from the TGT, and (c) the starttime of the TGT plus the minimum of
|
|
the maximum life for the application server and the maximum life for
|
|
the local realm (the maximum life for the requesting principal was
|
|
already applied when the TGT was issued). If the new ticket is to be
|
|
a renewal, then the endtime above is replaced by the minimum of (a)
|
|
the value of the renew_till field of the ticket and (b) the starttime
|
|
for the new ticket plus the life (endtimestarttime) of the old
|
|
ticket.
|
|
|
|
If the FORWARDED option has been requested, then the resulting ticket
|
|
will contain the addresses specified by the client. This option will
|
|
only be honored if the FORWARDABLE flag is set in the TGT. The PROXY
|
|
option is similar; the resulting ticket will contain the addresses
|
|
specified by the client. It will be honored only if the PROXIABLE
|
|
flag in the TGT is set. The PROXY option will not be honored on
|
|
requests for additional ticket-granting tickets.
|
|
|
|
If the requested start time is absent or indicates a time in the
|
|
past, then the start time of the ticket is set to the authentication
|
|
server's current time. If it indicates a time in the future, but the
|
|
POSTDATED option has not been specified or the MAY-POSTDATE flag is
|
|
not set in the TGT, then the error KDC_ERR_CANNOT_POSTDATE is
|
|
returned. Otherwise, if the ticket-granting ticket has the
|
|
MAYPOSTDATE flag set, then the resulting ticket will be postdated and
|
|
the requested starttime is checked against the policy of the local
|
|
realm. If acceptable, the ticket's start time is set as requested,
|
|
and the INVALID flag is set. The postdated ticket must be validated
|
|
before use by presenting it to the KDC after the starttime has been
|
|
reached. However, in no case may the starttime, endtime, or renew-
|
|
till time of a newly-issued postdated ticket extend beyond the
|
|
renew-till time of the ticket-granting ticket.
|
|
|
|
If the ENC-TKT-IN-SKEY option has been specified and an additional
|
|
ticket has been included in the request, the KDC will decrypt the
|
|
additional ticket using the key for the server to which the
|
|
additional ticket was issued and verify that it is a ticket-granting
|
|
ticket. If the name of the requested server is missing from the
|
|
request, the name of the client in the additional ticket will be
|
|
used. Otherwise the name of the requested server will be compared to
|
|
the name of the client in the additional ticket and if different, the
|
|
request will be rejected. If the request succeeds, the session key
|
|
from the additional ticket will be used to encrypt the new ticket
|
|
that is issued instead of using the key of the server for which the
|
|
new ticket will be used (This allows easy implementation of user-to-
|
|
user authentication [6], which uses ticket-granting ticket session
|
|
keys in lieu of secret server keys in situations where such secret
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 28]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
keys could be easily compromised.).
|
|
|
|
If the name of the server in the ticket that is presented to the KDC
|
|
as part of the authentication header is not that of the ticket-
|
|
granting server itself, and the server is registered in the realm of
|
|
the KDC, If the RENEW option is requested, then the KDC will verify
|
|
that the RENEWABLE flag is set in the ticket and that the renew_till
|
|
time is still in the future. If the VALIDATE option is rqeuested,
|
|
the KDC will check that the starttime has passed and the INVALID flag
|
|
is set. If the PROXY option is requested, then the KDC will check
|
|
that the PROXIABLE flag is set in the ticket. If the tests succeed,
|
|
the KDC will issue the appropriate new ticket.
|
|
|
|
Whenever a request is made to the ticket-granting server, the
|
|
presented ticket(s) is(are) checked against a hot-list of tickets
|
|
which have been canceled. This hot-list might be implemented by
|
|
storing a range of issue dates for "suspect tickets"; if a presented
|
|
ticket had an authtime in that range, it would be rejected. In this
|
|
way, a stolen ticket-granting ticket or renewable ticket cannot be
|
|
used to gain additional tickets (renewals or otherwise) once the
|
|
theft has been reported. Any normal ticket obtained before it was
|
|
reported stolen will still be valid (because they require no
|
|
interaction with the KDC), but only until their normal expiration
|
|
time.
|
|
|
|
The ciphertext part of the response in the KRB_TGS_REP message is
|
|
encrypted in the sub-session key from the Authenticator, if present,
|
|
or the session key key from the ticket-granting ticket. It is not
|
|
encrypted using the client's secret key. Furthermore, the client's
|
|
key's expiration date and the key version number fields are left out
|
|
since these values are stored along with the client's database
|
|
record, and that record is not needed to satisfy a request based on a
|
|
ticket-granting ticket. See section A.6 for pseudocode.
|
|
|
|
3.3.3.1. Encoding the transited field
|
|
|
|
If the identity of the server in the TGT that is presented to the KDC
|
|
as part of the authentication header is that of the ticket-granting
|
|
service, but the TGT was issued from another realm, the KDC will look
|
|
up the inter-realm key shared with that realm and use that key to
|
|
decrypt the ticket. If the ticket is valid, then the KDC will honor
|
|
the request, subject to the constraints outlined above in the section
|
|
describing the AS exchange. The realm part of the client's identity
|
|
will be taken from the ticket-granting ticket. The name of the realm
|
|
that issued the ticket-granting ticket will be added to the transited
|
|
field of the ticket to be issued. This is accomplished by reading
|
|
the transited field from the ticket-granting ticket (which is treated
|
|
as an unordered set of realm names), adding the new realm to the set,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 29]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
then constructing and writing out its encoded (shorthand) form (this
|
|
may involve a rearrangement of the existing encoding).
|
|
|
|
Note that the ticket-granting service does not add the name of its
|
|
own realm. Instead, its responsibility is to add the name of the
|
|
previous realm. This prevents a malicious Kerberos server from
|
|
intentionally leaving out its own name (it could, however, omit other
|
|
realms' names).
|
|
|
|
The names of neither the local realm nor the principal's realm are to
|
|
be included in the transited field. They appear elsewhere in the
|
|
ticket and both are known to have taken part in authenticating the
|
|
principal. Since the endpoints are not included, both local and
|
|
single-hop inter-realm authentication result in a transited field
|
|
that is empty.
|
|
|
|
Because the name of each realm transited is added to this field,
|
|
it might potentially be very long. To decrease the length of this
|
|
field, its contents are encoded. The initially supported encoding is
|
|
optimized for the normal case of inter-realm communication: a
|
|
hierarchical arrangement of realms using either domain or X.500 style
|
|
realm names. This encoding (called DOMAIN-X500-COMPRESS) is now
|
|
described.
|
|
|
|
Realm names in the transited field are separated by a ",". The ",",
|
|
"\", trailing "."s, and leading spaces (" ") are special characters,
|
|
and if they are part of a realm name, they must be quoted in the
|
|
transited field by preceding them with a "\".
|
|
|
|
A realm name ending with a "." is interpreted as being prepended to
|
|
the previous realm. For example, we can encode traversal of EDU,
|
|
MIT.EDU, ATHENA.MIT.EDU, WASHINGTON.EDU, and CS.WASHINGTON.EDU as:
|
|
|
|
"EDU,MIT.,ATHENA.,WASHINGTON.EDU,CS.".
|
|
|
|
Note that if ATHENA.MIT.EDU, or CS.WASHINGTON.EDU were endpoints,
|
|
that they would not be included in this field, and we would have:
|
|
|
|
"EDU,MIT.,WASHINGTON.EDU"
|
|
|
|
A realm name beginning with a "/" is interpreted as being appended to
|
|
the previous realm (For the purpose of appending, the realm preceding
|
|
the first listed realm is considered to be the null realm ("")). If
|
|
it is to stand by itself, then it should be preceded by a space ("
|
|
"). For example, we can encode traversal of /COM/HP/APOLLO, /COM/HP,
|
|
/COM, and /COM/DEC as:
|
|
|
|
"/COM,/HP,/APOLLO, /COM/DEC".
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 30]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Like the example above, if /COM/HP/APOLLO and /COM/DEC are endpoints,
|
|
they they would not be included in this field, and we would have:
|
|
|
|
"/COM,/HP"
|
|
|
|
A null subfield preceding or following a "," indicates that all
|
|
realms between the previous realm and the next realm have been
|
|
traversed (For the purpose of interpreting null subfields, the
|
|
client's realm is considered to precede those in the transited field,
|
|
and the server's realm is considered to follow them.). Thus, ","
|
|
means that all realms along the path between the client and the
|
|
server have been traversed. ",EDU, /COM," means that that all realms
|
|
from the client's realm up to EDU (in a domain style hierarchy) have
|
|
been traversed, and that everything from /COM down to the server's
|
|
realm in an X.500 style has also been traversed. This could occur if
|
|
the EDU realm in one hierarchy shares an inter-realm key directly
|
|
with the /COM realm in another hierarchy.
|
|
|
|
3.3.4. Receipt of KRB_TGS_REP message
|
|
|
|
When the KRB_TGS_REP is received by the client, it is processed in
|
|
the same manner as the KRB_AS_REP processing described above. The
|
|
primary difference is that the ciphertext part of the response must
|
|
be decrypted using the session key from the ticket-granting ticket
|
|
rather than the client's secret key. See section A.7 for pseudocode.
|
|
|
|
3.4. The KRB_SAFE Exchange
|
|
|
|
The KRB_SAFE message may be used by clients requiring the ability to
|
|
detect modifications of messages they exchange. It achieves this by
|
|
including a keyed collisionproof checksum of the user data and some
|
|
control information. The checksum is keyed with an encryption key
|
|
(usually the last key negotiated via subkeys, or the session key if
|
|
no negotiation has occured).
|
|
|
|
3.4.1. Generation of a KRB_SAFE message
|
|
|
|
When an application wishes to send a KRB_SAFE message, it collects
|
|
its data and the appropriate control information and computes a
|
|
checksum over them. The checksum algorithm should be some sort of
|
|
keyed one-way hash function (such as the RSA-MD5-DES checksum
|
|
algorithm specified in section 6.4.5, or the DES MAC), generated
|
|
using the sub-session key if present, or the session key. Different
|
|
algorithms may be selected by changing the checksum type in the
|
|
message. Unkeyed or non-collision-proof checksums are not suitable
|
|
for this use.
|
|
|
|
The control information for the KRB_SAFE message includes both a
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 31]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
timestamp and a sequence number. The designer of an application
|
|
using the KRB_SAFE message must choose at least one of the two
|
|
mechanisms. This choice should be based on the needs of the
|
|
application protocol.
|
|
|
|
Sequence numbers are useful when all messages sent will be received
|
|
by one's peer. Connection state is presently required to maintain
|
|
the session key, so maintaining the next sequence number should not
|
|
present an additional problem.
|
|
|
|
If the application protocol is expected to tolerate lost messages
|
|
without them being resent, the use of the timestamp is the
|
|
appropriate replay detection mechanism. Using timestamps is also the
|
|
appropriate mechanism for multi-cast protocols where all of one's
|
|
peers share a common sub-session key, but some messages will be sent
|
|
to a subset of one's peers.
|
|
|
|
After computing the checksum, the client then transmits the
|
|
information and checksum to the recipient in the message format
|
|
specified in section 5.6.1.
|
|
|
|
3.4.2. Receipt of KRB_SAFE message
|
|
|
|
When an application receives a KRB_SAFE message, it verifies it as
|
|
follows. If any error occurs, an error code is reported for use by
|
|
the application.
|
|
|
|
The message is first checked by verifying that the protocol version
|
|
and type fields match the current version and KRB_SAFE, respectively.
|
|
A mismatch generates a KRB_AP_ERR_BADVERSION or KRB_AP_ERR_MSG_TYPE
|
|
error. The application verifies that the checksum used is a
|
|
collisionproof keyed checksum, and if it is not, a
|
|
KRB_AP_ERR_INAPP_CKSUM error is generated. The recipient verifies
|
|
that the operating system's report of the sender's address matches
|
|
the sender's address in the message, and (if a recipient address is
|
|
specified or the recipient requires an address) that one of the
|
|
recipient's addresses appears as the recipient's address in the
|
|
message. A failed match for either case generates a
|
|
KRB_AP_ERR_BADADDR error. Then the timestamp and usec and/or the
|
|
sequence number fields are checked. If timestamp and usec are
|
|
expected and not present, or they are present but not current, the
|
|
KRB_AP_ERR_SKEW error is generated. If the server name, along with
|
|
the client name, time and microsecond fields from the Authenticator
|
|
match any recently-seen such tuples, the KRB_AP_ERR_REPEAT error is
|
|
generated. If an incorrect sequence number is included, or a
|
|
sequence number is expected but not present, the KRB_AP_ERR_BADORDER
|
|
error is generated. If neither a timestamp and usec or a sequence
|
|
number is present, a KRB_AP_ERR_MODIFIED error is generated.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 32]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Finally, the checksum is computed over the data and control
|
|
information, and if it doesn't match the received checksum, a
|
|
KRB_AP_ERR_MODIFIED error is generated.
|
|
|
|
If all the checks succeed, the application is assured that the
|
|
message was generated by its peer and was not modified in transit.
|
|
|
|
3.5. The KRB_PRIV Exchange
|
|
|
|
The KRB_PRIV message may be used by clients requiring confidentiality
|
|
and the ability to detect modifications of exchanged messages. It
|
|
achieves this by encrypting the messages and adding control
|
|
information.
|
|
|
|
3.5.1. Generation of a KRB_PRIV message
|
|
|
|
When an application wishes to send a KRB_PRIV message, it collects
|
|
its data and the appropriate control information (specified in
|
|
section 5.7.1) and encrypts them under an encryption key (usually the
|
|
last key negotiated via subkeys, or the session key if no negotiation
|
|
has occured). As part of the control information, the client must
|
|
choose to use either a timestamp or a sequence number (or both); see
|
|
the discussion in section 3.4.1 for guidelines on which to use.
|
|
After the user data and control information are encrypted, the client
|
|
transmits the ciphertext and some "envelope" information to the
|
|
recipient.
|
|
|
|
3.5.2. Receipt of KRB_PRIV message
|
|
|
|
When an application receives a KRB_PRIV message, it verifies it as
|
|
follows. If any error occurs, an error code is reported for use by
|
|
the application.
|
|
|
|
The message is first checked by verifying that the protocol version
|
|
and type fields match the current version and KRB_PRIV, respectively.
|
|
A mismatch generates a KRB_AP_ERR_BADVERSION or KRB_AP_ERR_MSG_TYPE
|
|
error. The application then decrypts the ciphertext and processes
|
|
the resultant plaintext. If decryption shows the data to have been
|
|
modified, a KRB_AP_ERR_BAD_INTEGRITY error is generated. The
|
|
recipient verifies that the operating system's report of the sender's
|
|
address matches the sender's address in the message, and (if a
|
|
recipient address is specified or the recipient requires an address)
|
|
that one of the recipient's addresses appears as the recipient's
|
|
address in the message. A failed match for either case generates a
|
|
KRB_AP_ERR_BADADDR error. Then the timestamp and usec and/or the
|
|
sequence number fields are checked. If timestamp and usec are
|
|
expected and not present, or they are present but not current, the
|
|
KRB_AP_ERR_SKEW error is generated. If the server name, along with
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 33]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
the client name, time and microsecond fields from the Authenticator
|
|
match any recently-seen such tuples, the KRB_AP_ERR_REPEAT error is
|
|
generated. If an incorrect sequence number is included, or a
|
|
sequence number is expected but not present, the KRB_AP_ERR_BADORDER
|
|
error is generated. If neither a timestamp and usec or a sequence
|
|
number is present, a KRB_AP_ERR_MODIFIED error is generated.
|
|
|
|
If all the checks succeed, the application can assume the message was
|
|
generated by its peer, and was securely transmitted (without
|
|
intruders able to see the unencrypted contents).
|
|
|
|
3.6. The KRB_CRED Exchange
|
|
|
|
The KRB_CRED message may be used by clients requiring the ability to
|
|
send Kerberos credentials from one host to another. It achieves this
|
|
by sending the tickets together with encrypted data containing the
|
|
session keys and other information associated with the tickets.
|
|
|
|
3.6.1. Generation of a KRB_CRED message
|
|
|
|
When an application wishes to send a KRB_CRED message it first (using
|
|
the KRB_TGS exchange) obtains credentials to be sent to the remote
|
|
host. It then constructs a KRB_CRED message using the ticket or
|
|
tickets so obtained, placing the session key needed to use each
|
|
ticket in the key field of the corresponding KrbCredInfo sequence of
|
|
the encrypted part of the the KRB_CRED message.
|
|
|
|
Other information associated with each ticket and obtained during the
|
|
KRB_TGS exchange is also placed in the corresponding KrbCredInfo
|
|
sequence in the encrypted part of the KRB_CRED message. The current
|
|
time and, if specifically required by the application the nonce, s-
|
|
address, and raddress fields, are placed in the encrypted part of the
|
|
KRB_CRED message which is then encrypted under an encryption key
|
|
previosuly exchanged in the KRB_AP exchange (usually the last key
|
|
negotiated via subkeys, or the session key if no negotiation has
|
|
occured).
|
|
|
|
3.6.2. Receipt of KRB_CRED message
|
|
|
|
When an application receives a KRB_CRED message, it verifies it. If
|
|
any error occurs, an error code is reported for use by the
|
|
application. The message is verified by checking that the protocol
|
|
version and type fields match the current version and KRB_CRED,
|
|
respectively. A mismatch generates a KRB_AP_ERR_BADVERSION or
|
|
KRB_AP_ERR_MSG_TYPE error. The application then decrypts the
|
|
ciphertext and processes the resultant plaintext. If decryption shows
|
|
the data to have been modified, a KRB_AP_ERR_BAD_INTEGRITY error is
|
|
generated.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 34]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
If present or required, the recipient verifies that the operating
|
|
system's report of the sender's address matches the sender's address
|
|
in the message, and that one of the recipient's addresses appears as
|
|
the recipient's address in the message. A failed match for either
|
|
case generates a KRB_AP_ERR_BADADDR error. The timestamp and usec
|
|
fields (and the nonce field if required) are checked next. If the
|
|
timestamp and usec are not present, or they are present but not
|
|
current, the KRB_AP_ERR_SKEW error is generated.
|
|
|
|
If all the checks succeed, the application stores each of the new
|
|
tickets in its ticket cache together with the session key and other
|
|
information in the corresponding KrbCredInfo sequence from the
|
|
encrypted part of the KRB_CRED message.
|
|
|
|
4. The Kerberos Database
|
|
|
|
The Kerberos server must have access to a database containing the
|
|
principal identifiers and secret keys of principals to be
|
|
authenticated (The implementation of the Kerberos server need not
|
|
combine the database and the server on the same machine; it is
|
|
feasible to store the principal database in, say, a network name
|
|
service, as long as the entries stored therein are protected from
|
|
disclosure to and modification by unauthorized parties. However, we
|
|
recommend against such strategies, as they can make system management
|
|
and threat analysis quite complex.).
|
|
|
|
4.1. Database contents
|
|
|
|
A database entry should contain at least the following fields:
|
|
|
|
Field Value
|
|
|
|
name Principal's identifier
|
|
key Principal's secret key
|
|
p_kvno Principal's key version
|
|
max_life Maximum lifetime for Tickets
|
|
max_renewable_life Maximum total lifetime for renewable
|
|
Tickets
|
|
|
|
The name field is an encoding of the principal's identifier. The key
|
|
field contains an encryption key. This key is the principal's secret
|
|
key. (The key can be encrypted before storage under a Kerberos
|
|
"master key" to protect it in case the database is compromised but
|
|
the master key is not. In that case, an extra field must be added to
|
|
indicate the master key version used, see below.) The p_kvno field is
|
|
the key version number of the principal's secret key. The max_life
|
|
field contains the maximum allowable lifetime (endtime - starttime)
|
|
for any Ticket issued for this principal. The max_renewable_life
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 35]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
field contains the maximum allowable total lifetime for any renewable
|
|
Ticket issued for this principal. (See section 3.1 for a description
|
|
of how these lifetimes are used in determining the lifetime of a
|
|
given Ticket.)
|
|
|
|
A server may provide KDC service to several realms, as long as the
|
|
database representation provides a mechanism to distinguish between
|
|
principal records with identifiers which differ only in the realm
|
|
name.
|
|
|
|
When an application server's key changes, if the change is routine
|
|
(i.e., not the result of disclosure of the old key), the old key
|
|
should be retained by the server until all tickets that had been
|
|
issued using that key have expired. Because of this, it is possible
|
|
for several keys to be active for a single principal. Ciphertext
|
|
encrypted in a principal's key is always tagged with the version of
|
|
the key that was used for encryption, to help the recipient find the
|
|
proper key for decryption.
|
|
|
|
When more than one key is active for a particular principal, the
|
|
principal will have more than one record in the Kerberos database.
|
|
The keys and key version numbers will differ between the records (the
|
|
rest of the fields may or may not be the same). Whenever Kerberos
|
|
issues a ticket, or responds to a request for initial authentication,
|
|
the most recent key (known by the Kerberos server) will be used for
|
|
encryption. This is the key with the highest key version number.
|
|
|
|
4.2. Additional fields
|
|
|
|
Project Athena's KDC implementation uses additional fields in its
|
|
database:
|
|
|
|
Field Value
|
|
|
|
K_kvno Kerberos' key version
|
|
expiration Expiration date for entry
|
|
attributes Bit field of attributes
|
|
mod_date Timestamp of last modification
|
|
mod_name Modifying principal's identifier
|
|
|
|
The K_kvno field indicates the key version of the Kerberos master key
|
|
under which the principal's secret key is encrypted.
|
|
|
|
After an entry's expiration date has passed, the KDC will return an
|
|
error to any client attempting to gain tickets as or for the
|
|
principal. (A database may want to maintain two expiration dates:
|
|
one for the principal, and one for the principal's current key. This
|
|
allows password aging to work independently of the principal's
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 36]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
expiration date. However, due to the limited space in the responses,
|
|
the KDC must combine the key expiration and principal expiration date
|
|
into a single value called "key_exp", which is used as a hint to the
|
|
user to take administrative action.)
|
|
|
|
The attributes field is a bitfield used to govern the operations
|
|
involving the principal. This field might be useful in conjunction
|
|
with user registration procedures, for site-specific policy
|
|
implementations (Project Athena currently uses it for their user
|
|
registration process controlled by the system-wide database service,
|
|
Moira [7]), or to identify the "string to key" conversion algorithm
|
|
used for a principal's key. (See the discussion of the padata field
|
|
in section 5.4.2 for details on why this can be useful.) Other bits
|
|
are used to indicate that certain ticket options should not be
|
|
allowed in tickets encrypted under a principal's key (one bit each):
|
|
Disallow issuing postdated tickets, disallow issuing forwardable
|
|
tickets, disallow issuing tickets based on TGT authentication,
|
|
disallow issuing renewable tickets, disallow issuing proxiable
|
|
tickets, and disallow issuing tickets for which the principal is the
|
|
server.
|
|
|
|
The mod_date field contains the time of last modification of the
|
|
entry, and the mod_name field contains the name of the principal
|
|
which last modified the entry.
|
|
|
|
4.3. Frequently Changing Fields
|
|
|
|
Some KDC implementations may wish to maintain the last time that a
|
|
request was made by a particular principal. Information that might
|
|
be maintained includes the time of the last request, the time of the
|
|
last request for a ticket-granting ticket, the time of the last use
|
|
of a ticket-granting ticket, or other times. This information can
|
|
then be returned to the user in the last-req field (see section 5.2).
|
|
|
|
Other frequently changing information that can be maintained is the
|
|
latest expiration time for any tickets that have been issued using
|
|
each key. This field would be used to indicate how long old keys
|
|
must remain valid to allow the continued use of outstanding tickets.
|
|
|
|
4.4. Site Constants
|
|
|
|
The KDC implementation should have the following configurable
|
|
constants or options, to allow an administrator to make and enforce
|
|
policy decisions:
|
|
|
|
+ The minimum supported lifetime (used to determine whether the
|
|
KDC_ERR_NEVER_VALID error should be returned). This constant
|
|
should reflect reasonable expectations of round-trip time to the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 37]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
KDC, encryption/decryption time, and processing time by the client
|
|
and target server, and it should allow for a minimum "useful"
|
|
lifetime.
|
|
|
|
+ The maximum allowable total (renewable) lifetime of a ticket
|
|
(renew_till - starttime).
|
|
|
|
+ The maximum allowable lifetime of a ticket (endtime - starttime).
|
|
|
|
+ Whether to allow the issue of tickets with empty address fields
|
|
(including the ability to specify that such tickets may only be
|
|
issued if the request specifies some authorization_data).
|
|
|
|
+ Whether proxiable, forwardable, renewable or post-datable tickets
|
|
are to be issued.
|
|
|
|
5. Message Specifications
|
|
|
|
The following sections describe the exact contents and encoding of
|
|
protocol messages and objects. The ASN.1 base definitions are
|
|
presented in the first subsection. The remaining subsections specify
|
|
the protocol objects (tickets and authenticators) and messages.
|
|
Specification of encryption and checksum techniques, and the fields
|
|
related to them, appear in section 6.
|
|
|
|
5.1. ASN.1 Distinguished Encoding Representation
|
|
|
|
All uses of ASN.1 in Kerberos shall use the Distinguished Encoding
|
|
Representation of the data elements as described in the X.509
|
|
specification, section 8.7 [8].
|
|
|
|
5.2. ASN.1 Base Definitions
|
|
|
|
The following ASN.1 base definitions are used in the rest of this
|
|
section. Note that since the underscore character (_) is not
|
|
permitted in ASN.1 names, the hyphen (-) is used in its place for the
|
|
purposes of ASN.1 names.
|
|
|
|
Realm ::= GeneralString
|
|
PrincipalName ::= SEQUENCE {
|
|
name-type[0] INTEGER,
|
|
name-string[1] SEQUENCE OF GeneralString
|
|
}
|
|
|
|
Kerberos realms are encoded as GeneralStrings. Realms shall not
|
|
contain a character with the code 0 (the ASCII NUL). Most realms
|
|
will usually consist of several components separated by periods (.),
|
|
in the style of Internet Domain Names, or separated by slashes (/) in
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 38]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
the style of X.500 names. Acceptable forms for realm names are
|
|
specified in section 7. A PrincipalName is a typed sequence of
|
|
components consisting of the following sub-fields:
|
|
|
|
name-type This field specifies the type of name that follows.
|
|
Pre-defined values for this field are
|
|
specified in section 7.2. The name-type should be
|
|
treated as a hint. Ignoring the name type, no two
|
|
names can be the same (i.e., at least one of the
|
|
components, or the realm, must be different).
|
|
This constraint may be eliminated in the future.
|
|
|
|
name-string This field encodes a sequence of components that
|
|
form a name, each component encoded as a General
|
|
String. Taken together, a PrincipalName and a Realm
|
|
form a principal identifier. Most PrincipalNames
|
|
will have only a few components (typically one or two).
|
|
|
|
KerberosTime ::= GeneralizedTime
|
|
-- Specifying UTC time zone (Z)
|
|
|
|
The timestamps used in Kerberos are encoded as GeneralizedTimes. An
|
|
encoding shall specify the UTC time zone (Z) and shall not include
|
|
any fractional portions of the seconds. It further shall not include
|
|
any separators. Example: The only valid format for UTC time 6
|
|
minutes, 27 seconds after 9 pm on 6 November 1985 is 19851106210627Z.
|
|
|
|
HostAddress ::= SEQUENCE {
|
|
addr-type[0] INTEGER,
|
|
address[1] OCTET STRING
|
|
}
|
|
|
|
HostAddresses ::= SEQUENCE OF SEQUENCE {
|
|
addr-type[0] INTEGER,
|
|
address[1] OCTET STRING
|
|
}
|
|
|
|
|
|
The host adddress encodings consists of two fields:
|
|
|
|
addr-type This field specifies the type of address that
|
|
follows. Pre-defined values for this field are
|
|
specified in section 8.1.
|
|
|
|
|
|
address This field encodes a single address of type addr-type.
|
|
|
|
The two forms differ slightly. HostAddress contains exactly one
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 39]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
address; HostAddresses contains a sequence of possibly many
|
|
addresses.
|
|
|
|
AuthorizationData ::= SEQUENCE OF SEQUENCE {
|
|
ad-type[0] INTEGER,
|
|
ad-data[1] OCTET STRING
|
|
}
|
|
|
|
|
|
ad-data This field contains authorization data to be
|
|
interpreted according to the value of the
|
|
corresponding ad-type field.
|
|
|
|
ad-type This field specifies the format for the ad-data
|
|
subfield. All negative values are reserved for
|
|
local use. Non-negative values are reserved for
|
|
registered use.
|
|
|
|
APOptions ::= BIT STRING {
|
|
reserved(0),
|
|
use-session-key(1),
|
|
mutual-required(2)
|
|
}
|
|
|
|
|
|
TicketFlags ::= BIT STRING {
|
|
reserved(0),
|
|
forwardable(1),
|
|
forwarded(2),
|
|
proxiable(3),
|
|
proxy(4),
|
|
may-postdate(5),
|
|
postdated(6),
|
|
invalid(7),
|
|
renewable(8),
|
|
initial(9),
|
|
pre-authent(10),
|
|
hw-authent(11)
|
|
}
|
|
|
|
KDCOptions ::= BIT STRING {
|
|
reserved(0),
|
|
forwardable(1),
|
|
forwarded(2),
|
|
proxiable(3),
|
|
proxy(4),
|
|
allow-postdate(5),
|
|
postdated(6),
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 40]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
unused7(7),
|
|
renewable(8),
|
|
unused9(9),
|
|
unused10(10),
|
|
unused11(11),
|
|
renewable-ok(27),
|
|
enc-tkt-in-skey(28),
|
|
renew(30),
|
|
validate(31)
|
|
}
|
|
|
|
|
|
LastReq ::= SEQUENCE OF SEQUENCE {
|
|
lr-type[0] INTEGER,
|
|
lr-value[1] KerberosTime
|
|
}
|
|
|
|
lr-type This field indicates how the following lr-value
|
|
field is to be interpreted. Negative values indicate
|
|
that the information pertains only to the
|
|
responding server. Non-negative values pertain to
|
|
all servers for the realm.
|
|
|
|
If the lr-type field is zero (0), then no information
|
|
is conveyed by the lr-value subfield. If the
|
|
absolute value of the lr-type field is one (1),
|
|
then the lr-value subfield is the time of last
|
|
initial request for a TGT. If it is two (2), then
|
|
the lr-value subfield is the time of last initial
|
|
request. If it is three (3), then the lr-value
|
|
subfield is the time of issue for the newest
|
|
ticket-granting ticket used. If it is four (4),
|
|
then the lr-value subfield is the time of the last
|
|
renewal. If it is five (5), then the lr-value
|
|
subfield is the time of last request (of any
|
|
type).
|
|
|
|
lr-value This field contains the time of the last request.
|
|
The time must be interpreted according to the contents
|
|
of the accompanying lr-type subfield.
|
|
|
|
See section 6 for the definitions of Checksum, ChecksumType,
|
|
EncryptedData, EncryptionKey, EncryptionType, and KeyType.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 41]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
5.3. Tickets and Authenticators
|
|
|
|
This section describes the format and encryption parameters for
|
|
tickets and authenticators. When a ticket or authenticator is
|
|
included in a protocol message it is treated as an opaque object.
|
|
|
|
5.3.1. Tickets
|
|
|
|
A ticket is a record that helps a client authenticate to a service.
|
|
A Ticket contains the following information:
|
|
|
|
Ticket ::= [APPLICATION 1] SEQUENCE {
|
|
tkt-vno[0] INTEGER,
|
|
realm[1] Realm,
|
|
sname[2] PrincipalName,
|
|
enc-part[3] EncryptedData
|
|
}
|
|
-- Encrypted part of ticket
|
|
EncTicketPart ::= [APPLICATION 3] SEQUENCE {
|
|
flags[0] TicketFlags,
|
|
key[1] EncryptionKey,
|
|
crealm[2] Realm,
|
|
cname[3] PrincipalName,
|
|
transited[4] TransitedEncoding,
|
|
authtime[5] KerberosTime,
|
|
starttime[6] KerberosTime OPTIONAL,
|
|
endtime[7] KerberosTime,
|
|
renew-till[8] KerberosTime OPTIONAL,
|
|
caddr[9] HostAddresses OPTIONAL,
|
|
authorization-data[10] AuthorizationData OPTIONAL
|
|
}
|
|
-- encoded Transited field
|
|
TransitedEncoding ::= SEQUENCE {
|
|
tr-type[0] INTEGER, -- must be registered
|
|
contents[1] OCTET STRING
|
|
}
|
|
|
|
The encoding of EncTicketPart is encrypted in the key shared by
|
|
Kerberos and the end server (the server's secret key). See section 6
|
|
for the format of the ciphertext.
|
|
|
|
tkt-vno This field specifies the version number for the ticket
|
|
format. This document describes version number 5.
|
|
|
|
realm This field specifies the realm that issued a ticket. It
|
|
also serves to identify the realm part of the server's
|
|
principal identifier. Since a Kerberos server can only
|
|
issue tickets for servers within its realm, the two will
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 42]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
always be identical.
|
|
|
|
sname This field specifies the name part of the server's
|
|
identity.
|
|
|
|
enc-part This field holds the encrypted encoding of the
|
|
EncTicketPart sequence.
|
|
|
|
flags This field indicates which of various options were used or
|
|
requested when the ticket was issued. It is a bit-field,
|
|
where the selected options are indicated by the bit being
|
|
set (1), and the unselected options and reserved fields
|
|
being reset (0). Bit 0 is the most significant bit. The
|
|
encoding of the bits is specified in section 5.2. The
|
|
flags are described in more detail above in section 2. The
|
|
meanings of the flags are:
|
|
|
|
Bit(s) Name Description
|
|
|
|
0 RESERVED Reserved for future expansion of this
|
|
field.
|
|
|
|
1 FORWARDABLE The FORWARDABLE flag is normally only
|
|
interpreted by the TGS, and can be
|
|
ignored by end servers. When set,
|
|
this flag tells the ticket-granting
|
|
server that it is OK to issue a new
|
|
ticket- granting ticket with a
|
|
different network address based on
|
|
the presented ticket.
|
|
|
|
2 FORWARDED When set, this flag indicates that
|
|
the ticket has either been forwarded
|
|
or was issued based on authentication
|
|
involving a forwarded ticket-granting
|
|
ticket.
|
|
|
|
3 PROXIABLE The PROXIABLE flag is normally only
|
|
interpreted by the TGS, and can be
|
|
ignored by end servers. The PROXIABLE
|
|
flag has an interpretation identical
|
|
to that of the FORWARDABLE flag,
|
|
except that the PROXIABLE flag tells
|
|
the ticket-granting server that only
|
|
non- ticket-granting tickets may be
|
|
issued with different network
|
|
addresses.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 43]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
4 PROXY When set, this flag indicates that a
|
|
ticket is a proxy.
|
|
|
|
5 MAY-POSTDATE The MAY-POSTDATE flag is normally
|
|
only interpreted by the TGS, and can
|
|
be ignored by end servers. This flag
|
|
tells the ticket-granting server that
|
|
a post- dated ticket may be issued
|
|
based on this ticket-granting ticket.
|
|
|
|
6 POSTDATED This flag indicates that this ticket
|
|
has been postdated. The end-service
|
|
can check the authtime field to see
|
|
when the original authentication
|
|
occurred.
|
|
|
|
7 INVALID This flag indicates that a ticket is
|
|
invalid, and it must be validated by
|
|
the KDC before use. Application
|
|
servers must reject tickets which
|
|
have this flag set.
|
|
|
|
8 RENEWABLE The RENEWABLE flag is normally only
|
|
interpreted by the TGS, and can
|
|
usually be ignored by end servers
|
|
(some particularly careful servers
|
|
may wish to disallow renewable
|
|
tickets). A renewable ticket can be
|
|
used to obtain a replacement ticket
|
|
that expires at a later date.
|
|
|
|
9 INITIAL This flag indicates that this ticket
|
|
was issued using the AS protocol, and
|
|
not issued based on a ticket-granting
|
|
ticket.
|
|
|
|
10 PRE-AUTHENT This flag indicates that during
|
|
initial authentication, the client
|
|
was authenticated by the KDC before a
|
|
ticket was issued. The strength of
|
|
the preauthentication method is not
|
|
indicated, but is acceptable to the
|
|
KDC.
|
|
|
|
11 HW-AUTHENT This flag indicates that the protocol
|
|
employed for initial authentication
|
|
required the use of hardware expected
|
|
to be possessed solely by the named
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 44]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
client. The hardware authentication
|
|
method is selected by the KDC and the
|
|
strength of the method is not
|
|
indicated.
|
|
|
|
12-31 RESERVED Reserved for future use.
|
|
|
|
key This field exists in the ticket and the KDC response and is
|
|
used to pass the session key from Kerberos to the
|
|
application server and the client. The field's encoding is
|
|
described in section 6.2.
|
|
|
|
crealm This field contains the name of the realm in which the
|
|
client is registered and in which initial authentication
|
|
took place.
|
|
|
|
cname This field contains the name part of the client's principal
|
|
identifier.
|
|
|
|
transited This field lists the names of the Kerberos realms that took
|
|
part in authenticating the user to whom this ticket was
|
|
issued. It does not specify the order in which the realms
|
|
were transited. See section 3.3.3.1 for details on how
|
|
this field encodes the traversed realms.
|
|
|
|
authtime This field indicates the time of initial authentication for
|
|
the named principal. It is the time of issue for the
|
|
original ticket on which this ticket is based. It is
|
|
included in the ticket to provide additional information to
|
|
the end service, and to provide the necessary information
|
|
for implementation of a `hot list' service at the KDC. An
|
|
end service that is particularly paranoid could refuse to
|
|
accept tickets for which the initial authentication
|
|
occurred "too far" in the past.
|
|
|
|
This field is also returned as part of the response from
|
|
the KDC. When returned as part of the response to initial
|
|
authentication (KRB_AS_REP), this is the current time on
|
|
the Kerberos server (It is NOT recommended that this time
|
|
value be used to adjust the workstation's clock since the
|
|
workstation cannot reliably determine that such a
|
|
KRB_AS_REP actually came from the proper KDC in a timely
|
|
manner.).
|
|
|
|
starttime This field in the ticket specifies the time after which the
|
|
ticket is valid. Together with endtime, this field
|
|
specifies the life of the ticket. If it is absent from
|
|
the ticket, its value should be treated as that of the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 45]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
authtime field.
|
|
|
|
endtime This field contains the time after which the ticket will
|
|
not be honored (its expiration time). Note that individual
|
|
services may place their own limits on the life of a ticket
|
|
and may reject tickets which have not yet expired. As
|
|
such, this is really an upper bound on the expiration time
|
|
for the ticket.
|
|
|
|
renew-till This field is only present in tickets that have the
|
|
RENEWABLE flag set in the flags field. It indicates the
|
|
maximum endtime that may be included in a renewal. It can
|
|
be thought of as the absolute expiration time for the
|
|
ticket, including all renewals.
|
|
|
|
caddr This field in a ticket contains zero (if omitted) or more
|
|
(if present) host addresses. These are the addresses from
|
|
which the ticket can be used. If there are no addresses,
|
|
the ticket can be used from any location. The decision
|
|
by the KDC to issue or by the end server to accept zero-
|
|
address tickets is a policy decision and is left to the
|
|
Kerberos and end-service administrators; they may refuse to
|
|
issue or accept such tickets. The suggested and default
|
|
policy, however, is that such tickets will only be issued
|
|
or accepted when additional information that can be used to
|
|
restrict the use of the ticket is included in the
|
|
authorization_data field. Such a ticket is a capability.
|
|
|
|
Network addresses are included in the ticket to make it
|
|
harder for an attacker to use stolen credentials. Because
|
|
the session key is not sent over the network in cleartext,
|
|
credentials can't be stolen simply by listening to the
|
|
network; an attacker has to gain access to the session key
|
|
(perhaps through operating system security breaches or a
|
|
careless user's unattended session) to make use of stolen
|
|
tickets.
|
|
|
|
It is important to note that the network address from which
|
|
a connection is received cannot be reliably determined.
|
|
Even if it could be, an attacker who has compromised the
|
|
client's workstation could use the credentials from there.
|
|
Including the network addresses only makes it more
|
|
difficult, not impossible, for an attacker to walk off with
|
|
stolen credentials and then use them from a "safe"
|
|
location.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 46]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
authorization-data The authorization-data field is used to pass
|
|
authorization data from the principal on whose behalf a
|
|
ticket was issued to the application service. If no
|
|
authorization data is included, this field will be left
|
|
out. The data in this field are specific to the end
|
|
service. It is expected that the field will contain the
|
|
names of service specific objects, and the rights to those
|
|
objects. The format for this field is described in section
|
|
5.2. Although Kerberos is not concerned with the format of
|
|
the contents of the subfields, it does carry type
|
|
information (ad-type).
|
|
|
|
By using the authorization_data field, a principal is able
|
|
to issue a proxy that is valid for a specific purpose. For
|
|
example, a client wishing to print a file can obtain a file
|
|
server proxy to be passed to the print server. By
|
|
specifying the name of the file in the authorization_data
|
|
field, the file server knows that the print server can only
|
|
use the client's rights when accessing the particular file
|
|
to be printed.
|
|
|
|
It is interesting to note that if one specifies the
|
|
authorization-data field of a proxy and leaves the host
|
|
addresses blank, the resulting ticket and session key can
|
|
be treated as a capability. See [9] for some suggested
|
|
uses of this field.
|
|
|
|
The authorization-data field is optional and does not have
|
|
to be included in a ticket.
|
|
|
|
5.3.2. Authenticators
|
|
|
|
An authenticator is a record sent with a ticket to a server to
|
|
certify the client's knowledge of the encryption key in the ticket,
|
|
to help the server detect replays, and to help choose a "true session
|
|
key" to use with the particular session. The encoding is encrypted
|
|
in the ticket's session key shared by the client and the server:
|
|
|
|
-- Unencrypted authenticator
|
|
Authenticator ::= [APPLICATION 2] SEQUENCE {
|
|
authenticator-vno[0] INTEGER,
|
|
crealm[1] Realm,
|
|
cname[2] PrincipalName,
|
|
cksum[3] Checksum OPTIONAL,
|
|
cusec[4] INTEGER,
|
|
ctime[5] KerberosTime,
|
|
subkey[6] EncryptionKey OPTIONAL,
|
|
seq-number[7] INTEGER OPTIONAL,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 47]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
authorization-data[8] AuthorizationData OPTIONAL
|
|
}
|
|
|
|
authenticator-vno This field specifies the version number for the
|
|
format of the authenticator. This document specifies
|
|
version 5.
|
|
|
|
crealm and cname These fields are the same as those described for the
|
|
ticket in section 5.3.1.
|
|
|
|
cksum This field contains a checksum of the the application data
|
|
that accompanies the KRB_AP_REQ.
|
|
|
|
cusec This field contains the microsecond part of the client's
|
|
timestamp. Its value (before encryption) ranges from 0 to
|
|
999999. It often appears along with ctime. The two fields
|
|
are used together to specify a reasonably accurate
|
|
timestamp.
|
|
|
|
ctime This field contains the current time on the client's host.
|
|
|
|
subkey This field contains the client's choice for an encryption
|
|
key which is to be used to protect this specific
|
|
application session. Unless an application specifies
|
|
otherwise, if this field is left out the session key from
|
|
the ticket will be used.
|
|
|
|
seq-number This optional field includes the initial sequence number
|
|
to be used by the KRB_PRIV or KRB_SAFE messages when
|
|
sequence numbers are used to detect replays (It may also be
|
|
used by application specific messages). When included in
|
|
the authenticator this field specifies the initial sequence
|
|
number for messages from the client to the server. When
|
|
included in the AP-REP message, the initial sequence number
|
|
is that for messages from the server to the client. When
|
|
used in KRB_PRIV or KRB_SAFE messages, it is incremented by
|
|
one after each message is sent.
|
|
|
|
For sequence numbers to adequately support the detection of
|
|
replays they should be non-repeating, even across
|
|
connection boundaries. The initial sequence number should
|
|
be random and uniformly distributed across the full space
|
|
of possible sequence numbers, so that it cannot be guessed
|
|
by an attacker and so that it and the successive sequence
|
|
numbers do not repeat other sequences.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 48]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
authorization-data This field is the same as described for the ticket
|
|
in section 5.3.1. It is optional and will only appear when
|
|
additional restrictions are to be placed on the use of a
|
|
ticket, beyond those carried in the ticket itself.
|
|
|
|
5.4. Specifications for the AS and TGS exchanges
|
|
|
|
This section specifies the format of the messages used in exchange
|
|
between the client and the Kerberos server. The format of possible
|
|
error messages appears in section 5.9.1.
|
|
|
|
5.4.1. KRB_KDC_REQ definition
|
|
|
|
The KRB_KDC_REQ message has no type of its own. Instead, its type is
|
|
one of KRB_AS_REQ or KRB_TGS_REQ depending on whether the request is
|
|
for an initial ticket or an additional ticket. In either case, the
|
|
message is sent from the client to the Authentication Server to
|
|
request credentials for a service.
|
|
|
|
The message fields are:
|
|
|
|
AS-REQ ::= [APPLICATION 10] KDC-REQ
|
|
TGS-REQ ::= [APPLICATION 12] KDC-REQ
|
|
|
|
KDC-REQ ::= SEQUENCE {
|
|
pvno[1] INTEGER,
|
|
msg-type[2] INTEGER,
|
|
padata[3] SEQUENCE OF PA-DATA OPTIONAL,
|
|
req-body[4] KDC-REQ-BODY
|
|
}
|
|
|
|
PA-DATA ::= SEQUENCE {
|
|
padata-type[1] INTEGER,
|
|
padata-value[2] OCTET STRING,
|
|
-- might be encoded AP-REQ
|
|
}
|
|
|
|
KDC-REQ-BODY ::= SEQUENCE {
|
|
kdc-options[0] KDCOptions,
|
|
cname[1] PrincipalName OPTIONAL,
|
|
-- Used only in AS-REQ
|
|
realm[2] Realm, -- Server's realm
|
|
-- Also client's in AS-REQ
|
|
sname[3] PrincipalName OPTIONAL,
|
|
from[4] KerberosTime OPTIONAL,
|
|
till[5] KerberosTime,
|
|
rtime[6] KerberosTime OPTIONAL,
|
|
nonce[7] INTEGER,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 49]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
etype[8] SEQUENCE OF INTEGER, -- EncryptionType,
|
|
-- in preference order
|
|
addresses[9] HostAddresses OPTIONAL,
|
|
enc-authorization-data[10] EncryptedData OPTIONAL,
|
|
-- Encrypted AuthorizationData encoding
|
|
additional-tickets[11] SEQUENCE OF Ticket OPTIONAL
|
|
}
|
|
|
|
The fields in this message are:
|
|
|
|
pvno This field is included in each message, and specifies the
|
|
protocol version number. This document specifies protocol
|
|
version 5.
|
|
|
|
msg-type This field indicates the type of a protocol message. It
|
|
will almost always be the same as the application
|
|
identifier associated with a message. It is included to
|
|
make the identifier more readily accessible to the
|
|
application. For the KDC-REQ message, this type will be
|
|
KRB_AS_REQ or KRB_TGS_REQ.
|
|
|
|
padata The padata (pre-authentication data) field contains a of
|
|
authentication information which may be needed before
|
|
credentials can be issued or decrypted. In the case of
|
|
requests for additional tickets (KRB_TGS_REQ), this field
|
|
will include an element with padata-type of PA-TGS-REQ and
|
|
data of an authentication header (ticket-granting ticket
|
|
and authenticator). The checksum in the authenticator
|
|
(which must be collisionproof) is to be computed over the
|
|
KDC-REQ-BODY encoding. In most requests for initial
|
|
authentication (KRB_AS_REQ) and most replies (KDC-REP), the
|
|
padata field will be left out.
|
|
|
|
This field may also contain information needed by certain
|
|
extensions to the Kerberos protocol. For example, it might
|
|
be used to initially verify the identity of a client before
|
|
any response is returned. This is accomplished with a
|
|
padata field with padata-type equal to PA-ENC-TIMESTAMP and
|
|
padata-value defined as follows:
|
|
|
|
padata-type ::= PA-ENC-TIMESTAMP
|
|
padata-value ::= EncryptedData -- PA-ENC-TS-ENC
|
|
|
|
PA-ENC-TS-ENC ::= SEQUENCE {
|
|
patimestamp[0] KerberosTime, -- client's time
|
|
pausec[1] INTEGER OPTIONAL
|
|
}
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 50]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
with patimestamp containing the client's time and pausec
|
|
containing the microseconds which may be omitted if a
|
|
client will not generate more than one request per second.
|
|
The ciphertext (padata-value) consists of the PA-ENC-TS-ENC
|
|
sequence, encrypted using the client's secret key.
|
|
|
|
The padata field can also contain information needed to
|
|
help the KDC or the client select the key needed for
|
|
generating or decrypting the response. This form of the
|
|
padata is useful for supporting the use of certain
|
|
"smartcards" with Kerberos. The details of such extensions
|
|
are beyond the scope of this specification. See [10] for
|
|
additional uses of this field.
|
|
|
|
padata-type The padata-type element of the padata field indicates the
|
|
way that the padata-value element is to be interpreted.
|
|
Negative values of padata-type are reserved for
|
|
unregistered use; non-negative values are used for a
|
|
registered interpretation of the element type.
|
|
|
|
req-body This field is a placeholder delimiting the extent of the
|
|
remaining fields. If a checksum is to be calculated over
|
|
the request, it is calculated over an encoding of the KDC-
|
|
REQ-BODY sequence which is enclosed within the req-body
|
|
field.
|
|
|
|
kdc-options This field appears in the KRB_AS_REQ and KRB_TGS_REQ
|
|
requests to the KDC and indicates the flags that the client
|
|
wants set on the tickets as well as other information that
|
|
is to modify the behavior of the KDC. Where appropriate,
|
|
the name of an option may be the same as the flag that is
|
|
set by that option. Although in most case, the bit in the
|
|
options field will be the same as that in the flags field,
|
|
this is not guaranteed, so it is not acceptable to simply
|
|
copy the options field to the flags field. There are
|
|
various checks that must be made before honoring an option
|
|
anyway.
|
|
|
|
The kdc_options field is a bit-field, where the selected
|
|
options are indicated by the bit being set (1), and the
|
|
unselected options and reserved fields being reset (0).
|
|
The encoding of the bits is specified in section 5.2. The
|
|
options are described in more detail above in section 2.
|
|
The meanings of the options are:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 51]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Bit(s) Name Description
|
|
|
|
0 RESERVED Reserved for future expansion of this
|
|
field.
|
|
|
|
1 FORWARDABLE The FORWARDABLE option indicates that
|
|
the ticket to be issued is to have its
|
|
forwardable flag set. It may only be
|
|
set on the initial request, or in a
|
|
subsequent request if the ticket-
|
|
granting ticket on which it is based
|
|
is also forwardable.
|
|
|
|
2 FORWARDED The FORWARDED option is only specified
|
|
in a request to the ticket-granting
|
|
server and will only be honored if the
|
|
ticket-granting ticket in the request
|
|
has its FORWARDABLE bit set. This
|
|
option indicates that this is a
|
|
request for forwarding. The
|
|
address(es) of the host from which the
|
|
resulting ticket is to be valid are
|
|
included in the addresses field of the
|
|
request.
|
|
|
|
|
|
3 PROXIABLE The PROXIABLE option indicates that
|
|
the ticket to be issued is to have its
|
|
proxiable flag set. It may only be set
|
|
on the initial request, or in a
|
|
subsequent request if the ticket-
|
|
granting ticket on which it is based
|
|
is also proxiable.
|
|
|
|
4 PROXY The PROXY option indicates that this
|
|
is a request for a proxy. This option
|
|
will only be honored if the ticket-
|
|
granting ticket in the request has its
|
|
PROXIABLE bit set. The address(es) of
|
|
the host from which the resulting
|
|
ticket is to be valid are included in
|
|
the addresses field of the request.
|
|
|
|
5 ALLOW-POSTDATE The ALLOW-POSTDATE option indicates
|
|
that the ticket to be issued is to
|
|
have its MAY-POSTDATE flag set. It
|
|
may only be set on the initial
|
|
request, or in a subsequent request if
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 52]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
the ticket-granting ticket on which it
|
|
is based also has its MAY-POSTDATE
|
|
flag set.
|
|
|
|
6 POSTDATED The POSTDATED option indicates that
|
|
this is a request for a postdated
|
|
ticket. This option will only be
|
|
honored if the ticket-granting ticket
|
|
on which it is based has its MAY-
|
|
POSTDATE flag set. The resulting
|
|
ticket will also have its INVALID flag
|
|
set, and that flag may be reset by a
|
|
subsequent request to the KDC after
|
|
the starttime in the ticket has been
|
|
reached.
|
|
|
|
7 UNUSED This option is presently unused.
|
|
|
|
8 RENEWABLE The RENEWABLE option indicates that
|
|
the ticket to be issued is to have its
|
|
RENEWABLE flag set. It may only be
|
|
set on the initial request, or when
|
|
the ticket-granting ticket on which
|
|
the request is based is also
|
|
renewable. If this option is
|
|
requested, then the rtime field in the
|
|
request contains the desired absolute
|
|
expiration time for the ticket.
|
|
|
|
9-26 RESERVED Reserved for future use.
|
|
|
|
27 RENEWABLE-OK The RENEWABLE-OK option indicates that
|
|
a renewable ticket will be acceptable
|
|
if a ticket with the requested life
|
|
cannot otherwise be provided. If a
|
|
ticket with the requested life cannot
|
|
be provided, then a renewable ticket
|
|
may be issued with a renew-till equal
|
|
to the the requested endtime. The
|
|
value of the renew-till field may
|
|
still be limited by local limits, or
|
|
limits selected by the individual
|
|
principal or server.
|
|
|
|
28 ENC-TKT-IN-SKEY This option is used only by the
|
|
ticket-granting service. The ENC-
|
|
TKT-IN-SKEY option indicates that the
|
|
ticket for the end server is to be
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 53]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
encrypted in the session key from the
|
|
additional ticket-granting ticket
|
|
provided.
|
|
|
|
29 RESERVED Reserved for future use.
|
|
|
|
30 RENEW This option is used only by the
|
|
ticket-granting service. The RENEW
|
|
option indicates that the present
|
|
request is for a renewal. The ticket
|
|
provided is encrypted in the secret
|
|
key for the server on which it is
|
|
valid. This option will only be
|
|
honored if the ticket to be renewed
|
|
has its RENEWABLE flag set and if the
|
|
time in its renew till field has not
|
|
passed. The ticket to be renewed is
|
|
passed in the padata field as part of
|
|
the authentication header.
|
|
|
|
31 VALIDATE This option is used only by the
|
|
ticket-granting service. The VALIDATE
|
|
option indicates that the request is
|
|
to validate a postdated ticket. It
|
|
will only be honored if the ticket
|
|
presented is postdated, presently has
|
|
its INVALID flag set, and would be
|
|
otherwise usable at this time. A
|
|
ticket cannot be validated before its
|
|
starttime. The ticket presented for
|
|
validation is encrypted in the key of
|
|
the server for which it is valid and
|
|
is passed in the padata field as part
|
|
of the authentication header.
|
|
|
|
cname and sname These fields are the same as those described for the
|
|
ticket in section 5.3.1. sname may only be absent when the
|
|
ENC-TKT-IN-SKEY option is specified. If absent, the name
|
|
of the server is taken from the name of the client in the
|
|
ticket passed as additional-tickets.
|
|
|
|
enc-authorization-data The enc-authorization-data, if present (and it
|
|
can only be present in the TGS_REQ form), is an encoding of
|
|
the desired authorization-data encrypted under the sub-
|
|
session key if present in the Authenticator, or
|
|
alternatively from the session key in the ticket-granting
|
|
ticket, both from the padata field in the KRB_AP_REQ.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 54]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
realm This field specifies the realm part of the server's
|
|
principal identifier. In the AS exchange, this is also the
|
|
realm part of the client's principal identifier.
|
|
|
|
from This field is included in the KRB_AS_REQ and KRB_TGS_REQ
|
|
ticket requests when the requested ticket is to be
|
|
postdated. It specifies the desired start time for the
|
|
requested ticket.
|
|
|
|
till This field contains the expiration date requested by the
|
|
client in a ticket request.
|
|
|
|
rtime This field is the requested renew-till time sent from a
|
|
client to the KDC in a ticket request. It is optional.
|
|
|
|
nonce This field is part of the KDC request and response. It it
|
|
intended to hold a random number generated by the client.
|
|
If the same number is included in the encrypted response
|
|
from the KDC, it provides evidence that the response is
|
|
fresh and has not been replayed by an attacker. Nonces
|
|
must never be re-used. Ideally, it should be gen erated
|
|
randomly, but if the correct time is known, it may suffice
|
|
(Note, however, that if the time is used as the nonce, one
|
|
must make sure that the workstation time is monotonically
|
|
increasing. If the time is ever reset backwards, there is
|
|
a small, but finite, probability that a nonce will be
|
|
reused.).
|
|
|
|
etype This field specifies the desired encryption algorithm to be
|
|
used in the response.
|
|
|
|
addresses This field is included in the initial request for tickets,
|
|
and optionally included in requests for additional tickets
|
|
from the ticket-granting server. It specifies the
|
|
addresses from which the requested ticket is to be valid.
|
|
Normally it includes the addresses for the client's host.
|
|
If a proxy is requested, this field will contain other
|
|
addresses. The contents of this field are usually copied
|
|
by the KDC into the caddr field of the resulting ticket.
|
|
|
|
additional-tickets Additional tickets may be optionally included in a
|
|
request to the ticket-granting server. If the ENC-TKT-IN-
|
|
SKEY option has been specified, then the session key from
|
|
the additional ticket will be used in place of the server's
|
|
key to encrypt the new ticket. If more than one option
|
|
which requires additional tickets has been specified, then
|
|
the additional tickets are used in the order specified by
|
|
the ordering of the options bits (see kdc-options, above).
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 55]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
The application code will be either ten (10) or twelve (12) depending
|
|
on whether the request is for an initial ticket (AS-REQ) or for an
|
|
additional ticket (TGS-REQ).
|
|
|
|
The optional fields (addresses, authorization-data and additional-
|
|
tickets) are only included if necessary to perform the operation
|
|
specified in the kdc-options field.
|
|
|
|
It should be noted that in KRB_TGS_REQ, the protocol version number
|
|
appears twice and two different message types appear: the KRB_TGS_REQ
|
|
message contains these fields as does the authentication header
|
|
(KRB_AP_REQ) that is passed in the padata field.
|
|
|
|
5.4.2. KRB_KDC_REP definition
|
|
|
|
The KRB_KDC_REP message format is used for the reply from the KDC for
|
|
either an initial (AS) request or a subsequent (TGS) request. There
|
|
is no message type for KRB_KDC_REP. Instead, the type will be either
|
|
KRB_AS_REP or KRB_TGS_REP. The key used to encrypt the ciphertext
|
|
part of the reply depends on the message type. For KRB_AS_REP, the
|
|
ciphertext is encrypted in the client's secret key, and the client's
|
|
key version number is included in the key version number for the
|
|
encrypted data. For KRB_TGS_REP, the ciphertext is encrypted in the
|
|
sub-session key from the Authenticator, or if absent, the session key
|
|
from the ticket-granting ticket used in the request. In that case,
|
|
no version number will be present in the EncryptedData sequence.
|
|
|
|
The KRB_KDC_REP message contains the following fields:
|
|
|
|
AS-REP ::= [APPLICATION 11] KDC-REP
|
|
TGS-REP ::= [APPLICATION 13] KDC-REP
|
|
|
|
KDC-REP ::= SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
padata[2] SEQUENCE OF PA-DATA OPTIONAL,
|
|
crealm[3] Realm,
|
|
cname[4] PrincipalName,
|
|
ticket[5] Ticket,
|
|
enc-part[6] EncryptedData
|
|
}
|
|
|
|
EncASRepPart ::= [APPLICATION 25[25]] EncKDCRepPart
|
|
EncTGSRepPart ::= [APPLICATION 26] EncKDCRepPart
|
|
|
|
EncKDCRepPart ::= SEQUENCE {
|
|
key[0] EncryptionKey,
|
|
last-req[1] LastReq,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 56]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
nonce[2] INTEGER,
|
|
key-expiration[3] KerberosTime OPTIONAL,
|
|
flags[4] TicketFlags,
|
|
authtime[5] KerberosTime,
|
|
starttime[6] KerberosTime OPTIONAL,
|
|
endtime[7] KerberosTime,
|
|
renew-till[8] KerberosTime OPTIONAL,
|
|
srealm[9] Realm,
|
|
sname[10] PrincipalName,
|
|
caddr[11] HostAddresses OPTIONAL
|
|
}
|
|
|
|
NOTE: In EncASRepPart, the application code in the encrypted
|
|
part of a message provides an additional check that
|
|
the message was decrypted properly.
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is either KRB_AS_REP or KRB_TGS_REP.
|
|
|
|
padata This field is described in detail in section 5.4.1. One
|
|
possible use for this field is to encode an alternate
|
|
"mix-in" string to be used with a string-to-key algorithm
|
|
(such as is described in section 6.3.2). This ability is
|
|
useful to ease transitions if a realm name needs to change
|
|
(e.g., when a company is acquired); in such a case all
|
|
existing password-derived entries in the KDC database would
|
|
be flagged as needing a special mix-in string until the
|
|
next password change.
|
|
|
|
crealm, cname, srealm and sname These fields are the same as those
|
|
described for the ticket in section 5.3.1.
|
|
|
|
ticket The newly-issued ticket, from section 5.3.1.
|
|
|
|
enc-part This field is a place holder for the ciphertext and related
|
|
information that forms the encrypted part of a message.
|
|
The description of the encrypted part of the message
|
|
follows each appearance of this field. The encrypted part
|
|
is encoded as described in section 6.1.
|
|
|
|
key This field is the same as described for the ticket in
|
|
section 5.3.1.
|
|
|
|
last-req This field is returned by the KDC and specifies the time(s)
|
|
of the last request by a principal. Depending on what
|
|
information is available, this might be the last time that
|
|
a request for a ticket-granting ticket was made, or the
|
|
last time that a request based on a ticket-granting ticket
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 57]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
was successful. It also might cover all servers for a
|
|
realm, or just the particular server. Some implementations
|
|
may display this information to the user to aid in
|
|
discovering unauthorized use of one's identity. It is
|
|
similar in spirit to the last login time displayed when
|
|
logging into timesharing systems.
|
|
|
|
nonce This field is described above in section 5.4.1.
|
|
|
|
key-expiration The key-expiration field is part of the response from
|
|
the KDC and specifies the time that the client's secret key
|
|
is due to expire. The expiration might be the result of
|
|
password aging or an account expiration. This field will
|
|
usually be left out of the TGS reply since the response to
|
|
the TGS request is encrypted in a session key and no client
|
|
information need be retrieved from the KDC database. It is
|
|
up to the application client (usually the login program) to
|
|
take appropriate action (such as notifying the user) if the
|
|
expira tion time is imminent.
|
|
|
|
flags, authtime, starttime, endtime, renew-till and caddr These
|
|
fields are duplicates of those found in the encrypted
|
|
portion of the attached ticket (see section 5.3.1),
|
|
provided so the client may verify they match the intended
|
|
request and to assist in proper ticket caching. If the
|
|
message is of type KRB_TGS_REP, the caddr field will only
|
|
be filled in if the request was for a proxy or forwarded
|
|
ticket, or if the user is substituting a subset of the
|
|
addresses from the ticket granting ticket. If the client-
|
|
requested addresses are not present or not used, then the
|
|
addresses contained in the ticket will be the same as those
|
|
included in the ticket-granting ticket.
|
|
|
|
5.5. Client/Server (CS) message specifications
|
|
|
|
This section specifies the format of the messages used for the
|
|
authentication of the client to the application server.
|
|
|
|
5.5.1. KRB_AP_REQ definition
|
|
|
|
The KRB_AP_REQ message contains the Kerberos protocol version number,
|
|
the message type KRB_AP_REQ, an options field to indicate any options
|
|
in use, and the ticket and authenticator themselves. The KRB_AP_REQ
|
|
message is often referred to as the "authentication header".
|
|
|
|
AP-REQ ::= [APPLICATION 14] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 58]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
ap-options[2] APOptions,
|
|
ticket[3] Ticket,
|
|
authenticator[4] EncryptedData
|
|
}
|
|
|
|
APOptions ::= BIT STRING {
|
|
reserved(0),
|
|
use-session-key(1),
|
|
mutual-required(2)
|
|
}
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_AP_REQ.
|
|
|
|
ap-options This field appears in the application request (KRB_AP_REQ)
|
|
and affects the way the request is processed. It is a
|
|
bit-field, where the selected options are indicated by the
|
|
bit being set (1), and the unselected options and reserved
|
|
fields being reset (0). The encoding of the bits is
|
|
specified in section 5.2. The meanings of the options are:
|
|
|
|
Bit(s) Name Description
|
|
|
|
0 RESERVED Reserved for future expansion of
|
|
this field.
|
|
|
|
1 USE-SESSION-KEYThe USE-SESSION-KEY option indicates
|
|
that the ticket the client is
|
|
presenting to a server is encrypted in
|
|
the session key from the server's
|
|
ticket-granting ticket. When this
|
|
option is not specified, the ticket is
|
|
encrypted in the server's secret key.
|
|
|
|
2 MUTUAL-REQUIREDThe MUTUAL-REQUIRED option tells the
|
|
server that the client requires mutual
|
|
authentication, and that it must
|
|
respond with a KRB_AP_REP message.
|
|
|
|
3-31 RESERVED Reserved for future use.
|
|
|
|
ticket This field is a ticket authenticating the client to the
|
|
server.
|
|
|
|
authenticator This contains the authenticator, which includes the
|
|
client's choice of a subkey. Its encoding is described in
|
|
section 5.3.2.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 59]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
5.5.2. KRB_AP_REP definition
|
|
|
|
The KRB_AP_REP message contains the Kerberos protocol version number,
|
|
the message type, and an encrypted timestamp. The message is sent in
|
|
in response to an application request (KRB_AP_REQ) where the mutual
|
|
authentication option has been selected in the ap-options field.
|
|
|
|
AP-REP ::= [APPLICATION 15] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
enc-part[2] EncryptedData
|
|
}
|
|
|
|
EncAPRepPart ::= [APPLICATION 27] SEQUENCE {
|
|
ctime[0] KerberosTime,
|
|
cusec[1] INTEGER,
|
|
subkey[2] EncryptionKey OPTIONAL,
|
|
seq-number[3] INTEGER OPTIONAL
|
|
}
|
|
|
|
NOTE: in EncAPRepPart, the application code in the encrypted part of
|
|
a message provides an additional check that the message was decrypted
|
|
properly.
|
|
|
|
The encoded EncAPRepPart is encrypted in the shared session key of
|
|
the ticket. The optional subkey field can be used in an
|
|
application-arranged negotiation to choose a per association session
|
|
key.
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_AP_REP.
|
|
|
|
enc-part This field is described above in section 5.4.2.
|
|
|
|
ctime This field contains the current time on the client's host.
|
|
|
|
cusec This field contains the microsecond part of the client's
|
|
timestamp.
|
|
|
|
subkey This field contains an encryption key which is to be used
|
|
to protect this specific application session. See section
|
|
3.2.6 for specifics on how this field is used to negotiate
|
|
a key. Unless an application specifies otherwise, if this
|
|
field is left out, the sub-session key from the
|
|
authenticator, or if also left out, the session key from
|
|
the ticket will be used.
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 60]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
5.5.3. Error message reply
|
|
|
|
If an error occurs while processing the application request, the
|
|
KRB_ERROR message will be sent in response. See section 5.9.1 for
|
|
the format of the error message. The cname and crealm fields may be
|
|
left out if the server cannot determine their appropriate values from
|
|
the corresponding KRB_AP_REQ message. If the authenticator was
|
|
decipherable, the ctime and cusec fields will contain the values from
|
|
it.
|
|
|
|
5.6. KRB_SAFE message specification
|
|
|
|
This section specifies the format of a message that can be used by
|
|
either side (client or server) of an application to send a tamper-
|
|
proof message to its peer. It presumes that a session key has
|
|
previously been exchanged (for example, by using the
|
|
KRB_AP_REQ/KRB_AP_REP messages).
|
|
|
|
5.6.1. KRB_SAFE definition
|
|
|
|
The KRB_SAFE message contains user data along with a collision-proof
|
|
checksum keyed with the session key. The message fields are:
|
|
|
|
KRB-SAFE ::= [APPLICATION 20] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
safe-body[2] KRB-SAFE-BODY,
|
|
cksum[3] Checksum
|
|
}
|
|
|
|
KRB-SAFE-BODY ::= SEQUENCE {
|
|
user-data[0] OCTET STRING,
|
|
timestamp[1] KerberosTime OPTIONAL,
|
|
usec[2] INTEGER OPTIONAL,
|
|
seq-number[3] INTEGER OPTIONAL,
|
|
s-address[4] HostAddress,
|
|
r-address[5] HostAddress OPTIONAL
|
|
}
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_SAFE.
|
|
|
|
safe-body This field is a placeholder for the body of the KRB-SAFE
|
|
message. It is to be encoded separately and then have the
|
|
checksum computed over it, for use in the cksum field.
|
|
|
|
cksum This field contains the checksum of the application data.
|
|
Checksum details are described in section 6.4. The
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 61]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
checksum is computed over the encoding of the KRB-SAFE-BODY
|
|
sequence.
|
|
|
|
user-data This field is part of the KRB_SAFE and KRB_PRIV messages
|
|
and contain the application specific data that is being
|
|
passed from the sender to the recipient.
|
|
|
|
timestamp This field is part of the KRB_SAFE and KRB_PRIV messages.
|
|
Its contents are the current time as known by the sender of
|
|
the message. By checking the timestamp, the recipient of
|
|
the message is able to make sure that it was recently
|
|
generated, and is not a replay.
|
|
|
|
usec This field is part of the KRB_SAFE and KRB_PRIV headers.
|
|
It contains the microsecond part of the timestamp.
|
|
|
|
seq-number This field is described above in section 5.3.2.
|
|
|
|
s-address This field specifies the address in use by the sender of
|
|
the message.
|
|
|
|
r-address This field specifies the address in use by the recipient of
|
|
the message. It may be omitted for some uses (such as
|
|
broadcast protocols), but the recipient may arbitrarily
|
|
reject such messages. This field along with s-address can
|
|
be used to help detect messages which have been incorrectly
|
|
or maliciously delivered to the wrong recipient.
|
|
|
|
5.7. KRB_PRIV message specification
|
|
|
|
This section specifies the format of a message that can be used by
|
|
either side (client or server) of an application to securely and
|
|
privately send a message to its peer. It presumes that a session key
|
|
has previously been exchanged (for example, by using the
|
|
KRB_AP_REQ/KRB_AP_REP messages).
|
|
|
|
5.7.1. KRB_PRIV definition
|
|
|
|
The KRB_PRIV message contains user data encrypted in the Session Key.
|
|
The message fields are:
|
|
|
|
KRB-PRIV ::= [APPLICATION 21] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
enc-part[3] EncryptedData
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 62]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
EncKrbPrivPart ::= [APPLICATION 28] SEQUENCE {
|
|
user-data[0] OCTET STRING,
|
|
timestamp[1] KerberosTime OPTIONAL,
|
|
usec[2] INTEGER OPTIONAL,
|
|
seq-number[3] INTEGER OPTIONAL,
|
|
s-address[4] HostAddress, -- sender's addr
|
|
r-address[5] HostAddress OPTIONAL
|
|
-- recip's addr
|
|
}
|
|
|
|
NOTE: In EncKrbPrivPart, the application code in the encrypted part
|
|
of a message provides an additional check that the message was
|
|
decrypted properly.
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_PRIV.
|
|
|
|
enc-part This field holds an encoding of the EncKrbPrivPart sequence
|
|
encrypted under the session key (If supported by the
|
|
encryption method in use, an initialization vector may be
|
|
passed to the encryption procedure, in order to achieve
|
|
proper cipher chaining. The initialization vector might
|
|
come from the last block of the ciphertext from the
|
|
previous KRB_PRIV message, but it is the application's
|
|
choice whether or not to use such an initialization vector.
|
|
If left out, the default initialization vector for the
|
|
encryption algorithm will be used.). This encrypted
|
|
encoding is used for the enc-part field of the KRB-PRIV
|
|
message. See section 6 for the format of the ciphertext.
|
|
|
|
user-data, timestamp, usec, s-address and r-address These fields are
|
|
described above in section 5.6.1.
|
|
|
|
seq-number This field is described above in section 5.3.2.
|
|
|
|
5.8. KRB_CRED message specification
|
|
|
|
This section specifies the format of a message that can be used to
|
|
send Kerberos credentials from one principal to another. It is
|
|
presented here to encourage a common mechanism to be used by
|
|
applications when forwarding tickets or providing proxies to
|
|
subordinate servers. It presumes that a session key has already been
|
|
exchanged perhaps by using the KRB_AP_REQ/KRB_AP_REP messages.
|
|
|
|
5.8.1. KRB_CRED definition
|
|
|
|
The KRB_CRED message contains a sequence of tickets to be sent and
|
|
information needed to use the tickets, including the session key from
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 63]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
each. The information needed to use the tickets is encryped under an
|
|
encryption key previously exchanged. The message fields are:
|
|
|
|
KRB-CRED ::= [APPLICATION 22] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER, -- KRB_CRED
|
|
tickets[2] SEQUENCE OF Ticket,
|
|
enc-part[3] EncryptedData
|
|
}
|
|
|
|
EncKrbCredPart ::= [APPLICATION 29] SEQUENCE {
|
|
ticket-info[0] SEQUENCE OF KrbCredInfo,
|
|
nonce[1] INTEGER OPTIONAL,
|
|
timestamp[2] KerberosTime OPTIONAL,
|
|
usec[3] INTEGER OPTIONAL,
|
|
s-address[4] HostAddress OPTIONAL,
|
|
r-address[5] HostAddress OPTIONAL
|
|
}
|
|
|
|
KrbCredInfo ::= SEQUENCE {
|
|
key[0] EncryptionKey,
|
|
prealm[1] Realm OPTIONAL,
|
|
pname[2] PrincipalName OPTIONAL,
|
|
flags[3] TicketFlags OPTIONAL,
|
|
authtime[4] KerberosTime OPTIONAL,
|
|
starttime[5] KerberosTime OPTIONAL,
|
|
endtime[6] KerberosTime OPTIONAL
|
|
renew-till[7] KerberosTime OPTIONAL,
|
|
srealm[8] Realm OPTIONAL,
|
|
sname[9] PrincipalName OPTIONAL,
|
|
caddr[10] HostAddresses OPTIONAL
|
|
}
|
|
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_CRED.
|
|
|
|
tickets
|
|
These are the tickets obtained from the KDC specifically
|
|
for use by the intended recipient. Successive tickets are
|
|
paired with the corresponding KrbCredInfo sequence from the
|
|
enc-part of the KRB-CRED message.
|
|
|
|
enc-part This field holds an encoding of the EncKrbCredPart sequence
|
|
encrypted under the session key shared between the sender
|
|
and the intended recipient. This encrypted encoding is
|
|
used for the enc-part field of the KRB-CRED message. See
|
|
section 6 for the format of the ciphertext.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 64]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
nonce If practical, an application may require the inclusion of a
|
|
nonce generated by the recipient of the message. If the
|
|
same value is included as the nonce in the message, it
|
|
provides evidence that the message is fresh and has not
|
|
been replayed by an attacker. A nonce must never be re-
|
|
used; it should be generated randomly by the recipient of
|
|
the message and provided to the sender of the mes sage in
|
|
an application specific manner.
|
|
|
|
timestamp and usec These fields specify the time that the KRB-CRED
|
|
message was generated. The time is used to provide
|
|
assurance that the message is fresh.
|
|
|
|
s-address and r-address These fields are described above in section
|
|
5.6.1. They are used optionally to provide additional
|
|
assurance of the integrity of the KRB-CRED message.
|
|
|
|
key This field exists in the corresponding ticket passed by the
|
|
KRB-CRED message and is used to pass the session key from
|
|
the sender to the intended recipient. The field's encoding
|
|
is described in section 6.2.
|
|
|
|
The following fields are optional. If present, they can be
|
|
associated with the credentials in the remote ticket file. If left
|
|
out, then it is assumed that the recipient of the credentials already
|
|
knows their value.
|
|
|
|
prealm and pname The name and realm of the delegated principal
|
|
identity.
|
|
|
|
flags, authtime, starttime, endtime, renew-till, srealm, sname,
|
|
and caddr These fields contain the values of the
|
|
corresponding fields from the ticket found in the ticket
|
|
field. Descriptions of the fields are identical to the
|
|
descriptions in the KDC-REP message.
|
|
|
|
5.9. Error message specification
|
|
|
|
This section specifies the format for the KRB_ERROR message. The
|
|
fields included in the message are intended to return as much
|
|
information as possible about an error. It is not expected that all
|
|
the information required by the fields will be available for all
|
|
types of errors. If the appropriate information is not available
|
|
when the message is composed, the corresponding field will be left
|
|
out of the message.
|
|
|
|
Note that since the KRB_ERROR message is not protected by any
|
|
encryption, it is quite possible for an intruder to synthesize or
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 65]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
modify such a message. In particular, this means that the client
|
|
should not use any fields in this message for security-critical
|
|
purposes, such as setting a system clock or generating a fresh
|
|
authenticator. The message can be useful, however, for advising a
|
|
user on the reason for some failure.
|
|
|
|
5.9.1. KRB_ERROR definition
|
|
|
|
The KRB_ERROR message consists of the following fields:
|
|
|
|
KRB-ERROR ::= [APPLICATION 30] SEQUENCE {
|
|
pvno[0] INTEGER,
|
|
msg-type[1] INTEGER,
|
|
ctime[2] KerberosTime OPTIONAL,
|
|
cusec[3] INTEGER OPTIONAL,
|
|
stime[4] KerberosTime,
|
|
susec[5] INTEGER,
|
|
error-code[6] INTEGER,
|
|
crealm[7] Realm OPTIONAL,
|
|
cname[8] PrincipalName OPTIONAL,
|
|
realm[9] Realm, -- Correct realm
|
|
sname[10] PrincipalName, -- Correct name
|
|
e-text[11] GeneralString OPTIONAL,
|
|
e-data[12] OCTET STRING OPTIONAL
|
|
}
|
|
|
|
pvno and msg-type These fields are described above in section 5.4.1.
|
|
msg-type is KRB_ERROR.
|
|
|
|
ctime This field is described above in section 5.4.1.
|
|
|
|
cusec This field is described above in section 5.5.2.
|
|
|
|
stime This field contains the current time on the server. It is
|
|
of type KerberosTime.
|
|
|
|
susec This field contains the microsecond part of the server's
|
|
timestamp. Its value ranges from 0 to 999. It appears
|
|
along with stime. The two fields are used in conjunction to
|
|
specify a reasonably accurate timestamp.
|
|
|
|
error-code This field contains the error code returned by Kerberos or
|
|
the server when a request fails. To interpret the value of
|
|
this field see the list of error codes in section 8.
|
|
Implementations are encouraged to provide for national
|
|
language support in the display of error messages.
|
|
|
|
crealm, cname, srealm and sname These fields are described above in
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 66]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
section 5.3.1.
|
|
|
|
e-text This field contains additional text to help explain the
|
|
error code associated with the failed request (for example,
|
|
it might include a principal name which was unknown).
|
|
|
|
e-data This field contains additional data about the error for use
|
|
by the application to help it recover from or handle the
|
|
error. If the errorcode is KDC_ERR_PREAUTH_REQUIRED, then
|
|
the e-data field will contain an encoding of a sequence of
|
|
padata fields, each corresponding to an acceptable pre-
|
|
authentication method and optionally containing data for
|
|
the method:
|
|
|
|
METHOD-DATA ::= SEQUENCE of PA-DATA
|
|
|
|
If the error-code is KRB_AP_ERR_METHOD, then the e-data field will
|
|
contain an encoding of the following sequence:
|
|
|
|
METHOD-DATA ::= SEQUENCE {
|
|
method-type[0] INTEGER,
|
|
method-data[1] OCTET STRING OPTIONAL
|
|
}
|
|
|
|
method-type will indicate the required alternate method; method-data
|
|
will contain any required additional information.
|
|
|
|
6. Encryption and Checksum Specifications
|
|
|
|
The Kerberos protocols described in this document are designed to use
|
|
stream encryption ciphers, which can be simulated using commonly
|
|
available block encryption ciphers, such as the Data Encryption
|
|
Standard [11], in conjunction with block chaining and checksum
|
|
methods [12]. Encryption is used to prove the identities of the
|
|
network entities participating in message exchanges. The Key
|
|
Distribution Center for each realm is trusted by all principals
|
|
registered in that realm to store a secret key in confidence. Proof
|
|
of knowledge of this secret key is used to verify the authenticity of
|
|
a principal.
|
|
|
|
The KDC uses the principal's secret key (in the AS exchange) or a
|
|
shared session key (in the TGS exchange) to encrypt responses to
|
|
ticket requests; the ability to obtain the secret key or session key
|
|
implies the knowledge of the appropriate keys and the identity of the
|
|
KDC. The ability of a principal to decrypt the KDC response and
|
|
present a Ticket and a properly formed Authenticator (generated with
|
|
the session key from the KDC response) to a service verifies the
|
|
identity of the principal; likewise the ability of the service to
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 67]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
extract the session key from the Ticket and prove its knowledge
|
|
thereof in a response verifies the identity of the service.
|
|
|
|
The Kerberos protocols generally assume that the encryption used is
|
|
secure from cryptanalysis; however, in some cases, the order of
|
|
fields in the encrypted portions of messages are arranged to minimize
|
|
the effects of poorly chosen keys. It is still important to choose
|
|
good keys. If keys are derived from user-typed passwords, those
|
|
passwords need to be well chosen to make brute force attacks more
|
|
difficult. Poorly chosen keys still make easy targets for intruders.
|
|
|
|
The following sections specify the encryption and checksum mechanisms
|
|
currently defined for Kerberos. The encodings, chaining, and padding
|
|
requirements for each are described. For encryption methods, it is
|
|
often desirable to place random information (often referred to as a
|
|
confounder) at the start of the message. The requirements for a
|
|
confounder are specified with each encryption mechanism.
|
|
|
|
Some encryption systems use a block-chaining method to improve the
|
|
the security characteristics of the ciphertext. However, these
|
|
chaining methods often don't provide an integrity check upon
|
|
decryption. Such systems (such as DES in CBC mode) must be augmented
|
|
with a checksum of the plaintext which can be verified at decryption
|
|
and used to detect any tampering or damage. Such checksums should be
|
|
good at detecting burst errors in the input. If any damage is
|
|
detected, the decryption routine is expected to return an error
|
|
indicating the failure of an integrity check. Each encryption type is
|
|
expected to provide and verify an appropriate checksum. The
|
|
specification of each encryption method sets out its checksum
|
|
requirements.
|
|
|
|
Finally, where a key is to be derived from a user's password, an
|
|
algorithm for converting the password to a key of the appropriate
|
|
type is included. It is desirable for the string to key function to
|
|
be one-way, and for the mapping to be different in different realms.
|
|
This is important because users who are registered in more than one
|
|
realm will often use the same password in each, and it is desirable
|
|
that an attacker compromising the Kerberos server in one realm not
|
|
obtain or derive the user's key in another.
|
|
|
|
For a discussion of the integrity characteristics of the candidate
|
|
encryption and checksum methods considered for Kerberos, the the
|
|
reader is referred to [13].
|
|
|
|
6.1. Encryption Specifications
|
|
|
|
The following ASN.1 definition describes all encrypted messages. The
|
|
enc-part field which appears in the unencrypted part of messages in
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 68]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
section 5 is a sequence consisting of an encryption type, an optional
|
|
key version number, and the ciphertext.
|
|
|
|
EncryptedData ::= SEQUENCE {
|
|
etype[0] INTEGER, -- EncryptionType
|
|
kvno[1] INTEGER OPTIONAL,
|
|
cipher[2] OCTET STRING -- ciphertext
|
|
}
|
|
|
|
etype This field identifies which encryption algorithm was used
|
|
to encipher the cipher. Detailed specifications for
|
|
selected encryption types appear later in this section.
|
|
|
|
kvno This field contains the version number of the key under
|
|
which data is encrypted. It is only present in messages
|
|
encrypted under long lasting keys, such as principals'
|
|
secret keys.
|
|
|
|
cipher This field contains the enciphered text, encoded as an
|
|
OCTET STRING.
|
|
|
|
The cipher field is generated by applying the specified encryption
|
|
algorithm to data composed of the message and algorithm-specific
|
|
inputs. Encryption mechanisms defined for use with Kerberos must
|
|
take sufficient measures to guarantee the integrity of the plaintext,
|
|
and we recommend they also take measures to protect against
|
|
precomputed dictionary attacks. If the encryption algorithm is not
|
|
itself capable of doing so, the protections can often be enhanced by
|
|
adding a checksum and a confounder.
|
|
|
|
The suggested format for the data to be encrypted includes a
|
|
confounder, a checksum, the encoded plaintext, and any necessary
|
|
padding. The msg-seq field contains the part of the protocol message
|
|
described in section 5 which is to be encrypted. The confounder,
|
|
checksum, and padding are all untagged and untyped, and their length
|
|
is exactly sufficient to hold the appropriate item. The type and
|
|
length is implicit and specified by the particular encryption type
|
|
being used (etype). The format for the data to be encrypted is
|
|
described in the following diagram:
|
|
|
|
+-----------+----------+-------------+-----+
|
|
|confounder | check | msg-seq | pad |
|
|
+-----------+----------+-------------+-----+
|
|
|
|
The format cannot be described in ASN.1, but for those who prefer an
|
|
ASN.1-like notation:
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 69]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
CipherText ::= ENCRYPTED SEQUENCE {
|
|
confounder[0] UNTAGGED OCTET STRING(conf_length) OPTIONAL,
|
|
check[1] UNTAGGED OCTET STRING(checksum_length) OPTIONAL,
|
|
msg-seq[2] MsgSequence,
|
|
pad UNTAGGED OCTET STRING(pad_length) OPTIONAL
|
|
}
|
|
|
|
In the above specification, UNTAGGED OCTET STRING(length) is the
|
|
notation for an octet string with its tag and length removed. It is
|
|
not a valid ASN.1 type. The tag bits and length must be removed from
|
|
the confounder since the purpose of the confounder is so that the
|
|
message starts with random data, but the tag and its length are
|
|
fixed. For other fields, the length and tag would be redundant if
|
|
they were included because they are specified by the encryption type.
|
|
|
|
One generates a random confounder of the appropriate length, placing
|
|
it in confounder; zeroes out check; calculates the appropriate
|
|
checksum over confounder, check, and msg-seq, placing the result in
|
|
check; adds the necessary padding; then encrypts using the specified
|
|
encryption type and the appropriate key.
|
|
|
|
Unless otherwise specified, a definition of an encryption algorithm
|
|
that specifies a checksum, a length for the confounder field, or an
|
|
octet boundary for padding uses this ciphertext format (The ordering
|
|
of the fields in the CipherText is important. Additionally, messages
|
|
encoded in this format must include a length as part of the msg-seq
|
|
field. This allows the recipient to verify that the message has not
|
|
been truncated. Without a length, an attacker could use a chosen
|
|
plaintext attack to generate a message which could be truncated,
|
|
while leaving the checksum intact. Note that if the msg-seq is an
|
|
encoding of an ASN.1 SEQUENCE or OCTET STRING, then the length is
|
|
part of that encoding.). Those fields which are not specified will be
|
|
omitted.
|
|
|
|
In the interest of allowing all implementations using a particular
|
|
encryption type to communicate with all others using that type, the
|
|
specification of an encryption type defines any checksum that is
|
|
needed as part of the encryption process. If an alternative checksum
|
|
is to be used, a new encryption type must be defined.
|
|
|
|
Some cryptosystems require additional information beyond the key and
|
|
the data to be encrypted. For example, DES, when used in cipher-
|
|
block-chaining mode, requires an initialization vector. If required,
|
|
the description for each encryption type must specify the source of
|
|
such additional information.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 70]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
6.2. Encryption Keys
|
|
|
|
The sequence below shows the encoding of an encryption key:
|
|
|
|
EncryptionKey ::= SEQUENCE {
|
|
keytype[0] INTEGER,
|
|
keyvalue[1] OCTET STRING
|
|
}
|
|
|
|
keytype This field specifies the type of encryption key that
|
|
follows in the keyvalue field. It will almost always
|
|
correspond to the encryption algorithm used to generate the
|
|
EncryptedData, though more than one algorithm may use the
|
|
same type of key (the mapping is many to one). This might
|
|
happen, for example, if the encryption algorithm uses an
|
|
alternate checksum algorithm for an integrity check, or a
|
|
different chaining mechanism.
|
|
|
|
keyvalue This field contains the key itself, encoded as an octet
|
|
string.
|
|
|
|
All negative values for the encryption key type are reserved for
|
|
local use. All non-negative values are reserved for officially
|
|
assigned type fields and interpretations.
|
|
|
|
6.3. Encryption Systems
|
|
|
|
6.3.1. The NULL Encryption System (null)
|
|
|
|
If no encryption is in use, the encryption system is said to be the
|
|
NULL encryption system. In the NULL encryption system there is no
|
|
checksum, confounder or padding. The ciphertext is simply the
|
|
plaintext. The NULL Key is used by the null encryption system and is
|
|
zero octets in length, with keytype zero (0).
|
|
|
|
6.3.2. DES in CBC mode with a CRC-32 checksum (des-cbc-crc)
|
|
|
|
The des-cbc-crc encryption mode encrypts information under the Data
|
|
Encryption Standard [11] using the cipher block chaining mode [12].
|
|
A CRC-32 checksum (described in ISO 3309 [14]) is applied to the
|
|
confounder and message sequence (msg-seq) and placed in the cksum
|
|
field. DES blocks are 8 bytes. As a result, the data to be
|
|
encrypted (the concatenation of confounder, checksum, and message)
|
|
must be padded to an 8 byte boundary before encryption. The details
|
|
of the encryption of this data are identical to those for the des-
|
|
cbc-md5 encryption mode.
|
|
|
|
Note that, since the CRC-32 checksum is not collisionproof, an
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 71]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
attacker could use a probabilistic chosenplaintext attack to generate
|
|
a valid message even if a confounder is used [13]. The use of
|
|
collision-proof checksums is recommended for environments where such
|
|
attacks represent a significant threat. The use of the CRC-32 as the
|
|
checksum for ticket or authenticator is no longer mandated as an
|
|
interoperability requirement for Kerberos Version 5 Specification 1
|
|
(See section 9.1 for specific details).
|
|
|
|
6.3.3. DES in CBC mode with an MD4 checksum (des-cbc-md4)
|
|
|
|
The des-cbc-md4 encryption mode encrypts information under the Data
|
|
Encryption Standard [11] using the cipher block chaining mode [12].
|
|
An MD4 checksum (described in [15]) is applied to the confounder and
|
|
message sequence (msg-seq) and placed in the cksum field. DES blocks
|
|
are 8 bytes. As a result, the data to be encrypted (the
|
|
concatenation of confounder, checksum, and message) must be padded to
|
|
an 8 byte boundary before encryption. The details of the encryption
|
|
of this data are identical to those for the descbc-md5 encryption
|
|
mode.
|
|
|
|
6.3.4. DES in CBC mode with an MD5 checksum (des-cbc-md5)
|
|
|
|
The des-cbc-md5 encryption mode encrypts information under the Data
|
|
Encryption Standard [11] using the cipher block chaining mode [12].
|
|
An MD5 checksum (described in [16]) is applied to the confounder and
|
|
message sequence (msg-seq) and placed in the cksum field. DES blocks
|
|
are 8 bytes. As a result, the data to be encrypted (the
|
|
concatenation of confounder, checksum, and message) must be padded to
|
|
an 8 byte boundary before encryption.
|
|
|
|
Plaintext and DES ciphtertext are encoded as 8-octet blocks which are
|
|
concatenated to make the 64-bit inputs for the DES algorithms. The
|
|
first octet supplies the 8 most significant bits (with the octet's
|
|
MSbit used as the DES input block's MSbit, etc.), the second octet
|
|
the next 8 bits, ..., and the eighth octet supplies the 8 least
|
|
significant bits.
|
|
|
|
Encryption under DES using cipher block chaining requires an
|
|
additional input in the form of an initialization vector. Unless
|
|
otherwise specified, zero should be used as the initialization
|
|
vector. Kerberos' use of DES requires an 8-octet confounder.
|
|
|
|
The DES specifications identify some "weak" and "semiweak" keys;
|
|
those keys shall not be used for encrypting messages for use in
|
|
Kerberos. Additionally, because of the way that keys are derived for
|
|
the encryption of checksums, keys shall not be used that yield "weak"
|
|
or "semi-weak" keys when eXclusive-ORed with the constant
|
|
F0F0F0F0F0F0F0F0.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 72]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
A DES key is 8 octets of data, with keytype one (1). This consists
|
|
of 56 bits of key, and 8 parity bits (one per octet). The key is
|
|
encoded as a series of 8 octets written in MSB-first order. The bits
|
|
within the key are also encoded in MSB order. For example, if the
|
|
encryption key is:
|
|
(B1,B2,...,B7,P1,B8,...,B14,P2,B15,...,B49,P7,B50,...,B56,P8) where
|
|
B1,B2,...,B56 are the key bits in MSB order, and P1,P2,...,P8 are the
|
|
parity bits, the first octet of the key would be B1,B2,...,B7,P1
|
|
(with B1 as the MSbit). [See the FIPS 81 introduction for
|
|
reference.]
|
|
|
|
To generate a DES key from a text string (password), the text string
|
|
normally must have the realm and each component of the principal's
|
|
name appended(In some cases, it may be necessary to use a different
|
|
"mix-in" string for compatibility reasons; see the discussion of
|
|
padata in section 5.4.2.), then padded with ASCII nulls to an 8 byte
|
|
boundary. This string is then fan-folded and eXclusive-ORed with
|
|
itself to form an 8 byte DES key. The parity is corrected on the
|
|
key, and it is used to generate a DES CBC checksum on the initial
|
|
string (with the realm and name appended). Next, parity is corrected
|
|
on the CBC checksum. If the result matches a "weak" or "semiweak"
|
|
key as described in the DES specification, it is eXclusive-ORed with
|
|
the constant 00000000000000F0. Finally, the result is returned as
|
|
the key. Pseudocode follows:
|
|
|
|
string_to_key(string,realm,name) {
|
|
odd = 1;
|
|
s = string + realm;
|
|
for(each component in name) {
|
|
s = s + component;
|
|
}
|
|
tempkey = NULL;
|
|
pad(s); /* with nulls to 8 byte boundary */
|
|
for(8byteblock in s) {
|
|
if(odd == 0) {
|
|
odd = 1;
|
|
reverse(8byteblock)
|
|
}
|
|
else odd = 0;
|
|
tempkey = tempkey XOR 8byteblock;
|
|
}
|
|
fixparity(tempkey);
|
|
key = DES-CBC-check(s,tempkey);
|
|
fixparity(key);
|
|
if(is_weak_key_key(key))
|
|
key = key XOR 0xF0;
|
|
return(key);
|
|
}
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 73]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
6.4. Checksums
|
|
|
|
The following is the ASN.1 definition used for a checksum:
|
|
|
|
Checksum ::= SEQUENCE {
|
|
cksumtype[0] INTEGER,
|
|
checksum[1] OCTET STRING
|
|
}
|
|
|
|
cksumtype This field indicates the algorithm used to generate the
|
|
accompanying checksum.
|
|
|
|
checksum This field contains the checksum itself, encoded
|
|
as an octet string.
|
|
|
|
Detailed specification of selected checksum types appear later in
|
|
this section. Negative values for the checksum type are reserved for
|
|
local use. All non-negative values are reserved for officially
|
|
assigned type fields and interpretations.
|
|
|
|
Checksums used by Kerberos can be classified by two properties:
|
|
whether they are collision-proof, and whether they are keyed. It is
|
|
infeasible to find two plaintexts which generate the same checksum
|
|
value for a collision-proof checksum. A key is required to perturb
|
|
or initialize the algorithm in a keyed checksum. To prevent
|
|
message-stream modification by an active attacker, unkeyed checksums
|
|
should only be used when the checksum and message will be
|
|
subsequently encrypted (e.g., the checksums defined as part of the
|
|
encryption algorithms covered earlier in this section). Collision-
|
|
proof checksums can be made tamper-proof as well if the checksum
|
|
value is encrypted before inclusion in a message. In such cases, the
|
|
composition of the checksum and the encryption algorithm must be
|
|
considered a separate checksum algorithm (e.g., RSA-MD5 encrypted
|
|
using DES is a new checksum algorithm of type RSA-MD5-DES). For most
|
|
keyed checksums, as well as for the encrypted forms of collisionproof
|
|
checksums, Kerberos prepends a confounder before the checksum is
|
|
calculated.
|
|
|
|
6.4.1. The CRC-32 Checksum (crc32)
|
|
|
|
The CRC-32 checksum calculates a checksum based on a cyclic
|
|
redundancy check as described in ISO 3309 [14]. The resulting
|
|
checksum is four (4) octets in length. The CRC-32 is neither keyed
|
|
nor collision-proof. The use of this checksum is not recommended.
|
|
An attacker using a probabilistic chosen-plaintext attack as
|
|
described in [13] might be able to generate an alternative message
|
|
that satisfies the checksum. The use of collision-proof checksums is
|
|
recommended for environments where such attacks represent a
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 74]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
significant threat.
|
|
|
|
6.4.2. The RSA MD4 Checksum (rsa-md4)
|
|
|
|
The RSA-MD4 checksum calculates a checksum using the RSA MD4
|
|
algorithm [15]. The algorithm takes as input an input message of
|
|
arbitrary length and produces as output a 128-bit (16 octet)
|
|
checksum. RSA-MD4 is believed to be collision-proof.
|
|
|
|
6.4.3. RSA MD4 Cryptographic Checksum Using DES (rsa-md4des)
|
|
|
|
The RSA-MD4-DES checksum calculates a keyed collisionproof checksum
|
|
by prepending an 8 octet confounder before the text, applying the RSA
|
|
MD4 checksum algorithm, and encrypting the confounder and the
|
|
checksum using DES in cipher-block-chaining (CBC) mode using a
|
|
variant of the key, where the variant is computed by eXclusive-ORing
|
|
the key with the constant F0F0F0F0F0F0F0F0 (A variant of the key is
|
|
used to limit the use of a key to a particular function, separating
|
|
the functions of generating a checksum from other encryption
|
|
performed using the session key. The constant F0F0F0F0F0F0F0F0 was
|
|
chosen because it maintains key parity. The properties of DES
|
|
precluded the use of the complement. The same constant is used for
|
|
similar purpose in the Message Integrity Check in the Privacy
|
|
Enhanced Mail standard.). The initialization vector should be zero.
|
|
The resulting checksum is 24 octets long (8 octets of which are
|
|
redundant). This checksum is tamper-proof and believed to be
|
|
collision-proof.
|
|
|
|
The DES specifications identify some "weak keys"; those keys shall
|
|
not be used for generating RSA-MD4 checksums for use in Kerberos.
|
|
|
|
The format for the checksum is described in the following diagram:
|
|
|
|
+--+--+--+--+--+--+--+--
|
|
| des-cbc(confounder
|
|
+--+--+--+--+--+--+--+--
|
|
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
rsa-md4(confounder+msg),key=var(key),iv=0) |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
|
|
The format cannot be described in ASN.1, but for those who prefer an
|
|
ASN.1-like notation:
|
|
|
|
rsa-md4-des-checksum ::= ENCRYPTED UNTAGGED SEQUENCE {
|
|
confounder[0] UNTAGGED OCTET STRING(8),
|
|
check[1] UNTAGGED OCTET STRING(16)
|
|
}
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 75]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
6.4.4. The RSA MD5 Checksum (rsa-md5)
|
|
|
|
The RSA-MD5 checksum calculates a checksum using the RSA MD5
|
|
algorithm [16]. The algorithm takes as input an input message of
|
|
arbitrary length and produces as output a 128-bit (16 octet)
|
|
checksum. RSA-MD5 is believed to be collision-proof.
|
|
|
|
6.4.5. RSA MD5 Cryptographic Checksum Using DES (rsa-md5des)
|
|
|
|
The RSA-MD5-DES checksum calculates a keyed collisionproof checksum
|
|
by prepending an 8 octet confounder before the text, applying the RSA
|
|
MD5 checksum algorithm, and encrypting the confounder and the
|
|
checksum using DES in cipher-block-chaining (CBC) mode using a
|
|
variant of the key, where the variant is computed by eXclusive-ORing
|
|
the key with the constant F0F0F0F0F0F0F0F0. The initialization
|
|
vector should be zero. The resulting checksum is 24 octets long (8
|
|
octets of which are redundant). This checksum is tamper-proof and
|
|
believed to be collision-proof.
|
|
|
|
The DES specifications identify some "weak keys"; those keys shall
|
|
not be used for encrypting RSA-MD5 checksums for use in Kerberos.
|
|
|
|
The format for the checksum is described in the following diagram:
|
|
|
|
+--+--+--+--+--+--+--+--
|
|
| des-cbc(confounder
|
|
+--+--+--+--+--+--+--+--
|
|
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
rsa-md5(confounder+msg),key=var(key),iv=0) |
|
|
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|
|
|
|
The format cannot be described in ASN.1, but for those who prefer an
|
|
ASN.1-like notation:
|
|
|
|
rsa-md5-des-checksum ::= ENCRYPTED UNTAGGED SEQUENCE {
|
|
confounder[0] UNTAGGED OCTET STRING(8),
|
|
check[1] UNTAGGED OCTET STRING(16)
|
|
}
|
|
|
|
6.4.6. DES cipher-block chained checksum (des-mac)
|
|
|
|
The DES-MAC checksum is computed by prepending an 8 octet confounder
|
|
to the plaintext, performing a DES CBC-mode encryption on the result
|
|
using the key and an initialization vector of zero, taking the last
|
|
block of the ciphertext, prepending the same confounder and
|
|
encrypting the pair using DES in cipher-block-chaining (CBC) mode
|
|
using a a variant of the key, where the variant is computed by
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 76]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
eXclusive-ORing the key with the constant F0F0F0F0F0F0F0F0. The
|
|
initialization vector should be zero. The resulting checksum is 128
|
|
bits (16 octets) long, 64 bits of which are redundant. This checksum
|
|
is tamper-proof and collision-proof.
|
|
|
|
The format for the checksum is described in the following diagram:
|
|
|
|
+--+--+--+--+--+--+--+--
|
|
| des-cbc(confounder
|
|
+--+--+--+--+--+--+--+--
|
|
|
|
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
des-mac(conf+msg,iv=0,key),key=var(key),iv=0) |
|
|
+-----+-----+-----+-----+-----+-----+-----+-----+
|
|
|
|
The format cannot be described in ASN.1, but for those who prefer an
|
|
ASN.1-like notation:
|
|
|
|
des-mac-checksum ::= ENCRYPTED UNTAGGED SEQUENCE {
|
|
confounder[0] UNTAGGED OCTET STRING(8),
|
|
check[1] UNTAGGED OCTET STRING(8)
|
|
}
|
|
|
|
The DES specifications identify some "weak" and "semiweak" keys;
|
|
those keys shall not be used for generating DES-MAC checksums for use
|
|
in Kerberos, nor shall a key be used whose veriant is "weak" or
|
|
"semi-weak".
|
|
|
|
6.4.7. RSA MD4 Cryptographic Checksum Using DES alternative
|
|
(rsa-md4-des-k)
|
|
|
|
The RSA-MD4-DES-K checksum calculates a keyed collision-proof
|
|
checksum by applying the RSA MD4 checksum algorithm and encrypting
|
|
the results using DES in cipherblock-chaining (CBC) mode using a DES
|
|
key as both key and initialization vector. The resulting checksum is
|
|
16 octets long. This checksum is tamper-proof and believed to be
|
|
collision-proof. Note that this checksum type is the old method for
|
|
encoding the RSA-MD4-DES checksum and it is no longer recommended.
|
|
|
|
6.4.8. DES cipher-block chained checksum alternative (desmac-k)
|
|
|
|
The DES-MAC-K checksum is computed by performing a DES CBC-mode
|
|
encryption of the plaintext, and using the last block of the
|
|
ciphertext as the checksum value. It is keyed with an encryption key
|
|
and an initialization vector; any uses which do not specify an
|
|
additional initialization vector will use the key as both key and
|
|
initialization vector. The resulting checksum is 64 bits (8 octets)
|
|
long. This checksum is tamper-proof and collision-proof. Note that
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 77]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
this checksum type is the old method for encoding the DESMAC checksum
|
|
and it is no longer recommended.
|
|
|
|
The DES specifications identify some "weak keys"; those keys shall
|
|
not be used for generating DES-MAC checksums for use in Kerberos.
|
|
|
|
7. Naming Constraints
|
|
|
|
7.1. Realm Names
|
|
|
|
Although realm names are encoded as GeneralStrings and although a
|
|
realm can technically select any name it chooses, interoperability
|
|
across realm boundaries requires agreement on how realm names are to
|
|
be assigned, and what information they imply.
|
|
|
|
To enforce these conventions, each realm must conform to the
|
|
conventions itself, and it must require that any realms with which
|
|
inter-realm keys are shared also conform to the conventions and
|
|
require the same from its neighbors.
|
|
|
|
There are presently four styles of realm names: domain, X500, other,
|
|
and reserved. Examples of each style follow:
|
|
|
|
domain: host.subdomain.domain (example)
|
|
X500: C=US/O=OSF (example)
|
|
other: NAMETYPE:rest/of.name=without-restrictions (example)
|
|
reserved: reserved, but will not conflict with above
|
|
|
|
Domain names must look like domain names: they consist of components
|
|
separated by periods (.) and they contain neither colons (:) nor
|
|
slashes (/).
|
|
|
|
X.500 names contain an equal (=) and cannot contain a colon (:)
|
|
before the equal. The realm names for X.500 names will be string
|
|
representations of the names with components separated by slashes.
|
|
Leading and trailing slashes will not be included.
|
|
|
|
Names that fall into the other category must begin with a prefix that
|
|
contains no equal (=) or period (.) and the prefix must be followed
|
|
by a colon (:) and the rest of the name. All prefixes must be
|
|
assigned before they may be used. Presently none are assigned.
|
|
|
|
The reserved category includes strings which do not fall into the
|
|
first three categories. All names in this category are reserved. It
|
|
is unlikely that names will be assigned to this category unless there
|
|
is a very strong argument for not using the "other" category.
|
|
|
|
These rules guarantee that there will be no conflicts between the
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 78]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
various name styles. The following additional constraints apply to
|
|
the assignment of realm names in the domain and X.500 categories: the
|
|
name of a realm for the domain or X.500 formats must either be used
|
|
by the organization owning (to whom it was assigned) an Internet
|
|
domain name or X.500 name, or in the case that no such names are
|
|
registered, authority to use a realm name may be derived from the
|
|
authority of the parent realm. For example, if there is no domain
|
|
name for E40.MIT.EDU, then the administrator of the MIT.EDU realm can
|
|
authorize the creation of a realm with that name.
|
|
|
|
This is acceptable because the organization to which the parent is
|
|
assigned is presumably the organization authorized to assign names to
|
|
its children in the X.500 and domain name systems as well. If the
|
|
parent assigns a realm name without also registering it in the domain
|
|
name or X.500 hierarchy, it is the parent's responsibility to make
|
|
sure that there will not in the future exists a name identical to the
|
|
realm name of the child unless it is assigned to the same entity as
|
|
the realm name.
|
|
|
|
7.2. Principal Names
|
|
|
|
As was the case for realm names, conventions are needed to ensure
|
|
that all agree on what information is implied by a principal name.
|
|
The name-type field that is part of the principal name indicates the
|
|
kind of information implied by the name. The name-type should be
|
|
treated as a hint. Ignoring the name type, no two names can be the
|
|
same (i.e., at least one of the components, or the realm, must be
|
|
different). This constraint may be eliminated in the future. The
|
|
following name types are defined:
|
|
|
|
name-type value meaning
|
|
NT-UNKNOWN 0 Name type not known
|
|
NT-PRINCIPAL 1 Just the name of the principal as in
|
|
DCE, or for users
|
|
NT-SRV-INST 2 Service and other unique instance (krbtgt)
|
|
NT-SRV-HST 3 Service with host name as instance
|
|
(telnet, rcommands)
|
|
NT-SRV-XHST 4 Service with host as remaining components
|
|
NT-UID 5 Unique ID
|
|
|
|
When a name implies no information other than its uniqueness at a
|
|
particular time the name type PRINCIPAL should be used. The
|
|
principal name type should be used for users, and it might also be
|
|
used for a unique server. If the name is a unique machine generated
|
|
ID that is guaranteed never to be reassigned then the name type of
|
|
UID should be used (note that it is generally a bad idea to reassign
|
|
names of any type since stale entries might remain in access control
|
|
lists).
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 79]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
If the first component of a name identifies a service and the
|
|
remaining components identify an instance of the service in a server
|
|
specified manner, then the name type of SRV-INST should be used. An
|
|
example of this name type is the Kerberos ticket-granting ticket
|
|
which has a first component of krbtgt and a second component
|
|
identifying the realm for which the ticket is valid.
|
|
|
|
If instance is a single component following the service name and the
|
|
instance identifies the host on which the server is running, then the
|
|
name type SRV-HST should be used. This type is typically used for
|
|
Internet services such as telnet and the Berkeley R commands. If the
|
|
separate components of the host name appear as successive components
|
|
following the name of the service, then the name type SRVXHST should
|
|
be used. This type might be used to identify servers on hosts with
|
|
X.500 names where the slash (/) might otherwise be ambiguous.
|
|
|
|
A name type of UNKNOWN should be used when the form of the name is
|
|
not known. When comparing names, a name of type UNKNOWN will match
|
|
principals authenticated with names of any type. A principal
|
|
authenticated with a name of type UNKNOWN, however, will only match
|
|
other names of type UNKNOWN.
|
|
|
|
Names of any type with an initial component of "krbtgt" are reserved
|
|
for the Kerberos ticket granting service. See section 8.2.3 for the
|
|
form of such names.
|
|
|
|
7.2.1. Name of server principals
|
|
|
|
The principal identifier for a server on a host will generally be
|
|
composed of two parts: (1) the realm of the KDC with which the server
|
|
is registered, and (2) a two-component name of type NT-SRV-HST if the
|
|
host name is an Internet domain name or a multi-component name of
|
|
type NT-SRV-XHST if the name of the host is of a form such as X.500
|
|
that allows slash (/) separators. The first component of the two- or
|
|
multi-component name will identify the service and the latter
|
|
components will identify the host. Where the name of the host is not
|
|
case sensitive (for example, with Internet domain names) the name of
|
|
the host must be lower case. For services such as telnet and the
|
|
Berkeley R commands which run with system privileges, the first
|
|
component will be the string "host" instead of a service specific
|
|
identifier.
|
|
|
|
8. Constants and other defined values
|
|
|
|
8.1. Host address types
|
|
|
|
All negative values for the host address type are reserved for local
|
|
use. All non-negative values are reserved for officially assigned
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 80]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
type fields and interpretations.
|
|
|
|
The values of the types for the following addresses are chosen to
|
|
match the defined address family constants in the Berkeley Standard
|
|
Distributions of Unix. They can be found in <sys/socket.h> with
|
|
symbolic names AF_xxx (where xxx is an abbreviation of the address
|
|
family name).
|
|
|
|
|
|
Internet addresses
|
|
|
|
Internet addresses are 32-bit (4-octet) quantities, encoded in MSB
|
|
order. The type of internet addresses is two (2).
|
|
|
|
CHAOSnet addresses
|
|
|
|
CHAOSnet addresses are 16-bit (2-octet) quantities, encoded in MSB
|
|
order. The type of CHAOSnet addresses is five (5).
|
|
|
|
ISO addresses
|
|
|
|
ISO addresses are variable-length. The type of ISO addresses is
|
|
seven (7).
|
|
|
|
Xerox Network Services (XNS) addresses
|
|
|
|
XNS addresses are 48-bit (6-octet) quantities, encoded in MSB
|
|
order. The type of XNS addresses is six (6).
|
|
|
|
AppleTalk Datagram Delivery Protocol (DDP) addresses
|
|
|
|
AppleTalk DDP addresses consist of an 8-bit node number and a 16-
|
|
bit network number. The first octet of the address is the node
|
|
number; the remaining two octets encode the network number in MSB
|
|
order. The type of AppleTalk DDP addresses is sixteen (16).
|
|
|
|
DECnet Phase IV addresses
|
|
|
|
DECnet Phase IV addresses are 16-bit addresses, encoded in LSB
|
|
order. The type of DECnet Phase IV addresses is twelve (12).
|
|
|
|
8.2. KDC messages
|
|
|
|
8.2.1. IP transport
|
|
|
|
When contacting a Kerberos server (KDC) for a KRB_KDC_REQ request
|
|
using IP transport, the client shall send a UDP datagram containing
|
|
only an encoding of the request to port 88 (decimal) at the KDC's IP
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 81]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
address; the KDC will respond with a reply datagram containing only
|
|
an encoding of the reply message (either a KRB_ERROR or a
|
|
KRB_KDC_REP) to the sending port at the sender's IP address.
|
|
|
|
8.2.2. OSI transport
|
|
|
|
During authentication of an OSI client to and OSI server, the mutual
|
|
authentication of an OSI server to an OSI client, the transfer of
|
|
credentials from an OSI client to an OSI server, or during exchange
|
|
of private or integrity checked messages, Kerberos protocol messages
|
|
may be treated as opaque objects and the type of the authentication
|
|
mechanism will be:
|
|
|
|
OBJECT IDENTIFIER ::= {iso (1), org(3), dod(5),internet(1),
|
|
security(5), kerberosv5(2)}
|
|
|
|
Depending on the situation, the opaque object will be an
|
|
authentication header (KRB_AP_REQ), an authentication reply
|
|
(KRB_AP_REP), a safe message (KRB_SAFE), a private message
|
|
(KRB_PRIV), or a credentials message (KRB_CRED). The opaque data
|
|
contains an application code as specified in the ASN.1 description
|
|
for each message. The application code may be used by Kerberos to
|
|
determine the message type.
|
|
|
|
8.2.3. Name of the TGS
|
|
|
|
The principal identifier of the ticket-granting service shall be
|
|
composed of three parts: (1) the realm of the KDC issuing the TGS
|
|
ticket (2) a two-part name of type NT-SRVINST, with the first part
|
|
"krbtgt" and the second part the name of the realm which will accept
|
|
the ticket-granting ticket. For example, a ticket-granting ticket
|
|
issued by the ATHENA.MIT.EDU realm to be used to get tickets from the
|
|
ATHENA.MIT.EDU KDC has a principal identifier of "ATHENA.MIT.EDU"
|
|
(realm), ("krbtgt", "ATHENA.MIT.EDU") (name). A ticket-granting
|
|
ticket issued by the ATHENA.MIT.EDU realm to be used to get tickets
|
|
from the MIT.EDU realm has a principal identifier of "ATHENA.MIT.EDU"
|
|
(realm), ("krbtgt", "MIT.EDU") (name).
|
|
|
|
8.3. Protocol constants and associated values
|
|
|
|
The following tables list constants used in the protocol and defines
|
|
their meanings.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 82]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
---------------+-----------+----------+----------------+---------------
|
|
Encryption type|etype value|block size|minimum pad size|confounder size
|
|
---------------+-----------+----------+----------------+---------------
|
|
NULL 0 1 0 0
|
|
des-cbc-crc 1 8 4 8
|
|
des-cbc-md4 2 8 0 8
|
|
des-cbc-md5 3 8 0 8
|
|
|
|
-------------------------------+-------------------+-------------
|
|
Checksum type |sumtype value |checksum size
|
|
-------------------------------+-------------------+-------------
|
|
CRC32 1 4
|
|
rsa-md4 2 16
|
|
rsa-md4-des 3 24
|
|
des-mac 4 16
|
|
des-mac-k 5 8
|
|
rsa-md4-des-k 6 16
|
|
rsa-md5 7 16
|
|
rsa-md5-des 8 24
|
|
|
|
-------------------------------+-----------------
|
|
padata type |padata-type value
|
|
-------------------------------+-----------------
|
|
PA-TGS-REQ 1
|
|
PA-ENC-TIMESTAMP 2
|
|
PA-PW-SALT 3
|
|
|
|
-------------------------------+-------------
|
|
authorization data type |ad-type value
|
|
-------------------------------+-------------
|
|
reserved values 0-63
|
|
OSF-DCE 64
|
|
SESAME 65
|
|
|
|
-------------------------------+-----------------
|
|
alternate authentication type |method-type value
|
|
-------------------------------+-----------------
|
|
reserved values 0-63
|
|
ATT-CHALLENGE-RESPONSE 64
|
|
|
|
-------------------------------+-------------
|
|
transited encoding type |tr-type value
|
|
-------------------------------+-------------
|
|
DOMAIN-X500-COMPRESS 1
|
|
reserved values all others
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 83]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
--------------+-------+-----------------------------------------
|
|
Label |Value |Meaning or MIT code
|
|
--------------+-------+-----------------------------------------
|
|
|
|
pvno 5 current Kerberos protocol version number
|
|
|
|
message types
|
|
|
|
KRB_AS_REQ 10 Request for initial authentication
|
|
KRB_AS_REP 11 Response to KRB_AS_REQ request
|
|
KRB_TGS_REQ 12 Request for authentication based on TGT
|
|
KRB_TGS_REP 13 Response to KRB_TGS_REQ request
|
|
KRB_AP_REQ 14 application request to server
|
|
KRB_AP_REP 15 Response to KRB_AP_REQ_MUTUAL
|
|
KRB_SAFE 20 Safe (checksummed) application message
|
|
KRB_PRIV 21 Private (encrypted) application message
|
|
KRB_CRED 22 Private (encrypted) message to forward
|
|
credentials
|
|
KRB_ERROR 30 Error response
|
|
|
|
name types
|
|
|
|
KRB_NT_UNKNOWN 0 Name type not known
|
|
KRB_NT_PRINCIPAL 1 Just the name of the principal as in DCE, or
|
|
for users
|
|
KRB_NT_SRV_INST 2 Service and other unique instance (krbtgt)
|
|
KRB_NT_SRV_HST 3 Service with host name as instance (telnet,
|
|
rcommands)
|
|
KRB_NT_SRV_XHST 4 Service with host as remaining components
|
|
KRB_NT_UID 5 Unique ID
|
|
|
|
error codes
|
|
|
|
KDC_ERR_NONE 0 No error
|
|
KDC_ERR_NAME_EXP 1 Client's entry in database has
|
|
expired
|
|
KDC_ERR_SERVICE_EXP 2 Server's entry in database has
|
|
expired
|
|
KDC_ERR_BAD_PVNO 3 Requested protocol version number
|
|
not supported
|
|
KDC_ERR_C_OLD_MAST_KVNO 4 Client's key encrypted in old
|
|
master key
|
|
KDC_ERR_S_OLD_MAST_KVNO 5 Server's key encrypted in old
|
|
master key
|
|
KDC_ERR_C_PRINCIPAL_UNKNOWN 6 Client not found in Kerberos database
|
|
KDC_ERR_S_PRINCIPAL_UNKNOWN 7 Server not found in Kerberos database
|
|
KDC_ERR_PRINCIPAL_NOT_UNIQUE 8 Multiple principal entries in
|
|
database
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 84]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
KDC_ERR_NULL_KEY 9 The client or server has a null key
|
|
KDC_ERR_CANNOT_POSTDATE 10 Ticket not eligible for postdating
|
|
KDC_ERR_NEVER_VALID 11 Requested start time is later than
|
|
end time
|
|
KDC_ERR_POLICY 12 KDC policy rejects request
|
|
KDC_ERR_BADOPTION 13 KDC cannot accommodate requested
|
|
option
|
|
KDC_ERR_ETYPE_NOSUPP 14 KDC has no support for encryption
|
|
type
|
|
KDC_ERR_SUMTYPE_NOSUPP 15 KDC has no support for checksum type
|
|
KDC_ERR_PADATA_TYPE_NOSUPP 16 KDC has no support for padata type
|
|
KDC_ERR_TRTYPE_NOSUPP 17 KDC has no support for transited type
|
|
KDC_ERR_CLIENT_REVOKED 18 Clients credentials have been revoked
|
|
KDC_ERR_SERVICE_REVOKED 19 Credentials for server have been
|
|
revoked
|
|
KDC_ERR_TGT_REVOKED 20 TGT has been revoked
|
|
KDC_ERR_CLIENT_NOTYET 21 Client not yet valid - try again
|
|
later
|
|
KDC_ERR_SERVICE_NOTYET 22 Server not yet valid - try again
|
|
later
|
|
KDC_ERR_KEY_EXPIRED 23 Password has expired - change
|
|
password to reset
|
|
KDC_ERR_PREAUTH_FAILED 24 Pre-authentication information
|
|
was invalid
|
|
KDC_ERR_PREAUTH_REQUIRED 25 Additional pre-authentication
|
|
required*
|
|
KRB_AP_ERR_BAD_INTEGRITY 31 Integrity check on decrypted field
|
|
failed
|
|
KRB_AP_ERR_TKT_EXPIRED 32 Ticket expired
|
|
KRB_AP_ERR_TKT_NYV 33 Ticket not yet valid
|
|
KRB_AP_ERR_REPEAT 34 Request is a replay
|
|
KRB_AP_ERR_NOT_US 35 The ticket isn't for us
|
|
KRB_AP_ERR_BADMATCH 36 Ticket and authenticator don't match
|
|
KRB_AP_ERR_SKEW 37 Clock skew too great
|
|
KRB_AP_ERR_BADADDR 38 Incorrect net address
|
|
KRB_AP_ERR_BADVERSION 39 Protocol version mismatch
|
|
KRB_AP_ERR_MSG_TYPE 40 Invalid msg type
|
|
KRB_AP_ERR_MODIFIED 41 Message stream modified
|
|
KRB_AP_ERR_BADORDER 42 Message out of order
|
|
KRB_AP_ERR_BADKEYVER 44 Specified version of key is not
|
|
available
|
|
KRB_AP_ERR_NOKEY 45 Service key not available
|
|
KRB_AP_ERR_MUT_FAIL 46 Mutual authentication failed
|
|
KRB_AP_ERR_BADDIRECTION 47 Incorrect message direction
|
|
KRB_AP_ERR_METHOD 48 Alternative authentication method
|
|
required*
|
|
KRB_AP_ERR_BADSEQ 49 Incorrect sequence number in message
|
|
KRB_AP_ERR_INAPP_CKSUM 50 Inappropriate type of checksum in
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 85]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
message
|
|
KRB_ERR_GENERIC 60 Generic error (description in e-text)
|
|
KRB_ERR_FIELD_TOOLONG 61 Field is too long for this
|
|
implementation
|
|
|
|
*This error carries additional information in the e-data field. The
|
|
contents of the e-data field for this message is described in section
|
|
5.9.1.
|
|
|
|
9. Interoperability requirements
|
|
|
|
Version 5 of the Kerberos protocol supports a myriad of options.
|
|
Among these are multiple encryption and checksum types, alternative
|
|
encoding schemes for the transited field, optional mechanisms for
|
|
pre-authentication, the handling of tickets with no addresses,
|
|
options for mutual authentication, user to user authentication,
|
|
support for proxies, forwarding, postdating, and renewing tickets,
|
|
the format of realm names, and the handling of authorization data.
|
|
|
|
In order to ensure the interoperability of realms, it is necessary to
|
|
define a minimal configuration which must be supported by all
|
|
implementations. This minimal configuration is subject to change as
|
|
technology does. For example, if at some later date it is discovered
|
|
that one of the required encryption or checksum algorithms is not
|
|
secure, it will be replaced.
|
|
|
|
9.1. Specification 1
|
|
|
|
This section defines the first specification of these options.
|
|
Implementations which are configured in this way can be said to
|
|
support Kerberos Version 5 Specification 1 (5.1).
|
|
|
|
Encryption and checksum methods
|
|
|
|
The following encryption and checksum mechanisms must be supported.
|
|
Implementations may support other mechanisms as well, but the
|
|
additional mechanisms may only be used when communicating with
|
|
principals known to also support them: Encryption: DES-CBC-MD5
|
|
Checksums: CRC-32, DES-MAC, DES-MAC-K, and DES-MD5
|
|
|
|
Realm Names
|
|
|
|
All implementations must understand hierarchical realms in both the
|
|
Internet Domain and the X.500 style. When a ticket granting ticket
|
|
for an unknown realm is requested, the KDC must be able to determine
|
|
the names of the intermediate realms between the KDCs realm and the
|
|
requested realm.
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 86]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Transited field encoding
|
|
|
|
DOMAIN-X500-COMPRESS (described in section 3.3.3.1) must be
|
|
supported. Alternative encodings may be supported, but they may be
|
|
used only when that encoding is supported by ALL intermediate realms.
|
|
|
|
Pre-authentication methods
|
|
|
|
The TGS-REQ method must be supported. The TGS-REQ method is not used
|
|
on the initial request. The PA-ENC-TIMESTAMP method must be supported
|
|
by clients but whether it is enabled by default may be determined on
|
|
a realm by realm basis. If not used in the initial request and the
|
|
error KDC_ERR_PREAUTH_REQUIRED is returned specifying PA-ENCTIMESTAMP
|
|
as an acceptable method, the client should retry the initial request
|
|
using the PA-ENC-TIMESTAMP preauthentication method. Servers need not
|
|
support the PAENC-TIMESTAMP method, but if not supported the server
|
|
should ignore the presence of PA-ENC-TIMESTAMP pre-authentication in
|
|
a request.
|
|
|
|
Mutual authentication
|
|
|
|
Mutual authentication (via the KRB_AP_REP message) must be supported.
|
|
|
|
Ticket addresses and flags
|
|
|
|
All KDC's must pass on tickets that carry no addresses (i.e., if a
|
|
TGT contains no addresses, the KDC will return derivative tickets),
|
|
but each realm may set its own policy for issuing such tickets, and
|
|
each application server will set its own policy with respect to
|
|
accepting them. By default, servers should not accept them.
|
|
|
|
Proxies and forwarded tickets must be supported. Individual realms
|
|
and application servers can set their own policy on when such tickets
|
|
will be accepted.
|
|
|
|
All implementations must recognize renewable and postdated tickets,
|
|
but need not actually implement them. If these options are not
|
|
supported, the starttime and endtime in the ticket shall specify a
|
|
ticket's entire useful life. When a postdated ticket is decoded by a
|
|
server, all implementations shall make the presence of the postdated
|
|
flag visible to the calling server.
|
|
|
|
User-to-user authentication
|
|
|
|
Support for user to user authentication (via the ENC-TKTIN-SKEY KDC
|
|
option) must be provided by implementations, but individual realms
|
|
may decide as a matter of policy to reject such requests on a per-
|
|
principal or realm-wide basis.
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 87]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
Authorization data
|
|
|
|
Implementations must pass all authorization data subfields from
|
|
ticket-granting tickets to any derivative tickets unless directed to
|
|
suppress a subfield as part of the definition of that registered
|
|
subfield type (it is never incorrect to pass on a subfield, and no
|
|
registered subfield types presently specify suppression at the KDC).
|
|
|
|
Implementations must make the contents of any authorization data
|
|
subfields available to the server when a ticket is used.
|
|
Implementations are not required to allow clients to specify the
|
|
contents of the authorization data fields.
|
|
|
|
9.2. Recommended KDC values
|
|
|
|
Following is a list of recommended values for a KDC implementation,
|
|
based on the list of suggested configuration constants (see section
|
|
4.4).
|
|
|
|
minimum lifetime 5 minutes
|
|
|
|
maximum renewable lifetime 1 week
|
|
|
|
maximum ticket lifetime 1 day
|
|
|
|
empty addresses only when suitable restrictions appear
|
|
in authorization data
|
|
|
|
proxiable, etc. Allowed.
|
|
|
|
10. Acknowledgments
|
|
|
|
Early versions of this document, describing version 4 of the
|
|
protocol, were written by Jennifer Steiner (formerly at Project
|
|
Athena); these drafts provided an excellent starting point for this
|
|
current version 5 specification. Many people in the Internet
|
|
community have contributed ideas and suggested protocol changes for
|
|
version 5. Notable contributions came from Ted Anderson, Steve
|
|
Bellovin and Michael Merritt [17], Daniel Bernstein, Mike Burrows,
|
|
Donald Davis, Ravi Ganesan, Morrie Gasser, Virgil Gligor, Bill
|
|
Griffeth, Mark Lillibridge, Mark Lomas, Steve Lunt, Piers McMahon,
|
|
Joe Pato, William Sommerfeld, Stuart Stubblebine, Ralph Swick, Ted
|
|
T'so, and Stanley Zanarotti. Many others commented and helped shape
|
|
this specification into its current form.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 88]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
11. References
|
|
|
|
[1] Miller, S., Neuman, C., Schiller, J., and J. Saltzer, "Section
|
|
E.2.1: Kerberos Authentication and Authorization System",
|
|
M.I.T. Project Athena, Cambridge, Massachusetts, December 21,
|
|
1987.
|
|
|
|
[2] Steiner, J., Neuman, C., and J. Schiller, "Kerberos: An
|
|
Authentication Service for Open Network Systems", pp. 191-202 in
|
|
Usenix Conference Proceedings, Dallas, Texas, February, 1988.
|
|
|
|
[3] Needham, R., and M. Schroeder, "Using Encryption for
|
|
Authentication in Large Networks of Computers", Communications
|
|
of the ACM, Vol. 21 (12), pp. 993-999, December 1978.
|
|
|
|
[4] Denning, D., and G. Sacco, "Time stamps in Key Distribution
|
|
Protocols", Communications of the ACM, Vol. 24 (8), pp. 533-536,
|
|
August 1981.
|
|
|
|
[5] Kohl, J., Neuman, C., and T. Ts'o, "The Evolution of the
|
|
Kerberos Authentication Service", in an IEEE Computer Society
|
|
Text soon to be published, June 1992.
|
|
|
|
[6] Davis, D., and R. Swick, "Workstation Services and Kerberos
|
|
Authentication at Project Athena", Technical Memorandum TM-424,
|
|
MIT Laboratory for Computer Science, February 1990.
|
|
|
|
[7] Levine, P., Gretzinger, M, Diaz, J., Sommerfeld, W., and K.
|
|
Raeburn, "Section E.1: Service Management System, M.I.T.
|
|
Project Athena, Cambridge, Mas sachusetts (1987).
|
|
|
|
[8] CCITT, Recommendation X.509: The Directory Authentication
|
|
Framework, December 1988.
|
|
|
|
[9] Neuman, C., "Proxy-Based Authorization and Accounting for
|
|
Distributed Systems," in Proceedings of the 13th International
|
|
Conference on Distributed Computing Systems", Pittsburgh, PA,
|
|
May 1993.
|
|
|
|
[10] Pato, J., "Using Pre-Authentication to Avoid Password Guessing
|
|
Attacks", Open Software Foundation DCE Request for Comments 26,
|
|
December 1992.
|
|
|
|
[11] National Bureau of Standards, U.S. Department of Commerce, "Data
|
|
Encryption Standard", Federal Information Processing Standards
|
|
Publication 46, Washington, DC (1977).
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 89]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
[12] National Bureau of Standards, U.S. Department of Commerce, "DES
|
|
Modes of Operation", Federal Information Processing Standards
|
|
Publication 81, Springfield, VA, December 1980.
|
|
|
|
[13] Stubblebine S., and V. Gligor, "On Message Integrity in
|
|
Cryptographic Protocols", in Proceedings of the IEEE Symposium
|
|
on Research in Security and Privacy, Oakland, California, May
|
|
1992.
|
|
|
|
[14] International Organization for Standardization, "ISO Information
|
|
Processing Systems - Data Communication High-Level Data Link
|
|
Control Procedure - Frame Structure", IS 3309, October 1984, 3rd
|
|
Edition.
|
|
|
|
[15] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT
|
|
Laboratory for Computer Science, April 1992.
|
|
|
|
[16] Rivest, R., "The MD5 Message Digest Algorithm", RFC 1321, MIT
|
|
Laboratory for Computer Science, April 1992.
|
|
|
|
[17] Bellovin S., and M. Merritt, "Limitations of the Kerberos
|
|
Authentication System", Computer Communications Review, Vol.
|
|
20(5), pp. 119-132, October 1990.
|
|
|
|
12. Security Considerations
|
|
|
|
Security issues are discussed throughout this memo.
|
|
|
|
13. Authors' Addresses
|
|
|
|
John Kohl
|
|
Digital Equipment Corporation
|
|
110 Spit Brook Road, M/S ZKO3-3/U14
|
|
Nashua, NH 03062
|
|
|
|
Phone: 603-881-2481
|
|
EMail: jtkohl@zk3.dec.com
|
|
|
|
|
|
B. Clifford Neuman
|
|
USC/Information Sciences Institute
|
|
4676 Admiralty Way #1001
|
|
Marina del Rey, CA 90292-6695
|
|
|
|
Phone: 310-822-1511
|
|
EMail: bcn@isi.edu
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 90]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
A. Pseudo-code for protocol processing
|
|
|
|
This appendix provides pseudo-code describing how the messages are to
|
|
be constructed and interpreted by clients and servers.
|
|
|
|
A.1. KRB_AS_REQ generation
|
|
request.pvno := protocol version; /* pvno = 5 */
|
|
request.msg-type := message type; /* type = KRB_AS_REQ */
|
|
|
|
if(pa_enc_timestamp_required) then
|
|
request.padata.padata-type = PA-ENC-TIMESTAMP;
|
|
get system_time;
|
|
padata-body.patimestamp,pausec = system_time;
|
|
encrypt padata-body into request.padata.padata-value
|
|
using client.key; /* derived from password */
|
|
endif
|
|
|
|
body.kdc-options := users's preferences;
|
|
body.cname := user's name;
|
|
body.realm := user's realm;
|
|
body.sname := service's name; /* usually "krbtgt",
|
|
"localrealm" */
|
|
if (body.kdc-options.POSTDATED is set) then
|
|
body.from := requested starting time;
|
|
else
|
|
omit body.from;
|
|
endif
|
|
body.till := requested end time;
|
|
if (body.kdc-options.RENEWABLE is set) then
|
|
body.rtime := requested final renewal time;
|
|
endif
|
|
body.nonce := random_nonce();
|
|
body.etype := requested etypes;
|
|
if (user supplied addresses) then
|
|
body.addresses := user's addresses;
|
|
else
|
|
omit body.addresses;
|
|
endif
|
|
omit body.enc-authorization-data;
|
|
request.req-body := body;
|
|
|
|
kerberos := lookup(name of local kerberos server (or servers));
|
|
send(packet,kerberos);
|
|
|
|
wait(for response);
|
|
if (timed_out) then
|
|
retry or use alternate server;
|
|
endif
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 91]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
A.2. KRB_AS_REQ verification and KRB_AS_REP generation
|
|
decode message into req;
|
|
|
|
client := lookup(req.cname,req.realm);
|
|
server := lookup(req.sname,req.realm);
|
|
get system_time;
|
|
kdc_time := system_time.seconds;
|
|
|
|
if (!client) then
|
|
/* no client in Database */
|
|
error_out(KDC_ERR_C_PRINCIPAL_UNKNOWN);
|
|
endif
|
|
if (!server) then
|
|
/* no server in Database */
|
|
error_out(KDC_ERR_S_PRINCIPAL_UNKNOWN);
|
|
endif
|
|
|
|
if(client.pa_enc_timestamp_required and
|
|
pa_enc_timestamp not present) then
|
|
error_out(KDC_ERR_PREAUTH_REQUIRED(PA_ENC_TIMESTAMP));
|
|
endif
|
|
|
|
if(pa_enc_timestamp present) then
|
|
decrypt req.padata-value into decrypted_enc_timestamp
|
|
using client.key;
|
|
using auth_hdr.authenticator.subkey;
|
|
if (decrypt_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
if(decrypted_enc_timestamp is not within allowable
|
|
skew) then error_out(KDC_ERR_PREAUTH_FAILED);
|
|
endif
|
|
if(decrypted_enc_timestamp and usec is replay)
|
|
error_out(KDC_ERR_PREAUTH_FAILED);
|
|
endif
|
|
add decrypted_enc_timestamp and usec to replay cache;
|
|
endif
|
|
|
|
use_etype := first supported etype in req.etypes;
|
|
|
|
if (no support for req.etypes) then
|
|
error_out(KDC_ERR_ETYPE_NOSUPP);
|
|
endif
|
|
|
|
new_tkt.vno := ticket version; /* = 5 */
|
|
new_tkt.sname := req.sname;
|
|
new_tkt.srealm := req.srealm;
|
|
reset all flags in new_tkt.flags;
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 92]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
/* It should be noted that local policy may affect the */
|
|
/* processing of any of these flags. For example, some */
|
|
/* realms may refuse to issue renewable tickets */
|
|
|
|
if (req.kdc-options.FORWARDABLE is set) then
|
|
set new_tkt.flags.FORWARDABLE;
|
|
endif
|
|
if (req.kdc-options.PROXIABLE is set) then
|
|
set new_tkt.flags.PROXIABLE;
|
|
endif
|
|
if (req.kdc-options.ALLOW-POSTDATE is set) then
|
|
set new_tkt.flags.ALLOW-POSTDATE;
|
|
endif
|
|
if ((req.kdc-options.RENEW is set) or
|
|
(req.kdc-options.VALIDATE is set) or
|
|
(req.kdc-options.PROXY is set) or
|
|
(req.kdc-options.FORWARDED is set) or
|
|
(req.kdc-options.ENC-TKT-IN-SKEY is set)) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
|
|
new_tkt.session := random_session_key();
|
|
new_tkt.cname := req.cname;
|
|
new_tkt.crealm := req.crealm;
|
|
new_tkt.transited := empty_transited_field();
|
|
|
|
new_tkt.authtime := kdc_time;
|
|
|
|
if (req.kdc-options.POSTDATED is set) then
|
|
if (against_postdate_policy(req.from)) then
|
|
error_out(KDC_ERR_POLICY);
|
|
endif
|
|
set new_tkt.flags.INVALID;
|
|
new_tkt.starttime := req.from;
|
|
else
|
|
omit new_tkt.starttime; /* treated as authtime when
|
|
omitted */
|
|
endif
|
|
if (req.till = 0) then
|
|
till := infinity;
|
|
else
|
|
till := req.till;
|
|
endif
|
|
|
|
new_tkt.endtime := min(till,
|
|
new_tkt.starttime+client.max_life,
|
|
new_tkt.starttime+server.max_life,
|
|
new_tkt.starttime+max_life_for_realm);
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 93]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
if ((req.kdc-options.RENEWABLE-OK is set) and
|
|
(new_tkt.endtime < req.till)) then
|
|
/* we set the RENEWABLE option for later processing */
|
|
set req.kdc-options.RENEWABLE;
|
|
req.rtime := req.till;
|
|
endif
|
|
|
|
if (req.rtime = 0) then
|
|
rtime := infinity;
|
|
else
|
|
rtime := req.rtime;
|
|
endif
|
|
|
|
if (req.kdc-options.RENEWABLE is set) then
|
|
set new_tkt.flags.RENEWABLE;
|
|
new_tkt.renew-till := min(rtime,
|
|
new_tkt.starttime+client.max_rlife,
|
|
new_tkt.starttime+server.max_rlife,
|
|
new_tkt.starttime+max_rlife_for_realm);
|
|
else
|
|
omit new_tkt.renew-till; /* only present if RENEWABLE */
|
|
endif
|
|
|
|
if (req.addresses) then
|
|
new_tkt.caddr := req.addresses;
|
|
else
|
|
omit new_tkt.caddr;
|
|
endif
|
|
|
|
new_tkt.authorization_data := empty_authorization_data();
|
|
|
|
encode to-be-encrypted part of ticket into OCTET STRING;
|
|
new_tkt.enc-part := encrypt OCTET STRING
|
|
using etype_for_key(server.key), server.key, server.p_kvno;
|
|
|
|
|
|
/* Start processing the response */
|
|
|
|
resp.pvno := 5;
|
|
resp.msg-type := KRB_AS_REP;
|
|
resp.cname := req.cname;
|
|
resp.crealm := req.realm;
|
|
resp.ticket := new_tkt;
|
|
|
|
resp.key := new_tkt.session;
|
|
resp.last-req := fetch_last_request_info(client);
|
|
resp.nonce := req.nonce;
|
|
resp.key-expiration := client.expiration;
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 94]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
resp.flags := new_tkt.flags;
|
|
|
|
resp.authtime := new_tkt.authtime;
|
|
resp.starttime := new_tkt.starttime;
|
|
resp.endtime := new_tkt.endtime;
|
|
|
|
if (new_tkt.flags.RENEWABLE) then
|
|
resp.renew-till := new_tkt.renew-till;
|
|
endif
|
|
|
|
resp.realm := new_tkt.realm;
|
|
resp.sname := new_tkt.sname;
|
|
|
|
resp.caddr := new_tkt.caddr;
|
|
|
|
encode body of reply into OCTET STRING;
|
|
|
|
resp.enc-part := encrypt OCTET STRING
|
|
using use_etype, client.key, client.p_kvno;
|
|
send(resp);
|
|
|
|
A.3. KRB_AS_REP verification
|
|
decode response into resp;
|
|
|
|
if (resp.msg-type = KRB_ERROR) then
|
|
if(error = KDC_ERR_PREAUTH_REQUIRED(PA_ENC_TIMESTAMP))
|
|
then set pa_enc_timestamp_required;
|
|
goto KRB_AS_REQ;
|
|
endif
|
|
process_error(resp);
|
|
return;
|
|
endif
|
|
|
|
/* On error, discard the response, and zero the session key */
|
|
/* from the response immediately */
|
|
|
|
key = get_decryption_key(resp.enc-part.kvno, resp.enc-part.etype,
|
|
resp.padata);
|
|
unencrypted part of resp := decode of decrypt of resp.enc-part
|
|
using resp.enc-part.etype and key;
|
|
zero(key);
|
|
|
|
if (common_as_rep_tgs_rep_checks fail) then
|
|
destroy resp.key;
|
|
return error;
|
|
endif
|
|
|
|
if near(resp.princ_exp) then
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 95]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
print(warning message);
|
|
endif
|
|
save_for_later(ticket,session,client,server,times,flags);
|
|
|
|
A.4. KRB_AS_REP and KRB_TGS_REP common checks
|
|
if (decryption_error() or
|
|
(req.cname != resp.cname) or
|
|
(req.realm != resp.crealm) or
|
|
(req.sname != resp.sname) or
|
|
(req.realm != resp.realm) or
|
|
(req.nonce != resp.nonce) or
|
|
(req.addresses != resp.caddr)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
endif
|
|
|
|
/* make sure no flags are set that shouldn't be, and that */
|
|
/* all that should be are set */
|
|
if (!check_flags_for_compatability(req.kdc-options,resp.flags))
|
|
then destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
endif
|
|
|
|
if ((req.from = 0) and
|
|
(resp.starttime is not within allowable skew)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_SKEW;
|
|
endif
|
|
if ((req.from != 0) and (req.from != resp.starttime)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
endif
|
|
if ((req.till != 0) and (resp.endtime > req.till)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
endif
|
|
|
|
if ((req.kdc-options.RENEWABLE is set) and
|
|
(req.rtime != 0) and (resp.renew-till > req.rtime)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
endif
|
|
if ((req.kdc-options.RENEWABLE-OK is set) and
|
|
(resp.flags.RENEWABLE) and
|
|
(req.till != 0) and
|
|
(resp.renew-till > req.till)) then
|
|
destroy resp.key;
|
|
return KRB_AP_ERR_MODIFIED;
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 96]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
endif
|
|
|
|
A.5. KRB_TGS_REQ generation
|
|
/* Note that make_application_request might have to */
|
|
/* recursivly call this routine to get the appropriate */
|
|
/* ticket-granting ticket */
|
|
|
|
request.pvno := protocol version; /* pvno = 5 */
|
|
request.msg-type := message type; /* type = KRB_TGS_REQ */
|
|
|
|
body.kdc-options := users's preferences;
|
|
/* If the TGT is not for the realm of the end-server */
|
|
/* then the sname will be for a TGT for the end-realm */
|
|
/* and the realm of the requested ticket (body.realm) */
|
|
/* will be that of the TGS to which the TGT we are */
|
|
/* sending applies */
|
|
body.sname := service's name;
|
|
body.realm := service's realm;
|
|
|
|
if (body.kdc-options.POSTDATED is set) then
|
|
body.from := requested starting time;
|
|
else
|
|
omit body.from;
|
|
endif
|
|
body.till := requested end time;
|
|
if (body.kdc-options.RENEWABLE is set) then
|
|
body.rtime := requested final renewal time;
|
|
endif
|
|
body.nonce := random_nonce();
|
|
body.etype := requested etypes;
|
|
if (user supplied addresses) then
|
|
body.addresses := user's addresses;
|
|
else
|
|
omit body.addresses;
|
|
endif
|
|
|
|
body.enc-authorization-data := user-supplied data;
|
|
if (body.kdc-options.ENC-TKT-IN-SKEY) then
|
|
body.additional-tickets_ticket := second TGT;
|
|
endif
|
|
|
|
request.req-body := body;
|
|
check := generate_checksum (req.body,checksumtype);
|
|
|
|
request.padata[0].padata-type := PA-TGS-REQ;
|
|
request.padata[0].padata-value := create a KRB_AP_REQ using
|
|
the TGT and checksum
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 97]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
/* add in any other padata as required/supplied */
|
|
|
|
kerberos := lookup(name of local kerberose server (or servers));
|
|
send(packet,kerberos);
|
|
|
|
wait(for response);
|
|
if (timed_out) then
|
|
retry or use alternate server;
|
|
endif
|
|
|
|
A.6. KRB_TGS_REQ verification and KRB_TGS_REP generation
|
|
/* note that reading the application request requires first
|
|
determining the server for which a ticket was issued, and
|
|
choosing the correct key for decryption. The name of the
|
|
server appears in the plaintext part of the ticket. */
|
|
|
|
if (no KRB_AP_REQ in req.padata) then
|
|
error_out(KDC_ERR_PADATA_TYPE_NOSUPP);
|
|
endif
|
|
verify KRB_AP_REQ in req.padata;
|
|
|
|
/* Note that the realm in which the Kerberos server is
|
|
operating is determined by the instance from the
|
|
ticket-granting ticket. The realm in the ticket-granting
|
|
ticket is the realm under which the ticket granting ticket was
|
|
issued. It is possible for a single Kerberos server to
|
|
support more than one realm. */
|
|
|
|
auth_hdr := KRB_AP_REQ;
|
|
tgt := auth_hdr.ticket;
|
|
|
|
if (tgt.sname is not a TGT for local realm and is not
|
|
req.sname) then error_out(KRB_AP_ERR_NOT_US);
|
|
|
|
realm := realm_tgt_is_for(tgt);
|
|
|
|
decode remainder of request;
|
|
|
|
if (auth_hdr.authenticator.cksum is missing) then
|
|
error_out(KRB_AP_ERR_INAPP_CKSUM);
|
|
endif
|
|
if (auth_hdr.authenticator.cksum type is not supported) then
|
|
error_out(KDC_ERR_SUMTYPE_NOSUPP);
|
|
endif
|
|
if (auth_hdr.authenticator.cksum is not both collision-proof
|
|
and keyed) then
|
|
error_out(KRB_AP_ERR_INAPP_CKSUM);
|
|
endif
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 98]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
set computed_checksum := checksum(req);
|
|
if (computed_checksum != auth_hdr.authenticatory.cksum) then
|
|
error_out(KRB_AP_ERR_MODIFIED);
|
|
endif
|
|
|
|
server := lookup(req.sname,realm);
|
|
|
|
if (!server) then
|
|
if (is_foreign_tgt_name(server)) then
|
|
server := best_intermediate_tgs(server);
|
|
else
|
|
/* no server in Database */
|
|
error_out(KDC_ERR_S_PRINCIPAL_UNKNOWN);
|
|
endif
|
|
endif
|
|
|
|
session := generate_random_session_key();
|
|
|
|
|
|
use_etype := first supported etype in req.etypes;
|
|
|
|
if (no support for req.etypes) then
|
|
error_out(KDC_ERR_ETYPE_NOSUPP);
|
|
endif
|
|
|
|
new_tkt.vno := ticket version; /* = 5 */
|
|
new_tkt.sname := req.sname;
|
|
new_tkt.srealm := realm;
|
|
reset all flags in new_tkt.flags;
|
|
|
|
/* It should be noted that local policy may affect the */
|
|
/* processing of any of these flags. For example, some */
|
|
/* realms may refuse to issue renewable tickets */
|
|
|
|
new_tkt.caddr := tgt.caddr;
|
|
resp.caddr := NULL; /* We only include this if they change */
|
|
if (req.kdc-options.FORWARDABLE is set) then
|
|
if (tgt.flags.FORWARDABLE is reset) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.FORWARDABLE;
|
|
endif
|
|
if (req.kdc-options.FORWARDED is set) then
|
|
if (tgt.flags.FORWARDABLE is reset) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.FORWARDED;
|
|
new_tkt.caddr := req.addresses;
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 99]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
resp.caddr := req.addresses;
|
|
endif
|
|
if (tgt.flags.FORWARDED is set) then
|
|
set new_tkt.flags.FORWARDED;
|
|
endif
|
|
|
|
if (req.kdc-options.PROXIABLE is set) then
|
|
if (tgt.flags.PROXIABLE is reset)
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.PROXIABLE;
|
|
endif
|
|
if (req.kdc-options.PROXY is set) then
|
|
if (tgt.flags.PROXIABLE is reset) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.PROXY;
|
|
new_tkt.caddr := req.addresses;
|
|
resp.caddr := req.addresses;
|
|
endif
|
|
|
|
if (req.kdc-options.POSTDATE is set) then
|
|
if (tgt.flags.POSTDATE is reset)
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.POSTDATE;
|
|
endif
|
|
if (req.kdc-options.POSTDATED is set) then
|
|
if (tgt.flags.POSTDATE is reset) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
set new_tkt.flags.POSTDATED;
|
|
set new_tkt.flags.INVALID;
|
|
if (against_postdate_policy(req.from)) then
|
|
error_out(KDC_ERR_POLICY);
|
|
endif
|
|
new_tkt.starttime := req.from;
|
|
endif
|
|
|
|
|
|
if (req.kdc-options.VALIDATE is set) then
|
|
if (tgt.flags.INVALID is reset) then
|
|
error_out(KDC_ERR_POLICY);
|
|
endif
|
|
if (tgt.starttime > kdc_time) then
|
|
error_out(KRB_AP_ERR_NYV);
|
|
endif
|
|
if (check_hot_list(tgt)) then
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 100]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
error_out(KRB_AP_ERR_REPEAT);
|
|
endif
|
|
tkt := tgt;
|
|
reset new_tkt.flags.INVALID;
|
|
endif
|
|
|
|
if (req.kdc-options.(any flag except ENC-TKT-IN-SKEY, RENEW,
|
|
and those already processed) is set) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
|
|
new_tkt.authtime := tgt.authtime;
|
|
|
|
if (req.kdc-options.RENEW is set) then
|
|
/* Note that if the endtime has already passed, the ticket */
|
|
/* would have been rejected in the initial authentication */
|
|
/* stage, so there is no need to check again here */
|
|
if (tgt.flags.RENEWABLE is reset) then
|
|
error_out(KDC_ERR_BADOPTION);
|
|
endif
|
|
if (tgt.renew-till >= kdc_time) then
|
|
error_out(KRB_AP_ERR_TKT_EXPIRED);
|
|
endif
|
|
tkt := tgt;
|
|
new_tkt.starttime := kdc_time;
|
|
old_life := tgt.endttime - tgt.starttime;
|
|
new_tkt.endtime := min(tgt.renew-till,
|
|
new_tkt.starttime + old_life);
|
|
else
|
|
new_tkt.starttime := kdc_time;
|
|
if (req.till = 0) then
|
|
till := infinity;
|
|
else
|
|
till := req.till;
|
|
endif
|
|
new_tkt.endtime := min(till,
|
|
new_tkt.starttime+client.max_life,
|
|
new_tkt.starttime+server.max_life,
|
|
new_tkt.starttime+max_life_for_realm,
|
|
tgt.endtime);
|
|
|
|
if ((req.kdc-options.RENEWABLE-OK is set) and
|
|
(new_tkt.endtime < req.till) and
|
|
(tgt.flags.RENEWABLE is set) then
|
|
/* we set the RENEWABLE option for later */
|
|
/* processing */
|
|
set req.kdc-options.RENEWABLE;
|
|
req.rtime := min(req.till, tgt.renew-till);
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 101]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
endif
|
|
endif
|
|
|
|
if (req.rtime = 0) then
|
|
rtime := infinity;
|
|
else
|
|
rtime := req.rtime;
|
|
endif
|
|
|
|
if ((req.kdc-options.RENEWABLE is set) and
|
|
(tgt.flags.RENEWABLE is set)) then
|
|
set new_tkt.flags.RENEWABLE;
|
|
new_tkt.renew-till := min(rtime,
|
|
new_tkt.starttime+client.max_rlife,
|
|
new_tkt.starttime+server.max_rlife,
|
|
new_tkt.starttime+max_rlife_for_realm,
|
|
tgt.renew-till);
|
|
else
|
|
new_tkt.renew-till := OMIT;
|
|
/* leave the renew-till field out */
|
|
endif
|
|
if (req.enc-authorization-data is present) then
|
|
decrypt req.enc-authorization-data
|
|
into decrypted_authorization_data
|
|
using auth_hdr.authenticator.subkey;
|
|
if (decrypt_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
endif
|
|
new_tkt.authorization_data :=
|
|
req.auth_hdr.ticket.authorization_data +
|
|
decrypted_authorization_data;
|
|
|
|
new_tkt.key := session;
|
|
new_tkt.crealm := tgt.crealm;
|
|
new_tkt.cname := req.auth_hdr.ticket.cname;
|
|
|
|
if (realm_tgt_is_for(tgt) := tgt.realm) then
|
|
/* tgt issued by local realm */
|
|
new_tkt.transited := tgt.transited;
|
|
else
|
|
/* was issued for this realm by some other realm */
|
|
if (tgt.transited.tr-type not supported) then
|
|
error_out(KDC_ERR_TRTYPE_NOSUPP);
|
|
endif
|
|
new_tkt.transited
|
|
:= compress_transited(tgt.transited + tgt.realm)
|
|
endif
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 102]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
encode encrypted part of new_tkt into OCTET STRING;
|
|
if (req.kdc-options.ENC-TKT-IN-SKEY is set) then
|
|
if (server not specified) then
|
|
server = req.second_ticket.client;
|
|
endif
|
|
if ((req.second_ticket is not a TGT) or
|
|
(req.second_ticket.client != server)) then
|
|
error_out(KDC_ERR_POLICY);
|
|
endif
|
|
|
|
new_tkt.enc-part := encrypt OCTET STRING using
|
|
using etype_for_key(second-ticket.key),
|
|
second-ticket.key;
|
|
else
|
|
new_tkt.enc-part := encrypt OCTET STRING
|
|
using etype_for_key(server.key), server.key,
|
|
server.p_kvno;
|
|
endif
|
|
|
|
resp.pvno := 5;
|
|
resp.msg-type := KRB_TGS_REP;
|
|
resp.crealm := tgt.crealm;
|
|
resp.cname := tgt.cname;
|
|
resp.ticket := new_tkt;
|
|
|
|
resp.key := session;
|
|
resp.nonce := req.nonce;
|
|
resp.last-req := fetch_last_request_info(client);
|
|
resp.flags := new_tkt.flags;
|
|
|
|
resp.authtime := new_tkt.authtime;
|
|
resp.starttime := new_tkt.starttime;
|
|
resp.endtime := new_tkt.endtime;
|
|
|
|
omit resp.key-expiration;
|
|
|
|
resp.sname := new_tkt.sname;
|
|
resp.realm := new_tkt.realm;
|
|
|
|
if (new_tkt.flags.RENEWABLE) then
|
|
resp.renew-till := new_tkt.renew-till;
|
|
endif
|
|
|
|
|
|
encode body of reply into OCTET STRING;
|
|
|
|
if (req.padata.authenticator.subkey)
|
|
resp.enc-part := encrypt OCTET STRING using use_etype,
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 103]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
req.padata.authenticator.subkey;
|
|
else resp.enc-part := encrypt OCTET STRING
|
|
using use_etype, tgt.key;
|
|
|
|
send(resp);
|
|
|
|
A.7. KRB_TGS_REP verification
|
|
decode response into resp;
|
|
|
|
if (resp.msg-type = KRB_ERROR) then
|
|
process_error(resp);
|
|
return;
|
|
endif
|
|
|
|
/* On error, discard the response, and zero the session key from
|
|
the response immediately */
|
|
|
|
if (req.padata.authenticator.subkey)
|
|
unencrypted part of resp :=
|
|
decode of decrypt of resp.enc-part
|
|
using resp.enc-part.etype and subkey;
|
|
else unencrypted part of resp :=
|
|
decode of decrypt of resp.enc-part
|
|
using resp.enc-part.etype and tgt's session key;
|
|
if (common_as_rep_tgs_rep_checks fail) then
|
|
destroy resp.key;
|
|
return error;
|
|
endif
|
|
|
|
check authorization_data as necessary;
|
|
save_for_later(ticket,session,client,server,times,flags);
|
|
|
|
A.8. Authenticator generation
|
|
body.authenticator-vno := authenticator vno; /* = 5 */
|
|
body.cname, body.crealm := client name;
|
|
if (supplying checksum) then
|
|
body.cksum := checksum;
|
|
endif
|
|
get system_time;
|
|
body.ctime, body.cusec := system_time;
|
|
if (selecting sub-session key) then
|
|
select sub-session key;
|
|
body.subkey := sub-session key;
|
|
endif
|
|
if (using sequence numbers) then
|
|
select initial sequence number;
|
|
body.seq-number := initial sequence;
|
|
endif
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 104]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
A.9. KRB_AP_REQ generation
|
|
obtain ticket and session_key from cache;
|
|
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_AP_REQ */
|
|
|
|
if (desired(MUTUAL_AUTHENTICATION)) then
|
|
set packet.ap-options.MUTUAL-REQUIRED;
|
|
else
|
|
reset packet.ap-options.MUTUAL-REQUIRED;
|
|
endif
|
|
if (using session key for ticket) then
|
|
set packet.ap-options.USE-SESSION-KEY;
|
|
else
|
|
reset packet.ap-options.USE-SESSION-KEY;
|
|
endif
|
|
packet.ticket := ticket; /* ticket */
|
|
generate authenticator;
|
|
encode authenticator into OCTET STRING;
|
|
encrypt OCTET STRING into packet.authenticator
|
|
using session_key;
|
|
|
|
A.10. KRB_AP_REQ verification
|
|
receive packet;
|
|
if (packet.pvno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.msg-type != KRB_AP_REQ) then
|
|
error_out(KRB_AP_ERR_MSG_TYPE);
|
|
endif
|
|
if (packet.ticket.tkt_vno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.ap_options.USE-SESSION-KEY is set) then
|
|
retrieve session key from ticket-granting ticket for
|
|
packet.ticket.{sname,srealm,enc-part.etype};
|
|
else
|
|
retrieve service key for
|
|
packet.ticket.{sname,srealm,enc-part.etype,enc-part.skvno};
|
|
endif
|
|
if (no_key_available) then
|
|
if (cannot_find_specified_skvno) then
|
|
error_out(KRB_AP_ERR_BADKEYVER);
|
|
else
|
|
error_out(KRB_AP_ERR_NOKEY);
|
|
endif
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 105]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
endif
|
|
decrypt packet.ticket.enc-part into decr_ticket
|
|
using retrieved key;
|
|
if (decryption_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
decrypt packet.authenticator into decr_authenticator
|
|
using decr_ticket.key;
|
|
if (decryption_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
if (decr_authenticator.{cname,crealm} !=
|
|
decr_ticket.{cname,crealm}) then
|
|
error_out(KRB_AP_ERR_BADMATCH);
|
|
endif
|
|
if (decr_ticket.caddr is present) then
|
|
if (sender_address(packet) is not in decr_ticket.caddr)
|
|
then error_out(KRB_AP_ERR_BADADDR);
|
|
endif
|
|
elseif (application requires addresses) then
|
|
error_out(KRB_AP_ERR_BADADDR);
|
|
endif
|
|
if (not in_clock_skew(decr_authenticator.ctime,
|
|
decr_authenticator.cusec)) then
|
|
error_out(KRB_AP_ERR_SKEW);
|
|
endif
|
|
if (repeated(decr_authenticator.{ctime,cusec,cname,crealm}))
|
|
then error_out(KRB_AP_ERR_REPEAT);
|
|
endif
|
|
save_identifier(decr_authenticator.{ctime,cusec,cname,crealm});
|
|
get system_time;
|
|
if ((decr_ticket.starttime-system_time > CLOCK_SKEW) or
|
|
(decr_ticket.flags.INVALID is set)) then
|
|
/* it hasn't yet become valid */
|
|
error_out(KRB_AP_ERR_TKT_NYV);
|
|
endif
|
|
if (system_time-decr_ticket.endtime > CLOCK_SKEW) then
|
|
error_out(KRB_AP_ERR_TKT_EXPIRED);
|
|
endif
|
|
/* caller must check decr_ticket.flags for any pertinent */
|
|
/* details */
|
|
return(OK, decr_ticket, packet.ap_options.MUTUAL-REQUIRED);
|
|
|
|
A.11. KRB_AP_REP generation
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_AP_REP */
|
|
body.ctime := packet.ctime;
|
|
body.cusec := packet.cusec;
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 106]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
if (selecting sub-session key) then
|
|
select sub-session key;
|
|
body.subkey := sub-session key;
|
|
endif
|
|
if (using sequence numbers) then
|
|
select initial sequence number;
|
|
body.seq-number := initial sequence;
|
|
endif
|
|
|
|
encode body into OCTET STRING;
|
|
|
|
select encryption type;
|
|
encrypt OCTET STRING into packet.enc-part;
|
|
|
|
A.12. KRB_AP_REP verification
|
|
receive packet;
|
|
if (packet.pvno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.msg-type != KRB_AP_REP) then
|
|
error_out(KRB_AP_ERR_MSG_TYPE);
|
|
endif
|
|
cleartext := decrypt(packet.enc-part)
|
|
using ticket's session key;
|
|
if (decryption_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
if (cleartext.ctime != authenticator.ctime) then
|
|
error_out(KRB_AP_ERR_MUT_FAIL);
|
|
endif
|
|
if (cleartext.cusec != authenticator.cusec) then
|
|
error_out(KRB_AP_ERR_MUT_FAIL);
|
|
endif
|
|
if (cleartext.subkey is present) then
|
|
save cleartext.subkey for future use;
|
|
endif
|
|
if (cleartext.seq-number is present) then
|
|
save cleartext.seq-number for future verifications;
|
|
endif
|
|
return(AUTHENTICATION_SUCCEEDED);
|
|
|
|
A.13. KRB_SAFE generation
|
|
collect user data in buffer;
|
|
|
|
/* assemble packet: */
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_SAFE */
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 107]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
body.user-data := buffer; /* DATA */
|
|
if (using timestamp) then
|
|
get system_time;
|
|
body.timestamp, body.usec := system_time;
|
|
endif
|
|
if (using sequence numbers) then
|
|
body.seq-number := sequence number;
|
|
endif
|
|
body.s-address := sender host addresses;
|
|
if (only one recipient) then
|
|
body.r-address := recipient host address;
|
|
endif
|
|
checksum.cksumtype := checksum type;
|
|
compute checksum over body;
|
|
checksum.checksum := checksum value; /* checksum.checksum */
|
|
packet.cksum := checksum;
|
|
packet.safe-body := body;
|
|
|
|
A.14. KRB_SAFE verification
|
|
receive packet;
|
|
if (packet.pvno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.msg-type != KRB_SAFE) then
|
|
error_out(KRB_AP_ERR_MSG_TYPE);
|
|
endif
|
|
if (packet.checksum.cksumtype is not both collision-proof
|
|
and keyed) then
|
|
error_out(KRB_AP_ERR_INAPP_CKSUM);
|
|
endif
|
|
if (safe_priv_common_checks_ok(packet)) then
|
|
set computed_checksum := checksum(packet.body);
|
|
if (computed_checksum != packet.checksum) then
|
|
error_out(KRB_AP_ERR_MODIFIED);
|
|
endif
|
|
return (packet, PACKET_IS_GENUINE);
|
|
else
|
|
return common_checks_error;
|
|
endif
|
|
|
|
A.15. KRB_SAFE and KRB_PRIV common checks
|
|
if (packet.s-address != O/S_sender(packet)) then
|
|
/* O/S report of sender not who claims to have sent it */
|
|
error_out(KRB_AP_ERR_BADADDR);
|
|
endif
|
|
if ((packet.r-address is present) and
|
|
(packet.r-address != local_host_address)) then
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 108]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
/* was not sent to proper place */
|
|
error_out(KRB_AP_ERR_BADADDR);
|
|
endif
|
|
if (((packet.timestamp is present) and
|
|
(not in_clock_skew(packet.timestamp,packet.usec))) or
|
|
(packet.timestamp is not present and timestamp expected))
|
|
then error_out(KRB_AP_ERR_SKEW);
|
|
endif
|
|
if (repeated(packet.timestamp,packet.usec,packet.s-address))
|
|
then error_out(KRB_AP_ERR_REPEAT);
|
|
endif
|
|
if (((packet.seq-number is present) and
|
|
((not in_sequence(packet.seq-number)))) or
|
|
(packet.seq-number is not present and sequence expected))
|
|
then error_out(KRB_AP_ERR_BADORDER);
|
|
endif
|
|
if (packet.timestamp not present and
|
|
packet.seq-number not present) then
|
|
error_out(KRB_AP_ERR_MODIFIED);
|
|
endif
|
|
|
|
save_identifier(packet.{timestamp,usec,s-address},
|
|
sender_principal(packet));
|
|
|
|
return PACKET_IS_OK;
|
|
|
|
A.16. KRB_PRIV generation
|
|
collect user data in buffer;
|
|
|
|
/* assemble packet: */
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_PRIV */
|
|
|
|
packet.enc-part.etype := encryption type;
|
|
|
|
body.user-data := buffer;
|
|
if (using timestamp) then
|
|
get system_time;
|
|
body.timestamp, body.usec := system_time;
|
|
endif
|
|
if (using sequence numbers) then
|
|
body.seq-number := sequence number;
|
|
endif
|
|
body.s-address := sender host addresses;
|
|
if (only one recipient) then
|
|
body.r-address := recipient host address;
|
|
endif
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 109]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
encode body into OCTET STRING;
|
|
|
|
select encryption type;
|
|
encrypt OCTET STRING into packet.enc-part.cipher;
|
|
|
|
A.17. KRB_PRIV verification
|
|
receive packet;
|
|
if (packet.pvno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.msg-type != KRB_PRIV) then
|
|
error_out(KRB_AP_ERR_MSG_TYPE);
|
|
endif
|
|
|
|
cleartext := decrypt(packet.enc-part) using negotiated key;
|
|
if (decryption_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
|
|
if (safe_priv_common_checks_ok(cleartext)) then
|
|
return(cleartext.DATA, PACKET_IS_GENUINE_AND_UNMODIFIED);
|
|
else
|
|
return common_checks_error;
|
|
endif
|
|
|
|
A.18. KRB_CRED generation
|
|
invoke KRB_TGS; /* obtain tickets to be provided to peer */
|
|
|
|
/* assemble packet: */
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_CRED */
|
|
|
|
for (tickets[n] in tickets to be forwarded) do
|
|
packet.tickets[n] = tickets[n].ticket;
|
|
done
|
|
|
|
packet.enc-part.etype := encryption type;
|
|
|
|
for (ticket[n] in tickets to be forwarded) do
|
|
body.ticket-info[n].key = tickets[n].session;
|
|
body.ticket-info[n].prealm = tickets[n].crealm;
|
|
body.ticket-info[n].pname = tickets[n].cname;
|
|
body.ticket-info[n].flags = tickets[n].flags;
|
|
body.ticket-info[n].authtime = tickets[n].authtime;
|
|
body.ticket-info[n].starttime = tickets[n].starttime;
|
|
body.ticket-info[n].endtime = tickets[n].endtime;
|
|
body.ticket-info[n].renew-till = tickets[n].renew-till;
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 110]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
body.ticket-info[n].srealm = tickets[n].srealm;
|
|
body.ticket-info[n].sname = tickets[n].sname;
|
|
body.ticket-info[n].caddr = tickets[n].caddr;
|
|
done
|
|
|
|
get system_time;
|
|
body.timestamp, body.usec := system_time;
|
|
|
|
if (using nonce) then
|
|
body.nonce := nonce;
|
|
endif
|
|
|
|
if (using s-address) then
|
|
body.s-address := sender host addresses;
|
|
endif
|
|
if (limited recipients) then
|
|
body.r-address := recipient host address;
|
|
endif
|
|
|
|
encode body into OCTET STRING;
|
|
|
|
select encryption type;
|
|
encrypt OCTET STRING into packet.enc-part.cipher
|
|
using negotiated encryption key;
|
|
|
|
A.19. KRB_CRED verification
|
|
receive packet;
|
|
if (packet.pvno != 5) then
|
|
either process using other protocol spec
|
|
or error_out(KRB_AP_ERR_BADVERSION);
|
|
endif
|
|
if (packet.msg-type != KRB_CRED) then
|
|
error_out(KRB_AP_ERR_MSG_TYPE);
|
|
endif
|
|
|
|
cleartext := decrypt(packet.enc-part) using negotiated key;
|
|
if (decryption_error()) then
|
|
error_out(KRB_AP_ERR_BAD_INTEGRITY);
|
|
endif
|
|
if ((packet.r-address is present or required) and
|
|
(packet.s-address != O/S_sender(packet)) then
|
|
/* O/S report of sender not who claims to have sent it */
|
|
error_out(KRB_AP_ERR_BADADDR);
|
|
endif
|
|
if ((packet.r-address is present) and
|
|
(packet.r-address != local_host_address)) then
|
|
/* was not sent to proper place */
|
|
error_out(KRB_AP_ERR_BADADDR);
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 111]
|
|
|
|
RFC 1510 Kerberos September 1993
|
|
|
|
|
|
endif
|
|
if (not in_clock_skew(packet.timestamp,packet.usec)) then
|
|
error_out(KRB_AP_ERR_SKEW);
|
|
endif
|
|
if (repeated(packet.timestamp,packet.usec,packet.s-address))
|
|
then error_out(KRB_AP_ERR_REPEAT);
|
|
endif
|
|
if (packet.nonce is required or present) and
|
|
(packet.nonce != expected-nonce) then
|
|
error_out(KRB_AP_ERR_MODIFIED);
|
|
endif
|
|
|
|
for (ticket[n] in tickets that were forwarded) do
|
|
save_for_later(ticket[n],key[n],principal[n],
|
|
server[n],times[n],flags[n]);
|
|
return
|
|
|
|
A.20. KRB_ERROR generation
|
|
|
|
/* assemble packet: */
|
|
packet.pvno := protocol version; /* 5 */
|
|
packet.msg-type := message type; /* KRB_ERROR */
|
|
|
|
get system_time;
|
|
packet.stime, packet.susec := system_time;
|
|
packet.realm, packet.sname := server name;
|
|
|
|
if (client time available) then
|
|
packet.ctime, packet.cusec := client_time;
|
|
endif
|
|
packet.error-code := error code;
|
|
if (client name available) then
|
|
packet.cname, packet.crealm := client name;
|
|
endif
|
|
if (error text available) then
|
|
packet.e-text := error text;
|
|
endif
|
|
if (error data available) then
|
|
packet.e-data := error data;
|
|
endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Kohl & Neuman [Page 112]
|
|
|