0x00 TLNR;
一般情況下對aws eks 創(chuàng)建集群后, 只有創(chuàng)建者才有集群的完全訪問權(quán)限.
那么現(xiàn)在有一個需求: 對其他admin IAM 賬號開通 eks 集群訪問權(quán)限
0x01 IAM 賬號創(chuàng)建
可以直接在 IAM console 頁面手動添加管理員賬號, 以 eksadmin 用戶名為例.
0x02 RBAC 基礎(chǔ)知識
參考: https://jimmysong.io/kubernetes-handbook/concepts/rbac.html
參考: https://www.qikqiak.com/post/use-rbac-in-k8s/
K8s中的RBAC有以下幾個名詞:
2.1 Entity
定義了對資源進(jìn)行操作的主體, 比如: User, Group, ServiceAccount 等
2.2 Resource
K8s中的資源類型, 比如: pod,service,secret,node等
2.3 Role & ClusterRole
- Role: 關(guān)聯(lián)到特定namespace下的角色
- ClusterRole: 集群全局作用域的角色
2.4 RoleBinding & ClusterRoleBinding
把Role/ClusterRole 和 Entity 進(jìn)行關(guān)聯(lián).實現(xiàn)授權(quán)功能.
0x03 綁定操作
以下操作都是在原來的集群管理員下完成
- 創(chuàng)建k8s 用戶, 完成集群用戶和 IAM賬號的綁定
# 在線編輯集群用戶配置
kubectl edit cm aws-auth -n kube-system
添加mapUsers節(jié)點:
apiVersion: v1
data:
mapUsers: |
- userarn: arn:aws-cn:iam::{你的12位主賬號}:user/eksadmin
username: eksadmin
groups:
— system:masters
保存退出后, 此時執(zhí)行 kubectl get all
會提示權(quán)限不夠.
但是也說明, 已經(jīng)完成了IAM賬號和集群賬號的關(guān)聯(lián)綁定.
原本以為, 加上groups 參數(shù)就有管理權(quán)限了, 實測不行, 繼續(xù)下面的操作
-
重點
給用戶綁定集群的管理員權(quán)限
kubectl create clusterrolebinding eksadmin --clusterrole=cluster-admin --user=eksadmin
再次訪問 kubectl get all
, everything goes OK.
任務(wù)達(dá)成~.
0x04 指定namespace訪問權(quán)限
目標(biāo):
對開發(fā)者組的同學(xué)開放sit namespace 的完全訪問
4.1 創(chuàng)建Role
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sit-role
namespace: sit
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods", "configmaps","services"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
4.2 創(chuàng)建測試用戶
- 創(chuàng)建用戶
aws iam create-user --user-name dev-gg
返回結(jié)果
{
"User": {
"Path": "/",
"UserName": "dev-gg",
"UserId": "AI******5",
"Arn": "arn:aws-cn:iam::{你的12位主賬號}:user/dev-gg",
"CreateDate": "2022-03-28T06:01:10+00:00"
}
}
記錄生成的 arn, 后面要用
- 創(chuàng)建access key/secrets
aws iam create-access-key --user-name dev-gg
返回結(jié)果
{
"AccessKey": {
"UserName": "dev-gg",
"AccessKeyId": "***",
"Status": "Active",
"SecretAccessKey": "***",
"CreateDate": "2022-03-28T06:04:50+00:00"
}
}
記錄 AceessKey, 和 Secret.
- 創(chuàng)建IAM 策略
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "eks:DescribeCluster",
"Resource": "arn:aws-cn:eks:*:{你的12位主賬號}:cluster/*"
}
]
}
策略ARN: arn:aws-cn:iam::{12位主賬號}:policy/eks_desc_cluster
- 綁定到測試用戶
aws iam attach-user-policy --user-name dev-gg --policy-arn arn:aws-cn:iam::{12位主賬號}:policy/eks_desc_cluster
4.3 配置集群中的賬號
kubectl edit cm aws-auth -n kube-system
增加用戶:
mapUsers: |
- userarn: arn:aws-cn:iam::{12位賬號}:user/dev-gg
username: dev-gg
4.4 綁定用戶角色
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-gg
namespace: sit
subjects:
- kind: User
name: dev-gg
apiGroup: ""
roleRef:
kind: Role
name: sit-role
apiGroup: ""
4.5 驗證
- 綁定登錄信息
把步驟4.2的secret key 信息配置到用戶目錄
aws configure
AWS Access Key ID [None]: A***O
AWS Secret Access Key [None]: 0***p
Default region name [None]: cn-northwest-1
Default output format [None]: json
- 拉取集群配置
aws eks update-kubeconfig --name aws-cn
Added new context arn:aws-cn:eks:cn-northwest-1:{12位賬號}:cluster/aws-cn to /Users/dev-gg/.kube/config
- 部署&刪除測試應(yīng)用
kubectl create deploy web --image=nginx -n sit
kubectl get po -n sit
NAME READY STATUS RESTARTS AGE
web-96d5df5c8-t8n8z 0/1 ContainerCreating 0 16m
kubectl delete deploy web -n sit
deployment.apps "web" deleted
Good Job ~
4.6 關(guān)于增加其他權(quán)限
如果在使用中遇到權(quán)限問題:
kubectl get hpa -n sit
Error from server (Forbidden): horizontalpodautoscalers.autoscaling is forbidden: User "dev-gg" cannot list resource "horizontalpodautoscalers" in API group "autoscaling" in the namespace "sit"
只需要把日志中的 資源(horizontalpodautoscalers) 和 API Group(autoscaling) 添加到 role 配置中 apiGroups 和 resources 字段即可.
至此,我們完成了, AWS EKS 關(guān)于集群權(quán)限的基礎(chǔ)精細(xì)化控制.
0x05 后續(xù)
在集群中為開發(fā)者創(chuàng)建 group , 后續(xù)增加開發(fā)者用戶時, 只要關(guān)聯(lián)用戶到 group 即可.
答案在這里: http://www.reibang.com/p/525f90e46e5d
0x07 新增
一條指令完成iam 賬號向 k8s 添加
參考來源: https://repost.aws/knowledge-center/eks-api-server-unauthorized-error
eksctl create iamidentitymapping \
--cluster $CLUSTER-NAME \
--region $REGION \
--arn arn:aws:iam::XXXXXXXXXXXX:user/testuser \
--group system:masters \
--no-duplicate-arns \
--username admin-user1