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

作者| 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 逆袭之路真香,朕在看了!点击“阅读原文”,参与报名

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/519134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux未知设备驱动程序,未知Android设备 - linux mint

我仍然是一个新手到linux和android开发,但我终于得到了我的设备的认可。关键(我认为)是将SUBSYSTEM更改为SUBSYSTEMS,将ATTR更改为ATTRS。按照udev(7) page,这种“向上搜索DEVPATH查找匹配的设备......”所以,这就是我最后做一个令…

MSSQL-最佳实践-Always Encrypted

摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术、使用非对称密钥实现SQL Server列加密、使用混合密钥实现SQL Server列加密技术、列加密技术带来的查询性能问题以及相应解决方案、行级别安…

java实现对文件加解密操作

源文件: 加密后的文件: 解密后的文件: package com.gblfy.test;import java.io.*;/*** java 实现对文件加解密的方法** author gblfy* date 2020-12-08*/ public class IOSercet {//获取系统类型private static String OS System.getPro…

如何在工作中快速成长?致工程师的10个简单技巧

阿里妹导读:阿里有句非常经典的土话,“今天的最好表现,是明天的最低要求。”如何挖掘潜能、发现更好的自己?今天,阿里巴巴高级无线开发专家江建明将认知升级的方法总结出来,帮助你获得快速成长的秘诀&#…

1 手写第一个Win32窗口程序

1 基础概念 什么是窗口? 答:窗口就是屏幕上的一片区域,接受用户的输入,显示程序的输出。可以包含标题栏、菜单栏、工具栏以及控件等。什么是句柄? 答: 作为一种管理和操作系统资源的机制,提供了…

解析云原生与云计算本质区别,别再傻傻分不清楚了!

来源| comparethecloud翻译 | 天道酬勤,责编 | Carol出品 | CSDN云计算(ID:CSDNcloud)云应用程序是热门话题。很多时候,我们会遇到像云原生应用程序和云计算应用程序这样的术语。首先,很少有人同时使用这两…

Java 使用 zip4j 进行基本的压缩、解压、设置密码操作(version zip4j-2.6.4)

先看工具类 package space.util;import java.io.File; import java.util.List;import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.model.enums.AesKeyStrength; import net.lingala.zip4j.model.enums.EncryptionMe…

linux显示mem进行排序,Linux查看系统负载(CPU和MEM考虑)

查看占用CPU最高的10个进程[tidb:vg_adn_tidbCkhsTest:172.31.30.62 ~/tidb-ansible]$ps aux | grep -v PID | sort -rn -k | headmysql 6.6 60.4 ? Sl Nov22 : /usr/local/mysql/bin/mysqld --basedir/usr/local/mysql/ --datadir/data/data_mysql --plugin-dir/usr/local/my…

阿里开发者招聘节 | 面试题02-04:给定一个二叉搜索树(BST),找到树中第K小的节点

为帮助开发者们提升面试技能、有机会入职阿里,云栖社区特别制作了这个专辑——阿里巴巴资深技术专家们结合多年的工作、面试经验总结提炼而成的面试真题这一次将陆续放出(面试题官方参考答案将在专辑结束后统一汇总分享,点此进入答题并围观他…

linux 当前用户执行定时任务

当前用户编辑定时任务 crontab -e#每天11点25分执行 25 11 * * * /bin/sh /app/jiazai/sql_loadv1.0/dbloadupgrade.sh #每天凌晨4点执行 0 4 * * * /bin/sh /app/jiazai/sql_loadv1.0/dbloadupgrade.sh #每天11点22分执行 22 11 * * * /bin/sh /home/oracle/1.sh当前用户查看定…

确认!别再相信Python了! 程序员:就你敢说...

程序员你有没有感觉到,Python最近已经刷屏到爆炸了?细分析Python之所以刷屏,主要是因为人红是非多,在编程界它是一种特殊的存在,有人认为,只有用Python才能优雅写代码,提高代码效率;…

云原生的新思考,为什么容器已经无处不在了

4月24日,中国信息通信研究院主办的首届云原生产业大会在北京举行,在《云原生数字引领未来》的主题演讲中,阿里云容器服务总监易立表示:“云原生不但可以很好的支持互联网应用,也在深刻影响着新的计算架构、新的智能数据…

走近科学,探究阿里闲鱼团队通过数据提升Flutter体验的真相

背景 闲鱼客户端的flutter页面已经服务上亿级用户,这个时候Flutter页面的用户体验尤其重要,完善Flutter性能稳定性监控体系,可以及早发现线上性能问题,也可以作为用户体验提升的衡量标准。那么Flutter的性能到底如何?…

阿里3篇技术论文入选国际顶级会议FAST2020,全球第一!

2月26日,存储行业顶级国际会议FAST2020(18th USENIX Conference on File and Storage Technologies)在美国圣克拉拉举行,大会公开论文名单显示,阿里巴巴3篇第一作者论文入选,是全球入选数最多的企业。 FAS…

oracle11g linux 日期格式设置

下面的过程把oracle 的日期格式设置成 yyyy-mm-dd hh24:mi:ss(1) 使用 oracle 用户登录(2) 在.bash_profile里增加以下两条环境变量export NLS_LANGamerican_america.ZHS16GBK export NLS_DATE_FORMAT"YYYY-MM-DD HH24:MI:SS" (3) 执行一下"source .bash_profil…

如何通过http从linux下载文件,linux – 我可以通过http验证大量文件下载吗?

在服务器端,您可以使用dd和md5sum来校验文件的每个块:#!/bin/bashFILENAME"$1"FILESIZEstat --printf"%s" $FILENAMECHUNKSIZE536870912 # 512MBCHUNKNUM0while ! grep -q cannot skip hash.log 2> /dev/null ; dodd if$FILENAME bs$CHUNKSI…

一份还热乎的蚂蚁金服面经(已拿Offer)!附答案!!

本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者——泽林提供,部分答案由Hollis整理自知识星球《Hollis和他的朋友们》中「直面Java」板块。 经历了漫长一个月的等待,终于…

SFTP多用户权限 linux环境 一站式解决方案

文章目录一、方案11. 创建用户组2. 添加用户并设置为sftp组3. 设置用户密码4. 创建用户目录。并设置权限5. 修改SSH配置6. 在/etc/ssh/sshd_config添加用户组配置7. 最后重启SSH二、方案2(推荐)2.1. 创建用户组2.2. 添加用户并设置为sftp组2.3. 设置用户密码2.4. 创建用户目录。…

linux RssFile什么含义,什么是RSS

导读RSS 指 Really Simple Syndication(真正简易联合),RSS 的 元素可描述 RSS feed。RSS 元素RSS 的 元素可描述 RSS feed。请看下面这个 RSS 文档&#xff1a;<?xml version"1.0"encoding"UTF-8"?>菜鸟教程首页http://www.runoob.com免费编程教程…

linux CPU、内存、I/O、磁盘等监控统一解决方案

文章目录一、效果图二、软件安装配置2.1. nmon安装2.2. 权限赋予2.3. 脚本制作2.4. 脚本运行三、解析监控文件3.1. 监控文件下载3.2. 解析监控文件3.3. 监控指标总览补充内存计算方式需求背景: 性能测试过程中监控服务器健康(CPU、内存、I/O、磁盘)指标的状态 一、效果图 二、软…