As a Pecan developer, I’ll chime in and say that I’m actually *not* a fan of SecureController and its metaclass approach. Maybe it’s just too magical for my taste. I’d give a big thumbs up to an approach that involves utilizing pecan’s hooks. Similar to Kurt’s suggestion with middleware, they give you the opportunity to hook in security *before* the controller call, but they avoid the nastiness of parsing the WSGI environ by hand and writing code that duplicates pecan’s route-to-controller resolution.
--- Ryan Petrello Senior Developer, DreamHost ryan.petre...@dreamhost.com On Jan 9, 2014, at 3:04 PM, Georgy Okrokvertskhov <gokrokvertsk...@mirantis.com> wrote: > Hi Adam, > > This looks very interesting. When do you expect to have this code available > in oslo? Do you have a development guide which describes best practices for > using this authorization approach? > > I think that for Pecan it will be possible to get rid of @protected wrapper > and use SecureController class as a parent. It has a method which will be > called before each controller method call. I saw Pecan was moved to > stackforge, so probably it is a good idea to talk with Pecan developers and > discuss how this part of keystone can be integrated\ supported by Pecan > framework. > > > On Wed, Jan 8, 2014 at 8:34 PM, Adam Young <ayo...@redhat.com> wrote: > We are working on cleaning up the Keystone code with an eye to Oslo and reuse: > > https://review.openstack.org/#/c/56333/ > > > On 01/08/2014 02:47 PM, Georgy Okrokvertskhov wrote: >> Hi, >> >> Keep policy control in one place is a good idea. We can use standard policy >> approach and keep access control configuration in json file as it done in >> Nova and other projects. >> Keystone uses wrapper function for methods. Here is a wrapper code: >> https://github.com/openstack/keystone/blob/master/keystone/common/controller.py#L111. >> Each controller method has @protected() wrapper, so a method information is >> available through python f.__name__ instead of URL parsing. It means that >> some RBAC parts anyway scattered among the code. >> >> If we want to avoid RBAC scattered among the code we can use URL parsing >> approach and have all the logic inside hook. In pecan hook WSGI environment >> is already created and there is full access to request parameters\content. >> We can map URL to policy key. >> >> So we have two options: >> 1. Add wrapper to each API method like all other project did >> 2. Add a hook with URL parsing which maps path to policy key. >> >> >> Thanks >> Georgy >> >> >> >> On Wed, Jan 8, 2014 at 9:05 AM, Kurt Griffiths >> <kurt.griffi...@rackspace.com> wrote: >> Yeah, that could work. The main thing is to try and keep policy control in >> one place if you can rather than sprinkling it all over the place. >> >> From: Georgy Okrokvertskhov <gokrokvertsk...@mirantis.com> >> Reply-To: OpenStack Dev <openstack-dev@lists.openstack.org> >> Date: Wednesday, January 8, 2014 at 10:41 AM >> >> To: OpenStack Dev <openstack-dev@lists.openstack.org> >> Subject: Re: [openstack-dev] [Solum][Pecan][Security] Pecan SecureController >> vs. Nova policy >> >> Hi Kurt, >> >> As for WSGI middleware I think about Pecan hooks which can be added before >> actual controller call. Here is an example how we added a hook for keystone >> information collection: >> https://review.openstack.org/#/c/64458/4/solum/api/auth.py >> >> What do you think, will this approach with Pecan hooks work? >> >> Thanks >> Georgy >> >> >> On Tue, Jan 7, 2014 at 2:25 PM, Kurt Griffiths >> <kurt.griffi...@rackspace.com> wrote: >> You might also consider doing this in WSGI middleware: >> >> Pros: >> • Consolidates policy code in once place, making it easier to audit and >> maintain >> • Simple to turn policy on/off – just don’t insert the middleware when >> off! >> • Does not preclude the use of oslo.policy for rule checking >> • Blocks unauthorized requests before they have a chance to touch the >> web framework or app. This reduces your attack surface and can improve >> performance (since the web framework has yet to parse the request). >> Cons: >> • Doesn't work for policies that require knowledge that isn’t available >> this early in the pipeline (without having to duplicate a lot of code) >> • You have to parse the WSGI environ dict yourself (this may not be a >> big deal, depending on how much knowledge you need to glean in order to >> enforce the policy). >> • You have to keep your HTTP path matching in sync with with your route >> definitions in the code. If you have full test coverage, you will know when >> you get out of sync. That being said, API routes tend to be quite stable in >> relation to to other parts of the code implementation once you have settled >> on your API spec. >> I’m sure there are other pros and cons I missed, but you can make your own >> best judgement whether this option makes sense in Solum’s case. >> >> From: Doug Hellmann <doug.hellm...@dreamhost.com> >> Reply-To: OpenStack Dev <openstack-dev@lists.openstack.org> >> Date: Tuesday, January 7, 2014 at 6:54 AM >> To: OpenStack Dev <openstack-dev@lists.openstack.org> >> Subject: Re: [openstack-dev] [Solum][Pecan][Security] Pecan SecureController >> vs. Nova policy >> >> >> >> >> On Mon, Jan 6, 2014 at 6:26 PM, Georgy Okrokvertskhov >> <gokrokvertsk...@mirantis.com> wrote: >> Hi Dough, >> >> Thank you for pointing to this code. As I see you use OpenStack policy >> framework but not Pecan security features. How do you implement fine grain >> access control like user allowed to read only, writers and admins. Can you >> block part of API methods for specific user like access to create methods >> for specific user role? >> >> The policy enforcement isn't simple on/off switching in ceilometer, so we're >> using the policy framework calls in a couple of places within our API code >> (look through v2.py for examples). As a result, we didn't need to build much >> on top of the existing policy module to interface with pecan. >> >> For your needs, it shouldn't be difficult to create a couple of decorators >> to combine with pecan's hook framework to enforce the policy, which might be >> less complex than trying to match the operating model of the policy system >> to pecan's security framework. >> >> This is the sort of thing that should probably go through Oslo and be >> shared, so please consider contributing to the incubator when you have >> something working. >> >> Doug >> >> >> >> Thanks >> Georgy >> >> >> On Mon, Jan 6, 2014 at 2:45 PM, Doug Hellmann <doug.hellm...@dreamhost.com> >> wrote: >> >> >> >> On Mon, Jan 6, 2014 at 2:56 PM, Georgy Okrokvertskhov >> <gokrokvertsk...@mirantis.com> wrote: >> Hi, >> >> In Solum project we will need to implement security and ACL for Solum API. >> Currently we use Pecan framework for API. Pecan has its own security model >> based on SecureController class. At the same time OpenStack widely uses >> policy mechanism which uses json files to control access to specific API >> methods. >> >> I wonder if someone has any experience with implementing security and ACL >> stuff with using Pecan framework. What is the right way to provide security >> for API? >> >> In ceilometer we are using the keystone middleware and the policy framework >> to manage arguments that constrain the queries handled by the storage layer. >> >> http://git.openstack.org/cgit/openstack/ceilometer/tree/ceilometer/api/acl.py >> >> and >> >> http://git.openstack.org/cgit/openstack/ceilometer/tree/ceilometer/api/controllers/v2.py#n337 >> >> Doug >> >> >> >> Thanks >> Georgy >> >> _______________________________________________ >> OpenStack-dev mailing list >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> >> >> _______________________________________________ >> OpenStack-dev mailing list >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> >> >> >> -- >> Georgy Okrokvertskhov >> Technical Program Manager, >> Cloud and Infrastructure Services, >> Mirantis >> http://www.mirantis.com >> Tel. +1 650 963 9828 >> Mob. +1 650 996 3284 >> >> _______________________________________________ >> OpenStack-dev mailing list >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> >> >> _______________________________________________ >> OpenStack-dev mailing list >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> >> >> >> -- >> Georgy Okrokvertskhov >> Technical Program Manager, >> Cloud and Infrastructure Services, >> Mirantis >> http://www.mirantis.com >> Tel. +1 650 963 9828 >> Mob. +1 650 996 3284 >> >> _______________________________________________ >> OpenStack-dev mailing list >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev >> >> >> >> >> -- >> Georgy Okrokvertskhov >> Technical Program Manager, >> Cloud and Infrastructure Services, >> Mirantis >> http://www.mirantis.com >> Tel. +1 650 963 9828 >> Mob. +1 650 996 3284 >> >> >> _______________________________________________ >> OpenStack-dev mailing list >> >> OpenStack-dev@lists.openstack.org >> http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > > > _______________________________________________ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev > > > > > -- > Georgy Okrokvertskhov > Technical Program Manager, > Cloud and Infrastructure Services, > Mirantis > http://www.mirantis.com > Tel. +1 650 963 9828 > Mob. +1 650 996 3284 > _______________________________________________ > OpenStack-dev mailing list > OpenStack-dev@lists.openstack.org > http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev _______________________________________________ OpenStack-dev mailing list OpenStack-dev@lists.openstack.org http://lists.openstack.org/cgi-bin/mailman/listinfo/openstack-dev