jtkohl@ATHENA.MIT.EDU (John T Kohl) (07/06/89)
Following is a proposal which I'd like to get comments on before inclusion in the draft Kerberos V5 protocol specification. The basic idea here was first proposed by Ted Anderson (CMU ITC). The problem: long-lived tickets are sometimes desired (e.g. to allow a long-running computation to utilize Kerberos-mediated services), but the exposure to stolen credentials (ticket + session key) is greatly increased by increasing the lifetime of a ticket. What we think people want is a way to allow long-lived tickets with a (limited) form of revocability [Current tickets are not revocable, they just expire]. Here's a way to achieve that which adds only a little state to the KDC (in the form of a hot-list, described below). Each ticket will include 4 timestamps: "auth" time at which the initial password/key based authentication occurred "from" time after which it can be valid "till" time after which it can never be valid "life" delta (a 'local' lifetime), where "life" < "till" - "from" t(now) means the current time. If (t(now) > "from") and (t(now) < "from" + "life"), then the ticket may be valid, subject to the other normal restrictions (i.e. it hasn't expired). Presenting a valid, renewable ticket (i.e. a RENEWABLE flag is set in the ticket) to the KDC along with a request to extend the life results in the server issuing a replacement with "from" (and possibly "life") adjusted such that the ticket is valid for the minimum of "till"-"from" and "life" time units from t(now), UNLESS the "auth" time of the ticket is rejected by the "hot list" (see below). How this is used for long-life tickets: 1) The client needing a long life ticket requests a renewable long-life ticket. The KDC returns a ticket with "from" & "till" set as requested, but "life" set to some site-configured value (e.g. 8 hours). 2) The client remembers the "life" value. 3) The client presents this ticket to the server. 4) If the server is of the sort which refuses continued access after the expiration of a ticket, then the client needs to present the ticket to the KDC and request a lifetime extension before "life" expires. The returned ticket is used to replace the old ticket; the new ticket is presented to the server, and the Kerberos-mediated service transaction continues on its merry way. If the server doesn't want to expire access granted by use of a now-expired ticket, nothing more need be done. (e.g. current MIT implementations of TCP-based Kerberos mediated services) The "hot list": The "hot list" is maintained on one (or more) of a realm's KDC. It contains a short list of information which can be used to revoke a renewable long-lived ticket. The hot list needs to correlate "auth" times with tickets which are to be revoked. [The user whose tickets have been stolen may need to contact an administrator to put his stolen tickets on this list]. When the KDC receives a lifetime-extension request, it verifies that the ticket presented is not on the hot list. If the ticket is on the hot list, it logs the attempt, and rejects the request. Notes: 1) an entry in the hot list need only be maintained in that list until the maximum site "life" has passed. After this point, any hot-listed ticket will no longer be valid for obtaining a replacement, as it will have expired. 2) The hot list should be short and easy to maintain. Some possible ways to store info: a) put all tickets from user.inst@realm for service svc.inst (perhaps from a given host?) issued before some specified time on the list. e.g. all tickets for testuser@FOO.EDU to use rcmd.atalanta issued before 01-Jan-2001 are revoked. -This has the disadvantage of rendering invalid any other valid tickets for that service currently held by the user (but the user can reauthenticate manually). -It needs the fields <principal,service,time,[host]> -If an entire ticket cache were stolen, this could lead to a large number of entries per theft. An alternative would be to allow wildcards for the service name (e.g. invalidate all tickets from that user, rather than just the named tickets) b) put tickets from user.inst@realm authenticated at a specified time on the list. e.g. all tickets for testuser@FOO.EDU to use rcmd.atalanta issued at 08:30:43 01-Jan-2001 are revoked. -This renders invalid only the stolen ticket, but the user may still want to use it [tough luck]. -The hot list needs to store <principal,svc,time> -The user may not be able to determine the correct value for <time> if the ticket cache were removed upon theft. [An administrator could intervene and check ticket issue logs, though.] Possible problems: Depending on the site-chosen value for the standard 'life', the KDC could start fielding many more requests that currently required (assuming that a site might wish to make this lifetime short, and by policy issue all tickets with the renewal requirement, to reduce the exposure to things like rebooted machines having readily available credentials). The hot-list probably needs duplication, and since it can change often, this may be opening a database can of worms.
chariot@ATHENA.MIT.EDU (Mark Lillibridge) (07/21/89)
Comments on John's proposal: (1) Note that under the proposed system, old renewable tickets which have expired but have a 'successor' which has not expired must be kept secret. (By 'successors', I mean the series of tickets which resulted from renewing again and again the original ticket) This is because if I know the session key for the old ticket & have watched its successors being obtained, I can figure out the session key for all of the old ticket's successors, including the one currently in use. Thus, even if I stole a renewable ticket more than the site's maximum lifetime ago, I may still be able to use it. (2) I see no reason to keep unrenewable tickets at all. Since user's have no control over a site's maximum lifetime, they have no choice but to always ask for renewable tickets if they want a minimum (renewable) lifetime. This would remove the need for a RENEWABLE flag & simplify the code. (3) Limits on what kinds of tickets could be acquired were not mentioned in the proposal but I would like to propose the following: - TGT's can be acquired with any from and till values given only that from<till. The actual lifetime of the TGT is the minimum of the requested value and the site minimum. Note that some sites may want to have a smaller minimum lifetime for TGT's than normal tickets. - Normal tickets can be requested using a TGT with from time f and till time t only with from values >=f and till values <= t. I.e., no ticket can be obtained from a TGT which gives authentication beyond the authentication interval of the TGT. Lifetime is treated as for TGT although possibly with a different site lifetime minimum. - I would recommend that whenever a TGT with a lifetime greater than say 7 days is requested, a mail notice be sent to the principal of the ticket if it is a user telling that a TGT has been requested for X time on host X and giving explicit instructions on how to revoke it. This would protect against someone getting a very long lived ticket while you are momentarily away from your workstation and using it to wreck havoc later on. (4) Note that if the hotlist is kept on only one KDC and the net becomes partitioned, splitting a slave KDC off from the KDC with the hotlist, that slave KDC is no longer able to renew tickets. As this is a major loss of functionality, esp. if all tickets are renewable, I believe copies of the hotlist should be maintained on all KDC's. - Mark Lillibridge MIT Project Athena
wesommer@ATHENA.MIT.EDU (Bill Sommerfeld) (07/21/89)
Date: Fri, 21 Jul 89 12:28:44 -0400 From: Mark Lillibridge <chariot@ATHENA.MIT.EDU> Reply-To: chariot@ATHENA.MIT.EDU Address: EC Bemis 515, 3 Ames Street, Cambridge, MA 02139 Phone: (617) 225-6554 Comments on John's proposal: (1) Note that under the proposed system, old renewable tickets which have expired but have a 'successor' which has not expired must be kept secret. Wrong; the ticket itself never has to be kept secret, and it is sent over the wire "in the clear"; only the associated session key must be kept secret. - I would recommend that whenever a TGT with a lifetime greater than say 7 days is requested, a mail notice be sent to the principal of the ticket if it is a user telling that a TGT has been requested for X time on host X and giving explicit instructions on how to revoke it. This is an implementation issue, and assumes that there is a sensible mapping from kerberos names to mail names. When renewing a ticket, or using a ticket-granting-ticket, if the client identity is from the local realm, does the KDC have to check that the user in question still exists in the realm's database? If so, then some forms of revocation short of a hotlist are possible; however, if the kerberos database is replicated, but not strongly consistent, I can imagine a number of unusual failure modes going on for users which have just been added to the database. - Bill
saltzer@SRC.DEC.COM (Jerry Saltzer) (07/22/89)
Mark says, "(2) I see no reason to keep unrenewable tickets at all. Since user's have no control over a site's maximum lifetime, they have no choice but to always ask for renewable tickets if they want a minimum (renewable) lifetime. This would remove the need for a RENEWABLE flag & simplify the code." I agree. Rather than having a flag on RENEWABILITY, can't you just issue a ticket with FROM = now, and TILL = now+life? What we really have here is an opportunity for a more flexible set of site defaults. The first settable default is life, probably set to the current 8 hours. The second settable default is the amount by which TILL normally exceeds FROM. That could also be set to 8 hours, or 24 hours, or whatever seems plausible for the site. This proposal emphasizes the usefulness of a (prospective) ticket management utility that keeps a little window in some corner showing what tickets you have and how long they have to live. The same utility would be responsible for waking up just before the deadline and automatically renewing any renewable tickets. Jerry
bcn@JUNE.CS.WASHINGTON.EDU (Clifford Neuman) (07/22/89)
Note that the message describing long-lived revocable tickets was dated 5 July. For some reason it got stuck in a mail queue until just a few days ago. The proposal has been revised since then. The present plan is as follows: We can support the features described in the original message by simply adding a new field renew_till which only appears in renewable tickets. A ticket can be renewed before its expiration by requesting renewal from the KDC. The new lifetime (which is really the endtime - the starttime) will be the minimum of the old lifetime, the requested lifetime, and the time remaining till the renew_till field expires. The hot list can be implemented in the same manner described in the original message. Here are the meanings of the variables used to describe the necessary logic that would be implemented at the KDC. current = time read from system clock when we started processing this request starttime = start time endtime = end time renew_till = renew_till field authtime = time of initial authentication life = a temporary variable req_life = requested life from the request (new) is the renewal, (old) is the ticket presented to the TGS And here is the logic for generating the new values: renew_till(new) = renew_till(old); authtime(new) = authtime(old); life = endtime(old) - starttime(old); starttime(new) = current_time; endtime(new) = MIN(starttime(new) + life, starttime(new) + req_life, renew_till) The authtime would also be checked against the hot list. Now to answer some of the questions raised in responses to the original proposal: We had already decided to add an authtime field. Since it is the authtime that gets added to the hot list, all derivative tickets (i.e. the successors that Mark describes) become invalid as well. Just as a site can impose a maximum ticket lifetime, it can also impose a maximum renewal lifetime. Typically, this limit would be greater. Given this, I don't understand Mark's premise for making all tickets renewable. As to whether we need both renewable and non-renewable tickets, Mark has a point in that a non-renewable ticket can be thought of as being renewable, but with a renew_till equal to it's endtime. The majority of tickets, however, will not be renewable (one argument is that most are for service besides the TGS). I think explicitly making the distinction is appropriate. As to limits on the life that may be requested, and where the checks occur, this has already been discussed on the krb-protocol list. I think the solution was that the KDC can set limits on the tickets it issues, but that the end service can set more restrictive limits as well. Additionally, the limits checked at the end service may be based on authtime, and not just the starttime for the ticket. Thus, an end service can refuse to accept tickets based on a renewed tgt if the original authentication took place too long ago. ~ Cliff
rsalz@BBN.COM (Rich Salz) (07/22/89)
>Send mail if ticket lifetime greatar than say 7 days
Ick. I'd hate to see this kind of policy put into a protocol...
I want to be able to have non-revocable infinite tickets; my client and
server will conspire so that they won't be used for more than a single
transaction that lasts for 30 days. Is this possible?
/r$
saltzer@SRC.DEC.COM (Jerry Saltzer) (07/22/89)
John suggests, "1) an entry in the hot list need only be maintained in that list until the maximum site "life" has passed. After this point, any hot-listed ticket will no longer be valid for obtaining a replacement, as it will have expired. 2) The hot list should be short and easy to maintain." The initial, zero-order implementation could be just to hold the user's name and refuse to renew any tickets for that user until LIFE has passed. That would be a little inconvenient for the user, but on the other hand, the use of revocation and hot lists would probably be a very rare event; polishing to improve the granularity of revocation is something that can be left as a future exercise. Jerry
chariot@ATHENA.MIT.EDU (Mark Lillibridge) (07/25/89)
> Date: Fri, 21 Jul 89 11:21:58 PDT > From: bcn@june.cs.washington.edu (Clifford Neuman) > > ... > > We can support the features described in the original message by > simply adding a new field renew_till which only appears in renewable > tickets. A ticket can be renewed before its expiration by requesting > renewal from the KDC. The new lifetime (which is really the endtime - > the starttime) will be the minimum of the old lifetime, the requested > lifetime, and the time remaining till the renew_till field expires. > The hot list can be implemented in the same manner described in the > original message. > > ... > > And here is the logic for generating the new values: > > renew_till(new) = renew_till(old); > authtime(new) = authtime(old); > > life = endtime(old) - starttime(old); > > starttime(new) = current_time; > > endtime(new) = MIN(starttime(new) + life, starttime(new) > + req_life, renew_till) > > The authtime would also be checked against the hot list. This proposal is almost identical to the previous one. To see this, make the following substitutions: renew_till -> till starttime -> from endtime - starttime -> life authtime -> auth I.e., instead of storing the lifetime of the ticket, we are storing from+life. This is not a very major change. The logic to calculate the new lifetime is different though. The inclusion of starttime(new)+life in the MIN function in the assignment to endtime(new) causes all successor tickets to have a lifetime at most that of their precessor tickets. This is a good feature because it means that when I get a long ticket I can ensure that I can revoke it in a chosen amount of time. Note that I would add the site_maximum lifetime (if any) to that MIN function. > Just as a site can impose a maximum ticket lifetime, it can also > impose a maximum renewal lifetime. Typically, this limit would be > greater. Given this, I don't understand Mark's premise for making all > tickets renewable. As to whether we need both renewable and > non-renewable tickets, Mark has a point in that a non-renewable ticket > can be thought of as being renewable, but with a renew_till equal to > it's endtime. The majority of tickets, however, will not be renewable > (one argument is that most are for service besides the TGS). I think > explicitly making the distinction is appropriate. The reasoning for making all tickets renewable is as follows. Suppose I wish to request a 10 hour ticket. Now, if I ask for a non-renewable ticket I may get one good for only 8 hours. (Due to the site maximum lifetime...) Thus, in order to be guarenteed one for 10 hours, I must ask for a renewable ticket. (this is assuming I don't want to waste an extra trip trying for a non-renewable ticket) Given this, why would I ever ask for a non-renewable ticket? (i.e., what is a non-renewable ticket better at than a renewable ticket?) Likewise, since all applications must be able to deal both with renewable & non-renewable tickets, there is no cost for asking just for renewable tickets. (They must deal with both because I the user may obtain a long lived ticket for them then destroy my TGT) Thus, by this reasoning, non-renewable tickets are useless & should be discarded. Note that non-TGT tickets are exactly the ones most in need of renewal. This is because they are the ones needed by a batch job. (I have no intention of leaving a TGT around for a batch job to use...) > As to limits on the life that may be requested, and where the checks > occur, this has already been discussed on the krb-protocol list. I > think the solution was that the KDC can set limits on the tickets it > issues, but that the end service can set more restrictive limits as > well. Additionally, the limits checked at the end service may be > based on authtime, and not just the starttime for the ticket. Thus, > an end service can refuse to accept tickets based on a renewed tgt if > the original authentication took place too long ago. The operative word here is "can". If you can request arbitary from and renew_till fields, we have lost a lot of security. Consider for instance if I temporily get a copy of your 8 hour TGT. I now request 8 hour tickets forward dated for 8 hours of each day for the next year. Now, I can act as you for the entire next year. No longer is the effects of stealing a ticket limited to the lifetime of that ticket. Similar examples exist with infinite lifetimes from finite lifetime TGT's. In order to prevent serious problems like these, we need a minimum set of restrictions on possible from, till, lifetime fields. My proposal was a first cut at these. I have noticed at least one problem with it so far. This is the fact that we can not premit arbitary from fields. This is due to the need to change kerberos master keys every so often. This also implies that all sites must have a maximum lifetime if they ever intend to change their kerberos master key. - Mark Lillibridge MIT Project Athena
chariot@ATHENA.MIT.EDU (Mark Lillibridge) (07/25/89)
> From: Rich Salz <rsalz@bbn.com> > Date: Fri, 21 Jul 89 14:24:15 EDT > > >Send mail if ticket lifetime greater than say 7 days > Ick. I'd hate to see this kind of policy put into a protocol... Err... I really meant that as a suggested implementation feature as opposed to protocol. Even then, it was only a suggestion. Since getting a very long ticket is a big security risk, it should be brought to the user's or to the administrator's attention. > I want to be able to have non-revocable infinite tickets; my client and > server will conspire so that they won't be used for more than a single > transaction that lasts for 30 days. Is this possible? My proposal allowed this although the above 'feature' would send you mail warning you every time you obtained such tickets. Out of curiosity, what application did you have in mind? - Mark Lillibridge MIT Project Athena
rsalz@BBN.COM (Rich Salz) (07/25/89)
>Since getting a very long ticket is a big security risk, it should be >brought to the user's or to the administrator's attention. Perhaps. But not as a feature of the protocol. In a large, automated distributed system such things as mail to bring to attention are bad. I can imagine a database application where the DB server has enough state so that a ticket is used only once, or a number-cruncher where I wanna factor a 500-digit possible prime, or run a simulation of a complex chemical reaction... whatever. I understand that things like long tickets are scarey, but then so is the ability to be able to do "cat >/vmunix". /r$