将IAM Role附加给Pod,使Pod拥有不同的权限

2022-10-20 12:00

在我们使用EKS集群的时候,Pod默认继承Node上绑定的角色的身份,这样会使得我们不同的pod都拥有相同的身份,不利于我们管理权限。现在我们可以将IAM Role指定给Pod,提供了更精细化的权限控制,加强了安全性


创建身份提供商

EKS创建好之后,在详细信息界面,有一个OpenID Connect 提供商 URL,复制此内容:

转到IAM界面,点击身份提供商

创建身份提供商,选择OpenID Connect,将复制的URL填写进去,点击验证指纹,受众填写sts.amazonaws.com


创建一个角色

点击创建角色,选择Web身份,身份提供商选择我们刚刚创建的,受众选择sts.amazonaws.com

策略可暂时不选,最后取个名称即可;点击信任关系,编辑信任关系。

将类似:

"oidc.eks.us-west-2.amazonaws.com/id/xxxxxxxxxxxx:aud": "sts.amazonaws.com"

修改为:

"oidc.eks.us-west-2.amazonaws.com/id/xxxxxxxxxxxx:sub": "system:serviceaccount: SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"

上述图片配置内容代表该角色会讲权限映射到EKS集群的Default命令空间下的名为test-sa的ServiceAccount


创建ServiceAccount

ServiceAccount的yaml文件如下,在Annotations中指定我们上一步创建的角色的arn:


创建Pod

我们先创建一个没有使用ServiceAccount的Pod

apiVersion: apps/v1kind: Deploymentmetadata:annotations:deployment.kubernetes.io/revision: "4"labels:app: alpinename: alpine-deploymentspec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: alpinestrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: alpinespec:containers:- args:- apk update;apk add curl;apk add busybox-extras;apk add tcpdump;apk add aws-cli;apkadd py3-pip;pip install boto3;while true; do sleep 30; done;command:- /bin/sh- -c- --image: alpineimagePullPolicy: Alwaysname: alpineresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysterminationGracePeriodSeconds: 30

此时默认继承的是Node的role

复制此yaml文件,在其添加一行ServiceAccount,指定我们上一步创建的ServiceAccount

进入该容器,此时可以看到其身份已经为我们指定的Role