rest api security

67
REST API Security Les Hazlewood @lhazlewood PMC Chair, Apache Shiro Expert Group Member, JEE Application Security (JSR-375) Founder & CTO, Stormpath

Upload: stormpath

Post on 16-Jul-2015

1.076 views

Category:

Software


4 download

TRANSCRIPT

Page 1: Rest API Security

REST API Security

Les Hazlewood @lhazlewood

PMC Chair, Apache Shiro

Expert Group Member, JEE Application Security (JSR-375)

Founder & CTO, Stormpath

Page 2: Rest API Security

About Stormpath

• User Management API for Developers

• Password security

• Authentication and Authorization

• LDAP & Active Directory Cloud Sync

• Instant-on, scalable, and highly available

• Free for developers

Page 3: Rest API Security

Overview

• HTTP Authentication

• HTTP Authentication Schemes Comparison

• API Key Authentication

• Token Authentication

• Authorization

Page 4: Rest API Security

REST API Focus

• Eliminate server state

• Secure user credentials

• Secure server endpoints

• Expose access control rules

• SPAs and Mobile: ‘Untrusted Clients’

Learn more at Stormpath.com

Page 5: Rest API Security

HTTP(S) Authentication & Authorization

Learn more at Stormpath.com

Page 6: Rest API Security

Authentication

Proving you are who you say you are.

Learn more at Stormpath.com

Page 7: Rest API Security

Authorization

Ensuring someone is allowed to do what they

are trying to do.

Learn more at Stormpath.com

Page 8: Rest API Security

HTTP Authentication & Authorization

• Authorization header

• No Custom Headers!

• Stay spec-standard

• No pre-flight CORS requests (browsers) req’d

• Custom schemes easily supported

Learn more at Stormpath.com

Page 9: Rest API Security

Authorization header

How does it work?

Learn more at Stormpath.com

Page 10: Rest API Security

Authorization header

How does it work?

Challenge Response protocol

Learn more at Stormpath.com

Page 12: Rest API Security

2. Challenge

HTTP/1.1 401 Unauthorized

WWW-Authenticate: scheme-name <stuff>

*multiple schemes allowed, typically set as multiple WWW-Authenticate headers

Learn more at Stormpath.com

Page 13: Rest API Security

3. Re-Request

GET /admin HTTP/1.1

Authorization: scheme-name <stuff>

Learn more at Stormpath.com

Page 15: Rest API Security

1. Request (Basic)

GET /admin HTTP/1.1

Learn more at Stormpath.com

Page 16: Rest API Security

2. Challenge (Basic)

HTTP/1.1 401 Unauthorized

WWW-Authenticate: Basic realm=“MyApp”

Learn more at Stormpath.com

Page 17: Rest API Security

3. Re-Request (Basic)

GET /admin HTTP/1.1

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Learn more at Stormpath.com

Page 18: Rest API Security

Schemes

• Basic

• Digest Schemes (OAuth 1.0a)

• Bearer Token Schemes (OAuth2)

• Custom

Learn more at Stormpath.com

Page 20: Rest API Security

HTTP Basic

String value = username + ‘:’ + raw_password

String schemeValue = base64_encode(value)

...

GET /admin HTTP/1.1

Authorization: Basic schemeValue

Learn more at Stormpath.com

Page 21: Rest API Security

HTTP Basic

Pros:

• Very easy to use

• Supported by everything

Cons:

• Raw password always transmitted

• Easy to leak raw password if not careful (logging)

• Susceptible to Man-In-The-Middle attacks

• HTTPS *always* required

• Client must constantly retain/reference the raw password (server clients usually ok, browser clients not ok)

Learn more at Stormpath.com

Page 23: Rest API Security

Digest Schemes: Client

request.headers[‘Client-Id’] = getMyId()

String digest = hmacSha256(request, password)

String val = ‘Foo ‘ + digest

request.headers[‘Authorization’] = val

send(request)

Learn more at Stormpath.com

Page 24: Rest API Security

Digest Schemes: Server

String clientId = request.headers[‘Client-Id’]

byte[] password = lookupPassword(clientId);

String serverComputedDigest =

hmacSha256(request, password)

String val = request.headers[‘Authorization’]

String clientSpecifiedDigest = val.remove(‘Foo ‘)

if (clientSpecifiedDigest != serverComputedDigest) {

sendError(401, response)

return

}

//otherwise request is authenticated

Learn more at Stormpath.com

Page 25: Rest API Security

Digest Schemes: OAuth 1.0a example

Authorization: OAuth realm="http://sp.example.com/",

oauth_consumer_key="0685bd9184jfhq22”,

oauth_token="ad180jjd733klru7",

oauth_signature_method="HMAC-SHA1",

oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK%2FPY%3D",

oauth_timestamp="137131200",

oauth_nonce="4572616e48616d6d65724c61686176”

Learn more at Stormpath.com

Page 26: Rest API Security

Digest Schemes

Pros:

• Probably most secure

• Password never sent over the wire

• HTTPS not required (but your data may still require HTTPS)

