kubernetes Grafana不能担任IAM角色

r55awzrz  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(107)

我为Grafana创建了一个IAM(IRSA)角色,用于在EKS中运行以访问CloudWatch指标:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::xxxx:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/xxxx"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringLike": {
                    "oidc.eks.eu-west-1.amazonaws.com/id/xxxx:sub": "system:serviceaccount:somenamespace:cloudwatch",
                    "oidc.eks.eu-west-1.amazonaws.com/id/xxxx:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

附带如下所述的策略(IAM策略部分):https://docs.aws.amazon.com/grafana/latest/userguide/adding--CloudWatch-manual.html
我也试过StringEquals与子只,但没有运气。
然后我在EKS中创建了一个serviceAccount

serviceAccount:
  name: cloudwatch
  annotations:
    eks.amazonaws.com/role-arn: arn:aws:iam::xxxx:role/cloudwatch

Grafana部署使用设置为472的securityContext:

securityContext:
        fsGroup: 472
        runAsGroup: 472
        runAsUser: 472

不幸的是,在Datasheet配置中,我得到了访问拒绝错误:

1. CloudWatch metrics query failed: AccessDenied: User: arn:aws:sts::xxxx:assumed-role/cloudwatch/1678127715473319080 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxxx:role/cloudwatch status code: 403, request id: dc2af0f1-0fb8-4c50-9997-da6cebef02fd 2. CloudWatch logs query failed: AccessDenied: User: arn:aws:sts::xxxx:assumed-role/cloudwatch/1678127715473319080 is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::xxxx:role/cloudwatch status code: 403, request id: 2391d405-024d-43ab-a2f9-1db72835a472
iugsix8n

iugsix8n1#

我不确定您是如何在Grafana中配置Cloudwatch插件的,所以我将从我的用例中分享。

后台

查看以下Grafana文档:

  1. Amazon CloudWatch data source
    1.配置AWS身份验证
    我像你一样创建了角色(参考#1),然后将此设置(使用AWS SDK默认值和IAM角色的ARN)从参考#2添加到Grafana图表中:
datasources:
  - name: CloudWatch
    type: cloudwatch
    jsonData:
      authType: default
      assumeRoleArn: <the-role-arn>
      defaultRegion: eu-west-2

然后我得到了is not authorized to perform: sts:AssumeRole错误。

怎么解决?

删除assumeRoleArn行,让Grafana代码在默认的AWS凭据链上计数。

更深入

从这里:
AWS SDK for Go需要凭据(访问密钥和秘密访问密钥)来签署对AWS的请求。您可以在多个不同的位置指定凭据,具体取决于您的特定用例。有关获取凭据的信息,请参阅设置。
当您初始化新的服务客户端而不提供任何凭据参数时,SDK使用默认凭据提供程序链来查找AWS凭据。
SDK使用链中第一个返回凭据且没有错误的提供程序。默认提供程序链按以下顺序查找凭据:
1.环境变量。
1.共享凭据文件。
1.如果应用程序使用ECS任务定义或RunTask API操作,则任务的IAM角色。
1.如果您的应用程序正在Amazon EC2示例上运行,则Amazon EC2的IAM角色。
在我们的例子中,我们使用EKS和IRSA设置,它相当于(3)。
更多参考:

  1. AWS Go SDK中的CredChain。
  2. Enable more complete credential chain for SigV4 default SDK auth option
  3. CloudWatch access with sts:AssumeRoleWithWebIdentity broken in 7.3.x

相关问题