生成式AI领域的最新成果都在这里!抢 QCon 展区门票 了解详情
写点什么

OpenSource ,控制对 AWS 云中运行的 Amazon EKS 集群的访问

  • 2019-10-21
  • 本文字数:11982 字

    阅读完需:约 39 分钟

OpenSource ,控制对 AWS 云中运行的 Amazon EKS 集群的访问

我们的客户询问如何才能安全地访问他们的 Amazon Elastic Container Service for Kubernetes (Amazon EKS) 或 EC2 上的 Kubernetes 集群。我们的企业客户已经实施了 Active Directory (AD)、Active Directory 联合身份验证服务 (ADFS) 或轻量目录访问协议 (LDAP),以用于本地身份与访问管理,并在 AWS 上使用 AWS Identity and Access Management (IAM) 服务。许多客户都已在本地采用 Kubernetes,并且希望使用通用的基于角色的访问控制 (RBAC) 策略来控制本地和 AWS 云中对 Kubernetes 资源的访问权限。这促使了我们与 Heptio 的合作,该组织已经建立了庞大的社群项目系列,包括 Heptio Authenticator。Amazon EKS 开放源团队以 Heptio Authenticator 为起点,将 AWS IAM 与 Kubernetes RBAC 进行映射。AWS 和 Heptio 的工程师是项目的核心维护人员,与一群出色的社群工程师合作,将项目捐献给 Kubernetes 特别兴趣小组 AWS(又名 SIG-AWS)。当您使用 Amazon EKS、EC2 上的 Kubernetes 或本地 Kubernetes 时,您可以使用 Kubernetes RBAC 对象和角色约束机制,声明 AWS IAM 用户在 AWS 云中或 AD 用户在本地的操作权限。在声明之后,您可以将 AWS 托管的 IAM 用户角色或 AD 用户角色验证为共同的 Kubernetes RBAC 角色,并对您的 Kubernetes 集群启用端到端身份验证和授权。在此博文中,我们将向您介绍如何使用 AWS Single Sign-On (SSO)、AWS 管理的 Microsoft Active Directory 服务 以及 AWS IAM 身份验证器来控制对 AWS 云中运行的 Amazon EKS 集群的访问。这同样适用于使用 kops 在 AWS 上创建的自我管理的 Kubernetes 集群。我们选择利用 AWS 托管服务来模拟您可能在本地使用的第三方身份与访问管理工具,然后使用 AWS Identity and Access Management (IAM) 的联合访问权限。为了实施此方法,您将使用如下服务:


  • AWS Organizations 实现从单个 AWS 主账户来管理托管账户内部的 IAM 角色和策略。

  • AWS Single Sign-On 通过 AWS Directory Service 与 Microsoft Active Directory 集成,允许用户使用一组临时的 AWS 凭证来访问 AWS 命令行界面

  • AWS 管理的 Microsoft AD 提供完全托管的 Microsoft Active Directory,从而方便管理您的所有用户和凭证。此组件可以利用连接器和/或联合身份验证,用您自己的 AD 实施更换。

  • AWS Identity and Access Management (IAM) :为 AWS 客户/用户提供 AWS 云的原生身份与访问管理工具。

  • AWS IAM Authenticator for Kubernetes 用于将 AWS IAM 用户凭证与 Kubernetes 身份进行映射工具,因此熟悉 AWS IAM 的用户不需要维护单独的 Kubernetes 凭证集。


有关其他非托管型联合访问管理解决方案以及支持 SAML 2.0 的身份提供商的详细描述,请参阅启用对 AWS 的 Windows Active Directory、ADFS 和 SAML 2.0 联合身份验证以及如何实施适用于使用 SAML 2.0 的联合 API/CLI 访问的通用解决方案

先决条件

