Hi, I'm unsure about what you mean by this, but the UserPrincipal is a java.security.Principal implementation.
https://github.com/apache/karaf/blob/trunk/jaas/boot/src/main/java/org/apache/karaf/jaas/boot/principal/UserPrincipal.java Oh and by the way +1 for this concept :-D regards, Achim 2012/10/30 Andrei Pozolotin <andrei.pozolo...@gmail.com>: > and > http://docs.oracle.com/javase/6/docs/api/java/security/Principal.html > > is wrong, because ...? > > > -------- Original Message -------- > Subject: Re: Securing shell commands > From: Guillaume Nodet <gno...@gmail.com> > To: dev@karaf.apache.org > Date: Tue 30 Oct 2012 03:20:48 PM CDT >> Permissions in JAAS can't be used with wildcards or permission trees for >> example. >> You'd have to define a permission for each command without any way to >> simplify the configuration. >> >> On Tue, Oct 30, 2012 at 8:58 PM, Andrei Pozolotin < >> andrei.pozolo...@gmail.com> wrote: >> >>> what is the reason to stay away from >>> >>> http://docs.oracle.com/javase/6/docs/api/java/security/Permission.html >>> >>> in >>> >>> void checkPermission(Subject subject, String permission); >>> >>> vs >>> >>> void checkPermission(Subject subject, Permission permission); >>> >>> ? >>> >>> -------- Original Message -------- >>> Subject: Re: Securing shell commands >>> From: Guillaume Nodet <gno...@gmail.com> <gno...@gmail.com> >>> To: dev@karaf.apache.org, k...@westerfeld.com >>> Date: Tue 30 Oct 2012 11:03:14 AM CDT >>> >>> So what about a service defined like the following: >>> >>> public interface AuthorizationService { >>> >>> List<String> getPrincipals(Subject subject); >>> >>> void checkPermission(Subject subject, String permission); >>> >>> boolean isPermitted(Subject subject, String permission); >>> >>> void checkRole(Subject subject, String role); >>> >>> boolean hasRole(Subject subject, String role); >>> >>> void checkPermission(List<String> principals, String permission); >>> >>> boolean isPermitted(List<String> principals, String permission); >>> >>> void checkRole(List<String> principals, String role); >>> >>> boolean hasRole(List<String> principals, String role); >>> >>> } >>> >>> All the methods taking a subject delegate to the corresponding method using >>> a List<String> via a call to getPrincipals(Subject). >>> The translation is done by appending the Principal class name (usually a >>> org.apache.karaf.jaas.boot.principal.RolePrincipal) with the principal >>> name, separated by a column, so something like: >>> org.apache.karaf.jaas.boot.principal.RolePrincipal:karaf >>> >>> Thoughts ? >>> >>> On Tue, Oct 30, 2012 at 4:32 PM, Guillaume Nodet <gno...@gmail.com> >>> <gno...@gmail.com> wrote: >>> >>> >>> Ok, that totally makes sense to me. >>> Let me enhance the interface to provide more non jaas tied methods and get >>> back to this list. >>> >>> >>> On Tue, Oct 30, 2012 at 3:29 PM, Kurt Westerfeld >>> <kurt.westerf...@gmail.com> wrote: >>> >>> >>> I was thinking of Shiro as a provider for the authorization engine, not as >>> the actual interfaces. >>> >>> I actually think the container should provide a default implementation for >>> security concerns. If you look at JEE, there are definitely standards >>> there, which haven't worked out perfectly, but at least are constructs for >>> people to build on. In the OSGi world, I believe the container should be >>> configurable to provide a default realm (it is in Karaf), and there should >>> be an easy mapping from the application to the container's security (this >>> isn't hard to do, but since it is left up to the developer, I think it's >>> not done that well). >>> >>> For example, if I decide to tie my Karaf implementation to LDAP, I can >>> provide config to do that. Now, I'd like it if by doing that, my >>> application is wired to that LDAP provider and I just move along to other >>> concerns. If I want to do that myself, I can make a separate choice on >>> the >>> login realm to tie my application to it's own config. >>> >>> The main point I was making, though, is that your interface requires a >>> Subject. Getting one of those is not always an easy thing, and there's a >>> lot of value-add in at least putting a stake in the ground as to how one >>> obtains a Subject. Each component library, as an example, could provide >>> an >>> implementation of a provider of Subject material it its own way, and from >>> an application point-of-view, one would simply call "getCurrentSubject()". >>> In my opinion, that's not always an easy thing to get right. >>> >>> On Tue, Oct 30, 2012 at 10:22 AM, Guillaume Nodet <gno...@gmail.com> >>> <gno...@gmail.com> >>> wrote: >>> >>> >>> Thx for the feedback, Kurt. >>> >>> I've looked at Shiro when working on this feature. Actually, the >>> interface, and even a class I use for the implementation come from >>> >>> shiro. >>> >>> The reason why I discarded reusing shiro directly is mainly that it does >>> not provide the features we need. However, that's clearly not a >>> >>> blocking >>> >>> point and we could very well reimplement them all on top of shiro, >>> >>> mostly >>> >>> the realms would not necessarily cover our use cases I think, or at >>> >>> least, >>> >>> we'd have to break compatibility completely. Or maybe another way to >>> integrate would be to implement a jaas realm based on shiro and bridge >>> >>> that >>> >>> way, not sure if that's really a good idea though. >>> >>> However, the exemple you have is clearly on the app level, and there's >>> >>> imho >>> >>> not a real need to have application security integrated with the >>> >>> container >>> >>> security. If you deploy shiro in a web app, you clearly not integrate >>> >>> with >>> >>> the web container security, so I don't think this is a real problem. So >>> applications still clearly have the option of deploying shiro and >>> configuring it for their needs. >>> >>> I'm happy to discuss that further if people have other opinions. The >>> >>> above >>> >>> just explains why i didn't choose shiro at first and I certainly don't >>> >>> want >>> >>> to reject this option without discussion. >>> >>> On Tue, Oct 30, 2012 at 2:49 PM, Kurt Westerfeld<kurt.westerf...@gmail.com> >>> <kurt.westerf...@gmail.com>wrote: >>> >>> >>> I think the problem you find as you go down this route, is not that >>> >>> this >>> >>> checkPermission/isPermitted won't work for this command interface, but >>> >>> that >>> >>> there is a more fundamental problem across Karaf-based apps and >>> >>> enterprise >>> >>> apps in general, in that a javax.security.auth.Subject may actually >>> >>> be a >>> >>> difficult thing to uniformly provide. This is because of the >>> >>> asynchronous >>> >>> nature of Camel/ODE/whatever even within a short-run transaction in an >>> >>> ESB, >>> >>> and also commonly, the way in which long-running processes can >>> hibernate/unhibernate their context/state over time before a >>> >>> particular >>> >>> service might actually need the Subject information an originating >>> >>> caller >>> >>> to a service actually had. >>> >>> Simplest case: >>> - web service call call is authenticated, via basic auth, >>> >>> WS-Security, >>> >>> whatever >>> - web service calls camel >>> - camel route implements vm: queue, which blocks caller until >>> >>> complete >>> >>> - route actually needs Subject, but thread-local context techniques >>> don't work here >>> >>> Now, perhaps Camel has resolved this (it hadn't a while back), and >>> something like Apache ODE definitely hasn't (you have to manage this >>> >>> stuff >>> >>> yourself), but you can see a need here to have something like >>> "getSubject()" as a globally-applicable construct in Karaf/ESB >>> implementations. >>> >>> In one project that combined Java services, Camel services, and ODE >>> services, I had to create a SPI mechanism with OSGi to allow different >>> "providers" of javax.security.auth.Subject to have a crack at >>> >>> providing >>> >>> the >>> >>> subject for any caller. In some cases, a thread-local could suffice, >>> >>> and >>> >>> in other cases another strategy had to be used (such as stashing the >>> >>> data >>> >>> inside a CXF message header, etc). >>> >>> As to your interface, I would also add methods such as >>> >>> "hasRole(String)" >>> >>> because it could be a more convenient way to deal with this. >>> >>> Have you looked at Apache Shiro? I think there's a lot to be learned >>> >>> from >>> >>> there, and I've started to use Shiro in some of my projects. >>> >>> On Oct 30, 2012, at 7:20 AM, Guillaume Nodet <gno...@gmail.com> >>> <gno...@gmail.com> >>> >>> wrote: >>> >>> I've worked last week on a solution for KARAF-979, i.e. providing a >>> >>> way >>> >>> to >>> >>> secure shell commands. >>> What I came up with is the following. >>> >>> A new simple authentication service, exposed as an OSGi service with >>> >>> the >>> >>> following interface >>> >>> public interface AuthorizationService { >>> >>> void checkPermission(Subject subject, String permission); >>> >>> boolean isPermitted(Subject subject, String permission); >>> >>> } >>> >>> >>> This service would be used transparently by karaf commands by >>> >>> modifying >>> >>> the >>> >>> BlueprintCommand class and calling checkPermission with the current >>> >>> Subject >>> >>> and a permission which is >>> "command:" + [scope] + ":" + [command] >>> >>> Permissions can be set through ConfigAdmin using a single property >>> >>> which >>> >>> contains an xml which looks like: >>> <entries> >>> <entry permission="[xxx]" roles="[xxx]" type="add|set|modify" >>> >>> /> >>> >>> [ more entries ] >>> </entries> >>> >>> The matching is done by checking the permission given in the call to >>> >>> the >>> >>> AuthorizationService with the entries in the configuration. >>> >>> Matching >>> >>> entries are used to compute the list of authorized roles and those >>> >>> roles >>> >>> are checked against the roles of the authenticated Subject. >>> This mechanism is the same we had in ServiceMix 3.x. >>> >>> This allows to define permissions for a subshell or a single >>> >>> command. >>> >>> It >>> >>> does not provide a very easy way to split read operations from write >>> operations and this would have to be done in an example >>> >>> configuration >>> >>> maybe >>> >>> to ease the user task. >>> That said, the mechanism is easily extensible and we can later add >>> permissions for JMX access or any other part of Karaf that would >>> >>> benefit >>> >>> from that. >>> >>> Thoughts welcomed, as usual. >>> >>> >>> >>> -- >>> ------------------------ >>> Guillaume Nodet >>> ------------------------ >>> Blog: http://gnodet.blogspot.com/ >>> ------------------------ >>> FuseSource, Integration everywherehttp://fusesource.com >>> >>> -- >>> ------------------------ >>> Guillaume Nodet >>> ------------------------ >>> Blog: http://gnodet.blogspot.com/ >>> ------------------------ >>> FuseSource, Integration everywherehttp://fusesource.com >>> >>> -- >>> ------------------------ >>> Guillaume Nodet >>> ------------------------ >>> Blog: http://gnodet.blogspot.com/ >>> ------------------------ >>> FuseSource, Integration everywherehttp://fusesource.com >>> >>> >>> >> > -- Apache Karaf <http://karaf.apache.org/> Committer & PMC OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/> Committer & Project Lead OPS4J Pax for Vaadin <http://team.ops4j.org/wiki/display/PAXVAADIN/Home> Commiter & Project Lead blog <http://notizblog.nierbeck.de/>