On Fri, Aug 22, 2014 at 12:14 PM, James Peach <jpe...@apache.org> wrote:

> On Aug 22, 2014, at 10:35 AM, Manjesh Nilange <manjeshnila...@gmail.com>
> wrote:
>
> > On Thu, Aug 21, 2014 at 4:37 PM, James Peach <jpe...@apache.org> wrote:
> >
> >> On Aug 21, 2014, at 3:56 PM, Bill Zeng <billzeng2...@gmail.com> wrote:
> >>
> >>> Hi all,
> >>>
> >>> I am new to ATS and my understanding of ATS is limited. I am working
> on a
> >>> project to enable session resumption using session tickets. Session
> >> tickets
> >>> are encrypted with session ticket keys which need to be rotated for
> >>> security. Currently, one session ticket key file (only one key is used)
> >> is
> >>> specified by the ticket_key_name option and used for the entire time.
> >>>
> >>> I would like to propose to rotate the session ticket key periodically,
> >> say,
> >>> once every 12 hours. A new session ticket key is generated by a key
> >> server,
> >>> and distributed to ATS's. Note that locally generated keys cannot be
> >> shared
> >>> among multiple ATS's on different boxes easily. An ATS needs to load
> new
> >>> keys into memory every 12 hours. In order to smooth the key transition
> >>> process, multiple keys can be in use at the same time. That is, when a
> >> new
> >>> key is generated, the older can be used for a while before it gets
> >> retired.
> >>> These keys can be stored in multiple files, but it is neat to store
> them
> >> in
> >>> just one file.
> >>>
> >>> A session ticket key contains three 16-byte fields: key name, AES key,
> >> and
> >>> HMAC key. Right now,  they are stored as an opaque 48-byte blob. A
> >> 48-byte
> >>> blob works for the simple case with just one session ticket key. But it
> >> can
> >>> be inconvenient for multiple keys with different versions.
> >>
> >> We use the same ticket key format as httpd <
> >>
> http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslsessionticketkeyfile
> >>> .
> >>
> >>> I would like to
> >>> propose to use JSON as the format for session ticket keys. We can store
> >>> rich metadata such as the version, lifetime etc. in JSON. Each key can
> >> also
> >>> have a lifetime associated with it. JSON is also human-readable and
> >>> inter-operable with other tools. A simple JSON parser is needed to
> parse
> >>> the session ticket keys.
> >>>
> >>> Here is Twitter's approach to this problem:
> >>> https://blog.twitter.com/2013/forward-secrecy-at-twitter
> >>
> >> You can implement a scheme similar to that described in the Twitter post
> >> with some external tooling. Keep the tickets on a RAM disk (or a FUSE
> >> filesystem helper), and reload the SSL config (touch
> ssl_multicert.config
> >> && traffic_line -x) once the new version is in place everywhere. I guess
> >> that you could use something like etcd to co-ordinate the process.
> >>
> >
> > Won't traffic_line -x cause other config changes to be picked up as
> well? I
> > think that is risky.
>
> Well it's intrinsically risky to leave un-applied changes that you are not
> willing to accept at any time. I would expect any config management
> (puppet, salt, etc) will run traffic_line -x when it makes any config
> changes.
>

It is not really a change to the configuration files. The contents in the
ticket key file are changed, of which the file name stays the same. When
you run traffic_line -x, the configuration files get parsed but the ticket
keys do not get loaded again.


> > And operationally, I'm not sure how maintainable it is
> > to co-ordinate all servers like this.
>
> I dunno, it seems straightforward to me. Rotate the keys, load new ones.
> The failure mode is that there is a window where SSL sessions can't get
> resumed, so you'll take a CPU and latency hit for a short time.
>

The failure mode is not something I am worried about. We have multiple keys
in rotation. Session tickets decrypted with old keys will get encrypted
with the most recent one.


>
> J
>
>

Reply via email to