|
@@ -548,7 +548,7 @@ public class SecurityTests extends ESTestCase {
|
|
|
.put(
|
|
|
XPackSettings.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash()
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
.stream()
|
|
|
.filter(alg -> alg.startsWith("pbkdf2") == false)
|
|
|
.collect(Collectors.toList())
|
|
@@ -567,7 +567,10 @@ public class SecurityTests extends ESTestCase {
|
|
|
.put(
|
|
|
XPackSettings.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash().stream().filter(alg -> alg.startsWith("pbkdf2")).collect(Collectors.toList())
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2"))
|
|
|
+ .collect(Collectors.toList())
|
|
|
)
|
|
|
)
|
|
|
.build();
|
|
@@ -581,7 +584,7 @@ public class SecurityTests extends ESTestCase {
|
|
|
.put(
|
|
|
XPackSettings.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash()
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
.stream()
|
|
|
.filter(alg -> alg.startsWith("pbkdf2") == false)
|
|
|
.collect(Collectors.toList())
|
|
@@ -626,7 +629,7 @@ public class SecurityTests extends ESTestCase {
|
|
|
.put(
|
|
|
XPackSettings.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash()
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
.stream()
|
|
|
.filter(alg -> alg.startsWith("pbkdf2") == false)
|
|
|
.collect(Collectors.toList())
|
|
@@ -646,19 +649,28 @@ public class SecurityTests extends ESTestCase {
|
|
|
.put(
|
|
|
XPackSettings.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash().stream().filter(alg -> alg.startsWith("pbkdf2")).collect(Collectors.toList())
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2"))
|
|
|
+ .collect(Collectors.toList())
|
|
|
)
|
|
|
)
|
|
|
.put(
|
|
|
XPackSettings.SERVICE_TOKEN_HASHING_ALGORITHM.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash().stream().filter(alg -> alg.startsWith("pbkdf2")).collect(Collectors.toList())
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2"))
|
|
|
+ .collect(Collectors.toList())
|
|
|
)
|
|
|
)
|
|
|
.put(
|
|
|
- ApiKeyService.PASSWORD_HASHING_ALGORITHM.getKey(),
|
|
|
+ ApiKeyService.STORED_HASH_ALGO_SETTING.getKey(),
|
|
|
randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash().stream().filter(alg -> alg.startsWith("pbkdf2")).collect(Collectors.toList())
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2"))
|
|
|
+ .collect(Collectors.toList())
|
|
|
)
|
|
|
)
|
|
|
.put(
|
|
@@ -683,13 +695,37 @@ public class SecurityTests extends ESTestCase {
|
|
|
assertThatLogger(() -> Security.validateForFips(settings), Security.class, logEventForNonCompliantCacheHash(key));
|
|
|
}
|
|
|
|
|
|
- public void testValidateForFipsNonFipsCompliantStoredHashAlgoWarningLog() throws IllegalAccessException {
|
|
|
- String key = randomFrom(ApiKeyService.PASSWORD_HASHING_ALGORITHM, XPackSettings.SERVICE_TOKEN_HASHING_ALGORITHM).getKey();
|
|
|
+ public void testValidateForFipsNonFipsCompliantStoredHashAlgoWarningLog() {
|
|
|
+ String key = XPackSettings.SERVICE_TOKEN_HASHING_ALGORITHM.getKey();
|
|
|
final Settings settings = Settings.builder()
|
|
|
.put(XPackSettings.FIPS_MODE_ENABLED.getKey(), true)
|
|
|
- .put(key, randomNonFipsCompliantStoredHash())
|
|
|
+ .put(key, randomNonFipsCompliantStoredPasswordHash())
|
|
|
.build();
|
|
|
- assertThatLogger(() -> Security.validateForFips(settings), Security.class, logEventForNonCompliantStoredHash(key));
|
|
|
+ assertThatLogger(() -> Security.validateForFips(settings), Security.class, logEventForNonCompliantStoredPasswordHash(key));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testValidateForFipsNonFipsCompliantApiKeyStoredHashAlgoWarningLog() {
|
|
|
+ var nonCompliant = randomFrom(
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2") == false && alg.startsWith("ssha256") == false)
|
|
|
+ .collect(Collectors.toList())
|
|
|
+ );
|
|
|
+ String key = ApiKeyService.STORED_HASH_ALGO_SETTING.getKey();
|
|
|
+ final Settings settings = Settings.builder().put(XPackSettings.FIPS_MODE_ENABLED.getKey(), true).put(key, nonCompliant).build();
|
|
|
+ assertThatLogger(() -> Security.validateForFips(settings), Security.class, logEventForNonCompliantStoredApiKeyHash(key));
|
|
|
+ }
|
|
|
+
|
|
|
+ public void testValidateForFipsFipsCompliantApiKeyStoredHashAlgoWarningLog() {
|
|
|
+ var compliant = randomFrom(
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2") || alg.startsWith("ssha256"))
|
|
|
+ .collect(Collectors.toList())
|
|
|
+ );
|
|
|
+ String key = ApiKeyService.STORED_HASH_ALGO_SETTING.getKey();
|
|
|
+ final Settings settings = Settings.builder().put(XPackSettings.FIPS_MODE_ENABLED.getKey(), true).put(key, compliant).build();
|
|
|
+ assertThatLogger(() -> Security.validateForFips(settings), Security.class);
|
|
|
}
|
|
|
|
|
|
public void testValidateForMultipleNonFipsCompliantCacheHashAlgoWarningLogs() throws IllegalAccessException {
|
|
@@ -1135,9 +1171,12 @@ public class SecurityTests extends ESTestCase {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- private String randomNonFipsCompliantStoredHash() {
|
|
|
+ private String randomNonFipsCompliantStoredPasswordHash() {
|
|
|
return randomFrom(
|
|
|
- Hasher.getAvailableAlgoStoredHash().stream().filter(alg -> alg.startsWith("pbkdf2") == false).collect(Collectors.toList())
|
|
|
+ Hasher.getAvailableAlgoStoredPasswordHash()
|
|
|
+ .stream()
|
|
|
+ .filter(alg -> alg.startsWith("pbkdf2") == false)
|
|
|
+ .collect(Collectors.toList())
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -1153,7 +1192,19 @@ public class SecurityTests extends ESTestCase {
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- private MockLog.SeenEventExpectation logEventForNonCompliantStoredHash(String settingKey) {
|
|
|
+ private MockLog.SeenEventExpectation logEventForNonCompliantStoredApiKeyHash(String settingKey) {
|
|
|
+ return new MockLog.SeenEventExpectation(
|
|
|
+ "cache hash not fips compliant",
|
|
|
+ Security.class.getName(),
|
|
|
+ Level.WARN,
|
|
|
+ "[*] is not recommended for stored API key hashing in a FIPS 140 JVM. "
|
|
|
+ + "The recommended hasher for ["
|
|
|
+ + settingKey
|
|
|
+ + "] is SSHA256."
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ private MockLog.SeenEventExpectation logEventForNonCompliantStoredPasswordHash(String settingKey) {
|
|
|
return new MockLog.SeenEventExpectation(
|
|
|
"stored hash not fips compliant",
|
|
|
Security.class.getName(),
|