rgw: storing (and securing?) totp seed information

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I was looking into implementing the S3 multi-factor authentication
(mfa) functionality that is related to object versioning. The feature
is that when configured, certain operations (e.g., objects removal,
change of config) require the use of a totp (time-based one time
password) token along with the requests, so that it adds extra level
of security to the operation. This also helps prevents accidental
removal of objects, and is useful for enforcing archival requirements.
I have an issue with where and how should we keep the totp devices
seed information. My initial thought was to have it as part of the rgw
user metadata structure. Having it there is trivial, and it has the
added bonus that it should work out of the box for multisite. There
are multiple problems with this solution. First, it is not secure as
anyone with the ability to use radosgw-admin can just read it and
replicate the totp generator. Another problem is that we need to
update the token with information related its usage whenever it's used
(token is single use, so need to store info about the last value that
was used to avoid replay, and also need to keep info about
unsuccessful attempts to avoid malicious client trying to guess the
values). This will not work well with the user info object that is
designed to be mostly static. Any solution needs to take into account
that we need to work correctly in multi-site environment, so the seed
information could be distributed to the different zones.

I was thinking of different solutions, but any solution that I come up
with ends up either requiring some kind of a trust mechanism between
different ceph clusters, or acknowledges that some compromises need to
be made.

To illustrate, here's a simple-to-implement solution:

 - create a new objclass for management and authorization of a single
totp token. It will deal with creation, sync, verification, tracking
of attempts, etc.
 - hooks these objects specially into the rgw metadata subsystem, such
that the information could be synced via metadata sync

This solves tracking of the totp usage. The user info will only keep a
reference to the totp id, and not the seed itself. However, admin can
still potentially read the seed info. We can mask that info via
radosgw-admin, but one could potentially get that by running a raw
rados operation. It might be that I can stop here.

In addition we can also do this:
 - put seed objects (that the totp objclass are executed on) in a
separate pool, where radosgw-admin user only has write and execute
permissions. Creation is done by an execution of a write objclass
method to the object.
 - radosgw (not radosgw-admin) users will also have read permissions
for that pool, so that they will be able to read from it

In this solution it is possible to limit users' access to the seed
data, however, any user that that has rados permissions to the pool
will be able to extract that information. It might be that it's
enough.

Another attempt:
 - start with previous solution
 - create a trust mechanism between different ceph clusters:
   - assign a [set of] public/private key[s] to ceph cluster
   - osd could validate whether a public key belongs to an osd on a
trusted ceph cluster
   - osds will be able to access their private key
 - radosgw itself will need to provide a public key to the objclass in
order to fetch the seed, however, the returned result will be
encrypted by that key
 - metadata sync operation will first retrieve the public key for the
target osd, and send it along with the fetch request.
 - totp objclass will store the seed encrypted (*), but decrypt it
whenever it needs to fetch it.

This is an order of magnitude or two more complicated solution, and
requires changes all around ceph to get it working. Not sure it's
worth the trouble.
In here both radosgw and radosgw-admin cannot see the unecrypted seed.
Potentially rados users will not be able to do it without having the
cluster's private key. Cluster's admins are the weak link here as they
are able to gain access to the cluster's private keys. Also,
revocation of keys is problematic (*) unless the seeds are kept
unencrypted in the osds , in which case why bother. There are
solutions to that, but I think I dug too deep of a hole here.

Thinking about it, I think that a trust mechanism between different
clusters can be useful. I don't think this feature really needs it.

Thoughts?

Yehuda
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux