It seems to me that we should have very simple config for the endpoints and other deployment specific config added to a shiro.ini that has all the boilerplate stuff in it. Then you can make the rewrite rules stay in there as well.
Which, btw, is the idea behind topology.xml - it is a simple deployment specific descriptor that gets ingested and *compiled* into effective deployment configuration. Today that is gateway.xml and what you are proposing is shiro.ini. On Fri, Oct 25, 2013 at 12:25 PM, Dilli Arumugam <[email protected]>wrote: > Larry, > > I would go with specifying the end points of hadoop services in > knox.ini(=shiro.ini) and leave the rewrite rules in its own file. > > Rewrite rules are not going to be cluster specific and admins typically > would not have to tinker with them. > > Thanks > Dilli > > > On Fri, Oct 25, 2013 at 9:03 AM, Dilli Arumugam > <[email protected]>wrote: > > > Thanks Larry for the review and comments. > > > > The proposed knox.ini is meant to be edited by Knox system administrator > > until we get to have a admin console. This is not meant to be edited by > end > > user. > > > > To integrate additional back end hadoop service, following pieces of > > information have to come from pointers from knox.ini to external > > configuration files. > > > > 1. end point of the new hadoop servie back end > > 2. rewriting rules for the new service > > > > These can be specified in one file or split between 2 files with one of > > them being topology file or its equivalent. > > I have not shown all those details in the current shiro.ini. > > But, you would get the idea. > > > > Dilli > > > > > > On Fri, Oct 25, 2013 at 8:50 AM, larry mccay <[email protected]> wrote: > > > >> Hi Dilli - > >> > >> Good work here! > >> > >> Question: > >> 1. Is this complicated ini hand edited by the enduser in order to > deploy a > >> given topology or have you changed the shiro contributor to write this > out > >> from a much more understandable config within the topology? > >> > >> 2. Where are the services configured for a given topology? > >> 3. Did you rename all the existing filters to start with knox? > >> > >> A couple observations: > >> > >> 1. removing the use of gateway.xml means that we *require* Shiro for our > >> servlet filter chaining > >> 2. While comparing this to the current format of gateway.xml I can agree > >> that this is easier to understand - however, I don't actually find ini > >> format simpler to comprehend and administer than XML or JSON. In fact, > >> comparing this to topology.xml which is all you really need to do for > >> admin, I think the topology file is very easy to understand and > >> administer. > >> 3. moving the rewrite rules out to not require coding is good but should > >> probably not require that they be in this format and file > >> 4. Someone that wants to leverage their own or another third party > >> solution > >> is stuck squeezing it into Shiro > >> 5. This would violate a principle of mine of "Is-a" vs "Has-a" - Knox is > >> not a Shiro provider it can however *have* a Shiro provider > >> 6. End users should never have to see rewrite rules and maybe a lot of > >> what > >> is in that ini. Principal mapping, authz policy, etc will eventually > come > >> from Zookeeper which should remove their need to be in this file for > those > >> things. Maybe we can even get the LDAP config separately from there as > >> well > >> - though I still think it is best provided in a topology file with a > much > >> smaller config requirements and get pushed into shiro.ini. Then the user > >> may never need to see - or at least open - this file. > >> > >> I continue to believe that we are best served by enabling a deployment > >> that > >> looks like this and encouraging the use of it as the preferred solution. > >> However, we should continue to support the use of arbitrary providers > >> through the use of gateway.xml. In most cases, gateway.xml can be > >> leveraged > >> to only include the Shiro provider. In addition, all knowledge of Shiro > >> specifics should remain inside of that provider. If it leaks out then we > >> are violating the separation of Is-a vs Has-a again. > >> > >> This also allows us the flexibility to add something before or after > that > >> provider for things that we find are not easily or appropriately done > >> inside the security provider. > >> > >> "I think we can rename shiro.ini as knox.ini to make it explicit this is > >> more about knox configuration than shiro library configuration." > >> > >> While I can understand the thinking of renaming the shiro.ini file to > >> knox.ini, also violates the Is-a vs Has-a principle for me. We are not a > >> shiro security provider extension. We are a REST API Gateway for Hadoop > >> that has security providers - one of which is Shiro. > >> > >> "We are using shiro config file mechanism as simple, lightweight > depenency > >> injection." > >> > >> Where is there dependency injection here? If you are referring to the > >> configuration of the filter chain that is not really injection though it > >> is > >> an admittedly simpler mechanism than the current state of the > contributors > >> and our deployment machinery - which could be refactored and improved. > >> > >> "This does not really tie us to using only Shiro authentication > mechanism > >> or > >> authorization mechanisms. > >> > >> We have the choice of writing all our authentication or authorization in > >> our own servlet filters or leverage filters from Shiro library, Realms > >> from > >> Shiro library or write your own Shiro filters or Shiro realms." > >> > >> The only change that this proposal makes to our flexibility is the > >> inability to take Shiro out of the picture. > >> We could have leveraged Shiro to do all these things with the current > >> design as well. > >> BUT, we have control over our own interception channel in our chains > >> today. > >> This proposal takes a specific *security provider's* proprietary filter > >> chain and uses it as the only interceptor channel for the entire server. > >> Just because they also had a need for one - for their security work - > >> doesn't mean that we shouldn't have our own. The tail should not wag the > >> dog. Shiro is not an application or server framework it is a security > >> provider. > >> > >> "In most of the cases, when we want to integrate with a new Hadoop back > >> end > >> service, all that we have to do is specify the path to a file having > >> rewrite rules for the service. Rest of the things in > knox.ini(=shiro.ini) > >> would remain same." > >> > >> This isn't really very clear to me. Do we still have services in a > >> topology.xml file? > >> I don't see where you specify the url for the backend services - so I > >> assume there is still a topology file. > >> How do we know where to dispatch the requests to? > >> > >> I do agree that this is a very good step forward in defining a preferred > >> security provider model for Knox and that we should continue down this > >> road. We just need to do so carefully. If, over time, we have found no > >> reason to use the existing solution that we can consider removing it > >> entirely. > >> > >> Thanks for all this work and insight, Dilli! > >> > >> --larry > >> > >> > >> On Fri, Oct 25, 2013 at 10:27 AM, Dilli Arumugam > >> <[email protected]>wrote: > >> > >> > Have been trying out a few ideas with Knox and managed to get Knox > >> running > >> > with > >> > > >> > 1. WEB-INF/gateway.xml is completely removed > >> > 2. WEB-INF/web.xml declares only shiro filter and a defautl servlet > >> > 2. all filters are defined and injected using WEB-INF/shiro.ini > >> > > >> > To me that looks much simpler to comprehend and administer. > >> > Agreed, this could be subjective. > >> > Hence, seeking comments from community. > >> > > >> > Pasting web.xml and shiro.ini inline. > >> > > >> > web.xml > >> > -------------- > >> > > >> > <?xml version="1.0" encoding="UTF-8" standalone="yes"?> > >> > <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi=" > >> > http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" > >> > http://java.sun.com/xml/ns/javaee > >> > http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> > >> > > >> > <listener> > >> > > >> > > >> > > >> > <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> > >> > </listener> > >> > > >> > <listener> > >> > > >> > > >> > > >> > <listener-class>org.apache.hadoop.gateway.services.GatewayServicesContextListener</listener-class> > >> > </listener> > >> > > >> > <listener> > >> > > >> > > >> > > >> > <listener-class>org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletContextListener</listener-class> > >> > </listener> > >> > > >> > <context-param> > >> > <param-name>rewriteDescriptorLocation</param-name> > >> > <param-value>/WEB-INF/rewrite.xml</param-value> > >> > </context-param> > >> > > >> > <filter> > >> > <filter-name>ShiroFilter</filter-name> > >> > > >> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> > >> > </filter> > >> > > >> > <filter-mapping> > >> > <filter-name>ShiroFilter</filter-name> > >> > <url-pattern>/*</url-pattern> > >> > </filter-mapping> > >> > > >> > <session-config> > >> > <session-timeout>30</session-timeout> > >> > </session-config> > >> > > >> > <servlet> > >> > <servlet-name>errorservlet</servlet-name> > >> > > >> > > >> > > >> > <servlet-class>org.apache.hadoop.gateway.filter.KnoxErrorServlet</servlet-class> > >> > </servlet> > >> > > >> > <servlet-mapping> > >> > <servlet-name>errorservlet</servlet-name> > >> > <url-pattern>/*</url-pattern> > >> > </servlet-mapping> > >> > > >> > </web-app> > >> > > >> > > >> > shiro.ini > >> > ------------- > >> > > >> > [main] > >> > > >> > # define ldapRealm > >> > ldapRealm=org.apache.shiro.realm.ldap.JndiLdapRealm > >> > ldapRealm.contextFactory.authenticationMechanism=simple > >> > ldapRealm.contextFactory.url=ldap://localhost:33389 > >> > ldapRealm.userDnTemplate=uid={0},ou=people,dc=hadoop,dc=apache,dc=org > >> > > >> > > >> > # define filter: knoxResponseCookieFilter > >> > knoxResponseCookieFilter = > >> > org.apache.hadoop.gateway.filter.ResponseCookieFilter > >> > knoxResponseCookieFilter.enabled = true > >> > knoxResponseCookieFilter.filterHeaders = rememberMe, > hadoop.auth.cookie > >> > > >> > # define filter: knoxPrincipalMapper > >> > knoxPrincipalMapper = > >> org.apache.hadoop.gateway.filter.KnoxPrincipalMapper > >> > knoxPrincipalMapper.enabled = true > >> > knoxPrincipalMapper.userToUserMap = bob:guest, jon:bob > >> > knoxPrincipalMapper.userToGroupMap = *:users, bob:admin > >> > > >> > # define filter: knoxIPTracker > >> > knoxIPTracker =org.apache.hadoop.gateway.filter.KnoxIPTracker > >> > knoxIPTracker.enabled = true > >> > > >> > # define filter: knoxAclAuthzFilter > >> > knoxAclAuthzFilter = > org.apache.hadoop.gateway.filter.KnoxAclAuthzFilter > >> > knoxAclAuthzFilter.enabled = true > >> > knoxAclAuthzFilter.globalGroupAclMode = OR > >> > knoxAclAuthzFilter.serviceGroupAclModeMap = /webhdfs/:OR, > /templeton/:OR > >> > knoxAclAuthzFilter.serviceAclMap = /webhdfs/:user1 user2; users admin; > >> > 127.*.*.*, /templeton/:user11 user12; users admin > >> > > >> > # define filter: javaSubjectMapper > >> > javaSubjectMapper = > >> > org.apache.hadoop.gateway.filter.PostAuthenticationFilter > >> > > >> > # define filter: knoxIdentityAsserter > >> > knoxIdentityAsserter = > >> > org.apache.hadoop.gateway.filter.KnoxIdentityAsserter > >> > knoxIdentityAsserter.enabled = true > >> > > >> > # define filter: knoxUrlRewriter > >> > knoxUrlRewriter = > >> > org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter > >> > > >> > knoxUrlRewriter.requestUrlMap = > >> > /webhdfs/v1/:WEBHDFS/webhdfs/inbound/namenode/root, > >> > /webhdfs/v1/[^~]+:WEBHDFS/webhdfs/inbound/namenode/file, > >> > /webhdfs/v1/~:WEBHDFS/webhdfs/inbound/namenode/home, > >> > /webhdfs/v1/~/.*:WEBHDFS/webhdfs/inbound/namenode/home/file, > >> > /webhdfs/data/v1/.+:WEBHDFS/webhdfs/inbound/datanode > >> > > >> > knoxUrlRewriter.requestBodyMap = /oozie/:OOZIE/oozie/configuration, > >> > /oozie/v1/.*:OOZIE/oozie/configuration, > >> > /oozie/v2/.*:OOZIE/oozie/configuration > >> > > >> > knoxUrlRewriter.responseHeadersMap = > >> > /webhdfs/v1/[^~]*:WEBHDFS/webhdfs/outbound/namenode/headers, > >> > /webhdfs/v1/~/:WEBHDFS/webhdfs/outbound/namenode/headers, > >> > /hbase/:WEBHBASE/webhbase/headers/outbound, > >> > /hbase/[~/]*:WEBHBASE/webhbase/headers/outbound, > >> > /hbase/status/cluster:WEBHBASE/webhbase/status/outbound, > >> > /hbase/[^/]*/regions:WEBHBASE/webhbase/regions/outbound > >> > > >> > # define filter: knoxHttpDispatcher > >> > knoxHttpDispatcher = > >> org.apache.hadoop.gateway.dispatch.HttpClientDispatch > >> > knoxHttpDispatcher.replayBufferSizeMap = webhdfs:4, templeton:8, > oozie:4 > >> > > >> > [urls] > >> > # you could choose to have a different chain of filter for different > url > >> > patterns > >> > # so far Knox did not need it > >> > /** = knoxResponseCookieFilter, authcBasic, knoxPrincipalMapper, > >> > knoxIPTracker, knoxAclAuthzFilter, javaSubjectMapper, > >> knoxIdentityAsserter, > >> > knoxUrlRewriter, knoxHttpDispatcher > >> > > >> > # end of shiro.ini > >> > > >> > I think we can rename shiro.ini as knox.ini to make it explicit this > is > >> > more about knox configuration than shiro library configuration. > >> > > >> > > >> > We are using shiro config file mechanism as simple, lightweight > >> depenency > >> > injection. > >> > > >> > This does not really tie us to using only Shiro authentication > >> mechanism or > >> > authorization mechanisms. > >> > > >> > We have the choice of writing all our authentication or authorization > in > >> > our own servlet filters or leverage filters from Shiro library, Realms > >> from > >> > Shiro library or write your own Shiro filters or Shiro realms. > >> > > >> > In most of the cases, when we want to integrate with a new Hadoop back > >> end > >> > service, all that we have to do is specify the path to a file having > >> > rewrite rules for the service. Rest of the things in > >> knox.ini(=shiro.ini) > >> > would remain same. > >> > > >> > Please review and comment. > >> > > >> > > >> > Thanks > >> > Dilli > >> > > >> > -- > >> > CONFIDENTIALITY NOTICE > >> > NOTICE: This message is intended for the use of the individual or > >> entity to > >> > which it is addressed and may contain information that is > confidential, > >> > privileged and exempt from disclosure under applicable law. If the > >> reader > >> > of this message is not the intended recipient, you are hereby notified > >> that > >> > any printing, copying, dissemination, distribution, disclosure or > >> > forwarding of this communication is strictly prohibited. If you have > >> > received this communication in error, please contact the sender > >> immediately > >> > and delete it from your system. Thank You. > >> > > >> > > > > > > -- > CONFIDENTIALITY NOTICE > NOTICE: This message is intended for the use of the individual or entity to > which it is addressed and may contain information that is confidential, > privileged and exempt from disclosure under applicable law. If the reader > of this message is not the intended recipient, you are hereby notified that > any printing, copying, dissemination, distribution, disclosure or > forwarding of this communication is strictly prohibited. If you have > received this communication in error, please contact the sender immediately > and delete it from your system. Thank You. >
