-
Notifications
You must be signed in to change notification settings - Fork 2.4k
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
fix(aws): handle ECR repositories in different regions #6217
Conversation
c90f120
to
712265c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hello @knrc
Thanks for your report!
Left comments. Take a look, when you have time, please.
Regards, Dmitriy
1d8902b
to
ed18edb
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@knrc Thanks for your work!
pkg/fanal/image/registry/ecr/ecr.go
Outdated
@@ -46,11 +46,34 @@ func (e *ECR) CheckOptions(domain string, option types.RegistryOptions) error { | |||
return err | |||
} | |||
|
|||
// override region with the value from the repository domain | |||
cfg.Region = region |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@knrc I found 1 interesting case:
if AWS_REGION
env != region from domain:
Should we use AWS_REGION (we are overwriting this value now)?
IIUC this case is user mistake (wrongAWS_REGION
). But perhaps it make sense to show warning log message about this.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@DmitriyLewen The point of the PR is to override the AWS_REGION setting, if we don't do that then we end up with an authentication token for one region and have no visibility of containers hosted in other regions.
Our use case is multiple private repositories in multiple regions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I meant that we need to tell the user that region from AWS_REGION != region from domain.
Something like that:
func getSession(region string, option types.RegistryOptions) (aws.Config, error) {
// create custom credential information if option is valid
if option.AWSSecretKey != "" && option.AWSAccessKey != "" && option.AWSRegion != "" {
if region != option.AWSRegion {
log.Logger.Warnf("The region from AWS_REGION (%s) is incorrect. The region from domain (%s) was used.", option.AWSRegion, region)
}
return config.LoadDefaultConfig(
context.TODO(),
config.WithRegion(region),
config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider(option.AWSAccessKey, option.AWSSecretKey, option.AWSSessionToken)),
)
}
return config.LoadDefaultConfig(context.TODO(), config.WithRegion(region))
}
Also i am worried about asff template. We use AWS_REGION env for this template. Perhaps we need to set AWS_REGION
env when we have overwritten the region.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@DmitriyLewen Ah gotcha. We can certainly add a message, although I'm not sure it would make much sense as it is likely to have been set by the webhook to match the EKS installation. If you consider our use case, with multiple private repositories in different regions, then it would be impossible for the user to set the region appropriately so it would be defaulted to the webhook's view.
I can take a look at the template today, I didn't consider that, and can certainly pass the parameter through to getSession as that seems cleaner than rewriting it.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've pushed the changes for getSession and the warning, looking at the template.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But it looks like when using asff
template, users will have AWS_REGION
set. In addition, we display a warning.
We can start with these changes.
If problems arise, we will think about fixing them (as another solution, we can add your regex to asff.tpl
).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should Region match the image region?
AWS docs(https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_AwsSecurityFinding.html#securityhub-Type-AwsSecurityFinding-ProductArn) say:
Region The Region from which the finding was generated.
+1, in my view Arn and Region are not related but the template assumes they are.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But it looks like when using
asff
template, users will haveAWS_REGION
set. In addition, we display a warning. We can start with these changes.If problems arise, we will think about fixing them (as another solution, we can add your regex to
asff.tpl
).
Yes, since the output doesn't change with this PR we are no worse off. I do think there is change needed for the template but that should be a separate issue.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
AWS docs(https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_AwsSecurityFinding.html#securityhub-Type-AwsSecurityFinding-ProductArn) say:
oh... i sent the wrong link.
You can see ARN formats here:
https://docs.aws.amazon.com/securityhub/latest/userguide/securityhub-custom-providers.html
https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@DmitriyLewen I don't think those other links change anything for this PR.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your work @knrc
@knqyf263 i approved this PR.
If you agree with #6217 (comment) - we can merge it.
@DmitriyLewen I ran into another problem, it turns out the registry code (at least in 0.49.1) is broken. The three registries (google, azure and ECR) are invoked concurrently, which means their state gets overwritten each time while still being used. I have some fixes for that, I'll check with 0.50.0 and push up another version of this PR some time next week. |
@DmitriyLewen I pushed up the changes so you can see the difference, I'm just about to test them on 0.50.0. I'll rebase the PR on the latest once I've validated it. |
@DmitriyLewen I've tested and rebased the PR, it's ready again |
Hello @knrc
I'm a little confused Trivy checks registries sequentially: trivy/pkg/fanal/image/registry/token.go Lines 36 to 52 in 5f69937
Which field is overwritten? |
It does, within GetToken, however GetToken is called concurrently.
Line 37 calls |
I think I understand your logic. But I don't see any place where we use But i can missing something. Will be great if you can show some example. Anyway, I think these changes should be made in another PR. |
The artifacts are scanned by different workers in parallel, see trivy/pkg/k8s/scanner/scanner.go Lines 141 to 142 in e98c873
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@knrc sorry for the wait for an answer.
The artifacts are scanned by different workers in parallel, see
Thank you for showing me this. I'm currently seeing this problem!
Your changes look correct for this case.
I left 1 comment about google test.
No worries, we all have our day jobs.
:)
Sounds good, I'll take a look. I'm at Open Source Summit this week, but will try to get to this as quickly as I can. |
d0f4e93
to
ed0beb2
Compare
@DmitriyLewen I rebased and updated the PR for your comment, can you take another look? |
@knrc can you fix linter error? |
Yes, I can add that to the list since I'm in those files anyway. |
@DmitriyLewen try now |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for the contribution. This PR needs to resolve conflicts now. |
This PR is stale because it has been labeled with inactivity. |
I'll take a look at this over the next few days |
Signed-off-by: Kevin Conner <[email protected]>
The integration tests appear to be hitting a limit
|
The test does run successfully when executed locally |
Hello @knrc PR has been merged. |
Description
This PR modified the ECR integration so that it obtains authorization tokens from the region hosting the ECR. Current behaviour would be to use the default, resulting in authentication errors such as
This was raised in #1026, which is now closed although the underlying issue doesn't appear to be addressed.
Related issues
Checklist