[
https://issues.apache.org/jira/browse/KNOX-3096?focusedWorklogId=958815&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-958815
]
ASF GitHub Bot logged work on KNOX-3096:
----------------------------------------
Author: ASF GitHub Bot
Created on: 25/Feb/25 20:39
Start Date: 25/Feb/25 20:39
Worklog Time Spent: 10m
Work Description: lmccay commented on code in PR #994:
URL: https://github.com/apache/knox/pull/994#discussion_r1970510390
##########
gateway-provider-security-authc-remote/src/main/java/org/apache/knox/gateway/filter/RemoteAuthFilter.java:
##########
@@ -0,0 +1,249 @@
+/*
+ * 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.
+ */
+package org.apache.knox.gateway.filter;
+
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
+import org.apache.knox.gateway.RemoteAuthMessages;
+import org.apache.knox.gateway.audit.api.Action;
+import org.apache.knox.gateway.audit.api.ActionOutcome;
+import org.apache.knox.gateway.audit.api.AuditContext;
+import org.apache.knox.gateway.audit.api.AuditService;
+import org.apache.knox.gateway.audit.api.AuditServiceFactory;
+import org.apache.knox.gateway.audit.api.Auditor;
+import org.apache.knox.gateway.audit.api.ResourceType;
+import org.apache.knox.gateway.audit.log4j.audit.AuditConstants;
+import org.apache.knox.gateway.i18n.messages.MessagesFactory;
+import org.apache.knox.gateway.security.GroupPrincipal;
+import org.apache.knox.gateway.security.PrimaryPrincipal;
+import org.apache.knox.gateway.services.GatewayServices;
+import org.apache.knox.gateway.services.ServiceType;
+import org.apache.knox.gateway.services.security.KeystoreService;
+import org.apache.knox.gateway.services.security.KeystoreServiceException;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManagerFactory;
+import javax.security.auth.Subject;
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.security.KeyStore;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+public class RemoteAuthFilter implements Filter {
+
+ private static final String CONFIG_REMOTE_AUTH_URL = "remote.auth.url";
+ private static final String CONFIG_INCLUDE_HEADERS =
"remote.auth.include.headers";
+ private static final String CONFIG_CACHE_KEY_HEADER =
"remote.auth.cache.key";
+ private static final String CONFIG_EXPIRE_AFTER = "remote.auth.expire.after";
+ private static final String DEFAULT_CACHE_KEY_HEADER = "Authorization";
+ private static final String CONFIG_USER_HEADER = "remote.auth.user.header";
+ private static final String CONFIG_GROUP_HEADER = "remote.auth.group.header";
+
+ private String remoteAuthUrl;
+ private List<String> includeHeaders;
+ private String cacheKeyHeader;
+ private String userHeader;
+ private String groupHeader;
+ /*
+ For Testing
+ */
+ HttpURLConnection httpURLConnection;
+
+ Cache<String, Subject> authenticationCache;
+
+ private static final AuditService auditService =
AuditServiceFactory.getAuditService();
+ private static final Auditor auditor = auditService.getAuditor(
+ AuditConstants.DEFAULT_AUDITOR_NAME,
AuditConstants.KNOX_SERVICE_NAME, AuditConstants.KNOX_COMPONENT_NAME );
+ private final RemoteAuthMessages LOGGER = MessagesFactory.get(
RemoteAuthMessages.class );
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ remoteAuthUrl = filterConfig.getInitParameter(CONFIG_REMOTE_AUTH_URL);
+ if (remoteAuthUrl == null || remoteAuthUrl.isEmpty()) {
+ LOGGER.missingRequiredParameter(CONFIG_REMOTE_AUTH_URL);
+ throw new ServletException(CONFIG_REMOTE_AUTH_URL + " is a missing
required param.");
+ }
+ includeHeaders =
Arrays.asList(filterConfig.getInitParameter(CONFIG_INCLUDE_HEADERS).split(","));
+ cacheKeyHeader = filterConfig.getInitParameter(CONFIG_CACHE_KEY_HEADER) !=
null ? filterConfig
+ .getInitParameter(CONFIG_CACHE_KEY_HEADER) :
DEFAULT_CACHE_KEY_HEADER;
+ String cachetime = filterConfig.getInitParameter(CONFIG_EXPIRE_AFTER);
+ if (cachetime != null) {
+ int expireAfterMinutes = Integer.parseInt(cachetime);
+ authenticationCache = CacheBuilder.newBuilder()
+ .expireAfterWrite(expireAfterMinutes, TimeUnit.MINUTES)
+ .build();
+ }
+
+ userHeader = filterConfig.getInitParameter(CONFIG_USER_HEADER);
+ if (userHeader == null || userHeader.isEmpty()) {
+ LOGGER.missingRequiredParameter(CONFIG_USER_HEADER);
+ throw new ServletException(CONFIG_USER_HEADER + " is a missing required
param.");
+ }
+
+ groupHeader = filterConfig.getInitParameter(CONFIG_GROUP_HEADER);
Review Comment:
Yeah, well this was going to require a follow on for the list which was why
I didn't make it default to begin with. I'll make it default for now but we
will need a follow on for the list.
Issue Time Tracking
-------------------
Worklog Id: (was: 958815)
Time Spent: 50m (was: 40m)
> Remote Authentication Provider for Levaraging other Knox Instances
> ------------------------------------------------------------------
>
> Key: KNOX-3096
> URL: https://issues.apache.org/jira/browse/KNOX-3096
> Project: Apache Knox
> Issue Type: Improvement
> Components: Server
> Reporter: Larry McCay
> Assignee: Larry McCay
> Priority: Major
> Time Spent: 50m
> Remaining Estimate: 0h
>
> There are various possibilities for leveraging the authentication
> capabilities across Knox instances. One compelling reason is for
> containerized Knox instances within k8s that would like to accept CLIENT_ID
> and CLIENT_SECRET or Passcode tokens but do not have a local database
> provisioned. These Knox instances can accept the tokens by delegating the
> authentication to a remote instance configured with the appropriate database
> or other details that may not be available to all other instances. It will
> need to cache authentication results for a short but meaningful enough time
> to reduce the chance of authentication storms against the remote server. At
> the same time, authentication can't outlive a change in the user's status any
> dangerous amount of time. Perhaps default to 5 mins.
> It should allow for the configuration of all relevant possible items such as:
> 1. remote authentication server url (likely to the KNOX-AUTH-SERVICE API)
> 2. truststore location
> 3. truststore password/alias
> 4. headers to include in the call to the remote server from the request being
> processed
> 5. expected headers from the response to include the user and groups
> 6. interval in mins for cache of authentication result to reduce
> authentication storms to remote server
--
This message was sent by Atlassian Jira
(v8.20.10#820010)