Skip to content

Commit

Permalink
Support GKE Workload Identity for Searchable Snapshots (elastic#82974)
Browse files Browse the repository at this point in the history
* Support GKE Workload Identity for Searchable Snapshots

Searchable snapshots perform naked calls of `GoogleCloudStorageBlobContainer#readBlob` without the Security Manager. The
client fails to get Compute Engine credentials because of that. It works for normal snapshot/restore because they
do a privileged call of `GoogleCloudStorageBlobStore.writeBlob` during the verification of the repo.

The simplest fix is just to make sure `ServiceOptions.getDefaultProjectId` and `GoogleCredentials::getApplicationDefault`
are get called under the SecurityManager (which they should because they perform network calls).

Unfortunately, we can't write an integration test for the issue, because the test framework does the repo verification
automatically, which works around the bug. Writing a unit test also seems not possible, because
`ComputeEngineCredentials#getMetadataServerUrl` relies on the `GCE_METADATA_HOST` environment variable.

See elastic/cloud-on-k8s#5230

Resolves elastic#82702
  • Loading branch information
arteam authored and jdconrad committed Jan 27, 2022
1 parent 87d83c2 commit 5a55637
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 2 deletions.
6 changes: 6 additions & 0 deletions docs/changelog/82974.yaml
@@ -0,0 +1,6 @@
pr: 82974
summary: Support GKE Workload Identity for Searchable Snapshots
area: Snapshot/Restore
type: bug
issues:
- 82702
Expand Up @@ -195,7 +195,7 @@ StorageOptions createStorageOptions(
} else {
String defaultProjectId = null;
try {
defaultProjectId = ServiceOptions.getDefaultProjectId();
defaultProjectId = SocketAccess.doPrivilegedIOException(ServiceOptions::getDefaultProjectId);
if (defaultProjectId != null) {
storageOptionsBuilder.setProjectId(defaultProjectId);
}
Expand All @@ -219,7 +219,7 @@ StorageOptions createStorageOptions(
}
if (gcsClientSettings.getCredential() == null) {
try {
storageOptionsBuilder.setCredentials(GoogleCredentials.getApplicationDefault());
storageOptionsBuilder.setCredentials(SocketAccess.doPrivilegedIOException(GoogleCredentials::getApplicationDefault));
} catch (Exception e) {
logger.warn("failed to load Application Default Credentials", e);
}
Expand Down

0 comments on commit 5a55637

Please sign in to comment.