• Can guarantee end-to-end HTTP message authenticity(HTTPS cannot do this)

• Not susceptible to Man-In-The-Middle attacks

Cons:

• Very difficult to design safely

• Difficult to understand and use

• Difficult to implement libraries

• Client still must retain a constant reference to the password(server clients usually ok, browser clients not ok)

Learn more at Stormpath.com

Page 28: Rest API Security

Bearer Token Schemes

Authorization: Bearer opaque-token

Learn more at Stormpath.com

Page 29: Rest API Security

Bearer Token Schemes

• opaque-token can be whatever you want*

• *should always be cryptographically-signed

and expire

Learn more at Stormpath.com

Page 30: Rest API Security

Bearer Token Schemes: OAuth 2 Example

Authorization: Bearer eyJ0eXAiOiJKV

1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3M

iOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzOD

AsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc

19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-

92K27uhbUJU1p1r_wW1gFWFOEjXk

Learn more at Stormpath.com

Page 31: Rest API Security

Bearer Token Schemes

Pros:

• Easier to use than digest

• De-facto standard token format (JWT)

• Can contain state – no server sessions needed

• Does not require constant access to the user password

Cons:

• HTTPS always required, during and always after login (not a big deal nowadays)

• Cannot guarantee end-to-end HTTP message authenticity (like digest schemes can)

• Susceptible to Man-In-The-Middle attacks

• Token creation and renewal workflows can be very complicated and confusing depending on use case (OAuth2 confuses many people).

• When used for Browser or Mobile, additional security still required (Origin checks, CSRF-protection, etc)

• Token content is not standard – applications can open themselves to attack

Learn more at Stormpath.com

Page 33: Rest API Security

Custom Scheme

• Only if you really, Really, REALLY know what

you’re doing.

Seriously.

No, rly. Srsly.

• Non-standard, so you essentially must

provide your own client libraries.

Learn more at Stormpath.com

Page 34: Rest API Security

Custom Scheme

• Stormpath has a custom SAUTHC1 digest scheme

• Authenticates the entire HTTP Message, including the Body (OAuth 1.0a does not)

• Uses nonces to prevent replay attacks

• Uses key derivation algorithms and HMAC-SHA-256

• We use it for our own SDKs*

• If you’re curious:

https://github.com/stormpath

(search for ‘sauthc1’ in any stormpath-sdk-* project)

*Basic still supported for non-SDK clients or ‘weird’ environments

Learn more at Stormpath.com

Page 36: Rest API Security

API Key Example

ID : YLNVXG091ZO1BSANZ5U6DCTIX

Secret:

ZediwUeDCNl13ldjaFKFQzz0eD13PO931DLAopdeywixaeUAhsip+92iaY

Learn more at Stormpath.com

Page 37: Rest API Security

API Keys

• Entropy

• Password Independent

• Scope

• Speed

• Limited Exposure

• Traceability

Learn more at Stormpath.com

Page 38: Rest API Security

API Keys

• Can be thought of as a really long username and password pair.

• Can be used with any HTTP Authentication Scheme that accepts a username and password: Basic, Digest, OAuth2, etc.

• Almost exclusively used for server-to-server communication.

• Never embed API Key secrets in untrusted clients like JavaScript or mobile applications.

Learn more at Stormpath.com

Page 39: Rest API Security

HTTP Basic with API Key

String value = apiKeyId + ‘:’ + apiKeySecret

String schemeValue = base64_encode(value)

...

GET /admin HTTP/1.1

Authorization: Basic schemeValue

Learn more at Stormpath.com

Page 42: Rest API Security

Session ID Problems

• They’re opaque and have no meaning

themselves (they’re just ‘pointers’).

• Service-oriented architectures might need a

centralized ID de-referencing service

Learn more at Stormpath.com

Page 43: Rest API Security

Session ID Problems

• Opaque IDs mean clients can’t inspect them

and find out what it is allowed to do or not - it

needs to make more requests for this

information.

• Susceptible to CSRF attacks

Learn more at Stormpath.com

Page 44: Rest API Security

Session ID Problems

• Sessions = Server State!

• You need to store that state somewhere

• Session ID look up server state on *every

request*.

• Really not good for distributed/clustered apps

• Really not good for scale

Learn more at Stormpath.com

Page 45: Rest API Security

Token Authentication to the rescue!

Learn more at Stormpath.com

Page 48: Rest API Security

1. Token Request

POST /token HTTP/1.1

Origin: https://foo.com

Content-Type: application/x-www-form-urlencoded

grant_type=password&username=username&password=

password

*Assert allowed origin for browser-based apps

Learn more at Stormpath.com

Page 49: Rest API Security

2. Token Response

HTTP/1.1 200 OK

Content-Type: application/json;charset=UTF-8

Cache-Control: no-store

Pragma: no-cache

{

"access_token":"2YotnFZFEjr1zCsicMWpAA",

“token_type":"example",

“expires_in":3600,

"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",

"example_parameter":"example_value”

}

Learn more at Stormpath.com

