Adding Support For mTLS Based Authentication Support For Kruize Datasource#1793
Adding Support For mTLS Based Authentication Support For Kruize Datasource#1793dinogun merged 7 commits intokruize:mvp_demofrom
Conversation
Signed-off-by: Shekhar Saxena <shekhar.saxena@ibm.com>
Reviewer's GuideImplements a new mTLS authentication type for datasource HTTP connections by wiring it through the existing authentication configuration/strategy system and configuring the HTTP client’s SSLContext with client and CA certificates instead of Authorization headers. Sequence diagram for mTLS datasource HTTP requestsequenceDiagram
actor Caller
participant AuthenticationConfig
participant AuthenticationStrategyFactory
participant MTLSAuthenticationStrategy
participant GenericRestApiClient
participant HttpClient as CloseableHttpClient
participant Prometheus as PrometheusServer
Caller->>AuthenticationConfig: createAuthenticationConfigObject(authJson)
AuthenticationConfig-->>Caller: AuthenticationConfig(type=MTLS, credentials=MTLSCredentials)
Caller->>AuthenticationStrategyFactory: createAuthenticationStrategy(authConfig)
AuthenticationStrategyFactory->>MTLSAuthenticationStrategy: new MTLSAuthenticationStrategy(clientCertPath, clientKeyPath, caCertPath, keyPassword)
AuthenticationStrategyFactory-->>Caller: MTLSAuthenticationStrategy
Caller->>GenericRestApiClient: new GenericRestApiClient(authenticationStrategy)
Caller->>GenericRestApiClient: fetchMetricsJson(methodType, queryString)
GenericRestApiClient->>GenericRestApiClient: setupHttpClient()
GenericRestApiClient->>GenericRestApiClient: createMTLSContext(mtlsStrategy)
GenericRestApiClient->>GenericRestApiClient: loadCertificate(clientCertPath)
GenericRestApiClient-->>GenericRestApiClient: X509Certificate clientCert
GenericRestApiClient->>GenericRestApiClient: loadPrivateKey(clientKeyPath, keyPassword)
GenericRestApiClient-->>GenericRestApiClient: PrivateKey privateKey
GenericRestApiClient->>GenericRestApiClient: optionally loadCertificate(caCertPath)
GenericRestApiClient-->>GenericRestApiClient: SSLContext with client and trust material
GenericRestApiClient-->>HttpClient: configured HttpClient with mTLS SSLContext
GenericRestApiClient->>GenericRestApiClient: applyAuthentication(httpRequest)
MTLSAuthenticationStrategy-->>GenericRestApiClient: applyAuthentication() returns null
GenericRestApiClient->>GenericRestApiClient: skip Authorization header (authHeader is null)
HttpClient->>Prometheus: HTTPS request with TLS handshake (client cert)
Prometheus-->>HttpClient: HTTPS response
HttpClient-->>GenericRestApiClient: HTTP response
GenericRestApiClient-->>Caller: metrics JSON
Class diagram for new mTLS authentication supportclassDiagram
class AuthType {
<<enum>>
BASIC
BEARER
API_KEY
OAUTH2
MTLS
NONE
}
class Credentials {
<<abstract>>
}
class MTLSCredentials {
-String clientCertPath
-String clientKeyPath
-String caCertPath
-String keyPassword
+String getClientCertPath()
+void setClientCertPath(String clientCertPath)
+String getClientKeyPath()
+void setClientKeyPath(String clientKeyPath)
+String getCaCertPath()
+void setCaCertPath(String caCertPath)
+String getKeyPassword()
+void setKeyPassword(String keyPassword)
+boolean equals(Object o)
+int hashCode()
+String toString()
}
class AuthenticationConfig {
-AuthType type
-Credentials credentials
+static AuthenticationConfig createAuthenticationConfigObject(JSONObject authObj)
+AuthType getType()
+Credentials getCredentials()
}
class AuthenticationStrategy {
<<interface>>
+String applyAuthentication()
}
class MTLSAuthenticationStrategy {
-String clientCertPath
-String clientKeyPath
-String caCertPath
-String keyPassword
+MTLSAuthenticationStrategy(String clientCertPath, String clientKeyPath, String caCertPath, String keyPassword)
+String applyAuthentication()
+String getClientCertPath()
+String getClientKeyPath()
+String getCaCertPath()
+String getKeyPassword()
}
class AuthenticationStrategyFactory {
+static AuthenticationStrategy createAuthenticationStrategy(AuthenticationConfig authConfig)
}
class KruizeConstants_AuthenticationConstants {
<<static>>
+String AUTHENTICATION_CLIENT_CERT_PATH
+String AUTHENTICATION_CLIENT_KEY_PATH
+String AUTHENTICATION_CA_CERT_PATH
+String AUTHENTICATION_KEY_PASSWORD
+String MTLS
}
class GenericRestApiClient {
-AuthenticationStrategy authenticationStrategy
-CloseableHttpClient setupHttpClient()
-SSLContext createMTLSContext(MTLSAuthenticationStrategy mtlsStrategy)
-X509Certificate loadCertificate(String certPath)
-PrivateKey loadPrivateKey(String keyPath, String password)
-void applyAuthentication(HttpRequestBase httpRequestBase)
}
Credentials <|-- MTLSCredentials
AuthenticationStrategy <|.. MTLSAuthenticationStrategy
AuthenticationConfig o--> Credentials
AuthenticationConfig o--> AuthType
AuthenticationStrategyFactory ..> AuthenticationConfig : uses
AuthenticationStrategyFactory ..> MTLSAuthenticationStrategy : creates
GenericRestApiClient o--> AuthenticationStrategy
GenericRestApiClient ..> MTLSAuthenticationStrategy : mtls specific
GenericRestApiClient ..> KruizeConstants_AuthenticationConstants : uses
AuthenticationConfig ..> KruizeConstants_AuthenticationConstants : uses
MTLSCredentials ..> KruizeConstants_AuthenticationConstants : uses
AuthType ..> KruizeConstants_AuthenticationConstants : alignsWith
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
Signed-off-by: Shekhar Saxena <shekhar.saxena@ibm.com>
Signed-off-by: Shekhar Saxena <shekhar.saxena@ibm.com>
Signed-off-by: Shekhar Saxena <shekhar.saxena@ibm.com>
|
@dinogun can we please review this pr? |
|
@shekhar316 Please add a test for mtls authentication as a separate PR |
|
@shekhar316 Can you looking into the security issues highlighted here |
Hi @dinogun , Those are actually false positives. The string And about README files - That block is not an actual private key. |
| * @return Configured SSLContext for mTLS | ||
| * @throws Exception if certificate loading or SSL context creation fails | ||
| */ | ||
| private SSLContext createMTLSContext(MTLSAuthenticationStrategy mtlsStrategy) throws Exception { |
There was a problem hiding this comment.
Rather than have all of this code in GenericRestApiClient, please move this to MTLSAuthenticationStrategy itself. AuthenticationStrategy should not be specific to Http based auth alone and should cover everything. That way we have a clean way of looking at everything related to MTLS as it was originally meant to be.
There was a problem hiding this comment.
Sure, I have moved the mtls related methods to MTLSAuthenticationStrategy and kept GenericRestApiClient clean and common for all.
| @@ -0,0 +1,368 @@ | |||
| # Kruize Datasource Configuration Guide | |||
There was a problem hiding this comment.
Please add a link to this file from KruizeLocalAPI.md as well
Signed-off-by: SHEKHAR SAXENA <shekhar.saxena@ibm.com>
Signed-off-by: SHEKHAR SAXENA <shekhar.saxena@ibm.com>
Signed-off-by: SHEKHAR SAXENA <shekhar.saxena@ibm.com>
dinogun
left a comment
There was a problem hiding this comment.
Abstraction changes are looking good now
Description
Added support for mTLS (Mutual TLS) authentication support in Kruize datasource connections, enabling secure certificate-based authentication with Prometheus and other monitoring systems.
Type of change
Test Configuration
Checklist 🎯
Additional information
Image: quay.io/rh-ee-shesaxen/autotune:addmtls
Summary by Sourcery
Add mutual TLS (mTLS) as a first-class authentication option for datasource HTTP clients and wire it through the existing authentication configuration and strategy framework.
New Features:
Enhancements: