เครื่องมือ CFN-NAG มองหารูปแบบในเทมเพลต CloudFormation ที่อาจบ่งบอกถึงโครงสร้างพื้นฐานที่ไม่ปลอดภัย พูดคร่าวๆมันจะมองหา:
สำหรับพื้นหลังเพิ่มเติมเกี่ยวกับเครื่องมือโปรดดูโพสต์นี้ที่บล็อกของ Stelligent:
การค้นหาปัญหาความปลอดภัยในช่วงต้นของกระบวนการพัฒนาของเทมเพลต Cloudformation ด้วย "CFN-NAG"
มีการติดตั้งทับทิม> = 2.5.x การติดตั้งเป็นเพียงเรื่องของ:
gem install cfn-nagบน MacOS หรือ Linux คุณสามารถติดตั้งด้วย Brew:
brew install ruby brew-gem
brew gem install cfn-nag ในการเรียกใช้ cfn_nag เป็นการกระทำใน CodePipeline คุณสามารถปรับใช้ผ่านที่เก็บแอปพลิเคชัน AWS Serverless
เพื่อดำเนินการ:
cfn_nag_scan --input-path < path to cloudformation json > เส้นทางสามารถเป็นไดเรกทอรีหรือเทมเพลตเฉพาะ หากเป็นไดเรกทอรีไฟล์ .json, .template , .yml และ .yaml ทั้งหมดจะถูกประมวลผลรวมถึงการเรียกคืนเป็นไดเรกทอรีย่อย
รูปแบบเอาต์พุตเริ่มต้นเป็นข้อความแบบฟรี แต่สามารถเลือกเอาต์พุต JSON ด้วยธง --output-format json
ทางเลือกธง --debug จะทิ้งข้อมูลเกี่ยวกับภายในของการโหลดกฎ
เรียกใช้ด้วย --help สำหรับรายชื่อสวิตช์ที่รองรับทั้งหมด
หากต้องการดูรายการกฎทั้งหมด CFN-NAG ปัจจุบันรองรับมียูทิลิตี้บรรทัดคำสั่งที่จะทิ้งพวกเขาไปยัง stdout:
cfn_nag_rules Dockerfile มีให้ความสะดวก มันถูกเผยแพร่บน 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 จะส่งคืนการละเมิดจากกฎเฉพาะเหล่านั้นเท่านั้น
แรงจูงใจเบื้องหลังการสร้าง "โปรไฟล์" คือนักพัฒนาที่แตกต่างกันอาจใส่ใจเกี่ยวกับกฎที่แตกต่างกัน ตัวอย่างเช่น "Infrastructure_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 ในกรณีที่มีกฎที่คุณต้องการปราบปรามคีย์ Metadata cfn_nag สามารถเพิ่มลงในทรัพยากรที่ได้รับผลกระทบเพื่อบอก CFN_NAG ว่าไม่ยกความล้มเหลวหรือเตือนสำหรับกฎนั้น
ตัวอย่างเช่นหากคุณกำลังตั้งค่า ELB ที่หันหน้าเข้าหาสาธารณะที่เปิดให้เชื่อมต่อขาเข้าจากอินเทอร์เน็ตด้วยทรัพยากรดังต่อไปนี้:
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พารามิเตอร์เทมเพลต CloudFormation สามารถนำเสนอปัญหาสำหรับการวิเคราะห์แบบคงที่เนื่องจากมีการระบุค่า ณ จุดของการปรับใช้ กล่าวอีกนัยหนึ่งค่าไม่สามารถใช้ได้เมื่อทำการวิเคราะห์แบบคงที่ - การวิเคราะห์แบบคงที่สามารถดู "รหัส" ที่อยู่ข้างหน้าเท่านั้น ดังนั้นกฎการเข้ากลุ่มความปลอดภัยที่ 0.0.0.0/0 จะไม่ถูกตั้งค่าสถานะหาก CIDR ถูกกำหนดพารามิเตอร์และ 0.0.0.0/0 จะถูกส่งผ่านในเวลาปรับใช้
ในการอนุญาตสำหรับการตรวจสอบค่าพารามิเตอร์ผู้ใช้สามารถระบุค่าพารามิเตอร์ในไฟล์ JSON ที่ส่งผ่านบรรทัดคำสั่งไปยังทั้ง cfn_nag และ cfn_nag_scan ด้วย --parameter-values-path=<filename/uri>
รูปแบบของ 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 โมเดลจะพยายามคำนวณค่าสำหรับการโทรเพื่อค้นหา map และนำเสนอค่านั้นกับกฎ การประเมินนี้สนับสนุนคีย์ที่:
หากตรรกะการประเมินไม่สามารถหาค่าสำหรับคีย์ได้มันจะเริ่มต้นกับพฤติกรรมเก่าของการส่งคืนแฮชสำหรับนิพจน์ทั้งหมด
ก่อนหน้า 0.5.55 การโทรไปยัง AWS pseudofunctions ถูกละเว้นอย่างมีประสิทธิภาพ รูปแบบพื้นฐานจะทำให้พวกเขาเป็นและดังนั้นพวกเขาจะปรากฏเป็นค่าแฮชตามกฎ ตัวอย่างเช่น: {"Ref"=>"AWS::Region"} กรณีการใช้งานทั่วไปคือการจัดระเบียบการแมปตามภูมิภาคดังนั้นการประเมิน Pseudofunction จึงเป็นสิ่งสำคัญในการสนับสนุนการประเมินแผนที่ที่ดีขึ้น
เริ่มต้นใน 0.5.55 โมเดลจะนำเสนอ AWS pseudofunctions ต่อไปนี้กับกฎที่มีค่าเริ่มต้น:
'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 "
}
}จนถึงรุ่น 0.4.66 ของ CFN_NAG โมเดลพื้นฐานไม่ได้ทำการประมวลผลใด ๆ ของ FN :: ถ้าอยู่ในเทมเพลต นี่หมายความว่าหากทรัพย์สินมีค่าตามเงื่อนไขมันขึ้นอยู่กับกฎที่จะแยกวิเคราะห์ FN :: ถ้า เนื่องจาก FN :: หากสามารถปรากฏขึ้นได้ทุกที่มันจะสร้างสถานการณ์ที่เกิดจากการตีเป็นผู้พัฒนากฎ ที่ดีที่สุดตรรกะกฎสามารถเพิกเฉยต่อค่าที่แฮชสันนิษฐานได้ว่าค่านั้นไม่ใช่แฮชในตอนแรก
เพื่อแก้ไขปัญหานี้พฤติกรรมเริ่มต้นสำหรับ CFN_NAG ตอนนี้สามารถแทนที่ FN :: หากมีผลลัพธ์ที่แท้จริง ซึ่งหมายความว่าโดยค่าเริ่มต้นว่ากฎจะไม่ตรวจสอบผลลัพธ์ที่ผิดพลาดสำหรับการละเมิดความปลอดภัย
นอกเหนือจากการทดแทน FN :: หากอยู่ในระดับมูลค่าทรัพย์สินแล้วพฤติกรรมเดียวกันจะถูกนำไปใช้กับ FN :: ถ้าในระดับสูงสุดของคุณสมบัติ ตัวอย่างเช่น:
Resource1 :
Type : Foo
Properties : !If
- IsNone
- Description : Up
- Description : DOwnจะมีลักษณะเหมือนกับ:
Resource1 :
Type : Foo
Properties :
Description : Up เพื่อให้การควบคุมพฤติกรรมนี้บางอย่างผู้ใช้สามารถระบุค่าเงื่อนไขในไฟล์ JSON ที่ส่งผ่านบรรทัดคำสั่งไปยังทั้ง cfn_nag และ cfn_nag_scan ด้วย --condition-values-path=<filename/uri> flag
รูปแบบของ JSON เป็นพจนานุกรม AA ด้วยการแมปคู่/ค่าแต่ละคู่กับเงื่อนไข:
{
"Condition1" : true ,
"Condition2" : false
}พื้นฐานสำหรับ SPCM ได้อธิบายไว้ในบล็อกการทดลองโพสต์ความคิดที่เสนอตัวชี้วัดความซับซ้อนสำหรับเอกสารนโยบาย IAM
เริ่มต้นในเวอร์ชัน 0.6.0 ของ CFN_NAG:
spcm_scan สามารถสแกนไดเรกทอรีของเทมเพลต CloudFormation (เช่น CFN_NAG_SCAN) และสร้างรายงานด้วยตัวชี้วัด SPCM ในรูปแบบ JSON หรือ HTMLcfn_nag_scan --rule-arguments spcm_threshold:100--rule-arguments แบบเดียวกัน วัตถุกฎต้องประกาศ attr_accessor เท่านั้นเช่น attr_accessor :spcm_threshold และ cfn_nag จะดูแลรายละเอียดเพื่อฉีดค่าจาก --rule-arguments การเปิดตัว 0.5.x รวมถึงการเปลี่ยนแปลงที่สำคัญบางประการเกี่ยวกับวิธีการกระจายและโหลดกฎที่กำหนดเอง (CAN) ก่อนที่จะมีการเปิดตัวครั้งนี้มีสองสถานที่ที่มีการโหลดกฎจาก: ไดเรกทอรี lib/cfn-nag/custom_rules ภายใน Core CFN_NAG GEM และกฎระเบียบที่กำหนดเองที่ระบุไว้ในบรรทัดคำสั่ง
มีสองกรณีการใช้งานที่บังคับให้ออกแบบใหม่ว่ามีการโหลดกฎที่กำหนดเองอย่างไร กลไกการโหลดกฎได้รับการสรุปโดยทั่วไปว่าที่เก็บกฎที่กำหนดเองสามารถใช้เพื่อค้นหากฎ
"ไฟล์กฎ" จำนวนมากนั่งอยู่ในระบบไฟล์ไม่ได้ยอดเยี่ยมจากมุมมองการพัฒนาซอฟต์แวร์แบบดั้งเดิม ไม่มีเวอร์ชันหรือการตรวจสอบย้อนกลับในไฟล์เหล่านี้ดังนั้น 0.5.x จึงแนะนำแนวคิดของ "CFN_NAG RULE GEM" นักพัฒนาสามารถพัฒนากฎที่กำหนดเองซึ่งเป็นส่วนหนึ่งของอัญมณีแยกต่างหากเวอร์ชันและติดตั้ง ... และกฎเหล่านั้นอ้างอิงจาก CFN_NAG ตราบใดที่ข้อมูลเมตา GEM รวมถึง cfn_nag_rules => true สำหรับอัญมณีที่ชื่อว่า "CFN-NAG-HIPAA-RULES", *.RB ใด ๆ ภายใต้ lib/CFN-NAG-HIPAA-RULES จะถูกโหลด กฎที่กำหนดเองใด ๆ ควรได้รับจาก cfnnag :: baserule ใน cfn-nag/base_rule ( ไม่ใช่ cfn-nag/custom-rules/base) หากกฎต้องได้รับจากอย่างอื่นให้กำหนดวิธีการ cfn_nag_rule? ที่ส่งคืนจริงจะทำให้มันถูกโหลดเป็นกฎ
เมื่อ CFN_NAG ทำงานใน AWS Lambda - ไม่มีระบบไฟล์ (นอกเหนือจาก /TMP) ในความหมายดั้งเดิม ดังนั้นกฎหลักเท่านั้นจึงสามารถใช้งานได้จากแลมบ์ดา เพื่อสนับสนุนกฎที่กำหนดเอง CFN_NAG สนับสนุนการค้นหากฎจากถัง S3 แทนระบบไฟล์
ทุกสิ่งที่คุณมีแนวโน้มเกี่ยวกับวิธีการพัฒนากฎที่กำหนดเองในทับทิมยังคงเป็นจริง
หากต้องการค้นหากฎจากถัง S3 ให้สร้างไฟล์ s3.yml ด้วยเนื้อหานี้:
---
repo_class_name : S3BucketBasedRuleRepo
repo_arguments :
s3_bucket_name : cfn-nag-rules-my-enterprise
prefix : /rulesหากต้องการใช้ *ไฟล์ Rule.rb ใน bucket cfn-nag-rules-my-enterprise พร้อมคำนำหน้า /กฎ (เช่น /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 หากควรใช้ AWS_Profile เฉพาะให้เพิ่มเป็นคีย์ภายใต้ repo_arguments เช่น aws_profile: my_aws_profile
นอกเหนือจากระบบไฟล์ GEM ติดตั้งและ S3 - สถาปัตยกรรมใหม่ในทางทฤษฎีสนับสนุนการพัฒนา "ที่เก็บกฎ" อื่น ๆ เพื่อโหลดกฎจาก DynamoDB ฐานข้อมูลเชิงสัมพันธ์หรือบริการเว็บอื่น ๆ
หากต้องการเขียนกฎใหม่สำหรับการใช้งานของคุณและ/หรือการมีส่วนร่วมของชุมชนดูการพัฒนากฎที่กำหนดเองสำหรับรายละเอียด
screencast แสดงให้เห็นถึงการพัฒนากฎที่กำหนดเอง TDD ซุป TDD มีอยู่ที่นี่:
https://www.youtube.com/watch?v=JRZCT0NAFD4&t=1601S
ในการเรียกใช้ข้อมูลจำเพาะคุณจะต้องตรวจสอบให้แน่ใจว่าคุณติดตั้ง Docker และการพึ่งพา CFN_NAG ที่ติดตั้งผ่านทางผ่าน
gem install bundle
bundle install จากนั้นในการเรียกใช้รายละเอียดทั้งหมดเพียงแค่เรียกใช้ rake test:all
ในการเรียกใช้การทดสอบแบบ end-to-end ให้เรียกใช้ rake test:e2e สคริปต์จะรวมอัญมณีทั้งหมดใน Gemfile สร้างและติดตั้ง CFN_NAG GEM ในเครื่องติดตั้งการพึ่งพาข้อมูลจำเพาะจากนั้นดำเนินการทดสอบที่ติดแท็กด้วย 'END_TO_END' นอกจากนี้ยังจะดึงเทมเพลตตัวอย่างที่จัดทำโดย Amazon และเรียกใช้ CFN_NAG_SCAN กับพวกเขาเพื่อดูว่าเทมเพลตที่รู้จักกันดีทำให้เกิดข้อยกเว้นภายใน CFN-NAG หรือไม่
ในการติดตั้งสาขา GIT ปัจจุบันในเครื่อง:
bundle install
scripts/deploy_local.shมีสภาพแวดล้อมการพัฒนาระยะไกลที่สมบูรณ์ที่สร้างขึ้นและตั้งค่าด้วยเครื่องมือและการตั้งค่าทั้งหมดที่กำหนดค่าไว้ล่วงหน้าเพื่อความสะดวกในการพัฒนากฎและการสร้าง คุณสามารถเปิดใช้งานสิ่งนี้ได้โดยใช้ฟังก์ชั่นการพัฒนาระยะไกล VS
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