diff --git a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/ApiKeyService.java b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/ApiKeyService.java index 44e292741b56e..fd4ff6ff6118f 100644 --- a/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/ApiKeyService.java +++ b/x-pack/plugin/security/src/main/java/org/elasticsearch/xpack/security/authc/ApiKeyService.java @@ -368,6 +368,8 @@ public void createApiKey( ensureEnabled(); if (authentication == null) { listener.onFailure(new IllegalArgumentException("authentication must be provided")); + } else if (authentication.isCloudApiKey()) { + listener.onFailure(new IllegalArgumentException("creating elasticsearch api keys using cloud api keys is not supported")); } else { final TransportVersion transportVersion = getMinTransportVersion(); if (validateRoleDescriptorsForMixedCluster(listener, request.getRoleDescriptors(), transportVersion) == false) { diff --git a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authc/ApiKeyServiceTests.java b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authc/ApiKeyServiceTests.java index b465a8da3dbf9..5270bee97166f 100644 --- a/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authc/ApiKeyServiceTests.java +++ b/x-pack/plugin/security/src/test/java/org/elasticsearch/xpack/security/authc/ApiKeyServiceTests.java @@ -2557,6 +2557,16 @@ public void testCreationWillFailIfHashingThreadPoolIsSaturated() { assertThat(e, is(rejectedExecutionException)); } + public void testCreationFailsIfAuthenticationIsCloudApiKey() throws InterruptedException { + final Authentication authentication = AuthenticationTestHelper.randomCloudApiKeyAuthentication(); + final CreateApiKeyRequest createApiKeyRequest = new CreateApiKeyRequest(randomAlphaOfLengthBetween(3, 8), null, null); + ApiKeyService service = createApiKeyService(Settings.EMPTY); + final PlainActionFuture<CreateApiKeyResponse> future = new PlainActionFuture<>(); + service.createApiKey(authentication, createApiKeyRequest, Set.of(), future); + final IllegalArgumentException iae = expectThrows(IllegalArgumentException.class, future); + assertThat(iae.getMessage(), equalTo("creating elasticsearch api keys using cloud api keys is not supported")); + } + public void testCachedApiKeyValidationWillNotBeBlockedByUnCachedApiKey() throws IOException, ExecutionException, InterruptedException { final String apiKeyId1 = randomAlphaOfLength(12); final String apiKey1 = randomAlphaOfLength(16);