[SSSD] Re: Design document - SSSD KCM server

2017-04-10 Thread Simo Sorce
On Wed, 2017-04-05 at 21:02 +0200, Jakub Hrozek wrote:
> On Tue, Nov 22, 2016 at 08:51:10AM +0100, Jakub Hrozek wrote:
> > Hi,
> > 
> > I was working on a KCM server for SSSD for some time already in parallel
> > with the files provider and had some discussions with Simo as well. Of
> > course my intent wasn't to implement a feature secretly without a design
> > review, but to have a prototype to base a proper design on :)
> > 
> > However it makes sense to have a peer-reviewed design page now, also
> > because of Fedora's move towards Kerberos and KDC proxy, which leads to
> > questions on the Fedora lists about ccache renewals and so on -- so I
> > think it makes sense to pitch the design to Fedora at least already..
> > 
> > Here is the design page:
> > https://fedorahosted.org/sssd/wiki/DesignDocs/KCM
> > and here is the code of the KCM responder so far:
> > https://github.com/jhrozek/sssd/tree/kcm
> 
> Hi,
> 
> I moved the design doc to pagure:
> https://docs.pagure.org/SSSD.sssd/design_pages/kcm.html
> 
> It's been cleaned up and reconciled with the implementation.

It looks really nice with the docs formatting/font/style :-)

.. and the content LGTM too.

Simo.

-- 
Simo Sorce
Sr. Principal Software Engineer
Red Hat, Inc

___
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org


[SSSD] Re: Design document - SSSD KCM server

2017-04-05 Thread Jakub Hrozek
On Tue, Nov 22, 2016 at 08:51:10AM +0100, Jakub Hrozek wrote:
> Hi,
> 
> I was working on a KCM server for SSSD for some time already in parallel
> with the files provider and had some discussions with Simo as well. Of
> course my intent wasn't to implement a feature secretly without a design
> review, but to have a prototype to base a proper design on :)
> 
> However it makes sense to have a peer-reviewed design page now, also
> because of Fedora's move towards Kerberos and KDC proxy, which leads to
> questions on the Fedora lists about ccache renewals and so on -- so I
> think it makes sense to pitch the design to Fedora at least already..
> 
> Here is the design page:
> https://fedorahosted.org/sssd/wiki/DesignDocs/KCM
> and here is the code of the KCM responder so far:
> https://github.com/jhrozek/sssd/tree/kcm

Hi,

I moved the design doc to pagure:
https://docs.pagure.org/SSSD.sssd/design_pages/kcm.html

It's been cleaned up and reconciled with the implementation.
___
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org


[SSSD] Re: Design document - SSSD KCM server

2016-11-29 Thread Jakub Hrozek
On Tue, Nov 22, 2016 at 09:49:52AM -0500, Stephen Gallagher wrote:
> On 11/22/2016 09:38 AM, Simo Sorce wrote:
> > On Tue, 2016-11-22 at 09:23 -0500, Stephen Gallagher wrote:
> 
> >> OK, so the service is only semi-socket-activated? If we're keeping tevent 
> >> timers
> >> around for renewals and reaping, the service won't be exiting unless all 
> >> tickets
> >> have expired and been reaped.
> >>
> >> Would it be possible to look into setting non-persistent systemd timer 
> >> units
> >> instead that would "wake up" the sssd_kcm service at appropriate times to 
> >> do
> >> renewal and expiration?
> >>
> >> systemd provides the CreateTransientUnit() method on its public API that we
> >> could use for this purpose. If we did it this way, then the service would 
> >> only
> >> need to be activated whenever a ticket was actually being retrieved from 
> >> the
> >> collection.
> > 
> > I am trying to think if this would gain us anything.
> > What would you use as a reasonable timeout to decide to exit ?
> > There are other events we may want to detect in future. for example we
> > may want to decide to destroy all of a user ccaches if all his sessions
> > go away, this requires active probing though, but I guess it could also
> > be a timer or maybe systemd has a way to notify and start a process when
> > this happens too ?
> > 
> 
> Well, as far as a timeout to exit, I'd probably go with a minute or two (since
> you may have a short flurry of activity, such as when a user first connects 
> to a
> VPN).

I think the systemd transient units would be workable, but I also think
it's not the biggest priority. For starters, we could make the service
exit only when there are no credentials to be renewed or kept track
about. So unless you disagree, I would file a ticket about this and
proceed without any elaborate shutdown logic first. There is still a lot
of work to do even without this additional functionality :)

> 
> As far as notification of a user signing in or out, we *could* attach a helper
> unit to the systemd user session default.target (and have an ExecStop command
> for handling when it gets shut down too).

