Skip to content

Commit 6707bc1

Browse files
tibisabaurobobario
andauthored
Improve logging on auth fail conditions in Hashicorp Vault KMS provider (kroxylicious#3212)
* Improve logging on auth fail conditions in Hashicorp Vault KMS provider --------- Signed-off-by: Tiberiu Sabau <tibssabau@yahoo.com> Signed-off-by: Robert Young <robertyoungnz@gmail.com> Co-authored-by: Robert Young <robertyoungnz@gmail.com>
1 parent 2573a66 commit 6707bc1

3 files changed

Lines changed: 36 additions & 3 deletions

File tree

  • kroxylicious-kms-providers/kroxylicious-kms-provider-hashicorp-vault

kroxylicious-kms-providers/kroxylicious-kms-provider-hashicorp-vault/pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
<dependency>
4949
<groupId>org.slf4j</groupId>
5050
<artifactId>slf4j-api</artifactId>
51-
<scope>test</scope>
5251
</dependency>
5352

5453
<!-- third party dependencies - build and compile -->

kroxylicious-kms-providers/kroxylicious-kms-provider-hashicorp-vault/src/main/java/io/kroxylicious/kms/provider/hashicorp/vault/VaultKms.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.net.http.HttpClient;
1313
import java.net.http.HttpRequest;
1414
import java.net.http.HttpResponse;
15+
import java.nio.charset.StandardCharsets;
1516
import java.time.Duration;
1617
import java.util.Arrays;
1718
import java.util.Map;
@@ -24,6 +25,9 @@
2425

2526
import javax.crypto.SecretKey;
2627

28+
import org.slf4j.Logger;
29+
import org.slf4j.LoggerFactory;
30+
2731
import com.fasterxml.jackson.core.JsonProcessingException;
2832
import com.fasterxml.jackson.core.type.TypeReference;
2933
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -48,6 +52,7 @@
4852
*/
4953
public class VaultKms implements Kms<String, VaultEdek> {
5054

55+
private static final Logger LOGGER = LoggerFactory.getLogger(VaultKms.class);
5156
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
5257
private static final String AES_KEY_ALGO = "AES";
5358
private static final Pattern LEGAL_API_VERSION_REGEX = Pattern.compile("^/?v1/.+");
@@ -153,6 +158,11 @@ private String createDecryptPostBody(VaultEdek edek) {
153158
return OBJECT_MAPPER.writeValueAsString(map);
154159
}
155160
catch (JsonProcessingException e) {
161+
LOGGER.atWarn()
162+
.setCause(LOGGER.isDebugEnabled() ? e : null)
163+
.addArgument(edek.kekRef())
164+
.addArgument(e.getMessage())
165+
.log("Failed to build request body for key '{}', cause: {}. Increase log level to DEBUG for stacktrace");
156166
throw new KmsException("Failed to build request body for %s".formatted(edek.kekRef()));
157167
}
158168
}
@@ -183,24 +193,36 @@ private <T> CompletableFuture<T> sendAsync(String key,
183193
.thenApply(VaultResponse::data);
184194
}
185195

186-
private static <T> VaultResponse<T> decodeJson(TypeReference<VaultResponse<T>> valueTypeRef, byte[] bytes) {
196+
static <T> VaultResponse<T> decodeJson(TypeReference<VaultResponse<T>> valueTypeRef, byte[] bytes) {
187197
try {
188198
VaultResponse<T> result = OBJECT_MAPPER.readValue(bytes, valueTypeRef);
189199
Arrays.fill(bytes, (byte) 0);
190200
return result;
191201
}
192202
catch (IOException e) {
193-
throw new UncheckedIOException(e);
203+
var responseBody = new String(bytes, StandardCharsets.UTF_8);
204+
LOGGER.atWarn()
205+
.setCause(LOGGER.isDebugEnabled() ? e : null)
206+
.addArgument(responseBody)
207+
.addArgument(e.getMessage())
208+
.log("Failed to decode Vault response as JSON, response body: {}, cause: {}. Increase log level to DEBUG for stacktrace");
209+
throw new UncheckedIOException("Failed to decode Vault response as JSON", e);
194210
}
195211
}
196212

197213
private static HttpResponse<byte[]> checkResponseStatus(String key,
198214
HttpResponse<byte[]> response,
199215
Function<String, KmsException> notFound) {
200216
if (response.statusCode() == 404 || response.statusCode() == 400) {
217+
var uri = response.request().uri();
218+
var responseBody = new String(response.body(), StandardCharsets.UTF_8);
219+
LOGGER.warn("Key '{}' not found in Vault, request uri: {}, HTTP status code: {}, response: {}", key, uri, response.statusCode(), responseBody);
201220
throw notFound.apply("key '%s' is not found.".formatted(key));
202221
}
203222
else if (response.statusCode() != 200) {
223+
var uri = response.request().uri();
224+
var responseBody = new String(response.body(), StandardCharsets.UTF_8);
225+
LOGGER.warn("Failed to retrieve key '{}' from Vault, request uri: {}, HTTP status code: {}, response: {}", key, uri, response.statusCode(), responseBody);
204226
throw new KmsException("fail to retrieve key '%s', HTTP status code %d.".formatted(key, response.statusCode()));
205227
}
206228
return response;

kroxylicious-kms-providers/kroxylicious-kms-provider-hashicorp-vault/src/test/java/io/kroxylicious/kms/provider/hashicorp/vault/VaultKmsTest.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package io.kroxylicious.kms.provider.hashicorp.vault;
88

9+
import java.io.UncheckedIOException;
910
import java.net.URI;
1011
import java.net.http.HttpRequest;
1112
import java.nio.charset.StandardCharsets;
@@ -24,6 +25,7 @@
2425
import org.junit.jupiter.params.provider.Arguments;
2526
import org.junit.jupiter.params.provider.MethodSource;
2627

28+
import com.fasterxml.jackson.core.type.TypeReference;
2729
import com.github.tomakehurst.wiremock.WireMockServer;
2830

2931
import io.kroxylicious.kms.provider.hashicorp.vault.config.Config;
@@ -247,4 +249,14 @@ void detectsUnacceptableVaultTransitEnginePaths(String name, URI uri) {
247249

248250
}
249251

252+
@Test
253+
void decodeJsonFailure() {
254+
TypeReference<VaultResponse<VaultResponse.ReadKeyData>> typeRef = new TypeReference<>() {
255+
};
256+
byte[] invalidBytes = { 1, 2, 3 };
257+
assertThatThrownBy(() -> VaultKms.decodeJson(typeRef, invalidBytes))
258+
.isInstanceOf(UncheckedIOException.class)
259+
.hasMessageContaining("Failed to decode Vault response as JSON");
260+
}
261+
250262
}

0 commit comments

Comments
 (0)