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