Yes, this is something to look into. We already have
https://fedorahosted.org/sssd/ticket/2551

> 
> >> How do containers access the KCM? Would they have to run their own copy 
> >> internal
> >> to the container? Would we bind-mount the 
> >> /var/run/.heim_org.h5l.kcm-socket and
> >> then work some namespacing magic in the host?
> > 
> > Deployment specific, I can see either way as an option depending on what
> > you are doing.
> > 
> 
> OK, but the document doesn't describe how that might be done. We should 
> identify
> the set of supported approaches up-front and include them in the design.
> 
> 
> >> You call out in the introduction that this will help address container
> >> use-cases, but then don't describe that implementation. This seems like an
> >> important piece of the puzzle that should be added to the page (or made 
> >> more
> >> clear, since if it's in there, I can't spot it).
> > 
> > What would you want to call out exactly ?
> > 
> 
> Describe a couple use-cases and the expected user experience for setting them 
> up
> and using them. If we bind-mount the host's KCM into the container, would the
> user namespacing be handled "magically" by the kernel or do we need to keep
> track of which cgroup our client is and sort it into its own section of the
> database? (Just for example).

I added (and tested!) two, both concern containers because the single
host use-case is IMO quite clear. You can find them described in
detailed steps here:

https://fedorahosted.org/sssd/wiki/DesignDocs/KCM#Use-case:separatingccachesofrootusersincontainersSSSDisrunningonthehost
and here:

https://fedorahosted.org/sssd/wiki/DesignDocs/KCM#Use-case:separatingccachesofcontainersfromccachesofthehost

Writing up these cases was actually a nice exercise to see if the
current version in my branch already covers what we wanted :)

Feel free to ask if you'd like me to test and document more cases.
___
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org


[SSSD] Re: Design document - SSSD KCM server

2016-11-22 Thread Stephen Gallagher
On 11/22/2016 09:38 AM, Simo Sorce wrote:
> On Tue, 2016-11-22 at 09:23 -0500, Stephen Gallagher wrote:

>> OK, so the service is only semi-socket-activated? If we're keeping tevent 
>> timers
>> around for renewals and reaping, the service won't be exiting unless all 
>> tickets
>> have expired and been reaped.
>>
>> Would it be possible to look into setting non-persistent systemd timer units
>> instead that would "wake up" the sssd_kcm service at appropriate times to do
>> renewal and expiration?
>>
>> systemd provides the CreateTransientUnit() method on its public API that we
>> could use for this purpose. If we did it this way, then the service would 
>> only
>> need to be activated whenever a ticket was actually being retrieved from the
>> collection.
> 
> I am trying to think if this would gain us anything.
> What would you use as a reasonable timeout to decide to exit ?
> There are other events we may want to detect in future. for example we
> may want to decide to destroy all of a user ccaches if all his sessions
> go away, this requires active probing though, but I guess it could also
> be a timer or maybe systemd has a way to notify and start a process when
> this happens too ?
> 

Well, as far as a timeout to exit, I'd probably go with a minute or two (since
you may have a short flurry of activity, such as when a user first connects to a
VPN).

As far as notification of a user signing in or out, we *could* attach a helper
unit to the systemd user session default.target (and have an ExecStop command
for handling when it gets shut down too).

>> How do containers access the KCM? Would they have to run their own copy 
>> internal
>> to the container? Would we bind-mount the /var/run/.heim_org.h5l.kcm-socket 
>> and
>> then work some namespacing magic in the host?
> 
> Deployment specific, I can see either way as an option depending on what
> you are doing.
> 

OK, but the document doesn't describe how that might be done. We should identify
the set of supported approaches up-front and include them in the design.


>> You call out in the introduction that this will help address container
>> use-cases, but then don't describe that implementation. This seems like an
>> important piece of the puzzle that should be added to the page (or made more
>> clear, since if it's in there, I can't spot it).
> 
> What would you want to call out exactly ?
> 

Describe a couple use-cases and the expected user experience for setting them up
and using them. If we bind-mount the host's KCM into the container, would the
user namespacing be handled "magically" by the kernel or do we need to keep
track of which cgroup our client is and sort it into its own section of the
database? (Just for example).




signature.asc
Description: OpenPGP digital signature
___
sssd-devel mailing list -- sssd-devel@lists.fedorahosted.org
To unsubscribe send an email to sssd-devel-le...@lists.fedorahosted.org


[SSSD] Re: Design document - SSSD KCM server

