作者| Alexey Ledenev

翻译 | 天道酬勤,责编 | Carol

出品 | CSDN云计算(ID:CSDNcloud)

随着企业与各种云提供商合作,多云场景已经变得十分常见。

在谷歌Kubernetes引擎(GKE)上运行的应用程序需要访问亚马逊网络服务(AWS)API时,这种情况也会出现。任何应用程序都有需求,也许它需要在AmazonRedshift上运行分析查询,访问存储在Amazon S3存储桶中的数据,使用Amazon Polly将文本转换为语音或使用任何其他AWS服务。

跨云访问带来了新挑战:如何管理云凭据。这是从一个云提供商访问另一个提供商运行的服务所必需解决的问题。如果用不成熟的方法来分发和保存云提供商的机密是非常不安全的。将长期凭证分配给需要访问AWS服务的每个服务管理起来具有挑战性,并且存在潜在的安全风险。

当前解决方案

实际上,每个云服务商都提供了自己独特的解决方案来克服这一挑战,和其中一个云服务商合作就可以解决。

谷歌云(Google Cloud)推出了Workload Identity,这是GKE应用程序认证和使用其他谷歌云服务的推荐方式。Workload Identity 通过绑定Kubernetes服务帐户和Cloud IAM服务帐户来工作,因此你可以使用本地Kubernetes概念来定义哪些工作负载以哪些身份运行,并允许你的工作负载自动访问其他谷歌云服务,而无需管理Kubernetes秘密或IAM服务帐户密钥。

AWS通过“ IAM服务帐户角色”功能支持类似的功能。使用Amazon EKS集群上服务帐户的IAM角色,可以将IAM角色与Kubernetes服务帐户关联。然后该服务帐户可以向使用该服务帐户任何Pod中的容器提供AWS权限。使用此功能不再需要为工作节点IAM角色提供扩展权限,以便该节点上的Pod可以调用AWS API。

但是,如果你在GKE集群上运行应用程序工作负载,并且希望在不影响安全性的情况下访问AWS服务该怎么办?

定义一个使用案例

假设你已经有一个AWS账户和一个GKE集群,并且你的公司已决定在GKE集群上运行基于微服务的应用程序,但仍想使用AWS账户中的资源(Amazon S3和SNS服务)与在AWS上部署的其他系统。

例如,在GKE集群中运行业务流程作业(部署为Kubernetes Job),需要将数据文件上传到S3存储桶中并向Amazon SNS主题发送消息。等效的命令行如下:

这是一个很简单的例子。为了能使这些命令成功执行,业务流程作业必须具有可用的AWS凭证,并且这些凭证必须能够进行相关的API调用。

不成熟的(非安全的)方法:IAM的长期凭据

导出某些AWS IAM用户的AWS访问密钥和保密密钥,并将AWS凭证作为凭证文件或环境变量注入到业务流程作业中。可能不是直接执行此操作,而是使用RBAC授权策略保护的Kubernetes Secrets资源。

这里的风险是这些凭据永远不会过期。必须将它们从AWS环境转移到GCP环境,并且在大多数情况下,人们希望将它们存储在某个位置,以便在以后需要时可用于重新创建业务流程作业。

使用长期AWS凭证时,可以通过多种方式来破坏你的AWS账户。无意中将AWS凭证提交到GitHub存储库中、将其保存在Wiki系统中、针对不同的服务和应用程序重复使用凭证和允许无限制访问等等。

尽管可以为已发布的IAM用户凭据设计适当的凭据管理解决方案,但是如果你永远不会一开始就创建这些长期凭据,则不需要此解决方案。

作者提出的方法

基本思想是将AWS IAM角色分配给GKE Pod,类似于针对服务帐户云特定功能的工作负载身份和EKS IAM角色。

对我们来说很幸运的是,AWS允许为开放ID连接联盟(OpenID Connect Federation,OIDC)身份提供者而不是IAM用户创建IAM角色。另一方面,谷歌实现了OIDC提供程序,并通过工作负载身份功能将其与GKE紧密集成。为GKE Pod提供有效的OIDC令牌,该令牌在链接到谷歌云服务帐户的Kubernetes服务帐户下运行。所有这些都可以有助于实现GKE-to-AWS的安全访问。

