写点什么

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:00713

评论

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

低代码开发赋能教育数字化及典型场景

不在线第一只蜗牛

低代码 教育新创

计算机英文教材太难啃?Higress 和通义千问帮你!

阿里巴巴云原生

阿里云 云原生 Higress

What’s new in Apache/dubbo-getty 1.5.0

apache/dubbo-go

dubbo

Pika 主从数据同步状态指标 “repl_connect_status” 简介

apache/dubbo-go

redis Pika

RA8D1-Vision Board上OSPI-Flash实践

芯动大师

瑞萨MCU

6 大亮点!全新 Anolis OS 23.1 GA 版正式发布,满足多样化平台支持

OpenAnolis小助手

操作系统 国产操作系统 龙蜥操作系统 Anolis OS Anolis OS 23.1

低代码用得好,开发真的很顺手

伤感汤姆布利柏

PingCAP 与沙利文联合发布《中国企业全球化运营白皮书》

先锋IT

小游戏应该如何创建一个元服务项目

FN0

鸿蒙卡片 元服务

蓝易云 - javaee springMVC数字类型转换之通过注解的方式

百度搜索:蓝易云

Java 云计算 运维 服务器 云服务器

SMC-R 透明加速 TCP 技术,在 Redis 场景下的应用实践 | 干货推荐

OpenAnolis小助手

操作系统 龙蜥社区 SMC-R 浪潮信息 TCP 技术

Altair RapidMiner,将数据科学、深度学习等多种功能同时集成的一站式数据分析平台

Altair RapidMiner

机器学习 大模型 #人工智能 #数据分析

开发体育赛事直播平台源码:具备全面的体育数据资料库

软件开发-梦幻运营部

从仿真到生成式仿真,大模型助力工业智能化发展

Altair RapidMiner

#人工智能 仿真技术 制造业数字化 #大模型

【YashanDB知识库】outline固化执行计划

YashanDB

yashandb 崖山数据库

GitHub爆火标星127k!这份字节Python背记手册到底有什么魔力?

没脾气

Python 程序员 自学编程 python教程 python自学

龙蜥社区 5 月度运营大事件回顾

OpenAnolis小助手

开源 操作系统 龙蜥社区 月报

业务转型,你的团队该如何应对?

凌晞

团队管理 数字化业务转型IT路线图

蓝易云 - javaee springMVC model的使用

百度搜索:蓝易云

Java 云计算 运维 服务器 云服务器

数据驱动的未来:数据融合与平台化应用的探索

快乐非自愿限量之名

低代码 数据驱动 平台化

惊了!字节大佬总结的这份《零基础学python神级笔记全彩版》真的太强了

没脾气

Python 程序员 自学编程 架构师 自学python

读书笔记《一如既往》

酱紫的小白兔

案例研究|为什么 CDG 会选择从 DataDog 迁移至观测云?

观测云

可观测性

神仙级python入门教程(非常详细),从零基础入门到精通,建议收藏

没脾气

Python

Netty FastThreadLocal实践

FunTester

报名倒计时 2 天!龙蜥社区系统安全 Meetup 演讲亮点一览

OpenAnolis小助手

操作系统 系统安全 浪潮信息 龙蜥meetup

ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家

阿里巴巴云原生

阿里云 RocketMQ 云原生

广东人仁康一项技术通过国家科技成果评价达到国际先进水平平

Geek_2d6073

天润融通,荣获2024中国AI应用层创新企业

天润融通

人工智能 天润融通

Linux设备驱动系列(14) —— 使用全局工作队列

Linux内核拾遗

Linux内核 中断 工作队列

蓝易云 - javaee springMVC cookie的存入和取出

百度搜索:蓝易云

云计算 运维 Cookie 云服务器 JavaEE

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