Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(DRIVERS-2903): use custom aws configuration #1743

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
Open

Conversation

durran
Copy link
Member

@durran durran commented Jan 13, 2025

Adds section to auth spec and CSFLE spec on allowing user provided custom credential providers for AWS and notes on testing.

Node implementation: mongodb/node-mongodb-native#4373

  • Update changelog.
  • Test changes in at least one language driver.
  • Test these changes against all server versions and topologies (including standalone, replica set, sharded
    clusters, and serverless).

@durran durran force-pushed the DRIVERS-2903 branch 3 times, most recently from e4b7aa5 to 00dbb01 Compare January 13, 2025 13:31
@durran durran force-pushed the DRIVERS-2903 branch 2 times, most recently from 55956fe to 51081d5 Compare January 29, 2025 14:08
@durran durran marked this pull request as ready for review January 29, 2025 14:35
@durran durran requested a review from a team as a code owner January 29, 2025 14:35
@durran durran requested review from JamesKovacs and blink1073 and removed request for a team January 29, 2025 14:35
@blink1073 blink1073 changed the title feat(DRIVERS-2983): use custom aws configuration feat(DRIVERS-2903): use custom aws configuration Jan 30, 2025
Copy link
Contributor

@jyemin jyemin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just a few quick edits while I perused this.

Copy link
Contributor

@jyemin jyemin left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since this needs to be supported in FLE as well, I think we need to update the FLE spec and specify how to configure the "aws" kms provider. Consider adding a similar property with same semantics to AWSKMSOptions in https://github.com/mongodb/specifications/blob/master/source/client-side-encryption/client-side-encryption.md#kmsproviders.

(While in some drivers you might be able to apply an auth mechanism property to FLE, in Java that isn't possible as auth mechanism properties are associated with a credential, not the MongoClient, and the credential of the MongoClient might not even be an AWS credential (or could be a different one).

@durran
Copy link
Member Author

durran commented Jan 30, 2025

Since this needs to be supported in FLE as well, I think we need to update the FLE spec as well and specify how to configure the "aws" kms provider. Consider adding a similar property with same semantics to AWSKMSOptions in https://github.com/mongodb/specifications/blob/master/source/client-side-encryption/client-side-encryption.md#kmsproviders.

(While in some drivers you might be able to apply an auth mechanism property to FLE, in Java that isn't possible as auth mechanism properties are associated with a credential, not the MongoClient, and the credential of the MongoClient might not even be an AWS credential (or could be a different one).

@kevinAlbs Do you have thoughts on this? Would there be a case where auto-encryption could want a different AWS credential provider than the associated MongoClient. (With ClientEncryption this is already possible since it has its own MongoClient)

@baileympearson
Copy link
Contributor

@durran What about users who aren't using AWS authentication for their clients but want to use AWS automatic KMS credential fetching with a custom provider? I don't think Node would support that without a provider option for KMS specifically.

1 similar comment
@baileympearson
Copy link
Contributor

@durran What about users who aren't using AWS authentication for their clients but want to use AWS automatic KMS credential fetching with a custom provider? I don't think Node would support that without a provider option for KMS specifically.

@durran
Copy link
Member Author

durran commented Jan 30, 2025

@durran What about users who aren't using AWS authentication for their clients but want to use AWS automatic KMS credential fetching with a custom provider? I don't think Node would support that without a provider option for KMS specifically.

That's a good point and I think a valid use case. I'll update everything accordingly.

@durran durran requested a review from a team as a code owner February 19, 2025 00:14
@durran durran requested review from katcharov and jyemin and removed request for a team February 19, 2025 00:14
@blink1073
Copy link
Member

cc @kevinAlbs since this affects Client Encryption options

@kevinAlbs kevinAlbs self-requested a review March 3, 2025 15:59

```typescript
interface CredentialProviders {
aws? AWSCredentialProvider
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
aws? AWSCredentialProvider
aws?: AWSCredentialProvider

keyVaultClient: <setupClient>,
keyVaultNamespace: "keyvault.datakeys",
kmsProviders: { "aws": {} },
credentialProviders: { "aws": <object/function that returns valid credentials from the environment> }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it sufficient to test that the data key is successfully created? Credentials can already be fetched from the environment, so even if a driver didn't use the custom credential provider I'd expect this test to pass.

Is there a way we could make this test fail if the credential provider isn't used? In Node, we can always spy on the provider but I don't think every language can do this. Maybe we could manually implement spying by having the provider increment a call count, and then assert that callCount = 1. Or we could use environment variables that don't match what the AWS sdk expects:

# these have the wrong names, aws sdk looks for ACCESS_KEY_ID and SECRET_ACCESS_KEY
process.env = {
  KEY: <key id>,
  SECRET: <secret>
}

const provider: AWSCredentialProvider = async () => {
  return {
    accessKeyId: process.env.KEY,
    secretAccessKey: process.env.SECRET
  }
}

(While this would work in Node, where we can re-write process.env as we wish, but I'm not sure this would be possible in other languages without a separate evergreen task that didn't load the AWS credentials into the environment.).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have the same concern for the regular auth tests too.

These tests require valid AWS credentials. Refer:
[Automatic AWS Credentials](../client-side-encryption.md#automatic-credentials).

#### Case 1: Explicit encryption with credentials and custom credential provider
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you think we should test this case for auto encryption as well? Most (all?) drivers have separate code paths for instantiating a CE object and instantiating a client configured for auto encryption. This test only covers explicit encryption.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants