Nihal Jain created HBASE-20472: ---------------------------------- Summary: InfoServer doesnot honour any acl set by the admin Key: HBASE-20472 URL: https://issues.apache.org/jira/browse/HBASE-20472 Project: HBase Issue Type: Bug Components: security, UI Reporter: Nihal Jain
The adminsAcl property can be used to restrict access to certain sections of the web UI only to a particular set of users/groups. But in hbase, adminAcl variable for InfoServer is always null, rendering it to not honour any acl set by the admin. In fact I could not find any property in hbase to specify acl list for web server. *Analysis*: * *InfoSever* object forgets(?) to set any *adminAcl* in the builder object for http server. {code:java} public InfoServer(String name, String bindAddress, int port, boolean findPort, final Configuration c) { . . HttpServer.Builder builder = new org.apache.hadoop.hbase.http.HttpServer.Builder(); . . this.httpServer = builder.build(); }{code} [See InfoServer constructor|https://github.com/apache/hbase/blob/46cb5dfa226892fd2580f26ce9ce77225bd7e67c/hbase-http/src/main/java/org/apache/hadoop/hbase/http/InfoServer.java#L55] * http server retreives a null value and sets it as adminsAcl, which is passed to *createWebAppContext*() method {code:java} private HttpServer(final Builder b) throws IOException { . . . this.adminsAcl = b.adminsAcl; this.webAppContext = createWebAppContext(b.name, b.conf, adminsAcl, appDir); . . }{code} [See L527 HttpServer.java|https://github.com/apache/hbase/blob/46cb5dfa226892fd2580f26ce9ce77225bd7e67c/hbase-http/src/main/java/org/apache/hadoop/hbase/http/HttpServer.java#L527] **Solution:** * This method sets *ADMIN_ACL* attribute for the servlet context to *null* {code:java} private static WebAppContext createWebAppContext(String name, Configuration conf, AccessControlList adminsAcl, final String appDir) { WebAppContext ctx = new WebAppContext(); . . ctx.getServletContext().setAttribute(ADMINS_ACL, adminsAcl); . . } {code} * Now any page having *HttpServer.hasAdministratorAccess*() will allow access to everyone, making this check useless. {code:java} @Override public void doGet(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { // Do the authorization if (!HttpServer.hasAdministratorAccess(getServletContext(), request, response)) { return; } . . }{code} [For example See L104 LogLevel.java|https://github.com/apache/hbase/blob/46cb5dfa226892fd2580f26ce9ce77225bd7e67c/hbase-http/src/main/java/org/apache/hadoop/hbase/http/log/LogLevel.java#L104] * *hasAdministratorAccess()* checks for the following and returns true, in any case as *ADMIN_ACL* is always *null* {code:java} public static boolean hasAdministratorAccess( ServletContext servletContext, HttpServletRequest request, HttpServletResponse response) throws IOException { . . if (servletContext.getAttribute(ADMINS_ACL) != null && !userHasAdministratorAccess(servletContext, remoteUser)) { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "User " + remoteUser + " is unauthorized to access this page."); return false; } return true; }{code} [See line 1196 in HttpServer|https://github.com/apache/hbase/blob/46cb5dfa226892fd2580f26ce9ce77225bd7e67c/hbase-http/src/main/java/org/apache/hadoop/hbase/http/HttpServer.java#L1196] -- This message was sent by Atlassian JIRA (v7.6.3#76005)