2016-11-22 Thread Jakub Hrozek
On Tue, Nov 22, 2016 at 09:23:22AM -0500, Stephen Gallagher wrote:
> Some thoughts inline:
> 
> On 11/22/2016 02:51 AM, Jakub Hrozek wrote:
> 
> ...
> 
> > === Implementation details ===
> > A new SSSD responder will be added. Since accessing the Kerberos credentials
> > is quite an infrequent operation, the responder will be socket-activated.
> > 
> > This responder would implement the same subset of the KCM protocol the MIT
> > client libraries implement. Contrary to Heimdal's KCM server that just
> > stores the credential caches in memory, the SSSD KCM server would store
> > the ccaches in the secrets database through the sssd-secret's responder
> > [https://jhrozek.fedorapeople.org/sssd/1.14.2/man/sssd-secrets.5.html 
> > public REST API].
> > 
> > For user credentials the KCM Server would use a secrets responder URI
> > like `/kcm/users/1234/X` where 1234 is the user ID and X is the residual.
> > The client then gets assigned a KRB5CCNAME of KCM:1234:X. Internally in the
> > secrets responder we will store the credential caches under a new base DN
> > `cn=kcm`.
> > 
> > The secret responder's quota on secrets must be made modular to allow
> > different number of secrets per base DN (so, different number of secrets
> > and credentials pretty much). What to do in case the quota is reached is
> > debatable - we should probably first remove service (non-TGT) tickets first
> > for valid TGTs and if that's not possible, just fail. A failure in this
> > case would be no different than a failure if a disk is full when trying
> > to store a FILE-based ccache.
> > 
> > The KCM responder would renew the user credentials by starting a tevent
> > timer which would then contact the SSSD Data Provider for the given UID
> > and principal, asking for the credentials to be renewed. Another tevent
> > timer would reap and remove a ccache that reaches its lifetime.
> > 
> 
> 
> OK, so the service is only semi-socket-activated? If we're keeping tevent 
> timers
> around for renewals and reaping, the service won't be exiting unless all 
> tickets
> have expired and been reaped.
> 
> Would it be possible to look into setting non-persistent systemd timer units
> instead that would "wake up" the sssd_kcm service at appropriate times to do
> renewal and expiration?
> 
> systemd provides the CreateTransientUnit() method on its public API that we
> could use for this purpose. If we did it this way, then the service would only
> need to be activated whenever a ticket was actually being retrieved from the
> collection.

All good points, I 'just' need to look into these systemd timers.

> 
> 
> > In the future, SSSD-specific operations such as writing out a FILE-based
> > ccache might be added. The SSSD D-Bus interface would also be extended to
> > publish information about credentials activity (such as - a ticket being
> > acquired, a ticket was renewed etc)
> 
> 
> This should be a high priority, since it will benefit tools such as GNOME 
> Online
> Accounts greatly (right now, they have to poll the kernel keyring and are not
> happy about it; with FILE and DIR caches, they at least could get 
> notifications
> via inotify)

OK, noted.

> 
> 
> > 
> > === Configuration changes ===
> > No KCM-specific configuration options will be added. The SSSD KCM responder
> > would use the same common options like other SSSD services such as idle
> > timeout.
> > 
> > We can add a configurable KCM socket location later, if needed, but for
> > the start it's fine to default to `/var/run/.heim_org.h5l.kcm-socket`
> > mostly because that's what MIT defaults to as well.
> > 
> > '''Q''': Should we add an option to explicitly enable ccache renewals and
> > default to no renewals? I don't think this would any any security though,
> > the attacker can just run 'kinit -R' on behalf of the user anyway.
> > 
> 
> If the user asked for a renewable ticket in the first place (and the server
> permitted it), then I don't see any reason not to just go ahead and renew it 
> by
> default.
> 
> 
> > === How To Test ===
> > In order for the admin to start using the KCM service, the sssd-kcm
> > responder's systemd service must be enabled. Then, libkrb5 must also be
> > configured to use KCM as its default ccache type in `/etc/krb5.conf`
> > {{{
> > [libdefaults]
> > default_ccache_name = KCM
> > }}}
> > 
> > After that, all common operations like kinit, kdestroy or login through
> > pam_sss should just work and store their credentials in the KCM server.
> > 
> > The KCM server must implement access control correctly, so even
> > trying to access other user's KCM credentials by setting KRB5CCNAME to
> > `KCM:1234:RESIDUAL` would not work (except for root).
> > 
> > Restarting the KCM server or rebooting the machine must persist the tickets.
> > 
> > As far as automatic unit and integration testing is required, we need to 
> > make
> > sure that MIT's testsuite passes with Kerberos ccache defaulting to KCM
> > and SSSD KCM deamon running. In the SSSD 

