تبحث أداة CFN-NAG عن أنماط في قوالب CloudFormation التي قد تشير إلى البنية التحتية غير الآمنة. بالمعنى الدلا ، سوف يبحث عن:
لمزيد من الخلفية حول الأداة ، يرجى الاطلاع على هذا المنشور في مدونة Stelligent:
إيجاد مشاكل أمنية في وقت مبكر من عملية تطوير قالب السحابة مع "CFN-NAG"
على افتراض أن Ruby> = 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 Application.
للتنفيذ:
cfn_nag_scan --input-path < path to cloudformation json > يمكن أن يكون المسار دليلًا أو قالبًا معينًا. .yaml كان دليلًا .yml فسيتم معالجة جميع ملفات .json, .template
تنسيق الإخراج الافتراضي هو نص الشكل الحر ، ولكن يمكن تحديد إخراج 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 سوى الانتهاكات من تلك القواعد المحددة.
الدافع وراء إنشاء "ملف تعريف" هو أن المطورين المختلفين قد يهتمون بقواعد مختلفة. على سبيل المثال ، قد يهتم "البنية التحتية ببنية efrive_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::SecurityGroupIngressسوف تثير CFN_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 ، سيحاول النموذج حساب القيمة لاستدعاء لإيجاد iniNMap وتقديم هذه القيمة للقواعد. يدعم هذا التقييم مفاتيح:
إذا لم يتمكن منطق التقييم من معرفة القيمة للمفتاح ، فسيؤدي ذلك إلى افتراض السلوك القديم لإعادة التجزئة للتعبير بأكمله.
أيضًا قبل 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 "
}
}حتى الإصدار 0.4.66 من CFN_NAG ، لم يفعل النموذج الأساسي أي معالجة لـ fn :: إذا كانت داخل قالب. هذا يعني أنه إذا كان للممتلكات قيمة مشروطة ، فإن الأمر متروك للقاعدة لتحليل fn :: if. بالنظر إلى أن 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>
تنسيق JSON هو قاموس AA مع كل مفتاح/قيمة زوج رسم للشروط:
{
"Condition1" : true ,
"Condition2" : false
}تم وصف أساس SPCM في تجربة Thought Post Thought Post Post Post Metric لمستندات سياسة 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 ، eg attr_accessor :spcm_threshold و cfn_nag سوف يهتمون بالتفاصيل لحقن القيم --rule-arguments يتضمن إصدار 0.5.x بعض التغييرات الرئيسية في كيفية توزيع القواعد المخصصة (يمكن) تحميلها. قبل هذا الإصدار ، كان هناك مكانان تم فيه تحميل القواعد من: دليل lib/cfn-nag/custom_rules ضمن جوهرة CFN_NAG الأساسية ، والثنائي المخصص المحدد في سطر الأوامر.
هناك حالتان للاستخدام التي أجبرت على إعادة تصميم كيفية تحميل القواعد المخصصة. تم تعميم آلية تحميل القاعدة بحيث يمكن استخدام مستودعات القواعد المخصصة لاكتشاف القواعد.
مجموعة من "ملفات القواعد" التي تجلس على نظام الملفات ليست رائعة من منظور تطوير البرمجيات التقليدي. لا يوجد إصدار أو إمكانية تتبع على هذه الملفات ، لذا فإن 0.5.x يقدم فكرة "GEM CFN_NAG". يمكن للمطور تطوير قواعد مخصصة كجزء من جوهرة منفصلة ، وإصدارها وتثبيتها ... ويتم الرجوع إلى هذه القواعد من CFN_NAG طالما أن بيانات تعريف GEM تتضمن cfn_nag_rules => true . للحصول على جوهرة تسمى مثل "CFN-NAG-HIPAA-RULES" ، سيتم تحميل أي *.rb تحت LIB/CFN-NAG-HIPAA. يجب أن تستمد أي قواعد مخصصة من cfnnag :: baserule في cfn-nag/base_rule ( وليس cfn-nag/custom-rules/base). إذا كان يجب أن تستمد القاعدة من شيء آخر ، وتحديد طريقة cfn_nag_rule? هذا الإرجاع صحيح سيؤدي أيضًا إلى تحميله كقاعدة.
عندما يتم تشغيل CFN_NAG في Lambda AWS - لا يوجد بالفعل نظام ملفات (إلى جانب /TMP) بالمعنى التقليدي. لذلك ، فقط القواعد الأساسية قابلة للاستخدام من Lambda. لدعم القواعد المخصصة ، يدعم CFN_NAG اكتشاف القواعد من دلو S3 بدلاً من نظام الملفات.
كل ما رأيته على الأرجح حول كيفية تطوير قواعد مخصصة في روبي لا يزال صحيحًا.
لاكتشاف القواعد من دلو S3 ، قم بإنشاء ملف s3.yml مع هذا المحتوى:
---
repo_class_name : S3BucketBasedRuleRepo
repo_arguments :
s3_bucket_name : cfn-nag-rules-my-enterprise
prefix : /rulesلتطبيق ملفات *rule.rb في دلو CFN-NAG-Rules-My-Enterprise مع البادئة /القواعد (eg /rules/mynewrule.rb) ، حدد هذا الملف على سطر الأوامر إلى cfn_nag على هذا النحو:
cat my_cfn_template.yml | cfn_nag --rule-repository s3.yml إذا كانت القواعد في أكثر من دلو واحد ، فقم بإنشاء ملفات S3*.IML متعددة وحددها في الوسيطة- --rule-repository .
إذا كانت بيانات اعتماد AWS Ambient لديها إذن للوصول إلى دلو cfn-nag-rules-enterprise ، فستجد جميع القواعد مثل /rules/*Rule.rb . إذا كان ينبغي استخدام AWS_Profile معين ، فأضفه كمفتاح تحت repo_arguments ، على سبيل المثال aws_profile: my_aws_profile
إلى جانب نظام الملفات ، يقوم GEM بتثبيت و S3 - تدعم الهندسة المعمارية الجديدة نظريًا تطوير "مستودعات القواعد" الأخرى لتحميل القواعد من DynamoDB أو قواعد البيانات العلائقية أو خدمات الويب الأخرى.
لتأليف قواعد جديدة لاستخدامك و/أو مساهمة المجتمع ، راجع تطوير القواعد المخصصة للحصول على التفاصيل.
يتوفر هنا تطوير قاعدة مخصصة من الحساء إلى الحساء إلى الحساء TDD هنا:
https://www.youtube.com/watch؟v=jrzct0nafd4&t=1601s
لتشغيل المواصفات ، تحتاج إلى التأكد من تثبيت Docker وتثبيت التبعيات CFN_NAG عبر
gem install bundle
bundle install ثم ، لتشغيل جميع المواصفات ، ما عليك سوى تشغيل rake test:all .
لتشغيل الاختبارات من طرف إلى طرف ، قم بتشغيل rake test:e2e . سيقوم البرنامج النصي بتجميع جميع الأحجار الكريمة في Gemfile ، وإنشاء وتثبيت GEM CFN_NAG محليًا ، وتثبيت تبعيات المواصفات ، ثم ينفذ الاختبارات الموسومة بـ "end_to_end". كما أنه سيؤدي إلى سحب قوالب العينة التي توفرها Amazon وتشغيل CFN_NAG_SCAN ضدها ، لمعرفة ما إذا كانت أي قوالب جيدة معروفة تسبب استثناءات داخل CFN-NAG.
لتثبيت فرع GIT الحالي محليًا:
bundle install
scripts/deploy_local.shهناك بيئة تطوير عن بُعد كاملة تم إنشاؤها وإعدادها مع جميع الأدوات والإعدادات التي تم تكوينها مسبقًا لسهولة تطوير القواعد والخلق. يمكنك تمكين ذلك باستخدام وظيفة تطوير VS Code عن بُعد.
Folder contains a dev container configuration file. Reopen folder to develop in a container انقر فوق زر Reopen in Container[Dev Container] cfn_nag Developmentيمكن الاطلاع على مزيد من المعلومات حول إعداد VS Code Remote Development هنا ، VS Code Remote Development.
للإبلاغ عن خطأ أو طلب ميزة ، أرسل مشكلة من خلال مستودع github عبر: https://github.com/stelligent/cfn_nag/issues/new