在您开始使用前,请确保满足如下条件:


  1. 您拥有两个 AWS 账户,即账户 A(主账户)和账户 B(成员账户)。

  2. 您已经在账户 A(主账户)中根据 AWS SSO 先决条件的要求设置了 AWS Organizations 服务

  3. 您已经将账户 B(成员账户)添加到在账户 A(主账户)中创建的组织

  4. 您已经设置了账户 A(主账户)中的 AWS 管理的 Microsoft AD 在 us-east-1 区域的链接。

  5. 您已经部署了一个 Windows EC2 实例来管理 AWS Microsoft AD 并将它加入到 AD 域。确保您已经安装了 AD DS 和 AD LDS 工具

  6. 您已经从 AWS 管理控制台启用了 AWS SSO

  7. 您已经将 AWS SSO 连接到 Microsoft AD

  8. 您已经在任何可用区域在账户 B(成员账户)中部署了 Amazon EKS 集群。

  9. 可选:您必须将 AWS SSO 中的属性映射到您连接的目录


注意: 如果您使用本地 AD,您需要执行一个额外的步骤才能建立上文第 7 步所述对 AWS 账户的 SSO 访问。对于该步骤,您可以:


  • 在 AWS 管理的 Microsoft AD(在上文第 4 步创建)和本地 AD 之间建立双向信任关系。


或者


  • 在 AWS 中创建 AD Connector 以将请求重定向至本地 AD。

汇集完成


在下面的几个部分,我们会通过 AWS SSO AssumedRoles 将 AD 组映射到 AWS IAM 角色。然后使用 Kubernetes configMaps 和角色,将关联的 IAM 角色映射到 Kubernetes RBAC 角色。这将利用开放源 AWS IAM Authenticator 来通过来自 kubectl 的 IAM 身份完成。出于演示目的,我们将为 AWS-EKS-Admins 组的用户提供对 EKS 集群的完全权限(类似于 Kubernetes 中赋予默认集群管理员角色的权限),并且我们将为 AWS-EKS-Dev 组的用户提供对某些 Kubernetes 资源的只读访问权限。映射汇总表如下:


col 1col 2col 3col 4
Microsoft AD 组AWS IAM 角色权限Kubernetes RBAC 角色Kubernetes RBAC 角色权限
AWS-EKS-Admins{ “Effect”: “Allow”, “Action”: “sts:AssumeRole”, “Resource”: “*” }ad-cluster-admins– apiGroups:[‘’] resources:[‘’] verbs: [‘*’]
AWS-EKS-Dev{ “Effect”: “Allow”, “Action”: “sts:AssumeRole”, “Resource”: “*” }ad-cluster-devs– apiGroups: [“”] resources: [“services”, “endpoints”, “pods”, “deployments”, “ingress”] verbs: [“get”, “list”, “watch”]


有关 RBAC 在 Kubernetes 中的运行机制,请参阅 Kubernetes 参考文档

1. 创建 Microsoft AD 中的用户/组

我们将在 Microsoft AD 中创建两个 AD 组(AWS-EKS-Prod 和 AWS-EKS-Dev)。此外,我们还将创建一个 devuser 和一个 adminuser,并将分别将这两个用户添加到 AWS-EKS-Admins 组和 AWS-EKS-Dev 组。从已经加入 AD 域的 Windows EC2 实例执行如下操作:


  • 导航至 Active Directory 用户和计算机 mmc 控制台。您也可使用下文参考所示的 powershell。

  • 在 AD 域中创建 AWS-EKS-Admins 组。


PowerShell


PS C:\Users\Admin> New-ADGroup -Name "AWS-EKS-Admins" -SamAccountName AWS-EKS-Admins -GroupCategory Security -GroupScope Global -DisplayName "AWS-EKS-Admins" -Path "OU=test,DC=test,DC=eks,DC=Com" -Description "Members of this group are AWS EKS Administrators"
复制代码


  • 在 AD 域中创建 AWS-EKS-Dev 组。


PowerShell


PS C:\Users\Admin> New-ADGroup -Name "AWS-EKS-Dev" -SamAccountName AWS-EKS-Dev -GroupCategory Security -GroupScope Global -DisplayName "AWS-EKS-Dev" -Path "OU=test,DC=test,DC=eks,DC=Com" -Description "Members of this group are AWS EKS Developers"
复制代码


  • 创建 adminuser


PowerShell


