CFN-NAG工具在云形式模板中寻找可能表明基础架构不安全的模式。粗略地说,它会寻找:
有关该工具的更多背景,请在Stelligent的博客上查看此帖子:
在用“ CFN-NAG”的云形式模板的开发过程中找到安全问题
假定Ruby> = 2.5.x已安装,安装只是一个问题:
gem install cfn-nag在MacOS或Linux上,您可以与Brew一起安装:
brew install ruby brew-gem
brew gem install cfn-nag要在CodePipeline中运行cfn_nag作为操作,您可以通过AWS无服务器应用程序存储库来部署。
执行:
cfn_nag_scan --input-path < path to cloudformation json >该路径可以是目录或特定模板。如果是目录,则将处理所有.json, .template , .yml和.yaml文件,包括递归到子目录中。
默认输出格式是自由形式的文本,但是可以使用--output-format json标志选择JSON输出。
可选的是,一个--debug标志将转储有关规则加载内部的信息。
与--help一起运行,以完整列出支持的开关。
要查看当前支持所有规则的列表,有一个命令行实用程序将它们转储给STDOUT:
cfn_nag_rules为方便起见,提供了码头文件。它在Dockerhub上出版,为stelligent/cfn_nag 。
https://hub.docker.com/r/stelligent/cfn_nag
您也可以在本地构建它。
docker build -t stelligent/cfn_nag .您可以将包含模板的本地目录安装到Docker容器中,然后在容器中调用CFN_NAG。此示例使用单元测试中使用的测试模板CFN_NAG:
$ docker run -v ` pwd ` /spec/test_templates:/templates -t stelligent/cfn_nag /templates/json/efs/filesystem_with_encryption.json
{
" failure_count " : 0,
" violations " : [
]
}
$ docker run -v ` pwd ` /spec/test_templates:/templates -t stelligent/cfn_nag /templates/json/efs/filesystem_with_no_encryption.json
{
" failure_count " : 1,
" violations " : [
{
" id " : " F27 " ,
" type " : " FAIL " ,
" message " : " EFS FileSystem should have encryption enabled " ,
" logical_resource_ids " : [
" filesystem "
]
}
]
}cfn_nag_scan可以作为GITHUB工作流程的一部分运行,以评估连续集成管道期间的代码。
在您的github工作流文件中,创建一个使用CFN_NAG操作的步骤:
- name : Simple test
uses : stelligent/cfn_nag@master
with :
input_path : tests有关GITHUB动作的更多信息,请参见此处。
CFN-NAG支持“配置文件”的概念,该概念实际上允许应用规则列表。配置文件是一个文本文件,必须每行规则标识符。当通过--profile-path命令行参数指定时,CFN-NAG只会从这些特定规则中返回违规行为。
创建“配置文件”的动机是,不同的开发人员可能会关心不同的规则。例如,“基础架构_developer”可能关心IAM规则,而“ App_Developer”甚至可能无法创建IAM资源,因此也不关心这些规则。
这是一个示例配置文件:
F1
F2
F27
W3
W5
拒绝列表基本上与配置文件相反:这是一个永不适用的规则列表。当通过--deny-list-path命令行参数指定时,CFN-nag将永远不会从文件中指定的那些特定规则中返回违规行为。
如果两者都指定了规则,则拒绝列表将优先于个人资料,并且该规则将不会应用。
格式如下。仅有的两个显着字段是RulesToSuppress和每项id 。 reason不会由CFN-NAG解释,但是建议证明并记录为什么不应应用规则的合理性。
RulesToSuppress :
- id : W3
reason : W3 is something we never care about at enterprise X如果有一个规则要抑制,则可以将cfn_nag Metadata密钥添加到受影响的资源中,以告诉CFN_NAG不要为该规则引起故障或警告。
例如,如果您正在设置一个面向公共的ELB,该ELB可以通过以下资源从Internet上进行入站连接:
public_alb.yaml
# Partial template
PublicAlbSecurityGroup :
Properties :
GroupDescription : ' Security group for a public Application Load Balancer '
VpcId :
Ref : vpc
Type : AWS::EC2::SecurityGroup
PublicAlbSecurityGroupHttpIngress :
Properties :
CidrIp : 0.0.0.0/0
FromPort : 80
GroupId :
Ref : PublicAlbSecurityGroup
IpProtocol : tcp
ToPort : 80
Type : AWS::EC2::SecurityGroupIngressCFN_NAG将如下提出警告:
$ cfn_nag_scan -i public_alb.yaml
------------------------------------------------------------
public_alb.yaml
------------------------------------------------------------------------------------------------------------------------
| WARN W9
|
| Resources: [ " PublicAlbSecurityGroup " ]
|
| Security Groups found with ingress cidr that is not /32
------------------------------------------------------------
| WARN W2
|
| Resources: [ " PublicAlbSecurityGroup " ]
|
| Security Groups found with cidr open to world on ingress. This should never be true on instance. Permissible on ELB
Failures count: 0
Warnings count: 2通过添加元数据,可以抑制这些警告:
public_alb_with_suppression.yaml
# Partial template
PublicAlbSecurityGroup :
Properties :
GroupDescription : ' Security group for a public Application Load Balancer '
VpcId :
Ref : vpc
Type : AWS::EC2::SecurityGroup
Metadata :
cfn_nag :
rules_to_suppress :
- id : W9
reason : " This is a public facing ELB and ingress from the internet should be permitted. "
- id : W2
reason : " This is a public facing ELB and ingress from the internet should be permitted. "
PublicAlbSecurityGroupHttpIngress :
Properties :
CidrIp : 0.0.0.0/0
FromPort : 80
GroupId :
Ref : PublicAlbSecurityGroup
IpProtocol : tcp
ToPort : 80
Type : AWS::EC2::SecurityGroupIngress $ cfn_nag_scan -i public_alb_with_suppression.yaml
------------------------------------------------------------
public_alb_with_supression.yaml
------------------------------------------------------------
Failures count: 0
Warnings count: 0云形式模板参数可以提出静态分析的问题,因为在部署点指定值。换句话说,完成静态分析后无法使用这些值 - 静态分析只能查看其前面的“代码”。因此,如果CIDR被参数化,并且在部署时间通过0.0.0.0.0/0进行,则不会标记为0.0.0.0/0的安全组入口规则。
为了允许检查参数值,用户可以使用--parameter-values-path=<filename/uri> flag在命令行上传递给cfn_nag和cfn_nag_scan JSON文件中的参数值。
JSON的格式是单个密钥“参数”,其值是一个字典,每个键/值对映射到参数:
{
"Parameters" : {
"Cidr" : " 0.0.0.0/0 "
}
}这将为以下参数提供“ 0.0.0.0/0”:
Parameters :
Cidr :
Type : String请注意,如果JSON中有额外的参数,它们会被悄悄忽略(允许cfn_nag_scan在所有模板上应用相同的JSON)。
如果JSON畸形或不符合上述规范,则解析会因致命违规而失败。
在0.5.55之前,有效地忽略了fn :: FindInmap的电话。基础模型将使它们成为现实,因此它们将显示为规则的哈希值。例如: { "Fn::FindInMap" => [map1, key1, key2]}
从0.5.55开始,该模型将尝试计算呼叫的值的值,并将该值呈现给规则。该评估支持:
如果评估逻辑无法弄清键的值,则将默认情况下返回整个表达式的哈希的旧行为。
同样在0.5.55之前,有效地忽略了对AWS假功能的电话。基础模型将使它们成为现实,因此它们将显示为规则的哈希值。例如: {"Ref"=>"AWS::Region"} 。一个常见的用例是按区域组织映射,因此伪功能评估对于更好地支持地图评估很重要。
从0.5.55开始,该模型将向具有默认值的规则呈现以下AWS假功能:
'AWS::URLSuffix' => 'amazonaws.com',
'AWS::Partition' => 'aws',
'AWS::NotificationARNs' => '',
'AWS::AccountId' => '111111111111',
'AWS::Region' => 'us-east-1',
'AWS::StackId' => 'arn:aws:cloudformation:us-east-1:111111111111:stack/stackname/51af3dc0-da77-11e4-872e-1234567db123',
'AWS::StackName' => 'stackname'
此外,最终用户可以覆盖通过传统参数替换机制提供的价值。例如:
{
"Parameters" : {
"AWS::Region" : " eu-west-1 "
}
}直到CFN_NAG的0.4.66版本,基础模型在模板中没有进行FN ::的任何处理。这意味着,如果财产具有条件价值,则可以根据规则解析fn :: if。鉴于FN ::是否可以出现在任何地方,因此它为规则开发人员创造了一种摩尔的情况。充其量,规则逻辑可以忽略hash假定价值的值首先不是哈希。
为了解决此问题,如果以真实的结果,CFN_NAG的默认行为现在可以替换FN ::。这意味着默认情况下,规则不会检查错误结果是否是否违反安全性。
除了在属性值级别上替换FN ::,同一行为还应用于fn ::如果在属性的顶级级别。例如:
Resource1 :
Type : Foo
Properties : !If
- IsNone
- Description : Up
- Description : DOwn看起来与:
Resource1 :
Type : Foo
Properties :
Description : Up为了提供对这种行为的控制,用户可以使用--condition-values-path=<filename/uri> flag在命令行上传递给cfn_nag和cfn_nag_scan的json文件中的条件值。
JSON的格式是AA字典,每个键/值对映射到条件:
{
"Condition1" : true ,
"Condition2" : false
}SPCM的基础在博客文章思想实验中提出了IAM政策文件的复杂度度量。
从CFN_NAG的0.6.0版本开始:
spcm_scan可以扫描云形式模板的目录(例如CFN_NAG_SCAN),并使用JSON或HTML格式的SPCM指标生成报告cfn_nag_scan --rule-arguments spcm_threshold:100--rule-arguments机制接受设置的最终用户价值。规则对象只需要声明attr_accessor ,例如attr_accessor :spcm_threshold和cfn_nag将照顾细节以从--rule-arguments注入值0.5.x的发布包括对自定义规则(可以)分发和加载的一些重大更改。在此版本之前,有两个地方加载了规则:core cfn_nag Gem中的lib/cfn-nag/custom_rules目录,以及在命令行上指定的自定义 - 列表目录。
有两种用例迫使加载自定义规则的方式/位置进行了重新设计。规则加载机制已被概括,以便可以使用自定义规则存储库来发现规则。
从传统的软件开发角度来看,坐在文件系统上的一堆“规则文件”并不是很好。这些文件上没有版本或可追溯性,因此0.5.x引入了“ CFN_NAG规则GEM”的概念。开发人员可以开发自定义规则,作为单独的宝石,版本并安装它的一部分...并且只要GEM Metadata包含cfn_nag_rules => true ,这些规则将从CFN_NAG引用。对于称为“ CFN-NAG-IHIPAA-RULES”的宝石,将加载Lib/cfn-nag-iphaa-Rules下的任何 *.rb。任何自定义规则均应从CFNNAG :: BASERULE中衍生在CFN-NAG/BASE_RUE(不是CFN-NAG/CUSTON-RULES/BASE)中。如果规则必须从其他内容中得出,则定义方法cfn_nag_rule?返回true也将导致它通常会加载。
当CFN_NAG在AWS lambda中运行时 - 从传统意义上讲,实际上没有一个文件系统( /TMP)。因此,只有核心规则可从lambda使用。为了支持自定义规则,CFN_NAG支持从S3存储器而不是文件系统发现规则。
关于如何在Ruby中制定自定义规则的所有内容仍然是正确的。
要从S3存储桶中发现规则,请使用此内容创建一个文件s3.yml :
---
repo_class_name : S3BucketBasedRuleRepo
repo_arguments :
s3_bucket_name : cfn-nag-rules-my-enterprise
prefix : /rules在bucket cfn-nag-rules-my-enterprise中应用 *rule.rb文件,并使用前缀 /规则(eg /rules /mynewrule.rb),请在命令行上指定此文件至CFN_NAG,如:
cat my_cfn_template.yml | cfn_nag --rule-repository s3.yml如果规则以多个存储键为单位,则创建多个S3*.yml文件,并在--rule-repository参数中指定它们。
如果环境AWS凭据有权访问Bucket cfn-nag-rules-enterprise ,则它将找到所有规则,例如/rules/*Rule.rb rule.rb。如果应该使用特定的AWS_Profile,请将其添加为repo_arguments下的密钥,例如aws_profile: my_aws_profile
除了文件系统,GEM安装和S3之外,新的体系结构理论上支持开发其他“规则存储库”,以加载DynamoDB,关系数据库或其他Web服务的规则。
要为您自己使用和/或社区贡献的新规则,请参阅自定义规则开发的详细信息。
屏幕截图,展示了汤与坚果TDD自定义规则开发:此处可用:
https://www.youtube.com/watch?v=jrzct0nafd4&t=1601S
要运行规格,您需要确保已安装Docker,并通过
gem install bundle
bundle install然后,要运行所有规格,只需运行rake test:all 。
要运行端到端测试,请运行rake test:e2e 。该脚本将捆绑在Gemfile中的所有宝石,在本地构建和安装CFN_NAG GEM,安装规格依赖项,然后执行标记为“ end_to_end”的测试。它还将拉下亚马逊提供的样本模板,并将CFN_NAG_SCAN对其进行,以查看是否有任何已知良好模板会导致CFN-NAG中的例外。
在本地安装当前的GIT分支:
bundle install
scripts/deploy_local.sh有一个完整的远程开发环境创建并设置了所有工具和设置,预先配合了规则制定和创建方面的便捷性。您可以使用VS Code Remote开发功能来启用此功能。
Folder contains a dev container configuration file. Reopen folder to develop in a container夹单击“ Reopen in Container[Dev Container] cfn_nag Development选项有关VS代码远程开发设置的更多信息,请参见此处,VS代码远程开发。
要报告错误或请求功能,请通过以下方式通过GitHub存储库提交问题:https://github.com/stelligent/cfn_nag/issues/new