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

Use Credentials Provider-like mechanism with Redis clients #16284

Closed
abutic opened this issue Apr 6, 2021 · 22 comments · Fixed by #16296
Closed

Use Credentials Provider-like mechanism with Redis clients #16284

abutic opened this issue Apr 6, 2021 · 22 comments · Fixed by #16296
Assignees
Labels
area/redis kind/enhancement New feature or request
Milestone

Comments

@abutic
Copy link

abutic commented Apr 6, 2021

Description

It would be nice to be able to use Credentials Provider-like mechanism (or something similar), available with DB data sources, with Redis clients/connections as well. This way, one could retrieve Redis password from some other source and then use it, without setting it in quarkus.redis.hosts configuration property.

Alternative?

Is there any way to configure Redis password programmatically and make a RedisClient used like this

    @Inject
    RedisClient redisClient;

pick it up?

@abutic abutic added the kind/enhancement New feature or request label Apr 6, 2021
@quarkus-bot
Copy link

quarkus-bot bot commented Apr 6, 2021

/cc @cescoffier, @gsmet, @machi1990

@machi1990
Copy link
Member

Description

It would be nice to be able to use Credentials Provider-like mechanism (or something similar), available with DB data sources, with Redis clients/connections as well. This way, one could retrieve Redis password from some other source and then use it, without setting it in quarkus.redis.hosts configuration property.

This is a good enhancement.

Alternative?

Is there any way to configure Redis password programmatically and make a RedisClient used like this

    @Inject
    RedisClient redisClient;

pick it up?

No, at the moment we do not have a programmatic way of configuring the Redis client. Why do you need this, can't the password be supplied per environment?

@abutic
Copy link
Author

abutic commented Apr 6, 2021

No, at the moment we do not have a programmatic way of configuring the Redis client. Why do you need this, can't the password be supplied per environment?

We'd like to be able to get and use a password from our sensitive data storage, without having to write it down either to application.properties, system property or environment variable. If you have any advice on how to do this, we'd really appreciate it.

@machi1990
Copy link
Member

No, at the moment we do not have a programmatic way of configuring the Redis client. Why do you need this, can't the password be supplied per environment?

We'd like to be able to get and use a password from our sensitive data storage, without having to write it down either to application.properties, system property or environment variable. If you have any advice on how to do this, we'd really appreciate it.

Okay, having a Credentials Provider and store it somewhere like Vault just like datasources will be a useful addition.
As a workaround, have you tried to supply the password via ConfigSource?

@gsmet
Copy link
Member

gsmet commented Apr 6, 2021

I think the easiest way would be to implement it in Quarkus with the credential provider contract we already have. I don't think that would be that hard.

@abutic
Copy link
Author

abutic commented Apr 6, 2021

As a workaround, have you tried to supply the password via ConfigSource?

Hm, in order to get the password from a sensitive data storage, we need our custom @ApplicationScoped bean, which I think is not available for injection before ConfigSource methods get called. This could be an issue for us, but your suggestion is definitely worth investigating. Thanks!

@machi1990
Copy link
Member

As a workaround, have you tried to supply the password via ConfigSource?

Hm, in order to get the password from a sensitive data storage, we need our custom @ApplicationScoped bean, which I think is not available for injection before ConfigSource methods get called. This could be an issue for us, but your suggestion is definitely worth investigating. Thanks!

Thanks for looking. Well then, I think the CredentialsProvider is a very good is something you really need here. I'll open a PR for this enhancement. Until then, let me know how the ConfigSource option goes.

@machi1990 machi1990 self-assigned this Apr 6, 2021
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 6, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 6, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 7, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 7, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 7, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
machi1990 added a commit to machi1990/quarkus that referenced this issue Apr 8, 2021
This allows for configuration of properties like redis connection password coming from other
sources.

Closes quarkusio#16284
@quarkus-bot quarkus-bot bot added this to the 2.0 - main milestone Apr 14, 2021
@SebaLopez94
Copy link

Is there any documentation or example about this? Thanks

@machi1990
Copy link
Member

Is there any documentation or example about this? Thanks

We do not have an example (we should have one).

To get you going, the host provider may look like

@ApplicationScoped
@Named("hosts-provider")
public class ExampleRedisHostProvider implements RedisHostsProvider {
    @Override
    public Set<URI> getHosts() {
        // do stuff to get the host
        String host = "redis://localhost:6379/3"
        return Collections.singleton(URI.create(host));
    }
}

and in your application.properties

quarkus.redis.hosts-provider-name=hosts-provider

@lm-gunjan
Copy link

Does this works if password is getting rotated ?

I am looking to use AWS IAM authentication for ElasticCache Redis cluster. The auth token refreshes every 15 minutes.
would getHosts() get called dynamically or just once when the application loads.

@gianfett
Copy link

gianfett commented Nov 4, 2024

Does this works if password is getting rotated ?

I am looking to use AWS IAM authentication for ElasticCache Redis cluster. The auth token refreshes every 15 minutes. would getHosts() get called dynamically or just once when the application loads.

Anything on this one? In my tests getHosts() gets just called once on startup. As we would like to rotate PW e.g. every 15 minutes we would need a way to provide the Quarkus Redis Client with a new PW like every 15 minutes and/or in case of AUTH failure.

@cescoffier
Copy link
Member

No, it doesn't work, authentication only happen once, currently.

There are some work in the sql clients to handle that case. Maybe @tsegismont knows if it can also be applied to the redis client (it's a netclient underneath)

@gianfett
Copy link

gianfett commented Nov 5, 2024

Thanks for clarification @cescoffier. And if @tsegismont would have more information on this, would be great :) Thanks!

@tsegismont
Copy link
Contributor

@Ladicek do you think it would be possible to implement password rotation with the Redis client? Or would that require upstream changes?

@Ladicek
Copy link
Contributor

Ladicek commented Nov 5, 2024

That will be possible with Vert.x 5, which contains (or will contain, in fact) vert-x3/vertx-redis-client#475.

@Ladicek
Copy link
Contributor

Ladicek commented Nov 5, 2024

Also, to be honest, all I would like to support dynamically changing on the Quarkus side is the auth. In Vert.x, one can change almost everything, as @vietj demanded, but I don't actually think that's all gonna work well 😆

@gianfett
Copy link

gianfett commented Nov 5, 2024

Thanks for getting back on this issue @Ladicek. Is there any estimate on when Vert.x 5 will be released?

@Ladicek
Copy link
Contributor

Ladicek commented Nov 5, 2024

That's more of a question for @cescoffier, but IIRC, Quarkus should bump to Vert.x 5 late next year.

@gianfett
Copy link

gianfett commented Nov 5, 2024

Thanks for your feedback @Ladicek

@tsegismont
Copy link
Contributor

Thanks @Ladicek

@cescoffier
Copy link
Member

We started thinking about the Vertx 5 integration. Our target is fall 2025. It might be earlier or later depending on the number of hurdles we will have to deal with.

@gianfett
Copy link

gianfett commented Nov 8, 2024

Thanks @cescoffier for the estimate.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
area/redis kind/enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

9 participants