PS C:\Users\Admin> $password = "EKSRulz!" | ConvertTo-SecureString -AsPlainText -ForcePS C:\Users\Admin> New-ADUser -Name adminuser -GivenName adminuser -Surname adminuser -UserPrincipalName adminuser@test.eks.com -Path "OU=Users,OU=test,DC=test,DC=eks,DC=Com" -AccountPassword $Password -ChangePasswordAtLogon $True -Enabled $True
复制代码


  • 创建 devuser


PowerShell


PS C:\Users\Admin> $password = "EKSRulz!"| ConvertTo-SecureString -AsPlainText -ForcePS C:\Users\Admin> New-ADUser -Name devuser -GivenName devuser -Surname devuser -UserPrincipalName devuser@test.eks.com -Path "OU=Users,OU=test,DC=test,DC=eks,DC=Com" -AccountPassword $Password -ChangePasswordAtLogon $True -Enabled $True
复制代码


  • adminuser 添加到 AWS-EKS-Admins 组


PowerShell


PS C:\Users\Admin> Add-ADGroupMember -Identity AWS-EKS-Admins -Members adminuser
复制代码


  • devuser 添加到 AWS-EKS-Dev 组


PowerShell


PS C:\Users\Admin> Add-ADGroupMember -Identity AWS-EKS-Dev -Members devuser
复制代码

2. 将 AD 组分配给 AWS SSO

现在我们已经创建了 AD 用户/组,我们将分配组(以及相应的用户)对 AWS 账户 B(EKS 集群所在的账户)的访问权限。此外,我们还将添加一条权限设置,允许账户 A(主账户)扮演账户 B(成员账户)中的角色,从而访问该账户中的资源。请注意在此阶段,并未向 AD 用户/组分配扮演角色的具体权限。在默认情况下,扮演角色不会拥有执行任何操作的权限。具体的权限将通过下一部分的 Kubernetes RBAC 定义。在账户 A(主账户)中导航至 AWS SSO 控制台并执行如下操作:


  • 在左侧窗格中选择 AWS 账户 选项卡,然后选择 AWS 账户 A 以分配用户。单击 Assign Users(分配用户)

  • 搜索 AD 组 AWS-EKS-DevAWS-EKS-Admins 。单击 Next: Permission sets(下一步:权限设置)



  • 选择 Create new permission set(创建新权限设置) ,然后再下一页选择 Create a custom permission set(创建自定义权限设置) 。提供权限设置的名称,例如“AD-EKS-Dev-AssumedRole”,然后选中 Create a custom permissions policy(创建自定义权限策略) 复选框。将下列权限策略复制到窗口中,然后单击 创建 。以下策略将允许账户 A(主账户)中 IAM 用户扮演信任该用户账户的任何账户中的任何角色。在响应 AssumeRole API 调用时,AWS STS 将返回一组临时安全凭证以访问 AWS 资源。


Json


{    "Version": "2012-10-17",    "Statement": [        {          "Effect": "Allow",          "Action": "sts:AssumeRole",          "Resource": "*"        }    ] }
复制代码


  • 选中 AD-EKS-Dev-AssumeRole 复选框,然后单击 完成

  • AWS-EKS-Admins 重复前面的流程,为该组分配类似的权限。


在背后,AWS SSO 会在账户 B(成员账户)中执行如下操作:


  • 在 AWS IAM 中配置一个身份提供商 (IdP),从而建立 SAML 联合身份验证。身份提供商使得 AWS 账户信任 AWS SSO,从而允许 SSO 访问。

  • 创建一个 AWS IAM 角色并将上述权限设置作为策略附加到角色。这是 AWS SSO 代表 Microsoft AD 用户/组扮演的角色,用于访问 AWS 资源。

3. 通过 Kubernetes RBAC 配置角色权限