将OIDC访问令牌转换为ID令牌

需要完成该方法还缺少一点东西。通过正确设置工作负载身份,GKE Pod会获得OIDC访问令牌,该令牌允许访问谷歌云服务。为了从AWS安全令牌服务(STS)获取临时AWS凭证,你需要提供有效的OIDC ID令牌。

正确设置以下环境变量后,AWS开发工具包(和aws-cli工具)将自动从STS服务请求临时AWS凭证:

  • AWS_WEB_IDENTITY_TOKEN_FILE——Web身份令牌文件的路径(OIDCID令牌);

  • AWS_ROLE_ARN——Pod容器承担的角色的ARN;

  • AWS_ROLE_SESSION_NAME——应用于此假定角色会话的名称。

听起来可能有点复杂,但是作者将提供分步指南并支持开源项目dointl / gtoken来简化该设置。

gtoken-webhook可变流

gtoken-webhook将gtoken initContainer注入目标Pod和一个附加的gtoken sidekick容器(以在到期前刷新OIDC ID令牌),安装令牌量并注入三个AWS特定的环境变量。gtoken容器会生成有效的GCP OIDC ID令牌,并将其写入令牌卷。它还会注入必需的AWS环境变量。

AWS SDK将代表你自动对AWS STS进行相应的AssumeRoleWithWebIdentity调用。它将处理内存中的缓存以及根据需要刷新凭据。

配置流程指南

1)部署gtoken-webhook

要部署gtoken-webhook服务器,我们需要在Kubernetes集群中创建一个webhook服务和部署。这很简单,只需配置服务器的TLS。如果你想检查deploy.yaml文件,则会发现从命令行参数中读取了证书和相应的私钥文件,并且这些文件的路径来自指向Kubernetes机密的卷安装:

要记住的最重要的事情是稍后在webhook配置中设置相应的CA证书,因此apiserver将知道应接受该证书。现在,我们将重用Istio团队最初编写的脚本来生成证书签名请求。然后,我们会将请求发送到KubernetesAPI,获取证书,然后从结果中创建所需的秘密。

首先,运行webhook-create-signed-cert.sh脚本,并检查是否已创建包含证书和密钥的机密:

一旦创建了秘密,我们就可以创建部署和服务。这些是标准的Kubernetes部署和服务资源。到目前为止,我们只生成了HTTP服务器,该服务器通过端口443上的服务接受请求:

2)配置可变的webhook

现在我们的webhook服务器正在运行,它可以接受来自apiserver的请求。但是,我们应该首先在Kubernetes中创建一些配置资源。让我们从验证webhook开始,然后再配置可变的webhook。如果查看一下webhook配置,你会注意到它包含CA_BUNDLE的占位符:

有一个小的脚本用此CA替换配置中的CA_BUNDLE占位符。在创建验证webhook配置之前运行以下命令:

创建一个可变的webhook配置:
3)为gtoken-webhook配置RBAC

创建与gtoken-webhook一起使用的Kubernetes服务帐户:

定义webhook服务帐户的RBAC权限:

4)配置流程变量

用户应提供以下某些变量,其他变量将自动生成并在以下步骤中重复使用。

  • PROJECT_ID——GCP项目ID(由用户提供)

  • CLUSTER_NAME——GKE群集名称(由用户提供)

  • GSA_NAME——谷歌云帐户名(由用户提供)

  • GSA_ID——谷歌云服务帐户的唯一ID(由谷歌生成)

  • KSA_NAME——Kubernetes服务帐户名(由用户提供)

  • KSA_NAMESPACE——Kubernetes命名空间(由用户提供)

  • AWS_ROLE_NAME——AWS IAM角色名称(由用户提供)

  • AWS_POLICY_NAME——分配给IAM角色的AWS IAM策略(由用户提供)

  • AWS_ROLE_ARN——AWS IAM角色ARN标识符(由AWS生成)

5)谷歌云:启用GKE工作负载身份