Page 50: Rest API Security

3. Resource Request

GET /admin HTTP/1.1

Authorization: Bearer 2YotnFZFEjr1zCsicMWpAA

Learn more at Stormpath.com

Page 51: Rest API Security

Example: Token Request using an API Key

POST /token HTTP/1.1

Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=apiKeyId&cli

ent_secret=apiKeySecret

*Assert allowed origin for browser-based apps

Learn more at Stormpath.com

Page 52: Rest API Security

How does the server create a Token?

Learn more at Stormpath.com

Page 53: Rest API Security

JSON Web Tokens (JWT)

• A URL-safe, compact, self-contained string with

meaningful information that is usually digitally

signed or encrypted.

• The string is ‘opaque’ and can be used as a

‘token’.

• Many OAuth2 implementations use JWTs as

OAuth2 Access Tokens.

Learn more at Stormpath.com

Page 54: Rest API Security

JSON Web Tokens (JWT)

• You can store them in cookies! But all those

cookie security rules still apply (CSRF

protection, etc).

• You can entirely replace your session ID with

a JWT.

Learn more at Stormpath.com

Page 55: Rest API Security

JSON Web Tokens (JWT)

In the wild they look like just another ugly string:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVPmB92K27uhbUJU1p1r_wW1gFWFOEjXk

Learn more at Stormpath.com

Page 56: Rest API Security

JSON Web Tokens (JWT)

But they do have a three part structure. Each

part is a Base64-encoded string:

eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVPmB92K27uhbUJU1p1r_wW1gFWFOEjXk

Header

Body (‘Claims’)

Cryptographic Signature

Learn more at Stormpath.com

Page 57: Rest API Security

JSON Web Tokens (JWT)

Base64-decode the parts to find the juicy bits:

{"typ":"JWT","alg":"HS256"

}

{"iss”:”http://trustyapp.com/”,"exp": 1300819380,“sub”: ”users/8983462”,“scope”: “self api/buy”

}

tß´—™à%O˜v+nî…SZu¯µ€U…8H×

Header

Body (‘Claims’)

Cryptographic Signature

Learn more at Stormpath.com

Page 58: Rest API Security

JSON Web Tokens (JWT)

The claims body is the best part! It can tell:

{

"iss”:”http://trustyapp.com/”,

"exp": 1300819380,

“sub”: ”users/8983462”,

“scope”: “self api/buy”

}

Who issued the token

Learn more at Stormpath.com

Page 59: Rest API Security

JSON Web Tokens (JWT)

The claims body is the best part! It can tell:

{

"iss”:”http://trustyapp.com/”,

"exp": 1300819380,

“sub”: ”users/8983462”,

“scope”: “self api/buy”

}

Who issued the token

When it expires

Learn more at Stormpath.com

Page 60: Rest API Security

JSON Web Tokens (JWT)

The claims body is the best part! It can tell:

{

"iss”:”http://trustyapp.com/”,

"exp": 1300819380,

“sub”: ”users/8983462”,

“scope”: “self api/buy”

}

Who issued the token

When it expires

Who it represents

Learn more at Stormpath.com

Page 61: Rest API Security

JSON Web Tokens (JWT)

The claims body is the best part! It can tell:

{

"iss”:”http://trustyapp.com/”,

"exp": 1300819380,

“sub”: ”users/8983462”,

“scope”: “self api/buy”

}

Who issued the token

When it expires

Who it represents

What they can do

Learn more at Stormpath.com

Page 62: Rest API Security

JSON Web Tokens (JWT)

Great! Why is this useful?

• Implicitly trusted because it is cryptographically

signed (verified not tampered).

• It is structured, enabling inter-op between

services

• It can inform your client about basic access

control rules (permissions)*

• And the big one: statelessness!*servers must always enforce access control policies

Learn more at Stormpath.com

Page 63: Rest API Security

JSON Web Tokens (JWT)

So, what’s the catch?

• Implicit trust is a tradeoff – how long

should the token be good for? how will you

revoke it? (Another talk: refresh tokens)

• You still have to secure your cookies!

• You have to be mindful of what you store in

the JWT if they are not encrypted. No

sensitive info!

Learn more at Stormpath.com

Page 65: Rest API Security

Authorization

• JWT Claims can have whatever you want

• Use a scope field that contains a list of

permissions for that user

• Client can inspect the claims and scope and turn

on or off features based on permissions*

• *Server must always assert permissions

Learn more at Stormpath.com

Page 66: Rest API Security

In addition to user authentication and data security, Stormpath can handle authentication and authorization for your API, SPA or mobile app.

• API Authentication

• API Key Management

• Authorization

• Token Based Authentication

• OAuth

• JWTs

http://docs.stormpath.com/guides/api-key-management/

Implementations in your Library of choice:

https://docs.stormpath.com/home/

Use Stormpath for API

Authentication & Security

Learn more at Stormpath.com

Page 67: Rest API Security

Follow Us on Twitter

@lhazlewood @goStormpath

Learn more at Stormpath.com