Skip to content

Commit

Permalink
Support GKE Workload Identity for Searchable Snapshots (#82974) (#83127)
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 #82702
  • Loading branch information
arteam committed Jan 26, 2022
1 parent a0eb5b6 commit 40f5fd5
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 @@ -188,7 +188,7 @@ StorageOptions createStorageOptions(
} else {
String defaultProjectId = null;
try {
defaultProjectId = ServiceOptions.getDefaultProjectId();
defaultProjectId = SocketAccess.doPrivilegedIOException(ServiceOptions::getDefaultProjectId);
if (defaultProjectId != null) {
storageOptionsBuilder.setProjectId(defaultProjectId);
}
Expand All @@ -212,7 +212,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 40f5fd5

Please sign in to comment.