On Tue, 2014-03-04 at 14:19 -0500, Simo Sorce wrote:
> On Tue, 2014-03-04 at 19:14 +0100, Petr Spacek wrote:
> > On 4.3.2014 17:43, Dmitri Pal wrote:
> > > On 03/04/2014 11:25 AM, Petr Spacek wrote:
> > >> On 4.3.2014 17:00, Dmitri Pal wrote:
> > >>> On 03/04/2014 10:26 AM, Simo Sorce wrote:
> > >>>> On Tue, 2014-03-04 at 13:51 +0100, Petr Spacek wrote:
> > >>>>> On 26.2.2014 16:00, Simo Sorce wrote:
> > >>>>>>>>> need to be protected as carefully as the private key.
> > >>>>>>>>>> This is something I meant to discuss too, how do we protect them 
> > >>>>>>>>>> ?
> > >>>>>>>>>> Clearly we have ACIs but I am wondering if we want to encrypt 
> > >>>>>>>>>> them with
> > >>>>>>>>>> keys not immediately or easily available via LDAP ?
> > >>>>>>>>>>
> > >>>>>>>>>> It's kind of catastrofic if they get inadvertently exposed like 
> > >>>>>>>>>> if
> > >>>>>>>>>> someone does a ldapsearch as "Directory Manager", which is one 
> > >>>>>>>>>> of the
> > >>>>>>>>>> reasons why we encrypt kerberos key material before storing it 
> > >>>>>>>>>> into the
> > >>>>>>>>>> db.
> > >>>>>>>> PKCS#8 allows encryption, I guess we can use that. There needs to 
> > >>>>>>>> be
> > >>>>>>>> some metadata on how to decrypt the blob though, so that the 
> > >>>>>>>> PKCS#11
> > >>>>>>>> module can actually decrypt it when necessary.
> > >>>>>> Yep, and we also need to decide what master key is used and where it 
> > >>>>>> is
> > >>>>>> placed, and who access it, and how:-)
> > >>>>> Let's move the discussion forward, we need to implement the schema 
> > >>>>> for 4.0.
> > >>>>>
> > >>>>> Do I understand correctly that the whole purpose of
> > >>>>> krbPrincipalName=K/M@IPA.EXAMPLE,cn=IPA.EXAMPLE,cn=kerberos,dc=ipa,dc=example
> > >>>>>
> > >>>>> is just to encrypt keys with some other key which is located at some 
> > >>>>> other
> > >>>>> place? I.e. the goal is to lower the probability that a random 
> > >>>>> ldapsearch
> > >>>>> will
> > >>>>> return encrypted blob and master key at once, right?
> > >>>> Yes, it would also be nice if we could finally offload this key from
> > >>>> LDAP for added security, but we are not there yet.
> > >>>>
> > >>>>> What algorithm/method should we use for key wrapping? As far as I 
> > >>>>> remember
> > >>>>> from my studies key wrapping is very sensitive thing and we definitely
> > >>>>> need to
> > >>>>> use some existing standard&tool for doing it. Can we just call some 
> > >>>>> NSS
> > >>>>> function with default/system-wide parameters and let it do it's job?
> > >>>> I think that would be what we want to do in some form.
> > >>>>
> > >>>>> That would mean that, after all, we just need to provide some blob as 
> > >>>>> key
> > >>>>> wrapping key :-) (Generated with care it deserves etc.)
> > >>>> The key must be self describing somehow (for algorithm agility).
> > >>>>
> > >>>>
> > >>>>> We have had discussion with Honza and the first idea is to add 
> > >>>>> attribute
> > >>>>> like
> > >>>>> 'wrappingKeyId' to each encrypted blob and use it for locating
> > >>>>> appropriate key
> > >>>>> when necessary.
> > >>>>> - During decryption: Do a LDAP search with filter like
> > >>>>> (keyId=<wrappingKeyId>)
> > >>>>> to find appropriate wrapping key.
> > >>>>> - The harder part is how to pick a wrapping key for encryption. It 
> > >>>>> can be
> > >>>>> tricky if the wrapped key is shared among more users (DNS servers) 
> > >>>>> etc.
> > >>>>> - It is possible to easily use multiple wrapping keys at once so key
> > >>>>> rollover
> > >>>>> is easy. You can re-encrypt keys one by one.
> > >>>> This makes things complicated fast.
> > >>>> One thing I was thinking was to use a keytab and krb functions to do 
> > >>>> the
> > >>>> wrapping but that would be pretty IPA specific.
> > >>>>
> > >>>>> The other idea is to add 'wrappingKeyId' to PKCS#11 token. So all 
> > >>>>> PKCS#11
> > >>>>> objects inside the same token will be encrypted with the same key.
> > >>>>> - Decryption is easy - the same as in previous case.
> > >>>>> - Encryption is basically the same as encryption.
> > >>>>> - Key rollover is hard. You would have to re-encrypt all keys and 
> > >>>>> change
> > >>>>> wrappingKeyId associated with given token at once - but it is 
> > >>>>> impossible
> > >>>>> because we don't have LDAP transactions. As a result, clients will be
> > >>>>> confused
> > >>>>> during rollover. (Consider problems with syncrepl when clients can see
> > >>>>> changes
> > >>>>> immediately.)
> > >>>> Yeah this is a problem we need to address.
> > >>>>
> > >>>>> The third approach is 'hybrid':
> > >>>>> A 'wrappingKeyId' associated with PKCS#11 token is 'the active one' 
> > >>>>> and is
> > >>>>> used for encrypting new objects stored into PKCS#11 token. Each key
> > >>>>> stored in
> > >>>>> the token has own wrappingKeyId attribute and it is used for 
> > >>>>> decryption.
> > >>>>> - Decryption is easy - the same as in previous case.
> > >>>>> - Encryption always use wrappingKeyId associated with given token.
> > >>>>> - Key roll over can start from wrappingKeyId associated with the 
> > >>>>> token and
> > >>>>> then re-encrypt keys in the token one by one. All keys can be 
> > >>>>> decrypted
> > >>>>> in any
> > >>>>> step (assuming that changes in one LDAP object are atomic).
> > >>>>>
> > >>>>>
> > >>>>> Where is a hole in this design? :-)
> > >>>> I do not like the idea of having to add a wrappingKeyId everywhere.
> > >>>>
> > >>>> My initial though was to have a central place where wrapping keys are
> > >>>> stored, and during a rollover period you try all the keys until one
> > >>>> works or decryption fails. At the end of rollover you delete the old 
> > >>>> key
> > >>>> so you avoid the additional load.
> > >>>>
> > >>>>> Where should we store wrapping keys for users/services and DNS 
> > >>>>> servers? User
> > >>>>> object or cn=dns doesn't sound like a good idea because it would 
> > >>>>> defeat the
> > >>>>> purpose.
> > >>>> Indeed. And this is the biggest problem. It would be nice to have a
> > >>>> mechanism to securely transfer the key to the DNS servers w/o having to
> > >>>> store it permanently in LDAP. If we had this mechanism we'd be able to
> > >>>> apply it to the Kerberos master key too. But it can't be confined to
> > >>>> installation time only, which is easy, it needs to be possible to 
> > >>>> update
> > >>>> it at a later time, which is where we have issues, as our replication
> > >>>> mechanism is LDAP.
> > >>>>
> > >>>> If we solve the DNA plugin issue with the ability to use groups for
> > >>>> authentication I guess we could build a control/extend operation that
> > >>>> would allow masters to transfer keys to each other w/o exposing them as
> > >>>> LDAP searches, do we want to try to go in that direction ?
> > >>>>
> > >>>> Simo.
> > >>>>
> > >>> Should we consider "vault" as a storage for these keys too?
> > >>> It already supports recovery of the symmetric and asymmetric keys so 
> > >>> may be
> > >>> these keys should be stored there?
> > >>
> > >> Maybe. The question is if we want to support DNSSEC without Dogtag ...
> > >>
> > > Without Dogtag? Vault would be an independent component from CA I assume,
> > > though CA might be needed anyways to issue transport keys for the internal
> > > components.
> > > But I think that even if we use Vault as an internal password and key 
> > > storage
> > > I do not see a reason why we can't require it for DNSSEC.
> > > Why over-complicate things if we already have components that can be 
> > > used? If
> > > we see a requests to support DNSSEC without Vault component we will 
> > > adjust but
> > > I do not think we should limit ourselves in the first implementation.
> > 
> > I'm personally fine with that.
> > 
> > Are we going to re-prioritize Password Vault from Backlog to 4.0?
> > https://fedorahosted.org/freeipa/ticket/3872
> > 
> > We need that in 4.0 timeframe for DNSSEC otherwise you need to convince 
> > Simo 
> > that key wrapping is not necessary :-)
> 
> For 4.0 we could document that you have to copy the keys around
> manually. And add Vault support in 4.1 ?

Actually an idea came to mind that might work well enough.

We could store the symmetric key wrapped itself.
The wrapping would be done using a public key per DNS server.
Public keys for DNS servers would be generated via certmonger in the
usual way.

The only unknown here is who adds a new wrapper wen a new server is up
and it publishes the public key in LDAP. For existing servers they can
re-wrap themselves.

It's a few layers but should not be too hard.

Simo.

-- 
Simo Sorce * Red Hat, Inc * New York

_______________________________________________
Freeipa-devel mailing list
Freeipa-devel@redhat.com
https://www.redhat.com/mailman/listinfo/freeipa-devel

Reply via email to