创建一个启用了工作负载标识的新GKE集群:

或更新现有集群:

6)谷歌云:创建一个谷歌云服务账户

创建一个谷歌云服务帐户:

使用以下角色更新GSA_NAME谷歌服务帐户:
  • role / iam.workloadIdentityUser——模拟来自GKE 工作负载的服务帐户

  • role / iam.serviceAccountTokenCreator——模拟服务帐户以创建OAuth2访问令牌,签署Blob或签署JWT令牌

7)AWS:使用谷歌OIDC联盟创建AWSIAM角色

为谷歌 OIDC提供者准备角色信任策略文档:

使用谷歌网络身份创建AWSIAM角色:

分配所需的AWS角色策略:

获取要在K8s SA注释中使用的AWS Role ARN:

8)GKE:创建一个Kubernetes服务帐户

创建K8s命名空间:

创建K8s服务帐户:

使用GKE工作负载身份(GCP服务帐户电子邮件)注释K8s服务帐户:

使用AWS Role ARN注释K8s服务帐户:
9)运行一个演示样例

使用K8s ${KSA_NAME}服务帐户运行新的K8s Pod:

好啦,希望这篇文章对你有用,如果你对此有意见和任何问题,欢迎在评论区和我们交流。

参考文献

l GitHub: Securely access AWS services from GKE cluster with doitintl/gtoken

l AWS Docs: Creating aRole for Web Identity or OpenID Connect Federation

l Blog: Kubernetes GKE Workload Identity link

l AWS Blog: Introducing fine-grained IAM roles for service accounts link

l GitHub: AWS Auth using Web IdentityFederation from Google Cloud shrikant0013/gcp-aws-webidentityfederation GitHubproject

l Blog: Using GCP Service Accounts to access AWS IAM Roles blog post byColin Panisset

原文:https://hackernoon.com/access-aws-services-from-google-kubernetes-engine-securely-a-how-to-guide-x8an3b5y

本文为 CSDN 云计算翻译,转载请经授权。

在中国企业与「远程办公」正面相遇满月之际,2月29日,CSDN 联合广大「远程办公」工具服务企业共同举办【抗击疫情,科技公司在行动】系列之【远程办公】专题线上峰会活动:中国「远程办公」大考。

扫下方二维码或点击阅读原文免费报名直播+抽取奖品+与大牛交流。想提前了解峰会详情,可加小助手微信csdnai,回复远程办公,进直播群。

推荐阅读:面试还搞不懂Redis,快看看这40道面试题!| 博文精选
彻彻底底给你讲明白啥是SpringMvc异步处理
IntelliJ IDEA 的这个接口调试工具真是太好用了!
NFT——加密数字资产的基石
AI口罩“督查官”诞生记
一个学渣的 CTO 逆袭之路真香,朕在看了!点击“阅读原文”,参与报名

