在我的最后一篇文章中,我们研究了AWS IAM政策的结构,并研究了一个过于广泛的政策的例子。让'看一些更多的例子来探讨广泛的权限如何导致安全问题。
到目前为止,当策略范围内容为服务而不是特定操作时,将发生最常见的广泛权限形式。
通常,计算资源需要与服务的数据平面进行交互,执行CRUD样操作以操纵由服务可用的资源内部的数据。一个例子是Lambda函数将文件上传到S3存储桶。更少频繁的是计算资源需要与服务的控制平面进行交互,用于管理资源本身。删除整个S3桶,例如,是控制平面操作。大多数计算资源仅适用于特定数据平面操作的权限。
我们的第一个例子来自AWS CloudFormation样本:" AWS配置交付频道和规则"模板。让' s用stack.new检查它。
此堆栈显示如何创建AWS配置规则,以确保EBS卷具有特定标记,并启用自动启用I / O功能。定期AWS Config将检查EBS卷是否符合性,将结果写入S3存储桶,并发送对SNS主题的符合性的通知。
在AWS配置服务中构建了支票标记,请检查是否已打开自动启用I / O不是内置检查。相反,Lambda函数用于检查设置。
它在Lambda函数中'我们看到过于广泛的权限的角色。堆栈.New审计警告我们的问题:
Lambda函数是给出任何资源上的任何AWS CloudWatch日志操作的权限。 Lambda函数需要许可将日志事件发送到日志服务,但它们不需要对整个控制和数据平面的不受限制访问。使用此权限设置,该功能也能够创建和删除整个日志组和流。恶意攻击者会发现这非常有助于删除有关他们的利用的信息!
要修复此问题,我们将占用各个行动和资源的权限。我们希望将此策略拆分为每个独立资源类型的单独策略:一个用于日志服务,一个用于配置服务,一个用于EBS卷服务(其具有EC2的IAM Action Prefix)。我们' ll有一个更好的解决方案,用于在下面的比特中击败lambda函数日志权限。
有时,人们试图与他们的IAM政策暂时变得棘手。虽然大多数策略仅包含效果:允许语句,操作列表和资源列表,还有其他方法可以构建策略。例如,您可以使用以下语句创建一个很好的策略:
{&#34 ;:"拒绝"" notation&#34 ;:" s3:getObject"" notresource&#34 ;:&# 34; ARN:AWS:S3 ::: My-Bucket / My / File.png"使用De Morgan'我们可以将此策略陈述:允许S3:GetObject Action On / My / file。 PNG在My-Batch S3桶中,并拒绝所有其他要求。虽然可以使用允许,动作和资源属性来说明这一点,但是将其陈述这是一个拒绝语句可以有所帮助地覆盖允许语句。这使得拒绝语句可用于服务控制策略和权限边界,您可能希望允许大多数操作,但是防止一些特定的(如创建静态AWS Access键)。
但是,有时所有这些属性都会变成危险组合。让'看看AWS CloudFormation样本和#34; elastic beanstalk样本应用程序与数据库"让' s用stack.new检查它。
堆栈使用AWS Elastic Beanstalk创建自动播放应用程序,并与Amazon RDS数据库集成进行数据存储。
审计结果发现了少数严重问题。我们'重新忽略RDS实例的失败,可公开访问和专注于IAM策略警告。
第一个警告正确推断出我们不恰当的组合效果:在我们的政策声明中允许在不可思议的财产中。此声明所做的是允许EC2虚拟机为我们提供弹性Beanstalk的规定,以便我们制作任何AWS动作,只要它不是IAM动作。这将允许机器创建,读取,写入或删除S3存储桶,为挖掘比特币创建更多虚拟机,或者如果具有IAM身份验证或启用数据API,则可能与数据库连接和删除数据。
要修复此问题,IAM策略永远不应混合效果:允许同一语句中的允许和关注属性,因为它启用未备p津贴。即使您要指定不允许在不允许的所有服务和操作中(这是非常难以执行的),即使,此语句也将自动允许新的AWS服务和随时间发布的操作。
在这种情况下,鉴于应用程序可能只需要连接到RDS数据库,可能会删除此WebServerRoLopolicy,而不会效果。通过特定于数据库的凭据处理数据库的身份验证,通过安全组提供网络连接。
它难以写下很好的IAM政策!为什么我们也应该赞美展示如何做得很好的榜样。让'看看AWS连接的车辆解决方案。让' s用stack.new检查它。
该解决方案显示如何拟架构应用程序以分析来自车辆传感器的遥测,并且由许多不同的托管服务组成,需要许多不同的AWS IAM策略。让'看看审计结果:
没有IAM失败或警告!让' s查看来自模板中的lambda函数的AnomAlyServicerole IAM角色的示例策略语句,以了解它们如何完成此功能:
- 效果:允许动作: - 日志:createLoggroup - 日志:createLogstream - 日志:putlogeventes资源: - !子arn:aws:日志:$ {aws :: region}:$ {aws :: consocid}:log-group:/ AWS / lambda / * - 效果:允许动作: - DynamoDB:BathgetItem - DynamoDB:BathwriteItem - DynamoDB:DynamoDB:GetItem - DynamoDB:PutItem - DynamoDB:查询 - DynamoDB:Scan - DynamoDB:UpdateItem资源: - !子ARN: AWS:DynamoDB:$ {AWS :: Region}:$ {AWS :: AccoundId}:表/ $ {vevicleanomalytable} - !子ARN:AWS:DynamoDB:$ {AWS :: Region}:$ {AWS :: Accound} :表/ $ {vevicleanomalytable} / index / vin-trip_id-index- expert-效果:允许动作: - kinesis:linkestream - kinesis:getRecords - Kinesis:GetSharditorator - Kinesis:ListStreams资源: - !子ARN:AWS:Kinesis:Kinesis:Kinesis:Kinesis:Kinesis:kinesis:kinesis:kinesis:kinesis:kinesis:kinesis:kinesis:kinesis:$ { AWS :: Region}:$ {AWS :: AccountId}:Stream / CC-Anomaly-Stream-效果:允许操作: - Lambda:InvokeFunction资源: - !Getatt NotificationserviceFunction.arn-效果:允许操作: - KMS:DECRYPT资源: - !子:ARN:AWS:KMS:$ {AWS :: Region}:$ {AWS :: AccoundId}:别名/ AWS / Kinesis只有在AWS CloudWatch日志中为Lambda函数的适当名称空间中创建和写入日志的正确操作。
它只是直接和通过一个特定的二级指数与车辆异常表相互作用所需的CRUD数据平面动作。 它只拥有从CC-Anomaly-Stream Kinesis数据流读取记录所需的只读数据平面动作。 它有权仅调用通知服务功能(以及没有其他Lambda操作)。 它有权使用内置AWS KMS键从Kinesis读取(在这种情况下,解密)数据。 这些权限中的每一个都被带到了对异常服务函数的必要资源来完成其任务的必要操作。 制作适当的范围IAM权限并不是微不足道,但有很多例子可以学习,两者都很好。 值得庆幸的是,使用堆栈等工具.New和Sterligent' s cfn_nag我们可以识别示例的良好和坏部分。 如果你遇到伟大(而不是那么好!)你从中学到的例子,请给我们一个喊叫@ stracteryio! IAM政策