首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未授权执行sts:AssumeRoleWithWebIdentity 403

未授权执行sts:AssumeRoleWithWebIdentity 403
EN

Stack Overflow用户
提问于 2021-02-28 04:19:25
回答 7查看 30K关注 0票数 21

我一直试图运行一个外部-dns吊舱使用指南提供的k8s-sig集团。我遵循了指南的每一步,并得到了下面的错误。

代码语言:javascript
复制
time="2021-02-27T13:27:20Z" level=error msg="records retrieval failed: failed to list hosted zones: WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403, request id: 87a3ca86-ceb0-47be-8f90-25d0c2de9f48"

我使用Terraform创建了AWS IAM策略,并成功地创建了它。除了我曾经使用过eksctl的服务帐户的IAM角色之外,其他的一切都是通过Terraform来实现的。

但是我得到了这个文章,它说使用awscli创建awscli策略可以消除这个错误。因此,我删除了使用Terraform创建的策略,并使用awscli重新创建了它。然而,它正在抛出相同的错误。

下面的是我的外部dns yaml文件.

代码语言:javascript
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
  # If you're using Amazon EKS with IAM Roles for Service Accounts, specify the following annotation.
  # Otherwise, you may safely omit it.
  annotations:
    # Substitute your account ID and IAM service role name below.
    eks.amazonaws.com/role-arn: arn:aws:iam::268xxxxxxx:role/eksctl-ats-Eks1-addon-iamserviceaccoun-Role1-WMLL93xxxx
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: external-dns
rules:
- apiGroups: [""]
  resources: ["services","endpoints","pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions","networking.k8s.io"]
  resources: ["ingresses"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["list","watch"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: external-dns-viewer
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: external-dns
subjects:
- kind: ServiceAccount
  name: external-dns
  namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: external-dns
spec:
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: external-dns
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: k8s.gcr.io/external-dns/external-dns:v0.7.6
        args:
        - --source=service
        - --source=ingress
        - --domain-filter=xyz.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
        - --provider=aws
        - --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
        - --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both)
        - --registry=txt
        - --txt-owner-id=Z0471542U7WSPZxxxx
      securityContext:
        fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes and AWS token files

我正在抓挠我的头,因为没有适当的解决方案,这个错误在网上任何地方。希望在这个论坛上找到解决这个问题的办法。

最终结果必须显示如下所示,并在托管区域填充记录。

代码语言:javascript
复制
time="2020-05-05T02:57:31Z" level=info msg="All records are already up to date"
EN

回答 7

Stack Overflow用户

发布于 2021-05-05 11:53:45

我也和这个错误做了斗争。

问题在于信任关系的定义。

您可以在一些正式的aws教程(如)中看到以下设置:

代码语言:javascript
复制
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "${OIDC_PROVIDER}:sub": "system:serviceaccount:<my-namespace>:<my-service-account>"
        }
      }
    }
  ]
}

选项1用于失败

我的问题是,我在my-service-account部分的${OIDC_PROVIDER}:sub末尾传递了一个错误的值。

选项2,用于失败

在上一次修复之后--我仍然面临相同的错误--通过以下本aws教程解决了这个问题,它显示了使用eksctl的输出和下面的命令:

代码语言:javascript
复制
eksctl create iamserviceaccount \
                --name my-serviceaccount \
                --namespace <your-ns> \
                --cluster <your-cluster-name> \
                --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
                --approve

当您查看AWS控制台中信任关系选项卡中的输出时,您可以看到,在:aud的后缀和sts.amazonaws.com的值中添加了一个附加条件。

因此,这需要在"${OIDC_PROVIDER}:sub"条件之后添加。

票数 23
EN

Stack Overflow用户

发布于 2021-03-12 18:26:03

我得到了库伯内特斯斯拉克(对@Rob大喊)的帮助,这就是我们想出来的。本文中的k8s rbac没有什么问题,问题在于IAM角色的编写方式。我使用Terraformv0.12.24,但我认为类似于下面的.tf应该适用于Terraformv0.14:

代码语言:javascript
复制
data "aws_caller_identity" "current" {}

resource "aws_iam_role" "external_dns_role" {
  name = "external-dns"

  assume_role_policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Federated": format(
            "arn:aws:iam::${data.aws_caller_identity.current.account_id}:%s", 
            replace(
              "${aws_eks_cluster.<YOUR_CLUSTER_NAME>.identity[0].oidc[0].issuer}", 
              "https://", 
              "oidc-provider/"
            )
          )
        },
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
          "StringEquals": {
            format(
              "%s:sub", 
              trimprefix(
                "${aws_eks_cluster.<YOUR_CLUSTER_NAME>.identity[0].oidc[0].issuer}", 
                "https://"
              )
            ) : "system:serviceaccount:default:external-dns"
          }
        }
      }
    ]
  })
}

上面的.tf假设您使用terraform创建了您的ek集群,并且使用了rbac清单来自外部-dns教程。

票数 2
EN

Stack Overflow用户

发布于 2021-03-02 20:35:02

我在这里有几种可能性。

在此之前,您的集群是否有与其关联的OIDC提供程序?没有它,IRSA是行不通的。

您可以在AWS控制台中或通过CLI通过以下方式检查:

aws eks describe-cluster --name {name} --query "cluster.identity.oidc.issuer"

First

删除iamserviceaccount,重新创建它,从您的ExternalDNS manfiest (整个第一部分)中删除ServiceAccount定义并重新应用它。

代码语言:javascript
复制
eksctl delete iamserviceaccount --name {name} --namespace {namespace} --cluster {cluster}
eksctl create iamserviceaccount --name {name} --namespace {namespace} --cluster 
{cluster} --attach-policy-arn {policy-arn} --approve --override-existing-serviceaccounts
kubectl apply -n {namespace} -f {your-externaldns-manifest.yaml}

这可能是因为您已经通过在eksctl createiamserviceaccount中指定ServiceAccount覆盖了您用ExternalDNS创建的内容,因此可能会发生一些冲突。

第二

将集群升级到v1.19 (如果还没有):

eksctl upgrade cluster --name {name}会告诉你将要做什么;

eksctl upgrade cluster --name {name} --approve会做的

第三代

一些文档建议,除了设置securityContext.fsGroup: 65534之外,还需要设置securityContext.runAsUser: 0

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档