[OAUTH-WG] Use Cases for Signed Tokens

Justin Richer <jricher@mitre.org> Thu, 03 January 2013 22:48 UTC

Return-Path: <jricher@mitre.org>
X-Original-To: oauth@ietfa.amsl.com
Delivered-To: oauth@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id B7EA821F8A71 for <oauth@ietfa.amsl.com>; Thu, 3 Jan 2013 14:48:01 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -5.299
X-Spam-Level:
X-Spam-Status: No, score=-5.299 tagged_above=-999 required=5 tests=[AWL=1.300, BAYES_00=-2.599, RCVD_IN_DNSWL_MED=-4]
Received: from mail.ietf.org ([64.170.98.30]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 8iPdPP6hKfvN for <oauth@ietfa.amsl.com>; Thu, 3 Jan 2013 14:48:01 -0800 (PST)
Received: from smtpksrv1.mitre.org (smtpksrv1.mitre.org [198.49.146.77]) by ietfa.amsl.com (Postfix) with ESMTP id 07C0B21F8B13 for <oauth@ietf.org>; Thu, 3 Jan 2013 14:47:51 -0800 (PST)
Received: from smtpksrv1.mitre.org (localhost.localdomain [127.0.0.1]) by localhost (Postfix) with SMTP id 7400853111BC for <oauth@ietf.org>; Thu, 3 Jan 2013 17:47:21 -0500 (EST)
Received: from IMCCAS02.MITRE.ORG (imccas02.mitre.org [129.83.29.79]) by smtpksrv1.mitre.org (Postfix) with ESMTP id 6A1CC53111BA for <oauth@ietf.org>; Thu, 3 Jan 2013 17:47:21 -0500 (EST)
Received: from [10.146.15.29] (129.83.31.58) by IMCCAS02.MITRE.ORG (129.83.29.79) with Microsoft SMTP Server (TLS) id 14.2.318.4; Thu, 3 Jan 2013 17:47:20 -0500
Message-ID: <50E609F6.3080904@mitre.org>
Date: Thu, 03 Jan 2013 17:45:10 -0500
From: Justin Richer <jricher@mitre.org>
User-Agent: Mozilla/5.0 (X11; Linux i686; rv:17.0) Gecko/17.0 Thunderbird/17.0
MIME-Version: 1.0
To: "oauth@ietf.org" <oauth@ietf.org>
Content-Type: text/plain; charset="ISO-8859-1"; format="flowed"
Content-Transfer-Encoding: 7bit
X-Originating-IP: [129.83.31.58]
Subject: [OAUTH-WG] Use Cases for Signed Tokens
X-BeenThere: oauth@ietf.org
X-Mailman-Version: 2.1.12
Precedence: list
List-Id: OAUTH WG <oauth.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/oauth>, <mailto:oauth-request@ietf.org?subject=unsubscribe>
List-Archive: <http://www.ietf.org/mail-archive/web/oauth>
List-Post: <mailto:oauth@ietf.org>
List-Help: <mailto:oauth-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/oauth>, <mailto:oauth-request@ietf.org?subject=subscribe>
X-List-Received-Date: Thu, 03 Jan 2013 22:48:01 -0000

I'd like to present two use cases for signed tokens, for input into the 
ongoing MAC/HoK/higher-security discussion. Both of these are actual 
cases that I've done in the past, and we've used either OAuth 1 or JW* 
to solve them. I think that with the right tooling, a MAC-token-like 
thing could be used here. I'll note to the crypto nerds in the group 
(ahem, John) that I'm going to be using terms like "signing" and "MAC" 
in a somewhat loose sense, so please don't get hung up on that because I 
think you actually know what I mean.

So:

1) Message-level signing.

In this, you protect the content of the HTTP message by signing it with 
the secret part of the token, effectively what was done in OpenID 2, 
OAuth1, and the MAC draft. You pick some subset of the HTTP components, 
add them to your signing base in a predictable and repeatable fashion, 
and sign it with your secret. You then send the signature along with all 
of the bare HTTP elements across the wire, and the far side does the 
same signature generation magic and you're good to go.

The driving use case to this is security in depth. Yes, you probably 
still do want everything to go over TLS, but that only protects things 
in transit between endpoints. It won't protect anything as it gets 
chewed through an application platform or handed around a server farm. 
It's also considered "best practice" in many cases. In my experience in 
the health care space, you almost always want to have multiple layers 
protecting you.

An alternative approach here is to use a JW* container like a JWS or JWE 
to hold all of your parameters (as claims) and sign/encrypt over that. 
But if you do that, you're not really using HTTP anymore, except as a 
dumb transport. This is the approach of SOAP, and I doubt that many will 
come to its defense. (At least, those that don't want to sell you 
something to process SOAP messages.) We've done this ourselves with a 
prototype, and losing all of the processing capability that comes with 
HTTP is a huge programmatic hit.

2) Signed URL as an authorized artifact.

In this, you have party A generate a URL with parameters in it, 
protected by a signature. That URL points to party B, who can validate 
the signature. Party A then hands that fully baked URL to a third party, 
C, who can't do anything to the parameters in the URL without messing up 
the signature. From party B's perspective, so long as that signature is 
valid, all the parameters in the URL can be trusted and the request can 
proceed. With a timestamp and nonce parameter (built in to OAuth1), 
you've even got really nice replay and timeout protection. TLS doesn't 
do you any good here, because there's a party in the middle who has the 
full right to hold and view the artifact (URL), but does not have the 
right to modify it. We've solved this in the past using OAuth1's 
signature mechanism without tokens (aka, 2-legged OAuth1). We can't 
currently do this with OAuth2. If we had a generalizable HTTP components 
signing mechanism (which MAC *almost* is, and could become), then we could.

Again, you could simply cram everything into a JW* container and send 
*that* as the sole parameter to a URL and get almost the same result. 
But then you've got to unpack that JW* container to get all of your 
parameters, and you're back in SOAP land. And again I posit: nerds hate 
SOAP.



Hopefully both of these will help inform the discussion and shed some 
light onto why I think that:
  * MAC tokens (or equivalent) are still a good idea for the WG to pursue
  * Channel-binding and TLS don't solve all security problems
  * Abusing JOSE leads to breaking good HTTP designs

  -- Justin