无服务器安全性:将其置于自动驾驶仪上
Ack :本文是从个人经验以及从无服务器安全性的其他多个来源学到的东西的混合。 我无法在这里列出或确认所有这些信息; 但是,应该特别感谢The Register , Hacker Noon , PureSec以及Serverless Status和Serverless(Cron)icle新闻通讯。
我们都喜欢想象我们的系统是安全的。 然后…
破!!!
每个开发人员,系统管理员以及最终CISO都面临着一个非常普遍的噩梦。
必然?
计算机安全的一项基本原则指出, 没有系统可以达到绝对安全 。 就像人一样: 没有人是完美的 。 除非与外界完全隔离,否则不可以。 按照当今的标准,这几乎是不可能的–此外,拥有一个不能接受输入和提供输出的系统的意义何在?
无论您采取何种高级安全防护措施,攻击者最终都将找到解决方法。 即使您使用具有最大可能密钥长度的最严格的加密算法,攻击者最终也会通过蛮力进行攻击。 尽管目前在时间上是不可行的,但谁能保证一场技术突破会在明天或第二天成为可能?
但这不是您真正要担心的暴力手段: 人为错误更为常见,并且可能对系统安全性造成破坏性影响; 比暴力破解的密码要重要得多。 看看这个故事吧 ,有些人走进美国国税局大楼,and走了数百万美元,却没有使用任何所谓的“黑客”技术。
只要系统是由人制造和操作的,他们就天生就是容易出错的人,那么它们将永远不会真正安全。
那么,我们注定要失败吗?
没有。
见过船的内部吗?
它的船体如何划分成多个舱室,这样一个泄漏的舱室不会导致整艘船沉没?
人们通常在设计软件时采用类似的概念:多个模块,这样一个受损害的模块不会使整个系统瘫痪。
结合最小特权原则 ,这意味着组件将损害最小程度的安全性-理想情况下,攻击者将只能在模块安全范围的范围内造成破坏,而永远不会超出范围。
减小组件的爆炸半径 ,从而减小整个系统暴露的冲击面 。
您可以说是一个安全沙箱 。
那是一个相当不错的。
PoLP:最小特权原则
绝对不要给某人(或某物)比他们所需的更多的自由。
更正式地说,
每个模块都只能访问其合法目的所需的信息和资源。 – 维基百科
这样,如果模块行为异常(或被具有恶意恶意的实体( 黑客 ,英语)强迫行为),则可将其可能造成的危害降到最低; 没有采取任何预防性的“行动”,甚至在确定“违反”之前!
它永远不会变老
尽管该原则最初是在遗留系统的上下文中提出的,但它更适用于“现代”架构。 SOA(嗯,也许不是那么“现代”),微服务和FaaS(无服务器功能,因此也就是无服务器安全性)。
这个概念非常简单:使用底层访问控制机制来限制“执行单元”可用的权限; 可能是简单的HTTP服务器/代理,Web服务后端,微服务,容器或无服务器功能。
同时,在没有服务器的地方……
随着无服务器技术在全球范围内的广泛采用 ,无服务器安全性的重要性以及我们PoLP的价值变得比以往更加明显 。
少服务器=省力
无需配置和管理服务器(环境)意味着无服务器开发可以以惊人的速度进行。 有了CI / CD,这只是代码,提交和推送的问题; 几分钟之内,一切就可以启动并运行,即使不是几秒钟。 没有SSH登录,文件上载,配置同步,服务重启,路由更改或与传统部署相关的任何其他讨厌的琐事。
“稍后再修复权限。”
las,在那些“无ops”开发人员(如我自己)中,这是很常见的事情。 您急于将最新的更新推送到暂存中,而避免过多“拒绝权限”错误的“简便方法”是放宽对FaaS实体( AWS Lambda , Azure Function等)的权限。
分期将很快迁移到产品。 您的“超权限”功能也将如此。
它会留在那里。 远远超出您的想象。 最终,您会将流量转移到更新版本,而保留旧版本不变。 以免破坏其他一些依赖组件,以防您踩到它。
然后是时间的沙土,从每个人的记忆中掩盖了旧功能。
具有未打补丁的依赖关系和可能有缺陷的逻辑的过时功能,可以完全访问您的云资源。
无服务器定时炸弹 ,如果有的话。
再次!
如果我们从分阶段部署开始就遵循最小特权原则,它将大大减小爆炸半径:通过限制允许执行的功能,如果系统的其余部分受到“利用的程度”,我们将自动对其进行限制控制曾经落入错误的手中。
完善无服务器安全性:在公共云平台上
这些事情说起来容易做起来难。
目前,在公共云FaaS技术的领导者中,只有AWS具有足够灵活的无服务器安全模型。 GCP会自动为给定项目中的所有功能分配一个默认的项目级Cloud Platform服务帐户 ,这意味着就安全性和访问控制而言,所有功能都将归于一揽子。 Azure的IAM模型看起来更有希望 ,但是它仍然缺少诸如AWS和GCP中可用的基于角色的自动运行时凭据自动分配之类的炫酷功能。
AWS已为其Lambda函数应用了自己的基于IAM角色的权限模型 ,从而使用户可以灵活地为每个Lambda函数定义具有完全可自定义权限的自定义IAM角色(具有完全可自定义的权限)。 它具有令人印象深刻的一系列预定义角色 ,您可以在这些角色上进行扩展,并且具有定义明确的策略,用于对资源或主体类别进行权限范围界定,合并引用同一组资源或操作的规则等。
整个层次结构最终归结为一组权限,每个权限采用一种相当简单的格式 :
{"Effect": "Allow|Deny","Action": "API operation matcher (pattern), or array of them","Resource": "entity matcher (pattern), or array of them"
}
用英语,这仅意味着:
允许 (或拒绝 )拥有此权限的实体(用户,EC2实例,lambda;无论如何)对匹配的资源执行匹配的API操作。
(也有非必填字段“ Principal
和“ Condition
”,但为简洁起见,在此将其跳过。)
现在来看一些例子。
{"Effect": "Allow","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-awesome-bucket/*"
}
这允许受让人将一个对象( s3:PutObject
)放入名为my-awesome-bucket
。
{"Effect": "Allow","Action": "s3:PutObject","Resource": "arn:aws:s3:::my-awesome-*"
}
这是相似的,但是允许在名称以my-awesome-
开头的任何存储桶上执行my-awesome-
。
{"Effect": "Allow","Action": "s3:*","Resource": "*"
}
这允许受让人针对其拥有的AWS账户中的任何存储桶执行任何 S3操作(获取/放置对象,删除对象,甚至删除存储桶 )。
现在是银弹 :
{"Effect": "Allow","Action": "*","Resource": "*"
}
是的,您可以自己对AWS账户中的任何 内容 执行任何操作。
有点像AdministratorAccess受管策略。
而且,如果您的委托人(例如lambda)受到威胁,攻击者实际上就可以对您的AWS账户进行管理员访问!
无服务器的安全梦night。 不用说。
不惜一切代价避免。
期。
从这个意义上讲,最好的选择是一系列第一类权限; 允许范围最小(限制最大)且涵盖范围狭窄且定义明确的范围。
那有多难?
需要注意的是,您必须对该计算单元中的每个单个操作执行此操作(例如lambda)。 每一个。
当您需要配置事件源来触发这些单元时,情况会变得更糟。
假设,对于API网关触发的 lambda,必须授予API网关服务在特定APIG端点范围内(使用CloudFormation 语法 )调用您的lambda的权限:
{"Type": "AWS::Lambda::Permission","Properties": {"Action": "lambda:InvokeFunction","FunctionName": {"Ref": "LambdaFunction"},"SourceArn": {"Fn::Sub": ["arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/*/${__Method__}${__Path__}",{"__Method__": "POST","__Path__": "/API/resource/path","__ApiId__": {"Ref": "RestApi"}}]},"Principal": "apigateway.amazonaws.com"}
}
或对于由Kinesis流提供动力的 lambda,在这种情况下情况会变得更加复杂: Lambda函数需要访问以观看和从流中拉出 ,而Kinesis服务也需要获得许可才能触发 lambda:
"LambdaFunctionExecutionRole": {"Type": "AWS::IAM::Role","Properties": {"ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"],"AssumeRolePolicyDocument": {"Version": "2012-10-17","Statement": [{"Action": ["sts:AssumeRole"],"Effect": "Allow","Principal": {"Service": ["lambda.amazonaws.com"]}}]},"Policies": [{"PolicyName": "LambdaPolicy","PolicyDocument": {"Statement": [{"Effect": "Allow","Action": ["kinesis:GetRecords","kinesis:GetShardIterator","kinesis:DescribeStream","kinesis:ListStreams"],"Resource": {"Fn::GetAtt": ["KinesisStream","Arn"]}}]}}]}},"LambdaFunctionKinesisTrigger": {"Type": "AWS::Lambda::EventSourceMapping","Properties": {"BatchSize": 100,"EventSourceArn": {"Fn::GetAtt": ["KinesisStream","Arn"]},"StartingPosition": "TRIM_HORIZON","FunctionName": {"Ref": "LambdaFunction"}}},"KinesisStreamPermission": {"Type": "AWS::Lambda::Permission","Properties": {"Action": "lambda:InvokeFunction","FunctionName": {"Ref": "LambdaFunction"},"SourceArn": {"Fn::GetAtt": ["KinesisStream","Arn"]},"Principal": "kinesis.amazonaws.com"}}
因此,您将看到,这种粒度带来了强大的力量和巨大的责任感 。 一个丢失的权限(heck,一个错误键入的字母),它是403 AccessDeniedException
。
没有简单的方法; 您只需要跟踪函数触发或访问的每个AWS资源,查找文档,花些功夫并提供必要的权限即可。
但是……但是……那是太多的工作!
是的,是的。 如果您手动进行 。
但是,这些天谁开车手动? :)
幸运的是,如果您已经开始自动化,则有很多选择:
如果您在使用著名的无服务器架构 -这意味着你已经涵盖在扳机上的权限前-还有的serverless-puresec-cli
从插件Puresec 。
该插件可以静态分析您的lambda代码并生成最小特权角色。 看起来真的很酷,但是需要注意的是,在每次更改代码的部署之前,您必须运行serverless puresec gen-roles
命令。 我还找不到自动运行的方法-例如在serverless deploy
期间。 更糟糕的是,它只是将生成的角色打印到stdout中。 因此,您必须手动将其复制粘贴到serverless.yml
,或使用其他伏都教将其实际注入到部署配置中(希望将来会有所改善:))
AWS圣杯:来自众神
如果您是Python爱好者, Chalice可以自动为您自动生成权限。 圣杯在很多方面都很棒。 超快速部署,注释驱动的触发器,需要维护的配置很少甚至没有,等等。
但是,尽管是从AWS众神直接获得的帮助,但它似乎在权限方面错过了“最小”一词; 如果您有列出某些存储桶foo
内容的代码,它将生成权限以列出AWS账户中所有存储桶的内容( "Resource": "*"
而不是"Resource": "arn:aws:s3:::foo/*"
),而不仅仅是您感兴趣的存储桶。不酷!
选择SLAppForge Sigma
如果您是初学者,或者不喜欢CLI工具,那么SLAppForge中提供了Sigma 。
作为成熟的浏览器IDE,Sigma会在您编写(键入或拖放 )代码时自动分析您的代码,并为Lambda运行时和触发器获取必要的权限,因此您已全面了解。 最近引入的权限管理器还允许您根据需要修改这些自动生成的权限。 例如,如果您正在集成Sigma尚不了解的新AWS服务/运营。
另外,有了Sigma,您无需担心任何其他配置。 资源配置,触发器映射,实体相互关系等-IDE会处理所有这些。
需要注意的是,Sigma目前仅支持NodeJS。 但是Python,Java和其他很酷的语言正在兴起!
(如果您有其他凉爽的无服务器安全策略生成工具,请在下面发表评论!不, AWS Policy Generator不算在内。)
在结束时
最低特权原则对于无服务器安全和软件设计至关重要。 迟早会节省您的时间。 Lambda的高度精细的IAM许可模型非常适合PoLP。
Puresec CLI插件 ,多合一Sigma IDE和AWS Chalice等工具可以自动生成安全策略。 使您的生活更轻松,同时仍然遵守PoLP的承诺。
翻译自: https://www.javacodegeeks.com/2018/11/serverless-security-putting-autopilot.html
无服务器安全性:将其置于自动驾驶仪上相关推荐
- 自动驾驶行车记录仪训练集_无服务器安全性:将其置于自动驾驶仪上
自动驾驶行车记录仪训练集 Ack :本文是从个人经验以及从无服务器安全性的其他多个来源学到的东西的混合. 我无法在这里列出或确认所有这些信息: 但是,应该特别感谢The Register , Hack ...
- 红透半边天的无服务器只是炒作吗?技术上如何发展?
无服务器是当前软件架构模式中的热门话题之一,像许多软件工程中的其他术语或趋势一样,无服务器也没有一个明确的定义,所以在这篇文章中我们会简单介绍一下无服务器的基本概念,并围绕无服务器的几个争论点展开讨论 ...
- 4g信号满2g无服务器,4G信号满格却上不了网?原因终于找到了!
明明4G信号是满格的,但就是上不了网,打不了电话,或者断断续续的... ...问题究竟出现在哪里,今天蜗牛君就为你解密一二. 首先,手机上的信号越好,代表你距离运营商基站越近,但这并不意味着你的网速就 ...
- Docker学习总结(39)——简析容器、无服务器和虚拟机的安全性差异
外文翻译:英文原文 前言 在三十多年前,虚拟化仅适用于拥有大型机和众多小型计算机的用户,而安全问题仅仅是物理上的. 二十年前,VMware发布了其第一款产品,网络边界安全性仍处于起步阶段,依赖于防火墙 ...
- 服务器返回它们的和_无服务器有其陷阱。 这是避免它们的方法。
服务器返回它们的和 by Nicolas Dao 由Nicolas Dao 无服务器有其陷阱. 这是避免它们的方法. (Serverless has its pitfalls. Here's how ...
- 云服务器面临的问题_无服务器安全面临的多方面威胁以及我们应如何应对
云服务器面临的问题 by Yan Cui 崔燕 无服务器安全面临的多方面威胁以及我们应如何应对 (The many-faced threats to Serverless security, and ...
- 无服务器计算:云计算的下一阶段
本文翻译自美国计算机协会通讯杂志(Communications of ACM,CACM)近期的一篇文章(May 2021, Vol. 64 No. 5, Pages 76-84).该文阐述了对无服务器 ...
- 无服务器计算的黑暗面:程序移植没那么容易
根据"RightScale 2018 State of the Cloud"报告,无服务器计算在云服务中增长最快,增长率为75%,这意味着许多企业选择使用无服务器系统的便利性. 众 ...
- 作为工程师,你真的了解无服务器?
译者 | 王欢 来源 | 分布式实验室 头图 | 下载于ICphoto 最近,我在YouTube上看了一个非常出色的开发人员的视频.它的标题是"无服务器毫无意义".虽然我非常喜欢该 ...
最新文章
- 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、深度学习、语法分析、文本处理...
- 华为云服务的购买和建站
- antd4 table里面表单赋值_vue的组件化——table表格的封装
- One order search的框架代码里,硬编码了要去取Interaction object相关的数据
- 跨平台SSH客户端/Linux VNC客户端/Windows RDP客户端/FTP客户端 推荐 Royal TSX
- 重载操作符解析(原)
- Docker在Windows上运行NetCore系列(一)使用命令控制台运行.NetCore控制台应用
- java随机一个数字和字母_java怎么实现随机4个带有数字和字母的验证码?
- 基于SSM的停车位收费系统
- wordpress比其它phpcms有什么优势,看完就知道了
- 【Unity3D】使用 FBX 格式的外部模型 ② ( FBX 模型与默认 3D 模型的区别 | FBX 模型贴图查找路径 | FBX 模型可设置多个材质 )
- 金笛邮件倒入专题之Umail倒入
- ocelot和nginx比较_针对 Ocelot 网关的性能测试
- java实现找一条转乘次数最少的公交线路?,基于最优换乘次数的城市公交查询算法...
- 菜刀,蚁剑,冰蝎,哥斯拉的流量特征
- IDEA的基本使用:让你的IDEA有飞一般的感觉
- 微信视频号直播数据哪里可以看?
- 数据结构和算法学习网站
- C++ STL prev()函数
- 欧洲中世纪末期的战争
热门文章
- 【拓扑排序】【DP】旅行计划(luogu 1137)
- 经典题:poj2104-区间第k小 整体二分学习
- 2017西安交大ACM小学期数论 [水题]
- 去 BAT 面试,总结了这 55 道 MySQL 面试题
- MySQL str_to_date()函数
- 高级JAVA码农必须搞清楚它们的区别:instanceof、isInstance、isAssignableFrom
- JAVA元注解@interface详解(@Target,@Documented,@Retention,@Inherited)
- 漫画:什么是ConcurrentHashMap
- 不一样的假期,到底哪里不一样?
- Sentinel控制台