Role-based access control (RBAC)是一种细颗粒度的权限访问和控制方式。有兴趣的读者可以参考
K8s 关于RBAC的官方文档
1.如下是几个常用的概念:
-
实体:Entity,包括 user / group / service account 等
-
资源:Resource,包括 pod / service / secret 等
-
角色:Role,操作资源和实体的 Rules 等
-
角色绑定:Role Binding,把 Role 和 Entity 绑定使用。包括 Roles 和 ClusterRole 两类。
-
命名空间:Namespace,主要用来定义安全边界和资源边界。
在这个动手实验中,我们将听过创建一个叫
rbac-user
的IAM用户来访问和使用EKS集群服务,给它配置的命名空间叫
rbac-test
。
2.部署测试Pod
使用如下方式创建一个测试用 Pod
kubectl create namespace rbac-test
kubectl create deploy nginx --image=nginx -n rbac-test
kubectl get all -n rbac-test
会返回类似如下的结果
NAME READY STATUS RESTARTS AGE
pod/nginx-6799fc88d8-48x8k 0/1 ContainerCreating 0 1s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx 0/1 1 0 2s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-6799fc88d8 1 1 0 2s
RBAC测试
1.创建IAM用户
mkdir -p ~/environment/rbac && cd ~/environment/rbac
aws iam create-user --user-name rbac-user
aws iam create-access-key --user-name rbac-user | tee create_output.json
创建用户返回
"User": {
"Path": "/",
"UserName": "rbac-user",
"UserId": "AIDA5NAGHF6N43LTPEXA3",
"Arn": "arn:aws:iam::921283538843:user/rbac-user",
"CreateDate": "2021-05-21T10:03:22+00:00"
创建key返回
"AccessKey": {
"UserName": "rbac-user",
"AccessKeyId": "AKIA5NAGHF6N4QSQWTWO",
"Status": "Active",
"SecretAccessKey": "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",
"CreateDate": "2021-05-21T10:03:24+00:00"
管理切换用户的 Crendential
cd ~/environment/rbac
cat << EoF > rbacuser_creds.sh
export AWS_SECRET_ACCESS_KEY=$(jq -r .AccessKey.SecretAccessKey create_output.json)
export AWS_ACCESS_KEY_ID=$(jq -r .AccessKey.AccessKeyId create_output.json)
2.映射 IAM 用户到 K8s
使用 eksctl 创建,或者手动编辑
eksctl create iamidentitymapping \
--cluster my-cluster \
--arn arn:aws:iam::921283538843:user/rbac-user \
--username rbac-user
查看 aws-auth 配置的映射情况
eksctl get iamidentitymapping \
--cluster my-cluster \
--region eu-west-1 \
--arn arn:aws:iam::921283538843:user/rbac-user
显示结果如下
ARN USERNAME GROUPS
arn:aws:iam::921283538843:user/rbac-user rbac-user
3.IAM用户测试
执行脚本并获得 sts 配置信息
cd ~/environment/rbac
. rbacuser_creds.sh
aws sts get-caller-identity
返回类似如下信息
"UserId": "AIDA5NAGHF6N43LTPEXA3",
"Account": "921283538843",
"Arn": "arn:aws:iam::921283538843:user/rbac-user"
此时如果我们去查询会返回错误(因为我们还创建Role和绑定,所以不能访问集群中的资源)
kubectl get pods -n rbac-test
Error from server (Forbidden): pods is forbidden: User "rbac-user" cannot list resource "pods" in API group "" in the namespace "rbac-test"
4.创建 Role 并 Binding
重设 sts:
unset AWS_SECRET_ACCESS_KEY
unset AWS_ACCESS_KEY_ID
aws sts get-caller-identity
会返回正常的sts(没有rbac-user的)
"UserId": "AROA5NAGHF6NUMSLJ7TLA:i-0bfe140c9ab80a6dc",
"Account": "921283538843",
"Arn": "arn:aws:sts::921283538843:assumed-role/FullAcce***oleForCloud9/i-0bfe140c9ab80a6dc"
创建 Role 定义
cd ~/environment/rbac
cat << EoF > rbacuser-role.yaml
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: rbac-test
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["list","get","watch"]
- apiGroups: ["extensions","apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch"]
创建 Binding 定义
cd ~/environment/rbac
cat << EoF > rbacuser-role-binding.yaml
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: read-pods
namespace: rbac-test
subjects:
- kind: User
name: rbac-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
cd ~/environment/rbac
kubectl apply -f rbacuser-role.yaml
kubectl apply -f rbacuser-role-binding.yaml
5.验证 Role 和 Binding
用如下方式验证
cd ~/environment/rbac
. rbacuser_creds.sh
aws sts get-caller-identity
kubectl get pods -n rbac-test
wangzan:~/environment/rbac $ kubectl get pods -n rbac-test
NAME READY STATUS RESTARTS AGE
nginx-6799fc88d8-48x8k 1/1 Running 0 12m
此时,我们在尝试一个别的:
kubectl get pods -n kube-system
Error from server (Forbidden): pods is forbidden: User "rbac-user" cannot list resource "pods" in API group "" in the namespace "kube-system"
原因是,我们没有在 Role 和 Binding 里面对别的 namespace 授权。
当你不需要 rbac 的时候,可以通过如下方式删除
unset AWS_SECRET_ACCESS_KEY
unset AWS_ACCESS_KEY_ID
kubectl delete namespace rbac-test
aws iam delete-access-key --user-name=rbac-user --access-key-id=$(jq -r .AccessKey.AccessKeyId create_output.json)
aws iam delete-user --user-name rbac-user
删除 rbac-user 在 configMap 里面的配置(修改 aws-auth的 data 里面的 mapUsers 部分)
eksctl delete iamidentitymapping --cluster my-cluster --arn arn:aws:iam::921283538843:user/rbac-user
欢迎大家扫码关注,获取更多信息
该webhook用于更改需要AWS IAM访问权限的Pod。
EKS演练
在IAM中为您的群集。 您可以通过描述您的EKS集群来找到OIDC发现端点。 aws eks describe-cluster --name $CLUSTER_NAME --query cluster.identity.oidc 并输入“ sts.amazonaws.com”作为客户端ID
为您的Pod创建IAM角色,并以允许Pod的服务帐户使用该角色: {
" Version " : " 2012-10-17 " ,
" Statement " : [
" Effect " : " Allow " ,
" Principal " : {
" Federated " : " arn:aws:iam::111122223333:oidc
1. 在Services 中搜索 iam, 并选择 Identity and Access Management(IAM)
2. 选择左侧栏Users,右侧列表选择自己的用户名链接
3. 切换tab到Security credentials > Create access key
4. 下载.csv 保存 Access key ID 和 Secret access key.
注意:下次就看不到了。
博客地址: https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/211203931498/
相关话题:https://www.cnsre.cn/tags/aws/
因为创建 Amazon EKS 集群时,IAM 用户或角色会自动在集群的 RBAC 配置中被授予 system:masters 权限。例如,IAM 用户或角色可以是创建集群的联合身份用户。如果使用不属于 aws-auth ConfigMap 的 IAM 用..
目录一、RBAC是什么?二、将IAM实体映射到K8S集群三、创建Role和RoleBinding四、测试五、总结参考
一、RBAC是什么?
基于角色(Role)的访问控制(RBAC)是一种基于组织中用户的角色来调节控制对 计算机或网络资源的访问的方法。
RBAC 鉴权机制使用 rbac.authorization.k8s.io API 组 来驱动鉴权决定,允许你通过 Kubernetes API 动态配置策略。
RBAC 的核心逻辑组件是:
组、用户或服务帐户(代表想要执行某些操作(动作)并需要权限的
介绍 (Introduction)
Elastic Kubernetes Service (EKS) is the fully managed Kubernetes service from AWS. It is deeply integrated with many AWS services, such as AWS Identity and Access Management (IAM) (...
默认部署出来的 Pod 都是无状态的,pod 消亡里面的所有内容自动消亡,针对例如数据库场景(如 MySQL),这显然行不通。本章动手实验内容,我们以 Amazon EBS(Elastic Block Store)为例,演示如何在 Pod 里面把数据写入到 EBS 上,作为持久化存储( [PersisitentVolume](https://kubernetes.io/docs/con...
efs csi驱动和efs创建、安全组配置须根据步骤一一进行,否则pod挂载pvc使用时,有可能出现问题,如:Stale file handlers for EFS ,根据eks节点所在子网添加挂载目标,节点是多可用区,则每个可用区的子网都将运行一次命令,将 subnet-EXAMPLEe2ba886490 替换为相应的子网 ID。创建一条入站规则,该入站规则允许来自您的集群 VPC 的 CIDR 的入站 NFS 流量。检索您的集群的 VPC 的 CIDR 范围,并将其存储在变量中,以便在后续步骤中使用。
目录一、将 aws-auth ConfigMap 应用到集群二、将 IAM 用户或角色添加到 Amazon EKS 集群
Amazon EKS 使用 IAM 为Kubernetes 集群提供身份验证(通过 AWS CLI 的 1.16.156 版或更高版本中可用的 aws eks get-token 命令或者适用于 Kubernetes 的 AWS IAM 身份验证器),但它仍依赖于 Kubernetes 基于角色的访问控制 (RBAC) 来进行授权。
一、将 aws-auth ConfigMap 应用到
点击上方入口立即【自由构建 探索无限】一起共赴年度科技盛宴!1.背景用户通过 Deployment, Replication Controller 可以方便地在 Kubernetes 中部署一套高可用、可扩展的分布式无状态服务。这类应用不在本地存储数据,通过简单的负载均衡策略可实现请求分发。Deployment 以及Replication Controller 是为无状态服务而设计的,它们中 P...
aws官方用户指南中关于创建EKS集群部分,看了几次才理解了整个创建过程,这里总结了创建集群的过程和步骤,可以通过eksctl、管理控制台和aws cli创建集群,这里通过管理控制台进行创建EKS创建后默认没有worker节点、附加组件只有vpc cni、coredns、kubeproxy,因此需要自己添加worker节点和其它自定义组件,如ingress controll创建步骤创建集群角色创建EKS集群添加node配置kubectl安装ingress/alb(可选)
这个错误是说kube-apiserver这个用户没有权限查看日志,我们要给这个用户一个admin的角色权限就好了。查看pod日志时,报权限错误。二进制搭建的k8s集群。
2、选择权限菜单,点击右上角自定义策略
3、如下:示例管理RDS数据库权限
管理RDS需要两个权限,一个是RDS,一个是DAS,如下图可以分配一些权限,如果你只是想让他看,就选列表,保存。
4、到用户组里面新建用户组,然后点击权限配置
5、到用户里面新建个用户,绑定到这个组上面,大功告成