Hello, I am writing this email to get your help on an issue with my Apache knox configuration.
I am facing a problem on both YarnUI and Sparkhistory UI where I have to write myself rewrite rules for static files like css or js ones. For example when trying to access https://<knox>:8443/gateway/default/yarn/ I get 404 errors on the following files: gateway-audit.log 8:17 ||aa26e33e-e97b-4ff9-a977-79f5e9643ae3|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/yarn.css|unavailable|Request method: GET 24/07/11 15:18:17 ||aa26e33e-e97b-4ff9-a977-79f5e9643ae3|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/yarn.css|success| 24/07/11 15:18:17 ||aa26e33e-e97b-4ff9-a977-79f5e9643ae3|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/yarn.css|success|Response status: 404 24/07/11 15:18:17 ||475f6c06-c90d-4d14-ae39-9d81d5a51fee|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/jquery/themes-1.9.1/base/jquery-ui.css|unavailable|Request method: GET 24/07/11 15:18:17 ||475f6c06-c90d-4d14-ae39-9d81d5a51fee|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/jquery/themes-1.9.1/base/jquery-ui.css|success| 24/07/11 15:18:17 ||475f6c06-c90d-4d14-ae39-9d81d5a51fee|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/jquery/themes-1.9.1/base/jquery-ui.css|success|Response status: 404 24/07/11 15:18:17 ||0ea69ed6-8f4c-4cd1-86ca-ba8d1d30f505|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/jquery/jquery-3.6.0.min.js|unavailable|Request method: GET 24/07/11 15:18:17 ||0ea69ed6-8f4c-4cd1-86ca-ba8d1d30f505|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/jquery/jquery-3.6.0.min.js|success| 24/07/11 15:18:17 ||0ea69ed6-8f4c-4cd1-86ca-ba8d1d30f505|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/jquery/jquery-3.6.0.min.js|success|Response status: 404 24/07/11 15:18:17 ||9e5f2aeb-cff2-42cc-ae98-858e994e4214|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/yarn.dt.plugins.js|unavailable|Request method: GET 24/07/11 15:18:17 ||9e5f2aeb-cff2-42cc-ae98-858e994e4214|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/yarn.dt.plugins.js|success| 24/07/11 15:18:17 ||9e5f2aeb-cff2-42cc-ae98-858e994e4214|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/yarn.dt.plugins.js|success|Response status: 404 24/07/11 15:18:17 ||91eb4324-6b52-41ab-8473-6aebd0fec591|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/dt-1.10.18/css/jquery.dataTables.css|unavailable|Request method: GET 24/07/11 15:18:17 ||91eb4324-6b52-41ab-8473-6aebd0fec591|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/dt-1.10.18/css/jquery.dataTables.css|success| 24/07/11 15:18:17 ||5c26cfad-9397-406a-bc66-dfa668933d9a|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/dt-sorting/natural.js|unavailable|Request method: GET 24/07/11 15:18:17 ||91eb4324-6b52-41ab-8473-6aebd0fec591|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/dt-1.10.18/css/jquery.dataTables.css|success|Response status: 404 24/07/11 15:18:17 ||5c26cfad-9397-406a-bc66-dfa668933d9a|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/dt-sorting/natural.js|success| 24/07/11 15:18:17 ||5c26cfad-9397-406a-bc66-dfa668933d9a|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/dt-sorting/natural.js|success|Response status: 404 24/07/11 15:18:17 ||3aaa7592-bf99-4c84-814b-7a985a27454c|audit| < ip-address > |KNOX||||access|uri|/gateway/default/default/yarn/static/jquery/jquery-ui-1.13.2.custom.min.js|unavailable|Request method: GET 24/07/11 15:18:17 ||3aaa7592-bf99-4c84-814b-7a985a27454c|audit| < ip-address > |KNOX|user|||authentication|uri|/gateway/default/default/yarn/static/jquery/jquery-ui-1.13.2.custom.min.js|success| 24/07/11 15:18:17 ||3aaa7592-bf99-4c84-814b-7a985a27454c|audit| < ip-address > |KNOX|user|||access|uri|/gateway/default/default/yarn/static/jquery/jquery-ui-1.13.2.custom.min.js|success|Response status: 404 ... This the page I get without JS or CSS with the following message This page will not function without javascript enabled. Please enable javascript on your browser. I found a post with the same issue [ https://community.cloudera.com/t5/Support-Questions/Knox-wrong-mapping-help-will-be-appriciated/td-p/144055 | here ] but after replacing my rewrite.xml with the IBM one I still had the same problems To fix this issue I had to change the /static rule the following way. FROM < rule dir = "OUT" name = "YARNUI/yarn/outbound/static" pattern = "/static/{**}" > < rewrite template = "{$frontendUrl[url]}/static/{**}" /> </ rule > TO < rule dir = "OUT" name = "YARNUI/yarn/outbound/static" pattern = "/static/{**}" > < rewrite template = "{$serviceUrl[YARNUI]}/static/{**}" /> </ rule > Also doing that doesn’t feel right since all the links on the Yarn UI are still broken for example clicking on the application link in the left nav bar redirects me to https://<knox-host>:8443/default/yarn/cluster/apps (without the gateway in front for some reason) where I get a 404 error. The same problem seems to happen to Spark History UI. When trying to access to https://<knox>:8443/gateway/default/spark3history the only thing with a response 200 is the html document of the sparkui page but every other ressources gets a 404 error. I added the following rule in data/services/spark3historyui/3.0.0/rewrite.xml < rule dir = "OUT" name = "SPARKHISTORYUI/outbound/static" pattern = "/static/{**}" > < rewrite template = "{$serviceUrl[SPARKHISTORYUI]}/static/{**}" /> </ rule > which fixes the css but I am still having issues with the jquery called made to get the json of all the jobs. Here is the output of gateway.log 2024-07-11 15:44:12,879 DEBUG knox.gateway (PortMappingHelperHandler.java:handleDefaultTopologyMapping(150)) - Default topology forward from /api/v1/applications to /gateway/default/api/v1/applications 2024-07-11 15:44:12,880 568624ae-69ea-4574-b162-3faa22c9d85e DEBUG knox.gateway (GatewayFilter.java:doFilter(126)) - Received request: GET /api/v1/applications 2024-07-11 15:44:13,356 TRACE gateway.access (AccessHandler.java:log(49)) - |||194.12.154.214|GET|https:// < knox-host > :8443/api/v1/applications?limit=2147483647&status=completed|-1|404|0|477 I’m pretty sure that the problems on those 2 services are linked and that I’m missing something in my configuration but I can’ t tell what at all. To give additional informations Here is my default topology and my gateway-site.xml I replaced my host <knox-host> for privacy issues here but I am using a real host in those files. < topology > < gateway > < provider > < role > webappsec </ role > < name > WebAppSec </ name > < enabled > true </ enabled > </ provider > < provider > < role > hostmap </ role > < name > static </ name > < enabled > false </ enabled > < param > < name > localhost </ name > < value > sandbox,sandbox.hortonworks.com </ value > </ param > </ provider > < provider > < role > identity-assertion </ role > < name > Default </ name > < enabled > false </ enabled > </ provider > < provider > < role > federation </ role > < name > SSOCookieProvider </ name > < enabled > true </ enabled > < param > < name > sso.authentication.provider.url </ name > < value > https:// < knox-host > :8443/gateway/knoxsso/api/v1/websso </ value > </ param > </ provider > </ gateway > < service > < role > KNOX </ role > </ service > < service > < role > HDFSUI </ role > < version > 2.7.0 </ version > < url > https:// < host > :50070 </ url > </ service > < service > < role > NAMENODE </ role > < url > https://localhost:8020 </ url > < param > < name > webhdfs-redirect </ name > < value > https:// < host > :8443/gateway/default/webhdfs/v1 </ value > </ param > </ service > < service > < role > WEBHDFS </ role > < url > https:// < host > :50070/webhdfs </ url > </ service > < service > < role > YARNUI </ role > < version > 2.7.0 </ version > < url > https:// < host > :8088 </ url > < param > < name > webyarn-redirect </ name > < value > https:// < host > :8443/gateway/default/webhdfs/v1 </ value > </ param > </ service > < service > < role > YARN </ role > < url > https:// < host > :8088/ </ url > </ service > < service > < role > HBASEUI </ role > < url > https:// < host > :60010 </ url > </ service > < service > < role > SPARK3HISTORYUI </ role > < version > 3.0.0 </ version > < url > https:// < host > :18080 </ url > </ service > < application > < name > admin-ui </ name > </ application > </ topology > gateway-site.xml <?xml version="1.0" encoding="UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <configuration> <property> <name>gateway.service.alias.impl</name> <value>org.apache.knox.gateway.services.security.impl.RemoteAliasService</value> </property> <property> <name>default.app.topology.name</name> <value>default</value> </property> <property> <name>gateway.port</name> <value>8443</value> <description>The HTTP port for the Gateway.</description> </property> <property> <name>gateway.path</name> <value>gateway</value> <description>The default context path for the gateway.</description> </property> <property> <name>gateway.gateway.conf.dir</name> <value>deployments</value> <description>The directory within GATEWAY_HOME that contains gateway topology files and deployments.</description> </property> <property> <name>gateway.keystore.cert.algorithm</name> <value>SHA256withRSA</value> </property> <property> <name>gateway.hadoop.kerberos.secured</name> <value>false</value> <description>Boolean flag indicating whether the Hadoop cluster protected by Gateway is secured with Kerberos</description> </property> <property> <name>java.security.krb5.conf</name> <value>/etc/knox/conf/krb5.conf</value> <description>Absolute path to krb5.conf file</description> </property> <property> <name>java.security.auth.login.config</name> <value>/etc/knox/conf/krb5JAASLogin.conf</value> <description>Absolute path to JAAS login config file</description> </property> <property> <name>sun.security.krb5.debug</name> <value>false</value> <description>Boolean flag indicating whether to enable debug messages for krb5 authentication</description> </property> <!-- @since 0.10 Websocket configs --> <property> <name>gateway.websocket.feature.enabled</name> <value>true</value> <description>Enable/Disable websocket feature.</description> </property> <property> <name>gateway.scope.cookies.feature.enabled</name> <value>true</value> <description>Enable/Disable cookie scoping feature.</description> </property> <property> <name>gateway.cluster.config.monitor.ambari.enabled</name> <value>false</value> <description>Enable/disable Ambari cluster configuration monitoring.</description> </property> <property> <name>gateway.cluster.config.monitor.ambari.interval</name> <value>60</value> <description>The interval (in seconds) for polling Ambari for cluster configuration changes.</description> </property> <!-- @since 2.0.0 WebShell configs --> <!-- must have websocket enabled to use webshell --> <property> <name>gateway.webshell.feature.enabled</name> <value>false</value> <description>Enable/Disable webshell feature.</description> </property> <property> <name>gateway.webshell.max.concurrent.sessions</name> <value>20</value> <description>Maximum number of total concurrent webshell sessions</description> </property> <property> <name>gateway.webshell.audit.logging.enabled</name> <value>false</value> <description>[Experimental Feature] Enable/Disable webshell command audit logging. NOTE: Turning this on might log secrets that might be part of command line arguments, please consider this before turning this on.</description> </property> <property> <name>gateway.webshell.read.buffer.size</name> <value>1024</value> <description>Web Shell buffer size for reading</description> </property> <!-- @since 2.0.0 websocket JWT validation configs --> <property> <name>gateway.websocket.JWT.validation.feature.enabled</name> <value>true</value> <description>Enable/Disable websocket JWT validation at websocket layer.</description> </property> <!-- @since 1.5.0 homepage logout --> <property> <name>knox.homepage.logout.enabled</name> <value>true</value> <description>Enable/disable logout from the Knox Homepage.</description> </property> <!-- @since 1.6.0 token management related properties --> <property> <name>gateway.knox.token.eviction.grace.period</name> <value>0</value> <description>A duration (in seconds) beyond a token’s expiration to wait before evicting its state. This configuration only applies when server-managed token state is enabled either in gateway-site or at the topology level.</description> </property> <!-- Knox Admin related config --> <property> <name>gateway.knox.admin.groups</name> <value>admin</value> </property> <!-- DEMO LDAP config for Hadoop Group Provider --> <property> <name>gateway.group.config.hadoop.security.group.mapping</name> <value>org.apache.hadoop.security.LdapGroupsMapping</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.bind.user</name> <value>uid=guest,ou=people,dc=hadoop,dc=apache,dc=org</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.bind.password</name> <value>guest-password</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.url</name> <value>ldap://localhost:33389</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.base</name> <value></value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.search.filter.user</name> <value>(&(|(objectclass=person)(objectclass=applicationProcess))(cn={0}))</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.search.filter.group</name> <value>(objectclass=groupOfNames)</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.search.attr.member</name> <value>member</value> </property> <property> <name>gateway.group.config.hadoop.security.group.mapping.ldap.search.attr.group.name</name> <value>cn</value> </property> <property> <name>gateway.dispatch.whitelist.services</name> <value>DATANODE,HBASEUI,HDFSUI,JOBHISTORYUI,NODEUI,YARNUI,SPARK3HISTORYUI,knoxauth</value> <description>The comma-delimited list of service roles for which the gateway.dispatch.whitelist should be applied.</description> </property> <property> <name>gateway.dispatch.whitelist</name> <value>^https?:\/\/(localhost|127\.0\.0\.1|0:0:0:0:0:0:0:1|::1):[0-9].*$|^https:\/\/<host>:8443.*$|^https:\/\/<host>:50070.*$|^https:\/\/<host>:60010.*$|^https:\/\/<host>:8088.*$|^https:\/\/<host>:18080.*$</value> <!--<value>^https?:\/\/.*$</value>--> <!--<value>DEFAULT</value> --> <description>The whitelist to be applied for dispatches associated with the service roles specified by gateway.dispatch.whitelist.services. If the value is DEFAULT, a domain-based whitelist will be derived from the Knox host.</description> </property> <property> <name>gateway.frontend.url</name> <value>https://<host>:8443/</value> </property> <property> <name>gateway.xforwarded.enabled</name> <value>true</value> </property> <property> <name>gateway.server.header.enabled</name> <value>true</value> </property> <property> <name>gateway.xforwarded.header.context.append.servicename</name> <value>LIVYSERVER</value> <description>Add service name to x-forward-context header for the list of services defined above.</description> </property> </configuration> My spark version I think that there is a better way to achieve this without having to do all the manual workarounds ? Thanks for your help