Alat CFN-NAG mencari pola dalam templat informasi cloud yang dapat mengindikasikan infrastruktur yang tidak aman. Secara kasar, itu akan mencari:
Untuk latar belakang lebih lanjut tentang alat ini, silakan lihat posting ini di blog Stelligent:
Menemukan Masalah Keamanan Di awal proses pengembangan templat informasi cloud dengan "CFN-nag"
Anggota Ruby> = 2.5.x diinstal, instalasi hanyalah masalah:
gem install cfn-nagDi MacOS atau Linux Anda dapat menginstal dengan minuman:
brew install ruby brew-gem
brew gem install cfn-nag Untuk menjalankan cfn_nag sebagai tindakan di CodePipeline, Anda dapat menggunakan melalui repositori aplikasi AWS Serverless.
Untuk mengeksekusi:
cfn_nag_scan --input-path < path to cloudformation json > Jalan dapat berupa direktori atau templat tertentu. Jika itu adalah direktori, semua file .json, .template , .yml dan .yaml akan diproses, termasuk berulang ke dalam subdirektori.
Format output default adalah teks bentuk bebas, tetapi output JSON dapat dipilih dengan flag --output-format json .
Secara opsional, bendera --debug akan membuang informasi tentang internal pemuatan aturan.
Jalankan dengan --help untuk daftar lengkap sakelar yang didukung.
Untuk melihat daftar semua aturan CFN-nag saat ini didukung, ada utilitas baris perintah yang akan membuangnya ke stdout:
cfn_nag_rules Dockerfile disediakan untuk kenyamanan. Ini diterbitkan di Dockerhub sebagai stelligent/cfn_nag .
https://hub.docker.com/r/stelligent/cfn_nag
Anda juga dapat membangunnya secara lokal.
docker build -t stelligent/cfn_nag .Anda dapat memasang direktori lokal yang berisi templat ke dalam wadah Docker dan kemudian memanggil CFN_NAG di dalam wadah. Contoh ini menggunakan templat uji yang digunakan dalam pengujian unit 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 dapat dijalankan sebagai bagian dari alur kerja GitHub untuk mengevaluasi kode selama pipa integrasi kontinu.
Dalam file alur kerja GitHub Anda, buat langkah yang menggunakan tindakan cfn_nag:
- name : Simple test
uses : stelligent/cfn_nag@master
with :
input_path : testsInformasi lebih lanjut tentang tindakan GitHub dapat ditemukan di sini.
CFN-NAG mendukung gagasan "profil" yang secara efektif mengizinkan daftar aturan untuk diterapkan. Profil adalah file teks yang harus berisi pengidentifikasi aturan per baris. Ketika ditentukan melalui argumen baris perintah --profile-path , CFN-nag hanya akan mengembalikan pelanggaran dari aturan-aturan tertentu.
Motivasi di balik menciptakan "profil" adalah bahwa pengembang yang berbeda mungkin peduli dengan aturan yang berbeda. Misalnya, "infrastruktur_developer" mungkin peduli dengan aturan IAM, sementara "app_developer" bahkan mungkin tidak dapat membuat sumber daya IAM dan karena itu tidak peduli dengan aturan tersebut.
Berikut adalah contoh profil:
F1
F2
F27
W3
W5
Daftar DENY pada dasarnya adalah kebalikan dari profil: Ini adalah daftar aturan untuk tidak pernah berlaku. Ketika ditentukan melalui argumen baris perintah --deny-list-path , CFN-nag tidak akan pernah mengembalikan pelanggaran dari aturan khusus yang ditentukan dalam file.
Dalam hal aturan ditentukan dalam keduanya, daftar penolakan akan diprioritaskan di atas profil, dan aturan tidak akan diterapkan.
Formatnya adalah sebagai berikut. Satu -satunya dua bidang yang menonjol adalah RulesToSuppress dan id per item. reason tidak akan ditafsirkan oleh CFN-nag, tetapi disarankan untuk membenarkan dan mendokumentasikan mengapa aturan tidak boleh diterapkan.
RulesToSuppress :
- id : W3
reason : W3 is something we never care about at enterprise X Jika ada aturan yang ingin Anda tekan, kunci Metadata cfn_nag dapat ditambahkan ke sumber daya yang terpengaruh untuk memberi tahu CFN_NAG agar tidak meningkatkan kegagalan atau peringatan untuk aturan itu.
Misalnya, jika Anda menyiapkan ELB yang menghadap publik yang terbuka untuk koneksi masuk dari internet dengan sumber daya seperti berikut:
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 akan meningkatkan peringatan seperti berikut:
$ 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: 2Dengan menambahkan metadata, peringatan ini dapat ditekan:
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: 0Parameter templat cloudformation dapat menghadirkan masalah untuk analisis statis karena nilai -nilai ditentukan pada titik penyebaran. Dengan kata lain, nilai -nilai tidak tersedia ketika analisis statis dilakukan - analisis statis hanya dapat melihat "kode" yang ada di depannya. Oleh karena itu, aturan penginapan kelompok keamanan 0,0.0.0/0 tidak akan ditandai jika CIDR diparameterisasi dan 0.0.0.0/0 dilewati pada saat penyebaran.
Untuk memungkinkan untuk memeriksa nilai parameter, pengguna dapat menentukan nilai parameter dalam file JSON yang diteruskan pada baris perintah ke cfn_nag dan cfn_nag_scan dengan flag --parameter-values-path=<filename/uri> .
Format JSON adalah kunci tunggal, "parameter", yang nilainya merupakan kamus dengan setiap pemetaan pasangan kunci/nilai ke parameter:
{
"Parameters" : {
"Cidr" : " 0.0.0.0/0 "
}
}Ini akan memberikan "0.0.0.0/0" ke parameter berikut:
Parameters :
Cidr :
Type : String Waspadalah bahwa jika ada parameter tambahan di JSON, mereka diam -diam diabaikan (untuk memungkinkan cfn_nag_scan untuk menerapkan JSON yang sama di semua templat).
Jika JSON cacat atau tidak memenuhi spesifikasi di atas, maka parsing akan gagal dengan pelanggaran fatal.
Sebelum 0,5.55, panggilan ke fn :: findInmap secara efektif diabaikan. Model yang mendasarinya akan meninggalkannya, dan karenanya mereka akan muncul sebagai nilai hash untuk aturan. Misalnya: { "Fn::FindInMap" => [map1, key1, key2]}
Mulai 0.5.55, model akan berusaha menghitung nilai untuk panggilan untuk menemukaninmap dan menyajikan nilai itu kepada aturan. Evaluasi ini mendukung kunci yang:
Jika logika evaluasi tidak dapat mengetahui nilai kunci, itu akan default untuk perilaku lama mengembalikan hash untuk seluruh ekspresi.
Juga sebelum 0,5.55, panggilan ke AWS pseudofunctions secara efektif diabaikan. Model yang mendasarinya akan meninggalkannya, dan karenanya mereka akan muncul sebagai nilai hash untuk aturan. Misalnya: {"Ref"=>"AWS::Region"} . Kasus penggunaan umum adalah mengatur pemetaan berdasarkan wilayah, sehingga evaluasi pseudofunction penting untuk mendukung evaluasi peta yang lebih baik.
Mulai 0.5.55, model akan menyajikan fungsi pseudof fungsi AWS berikut dengan aturan dengan nilai default:
'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'
Selain itu, pengguna akhir dapat mengganti nilai yang disediakan melalui mekanisme substitusi parameter tradisional. Misalnya:
{
"Parameters" : {
"AWS::Region" : " eu-west-1 "
}
}Hingga Versi 0.4.66 dari CFN_NAG, model yang mendasarinya tidak melakukan pemrosesan fn :: jika dalam templat. Ini berarti bahwa jika suatu properti memiliki nilai bersyarat, tergantung pada aturan untuk menguraikan fn :: if. Mengingat bahwa FN :: jika bisa muncul di mana saja, itu menciptakan situasi yang kuat untuk pengembang aturan. Paling -paling, logika aturan dapat mengabaikan nilai -nilai yang merupakan hash yang menganggap nilainya bukan hash.
Untuk mengatasi masalah ini, perilaku default untuk CFN_NAG sekarang untuk menggantikan FN :: jika dengan hasil yang benar. Ini berarti secara default bahwa aturan tidak akan memeriksa hasil yang salah untuk pelanggaran keamanan.
Selain mengganti fn :: jika pada tingkat nilai properti, perilaku yang sama diterapkan pada fn :: jika pada tingkat atas properti. Misalnya:
Resource1 :
Type : Foo
Properties : !If
- IsNone
- Description : Up
- Description : DOwnAkan terlihat sama seperti:
Resource1 :
Type : Foo
Properties :
Description : Up Untuk memberikan beberapa kontrol atas perilaku ini, pengguna dapat menentukan nilai kondisi dalam file JSON yang diteruskan pada baris perintah ke cfn_nag dan cfn_nag_scan dengan bendera --condition-values-path=<filename/uri> .
Format JSON adalah kamus AA dengan setiap pemetaan kunci/pasangan nilai untuk kondisi:
{
"Condition1" : true ,
"Condition2" : false
}Dasar untuk SPCM dijelaskan dalam Eksperimen Pemikiran Posting Blog yang diusulkan Metrik Kompleksitas untuk Dokumen Kebijakan IAM.
Mulai dalam versi 0.6.0 dari CFN_NAG:
spcm_scan dapat memindai direktori templat cloudformation (seperti cfn_nag_scan) dan menghasilkan laporan dengan metrik SPCM dalam format JSON atau HTMLcfn_nag_scan --rule-arguments spcm_threshold:100--rule-arguments yang sama. Objek aturan hanya perlu mendeklarasikan attr_accessor , misalnya attr_accessor :spcm_threshold dan cfn_nag akan menangani detailnya untuk menyuntikkan nilai dari --rule-arguments Rilis 0.5.x mencakup beberapa perubahan besar dalam bagaimana aturan khusus (dapat) didistribusikan dan dimuat. Sebelum rilis ini, ada dua tempat di mana aturan dimuat dari: direktori lib/cfn-nag/custom_rules dalam permata CFN_NAG inti, dan direktur aturan khusus yang ditentukan pada baris perintah.
Ada dua kasus penggunaan yang memaksa desain ulang bagaimana/di mana aturan khusus dimuat. Mekanisme pemuatan aturan telah digeneralisasikan sehingga repositori aturan khusus dapat digunakan untuk menemukan aturan.
Sekelompok "file aturan" duduk di sekitar sistem file tidak bagus dari perspektif pengembangan perangkat lunak tradisional. Tidak ada versi atau keterlacakan pada file -file ini, jadi 0.5.x memperkenalkan gagasan "Permata Aturan CFN_NAG". Pengembang dapat mengembangkan aturan khusus sebagai bagian dari permata terpisah, versi itu dan menginstalnya ... dan aturan tersebut dirujuk dari CFN_NAG selama metadata permata termasuk cfn_nag_rules => true . Untuk permata bernama "cfn-nag-hipaa-rules", any *.rb di bawah lib/cfn-nag-hipaa-rules akan dimuat. Aturan khusus apa pun harus berasal dari cfnnag :: baserule di cfn-nag/base_rule ( bukan cfn-nag/custom-rules/base). Jika aturan harus berasal dari sesuatu yang lain, mendefinisikan metode cfn_nag_rule? Itu pengembalian true juga akan menyebabkannya dimuat sebagai aturan.
Ketika CFN_NAG berjalan di AWS Lambda - sebenarnya tidak ada sistem file (selain /TMP) dalam arti tradisional. Oleh karena itu, hanya aturan inti yang dapat digunakan dari lambda. Untuk mendukung aturan khusus, CFN_NAG mendukung aturan penemuan dari ember S3 alih -alih sistem file.
Semua yang mungkin Anda lihat tentang cara mengembangkan aturan khusus di Ruby masih berlaku.
Untuk menemukan aturan dari ember S3, buat file s3.yml dengan konten ini:
---
repo_class_name : S3BucketBasedRuleRepo
repo_arguments :
s3_bucket_name : cfn-nag-rules-my-enterprise
prefix : /rulesUntuk menerapkan *aturan.rb file dalam bucket cfn-nag-rules-my-enterprise dengan awalan /aturan (mis.
cat my_cfn_template.yml | cfn_nag --rule-repository s3.yml Jika aturan ada di lebih dari satu ember, maka buat beberapa file S3*.yml dan tentukan dalam argumen --rule-repository .
Jika kredensial AWS ambient memiliki izin untuk mengakses ember cfn-nag-rules-enterprise maka ia akan menemukan semua aturan seperti /rules/*Rule.rb . Jika AWS_Profile tertentu harus digunakan, tambahkannya sebagai kunci di bawah repo_arguments , misalnya aws_profile: my_aws_profile
Di luar sistem file, GEM menginstal dan S3 - arsitektur baru secara teoritis mendukung pengembangan "repositori aturan" lainnya untuk memuat aturan dari DynamoDB, database relasional, atau layanan web lainnya.
Untuk menulis aturan baru untuk penggunaan Anda sendiri dan/atau kontribusi komunitas, lihat pengembangan aturan khusus untuk detailnya.
A Screencast yang menunjukkan pengembangan aturan kustom sup-ke-kacang TDD tersedia di sini:
https://www.youtube.com/watch?v=jrzct0nafd4&t=1601s
Untuk menjalankan spesifikasi, Anda perlu memastikan Anda menginstal Docker dan dependensi CFN_NAG yang diinstal melalui
gem install bundle
bundle install Kemudian, untuk menjalankan semua spesifikasi, cukup jalankan rake test:all .
Untuk menjalankan tes ujung ke ujung, jalankan rake test:e2e . Skrip akan menggabungkan semua permata di Gemfile, membangun dan menginstal permata CFN_NAG secara lokal, menginstal dependensi spesifikasi, dan kemudian menjalankan tes yang ditandai dengan 'end_to_end'. Ini juga akan menurunkan templat sampel yang disediakan oleh Amazon dan menjalankan CFN_NAG_SCAN terhadapnya, untuk melihat apakah ada templat yang diketahui baik yang menyebabkan pengecualian dalam CFN-nag.
Untuk menginstal Cabang Git saat ini secara lokal:
bundle install
scripts/deploy_local.shAda lingkungan pengembangan jarak jauh yang lengkap yang dibuat dan diatur dengan semua alat dan pengaturan yang dikonfigurasi untuk kemudahan dalam pengembangan dan penciptaan aturan. Anda dapat mengaktifkan ini dengan menggunakan fungsionalitas pengembangan jarak jauh VS.
Folder contains a dev container configuration file. Reopen folder to develop in a container klik tombol Reopen in Container[Dev Container] cfn_nag DevelopmentInformasi lebih lanjut tentang pengaturan pengembangan jarak jauh VS Code dapat ditemukan di sini, pengembangan jarak jauh VS kode.
Untuk melaporkan bug atau meminta fitur, kirimkan masalah melalui repositori GitHub melalui: https://github.com/stelligent/cfn_nag/issues/new