从Kubernetes安全地访问AWS服务,告诉你多云场景下如何管理云凭据!相关推荐

  1. 混合多云场景下的 Kubernetes 多集群管理

    企业选择混合多云的驱动力 企业为什么要选择混合多云模式,其中比较主要的一个原因就是因为安全问题,这里我列举了一些国内外的安全事件,就一个发生比较近的事件来说,2021 年 3 月,欧洲云计算 OVH, ...

  2. 前 1 号店 CTO 黄哲铿揭秘:微服务架构在超大场景下的应用

    作者 | 黄哲铿 责编 | 胡巍巍 上周,前 1 号店技术总监.海尔农业电商 CTO,<技术管理之巅>作者黄哲铿,为大家带来了一场,关于微服务架构的分享,包含了微服务架构在千万级别日调用量 ...

  3. Android之解决PC浏览器访问手机服务端取assets目录下的文件页面显示不出来问题

    1 问题 我在手机里面写了Java socket服务,然后把前端的图片和css和js的文件放到了安卓项目的 assets目录,然后浏览器访问服务,我会把 assets目录下的文件读出来,然后用Data ...

  4. 基于AWS的云服务架构最佳实践 #CSDN博文精选# #IT# #云服务实践#

    大家好,小C将继续与你们见面,带来精选的CSDN博文~ 在这里,你将收获: 将系统化学习理论运用于实践,系统学习IT技术 学习内容涵盖数据库.软件测试.主流框架.领域驱动设计和第三方生态等,离全栈工程 ...

  5. CI Weekly #11 | 微服务场景下的自动化测试与持续部署

    又一周过去了,最近我们的工程师正在搞一个"大事情" --「flow.ci 配置文件」,稍微剧透一下,这个功能预计会在春节前上线.详情请大家关注 flow.ci Changelog ...

  6. 在虚拟机环境(CentOS7系统)下将kubernetes中部署服务成功,但在虚拟机外部无法访问到服务...

    在CentOS7环境下,kubernetes单机版环境,成功部署一个服务,在虚拟机中访问服务没问题,下面这样: curl http://172.27.73.26:8888/eureka-server/ ...

  7. 马斯洛理论告诉你,Kubernetes可以满足微服务的这些需求

    需求层次理论是由心理学家艾伯特·马斯洛设计的,它是一种解释人类动机的心理学理论,它由多层次的人类需求模型组成,通常被描述成金字塔内的等级层次.马斯洛使用诸如生理.安全.归属感和爱.尊重.自我实现和自我 ...

  8. kubernetes使用traefik作为ingress(相同域名不同路径访问不同服务)Middleware的StripPrefix进行实现

    1.环境 kubernetes:v1.20.1 traefik:2.4.8 链接:middleware的使用(stripprefix) 2.安装 kubeadm安装k8s helm安装traefik ...

  9. kubernetes ingress路由配置http body大小限制,访问k8s服务的时候报错:413 Request Entity Too Large

    访问k8s服务的时候报错:413 Request Entity Too Large kube-system命名空间下名为nginx-configuration的configmap,将proxy-bod ...

最新文章

  1. ELK不香了?企业级日志平台后起之秀 Graylog
  2. ContrainedBox:设置尺寸
  3. ios模拟器装ipa包_在iOS开发的时候如何在模拟器中安装APP
  4. 记一次iis+aspx环境下利用http参数污染绕过waf
  5. LeetCode 320. 列举单词的全部缩写(回溯/位运算)
  6. java连接mysql封装代码_JDBC连接数据库方法的封装,以及查询数据方法的封装
  7. YUM源安装,FTP安装
  8. 单行文本和多行文本溢出以省略号显示方法
  9. 好久不写日志了,现在开始,好好写了。。
  10. HTML5 Canvas JavaScript库 Fabric.js 使用经验
  11. php 写入txt换行_php是如何向文件中写入换行
  12. 测试视频软件支持的格式,支持82种视频格式!电视平台最强的本地播放器!
  13. cad等比例缩放快捷键_CAD比例缩放怎么用,快捷键命令SCALE
  14. 结点电压法的c语言实现,节点电压法该如何理解_节点电压法例题
  15. python在线朗读-python朗读软件
  16. 数学建模参赛技巧 --- 论文撰写
  17. 第一次Java项目实训:GUI学生管理系统
  18. 关于 geodesic distance 的通俗解释
  19. JavaWeb09(新闻数据分页)
  20. 美国服务器如何抵御黑客攻击

热门文章

  1. git配置全局用户名和密码_还在手动打包,手动传jar包?那你确实应该学一下jekins配置了...
  2. android 北斗定位代码_iPhone 11 确认支持北斗导航,真相来了!
  3. 拒绝不公平的师生关系,MIT霸气护学生:你换导师,我替你买单
  4. 数学家的亿万商业王国:创建“验证码”和“多邻国”,20岁就被盖茨挖去微软...
  5. 证明是一个偶像,数学家在这个偶像前折磨自己!
  6. 理工男最该死的十二个瞬间
  7. 怎样才能找到一份AI领域的好工作?
  8. 读书和不读书的女人之间,一眼就能看得出来差别
  9. mac 上传ftp服务器文件夹权限,mac 访问 ftp服务器文件夹权限
  10. 【转载保存】java 23种设计模式 深入理解