这时,我们已经设置了 Microsoft AD 来控制 AWS SSO 用户门户的身份验证。 此外,我们还通过指定向账户 B(EKS 集群所在的账户)赋予访问权限的 AD 组,设置了部分授权。但尚未明确访问控制(即授予 AD 用户的权限级别)。在这一部分,我们将演示如何通过 AWS IAM 角色实施联合身份验证,配置 Kubernetes RBAC 以定义对 AD 用户/组的访问控制。在执行如下步骤前,请确保满足如下条件:


  1. 您拥有正在运行的 Kubernetes 集群,拥有工作线程节点。

  2. 您已经通过集群管理员(创建者)配置了 kubeconfig 来管理集群。


注意:如果您使用 Amazon EKS,有关配置 Amazon EKS 集群的详细步骤请参阅 Amazon EKS 入门创建演示命名空间 首先让我们创建一个名为 demo-service 的演示命名空间。我们将使用此命名空间来演示通过 Kubernetes RBAC 执行 AWS-EKS-Admins 和 AWS-EKS-Dev AD 组的完全访问权限和只读访问权限控制。


$ kubectl create namespace demo-service
复制代码


然后,让我们为 AWS-EKS-Dev 和 AWS-EKS-Admins 组创建关联的 Kubernetes 角色,每组一个。创建集群角色



$ cat role.yaml
复制代码


YAML


# role.yaml --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:   name: demo-service:ad-cluster-admins   namespace: demo-service rules: - apiGroups: ["*"]   resources: ["*"]   verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:   name: demo-service:ad-cluster-devs   namespace: demo-service rules: - apiGroups: [""]   resources: ["services", "endpoints", "pods", "deployments", "ingress"]   verbs: ["get", "list", "watch"]
复制代码


然后,我们会将这些角色应用到集群以启用角色。



$ kubectl apply -f role.yaml
复制代码


修改身份验证器配置图 现在让我们修改身份验证器配置,以允许 EKS 访问这些组。您将需要取得 IAM 分别为 AWS-EKS-Dev 和 AWS-EKS-Admins 这两个 AD 组扮演的角色的角色 arns。您可以使用下面的命令执行该操作:



$ aws iam list-roles | grep Arn | grep AD-EKS-
复制代码


然后您需要编辑 aws-auth ConfigMap:



$ kubectl edit configmap aws-auth --namespace kube-system
复制代码


此命令将在您的编辑器中打开文件。然后我们可以将下列项目添加到 mapRoles 部分。请确保满足下列条件:


  1. 对于 rolearn,请务必删除 rolearn url 中的 /aws-reserved/sso.amazonaws.com/,否则该 arn 将无法授权为有效的用户。

  2. 请确保组与您在下文的角色约束中指定的组参数匹配。


YAML


# ... mapRoles config - rolearn: arn:aws:iam::141548511100:role/AWSReservedSSO_AWS-EKS-Admins_b7e6a177cfc720e6   username: adminuser:{{SessionName}}   groups:   - demo-service:ad-cluster-admins - rolearn: arn:aws:iam::141548511100:role/AWSReservedSSO_AWS-EKS-Dev-AssumedRole_7f87046f4b89cf97   username: devuser:{{SessionName}}   groups: - demo-service:ad-cluster-devs
复制代码


一旦您完成添加,请保存并关闭文件。 创建角色约束 最后,我们可以将这些角色约束到 Kubernetes 中应当拥有 demo-service 命名空间访问权限的相关组。AWS-EKS-Admin 角色将拥有 demo-service 命名空间的完全访问权限,AWS-EKS-Dev 角色则拥有只读访问权限。在如下的命令中,我们会创建 operations-team-binding 和 development-team-binding 这两个角色约束,该角色约束会将角色 demo-service:ad-cluster-admin 和角色 demo-service:ad-cluster-devs 分配给 demo-service 命名空间中的 Kubernetes 组 demo-service:ad-cluster-admins 和 demo-service:ad-cluster-devs。demo-service:ad-cluster-admins 的角色约束:



$ kubectl create rolebinding operations-team-binding --role demo-service:ad-cluster-admins --group demo-service:ad-cluster-admins --namespace demo-service
复制代码


demo-service:ad-cluster-devs 的角色约束:



$ kubectl create rolebinding development-team-binding --role demo-service:ad-cluster-devs --group demo-service:ad-cluster-devs --namespace demo-service
复制代码