[SSSD] Re: Design document - SSSD KCM server

2016-11-22 Thread Simo Sorce
On Tue, 2016-11-22 at 09:23 -0500, Stephen Gallagher wrote:
> Some thoughts inline:
> 
> On 11/22/2016 02:51 AM, Jakub Hrozek wrote:
> 
> ...
> 
> > === Implementation details ===
> > A new SSSD responder will be added. Since accessing the Kerberos credentials
> > is quite an infrequent operation, the responder will be socket-activated.
> > 
> > This responder would implement the same subset of the KCM protocol the MIT
> > client libraries implement. Contrary to Heimdal's KCM server that just
> > stores the credential caches in memory, the SSSD KCM server would store
> > the ccaches in the secrets database through the sssd-secret's responder
> > [https://jhrozek.fedorapeople.org/sssd/1.14.2/man/sssd-secrets.5.html 
> > public REST API].
> > 
> > For user credentials the KCM Server would use a secrets responder URI
> > like `/kcm/users/1234/X` where 1234 is the user ID and X is the residual.
> > The client then gets assigned a KRB5CCNAME of KCM:1234:X. Internally in the
> > secrets responder we will store the credential caches under a new base DN
> > `cn=kcm`.
> > 
> > The secret responder's quota on secrets must be made modular to allow
> > different number of secrets per base DN (so, different number of secrets
> > and credentials pretty much). What to do in case the quota is reached is
> > debatable - we should probably first remove service (non-TGT) tickets first
> > for valid TGTs and if that's not possible, just fail. A failure in this
> > case would be no different than a failure if a disk is full when trying
> > to store a FILE-based ccache.
> > 
> > The KCM responder would renew the user credentials by starting a tevent
> > timer which would then contact the SSSD Data Provider for the given UID
> > and principal, asking for the credentials to be renewed. Another tevent
> > timer would reap and remove a ccache that reaches its lifetime.
> > 
> 
> 
> OK, so the service is only semi-socket-activated? If we're keeping tevent 
> timers
> around for renewals and reaping, the service won't be exiting unless all 
> tickets
> have expired and been reaped.
> 
> Would it be possible to look into setting non-persistent systemd timer units
> instead that would "wake up" the sssd_kcm service at appropriate times to do
> renewal and expiration?
> 
> systemd provides the CreateTransientUnit() method on its public API that we
> could use for this purpose. If we did it this way, then the service would only
> need to be activated whenever a ticket was actually being retrieved from the
> collection.

I am trying to think if this would gain us anything.
What would you use as a reasonable timeout to decide to exit ?
There are other events we may want to detect in future. for example we
may want to decide to destroy all of a user ccaches if all his sessions
go away, this requires active probing though, but I guess it could also
be a timer or maybe systemd has a way to notify and start a process when
this happens too ?

> > In the future, SSSD-specific operations such as writing out a FILE-based
> > ccache might be added. The SSSD D-Bus interface would also be extended to
> > publish information about credentials activity (such as - a ticket being
> > acquired, a ticket was renewed etc)
> 
> 
> This should be a high priority, since it will benefit tools such as GNOME 
> Online
> Accounts greatly (right now, they have to poll the kernel keyring and are not
> happy about it; with FILE and DIR caches, they at least could get 
> notifications
> via inotify)

That's the main target, but they will still need to keep the old code
for now, until we make sssd-kcm mandatory for gnome sessions.

> > 
> > === Configuration changes ===
> > No KCM-specific configuration options will be added. The SSSD KCM responder
> > would use the same common options like other SSSD services such as idle
> > timeout.
> > 
> > We can add a configurable KCM socket location later, if needed, but for
> > the start it's fine to default to `/var/run/.heim_org.h5l.kcm-socket`
> > mostly because that's what MIT defaults to as well.
> > 
> > '''Q''': Should we add an option to explicitly enable ccache renewals and
> > default to no renewals? I don't think this would any any security though,
> > the attacker can just run 'kinit -R' on behalf of the user anyway.
> > 
> 
> If the user asked for a renewable ticket in the first place (and the server
> permitted it), then I don't see any reason not to just go ahead and renew it 
> by
> default.

You might be surprised at what regulations may require in this area, but
I tend to agree that it is ok as a default.

> > === How To Test ===
> > In order for the admin to start using the KCM service, the sssd-kcm
> > responder's systemd service must be enabled. Then, libkrb5 must also be
> > configured to use KCM as its default ccache type in `/etc/krb5.conf`
> > {{{
> > [libdefaults]
> > default_ccache_name = KCM
> > }}}
> > 
> > After that, all common operations like kinit, kdestroy or login through
> > pam_sss