修改 kubeconfig 现在我们可以为每组角色约束创建新的 KUBECONFIG 文件,一个用于开发用户,另一个用于管理员用户。复制您 kubeconfig 文件,然后修改 eks 集群的用户部分,与以下类似。~/.kube/config-test-eks-cluster-1-dev



- name: test-eks-cluster user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: heptio-authenticator-aws args: - "token" - "-i" - "test-eks-cluster" - "-r" - "<rolearn of aws-eks-dev assumedrole>"</rolearn of aws-eks-dev assumedrole>
复制代码


~/.kube/config-test-eks-cluster-1-admins



- name: test-eks-cluster user: exec: apiVersion: client.authentication.k8s.io/v1alpha1 command: heptio-authenticator-aws args: - "token" - "-i" - "test-eks-cluster" - "-r" - "<rolearn of aws-eks-admins assumedrole>"</rolearn of aws-eks-admins assumedrole>
复制代码


注意: 对于上文的 -r 参数,请指定此情况下的完整 rolearn,包括 rolearn 中的路径。例如:



arn:aws:iam::1234567890:role/ **aws-reserved/sso.amazonaws.com/** AWSReservedSSO_AWS-EKS-Admins
复制代码

测试一切工作正常

下面让我们尝试向 apiserver 发送请求,以验证端到端的身份验证和授权正常工作。如要作为 AD 用户验证身份,请从 AWS SSO 门户取得该用户的环境变量。访问门户网站的 URL,如下所示:



下一步:


  1. 使用有效的 AD 用户登录 AWS SSO 用户门户,例如 adminuser,该用户是 Microsoft AD AWS-EKS-Admins 组的成员。

  2. 单击 命令行或编程访问 链接,以检索该用户的环境变量。

  3. 将环境变量导出到终端。


此外,请确保在运行如下测试时设置了相关的 kubeconfig 上下文:adminuser 示例:



$ kubectl run snowflake --image=kubernetes/serve_hostname --replicas=2 --namespace=demo-servicedeployment.apps "snowflake" created
$ kubectl get pods --namespace=demo-service
NAME READY STATUS RESTARTS AGEsnowflake-54fccfcd67-9k8dq 0/1 Pending 0 3msnowflake-54fccfcd67-qq59k 0/1 Pending 0 3m
$ kubectl get podsError from server (Forbidden): pods is forbidden: User "adminuser-1529910544824263459" cannot list pods in the namespace "default"
复制代码


devuser 示例:



$ kubectl run snowflake --image=kubernetes/serve_hostname --replicas=2 --namespace=demo-serviceError from server (Forbidden): deployments.extensions is forbidden: User "devuser-1529910185702205240" cannot create deployments.extensions in the namespace "demo-service"
$ kubectl get pods --namespace=demo-serviceNAME READY STATUS RESTARTS AGEsnowflake-54fccfcd67-9k8dq 0/1 Pending 0 1msnowflake-54fccfcd67-qq59k 0/1 Pending 0 1m
$ kubectl get podsError from server (Forbidden): pods is forbidden: User "devuser-1529910584505925203" cannot list pods in the namespace "default"
复制代码


与预期一样,adminuser 拥有 demo-service 命名空间的完全权限,但不拥有其他命名空间的访问权限。而 devuser 拥有 demo-service 命名空间的只读访问权限。

小结

在此博文中,我们演示了 AWS Microsoft Active Directory 中的身份如何通过 AWS SSO 扮演 AWS IAM 角色,以使用 AWS CLI 进行身份验证。然后,AWS IAM 角色可以通过 K8s configMap、集群角色和角色约束映射到 Kubernetes RBAC,以向活动目录用户授予对 kubernetes 命名空间的访问权限。有关项目的更多信息请参阅:AWS-IAM-Authenticator,欢迎您提出反馈意见和作出贡献。


本文转载自 AWS 技术博客。


原文链接:


https://amazonaws-china.com/cn/blogs/china/integrating-ldap-ad-users-kubernetes-rbac-aws-iam-authenticator-project/


2019-10-21 08:00625

评论

发布
暂无评论
发现更多内容

Tapdata Cloud 基础课:新功能详解之「授权系统自动分析」,一键定位任务报错原因,快速获取修复建议

tapdata

大数据

DBA必备的Mysql知识点:数据类型和运算符

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

报名开启!KunlunBase今年首场线下MeetUP,期待与您的见面!

KunlunBase昆仑数据库

Meetup kunlunbase 内核技术

Sugar BI 增强分析能力全场景解析

Baidu AICLOUD

BI

经验总结!朋友的阿里面经分享(内附题目+解析)

Java你猿哥

Java 校招 春招 阿里面经 Java八股文

量化交易(机器人)开发系统现货合约策略

薇電13242772558

量化策略

家电类投诉高居榜首,拿什么拯救“投诉了个寂寞”的消费者?

Openlab_cosmoplat

工业互联网 开源社区 家电

MySQL创建用户与授权

源字节1号

软件开发 前端开发 后端开发 小程序开发

2023主流系统 固资管理助力转型升级一步到位

加入高科技仿生人

低代码 企业数字化转型 资产管理

办公要有新享法,「MIAOYUN生活梦想家」焕新升级!

MIAOYUN

搬迁公告 乔迁 办公升级

利用 ModelScope 社区开源模型,实现低资源场景下的零样本文本分类

阿里技术

深度学习 自然语言模型

跟清华大佬用18个要点带你一步步学习springboot2微服务项目实战

Java你猿哥

Spring Boot 面经 校招 春招 java

2023 MacBook Pro 与2021 Macbook Pro有哪些差别

互联网搬砖工作者

MacBook M1芯片 MacBook Pro M2芯片

低代码平台的流程引擎设计指南

Baidu AICLOUD

低代码 爱速搭

为什么CMS和G1都改用三色标记法,是可达性分析不香吗?

Java全栈架构师

Java 程序员 后端 JVM 架构师

2023年浸没液冷智算产业发展高峰论坛:OPPO发布两项白皮书

安第斯智能云

创新 OPPO 论坛 高新技术

功能强大的数据库管理工具:DBeaverEE 激活版

真大的脸盆

Mac 数据库管理工具 数据库管理 Mac 软件 数据库分析

【云原生】k8s 环境快速部署(一小时以内部署完)

Java你猿哥

Java 学习 k8s Spring Boot ssm

DSC:数仓SQL脚本迁移的神奇工具

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

Seata-go 1.1.0 发布,补齐 AT 模式支持

SOFAStack

开源 互联网 开发者 开发 Seata框架

从企业数据产品的演进,看指标平台发展趋势

Kyligence

数据分析 指标平台

Spring Boot 集成 Liquibase,数据库也能做版本控制!

Java你猿哥

Java spring Spring Boot java 编程

低代码平台怎么选?5大通用要素可以参考

这我可不懂

低代码 低代码平台 JNPF

CTO问我如何规避MyBatis使用过程中带来的全表更新风险

Java永远的神

Java 程序员 面试 后端 mybatis

2023年3月中国数据库排行榜:开源OTO揽获前三,传统达梦、GBase触机便发

墨天轮

数据库 opengauss TiDB oceanbase 国产数据库

关于服务器数据迁移,介绍在服务器数据迁移计划中的7个步骤

镭速

图片无损放大:Topaz Gigapixel AI 激活版

真大的脸盆

Mac Mac 软件 图片无损放大 图片编辑 图片放大

Refit — 让Http请求变得更简单

青柚1943

微服务 REST API NET6 Refit

实践Pytorch中的模型剪枝方法

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 3 月 PK 榜

倒计时2天:百度“文心一言”即将上线!

引迈信息

人工智能 低代码 AIGC ChatGPT 文心一言

请求响应--MQTT 5.0新特性

EMQ映云科技

物联网 IoT mqtt 订阅 企业号 3 月 PK 榜

OpenSource ,控制对 AWS 云中运行的 Amazon EKS 集群的访问_语言 & 开发_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章