AWS CloudFormation Guard 2.0's Modes of Operation

AWS CloudFormation Guard is an open-source general-purpose policy-as-code evaluation tool. It provides developers with a simple-to-use, yet powerful and expressive domain-specific language (DSL) to define policies and enables developers to validate JSON- or YAML- formatted structured data with those policies.

As an example of how to use AWS CloudFormation Guard (cfn-guard), given a CloudFormation template (template.json):

json { "Resources":{ "NewVolume":{ "Type":"AWS::EC2::Volume", "Properties":{ "Size":500, "Encrypted":false, "AvailabilityZone":"us-west-2b" } }, "NewVolume2":{ "Type":"AWS::EC2::Volume", "Properties":{ "Size":100, "Encrypted":false, "AvailabilityZone":"us-west-2c" } } }, "Parameters":{ "InstanceName":"NewInstance" } }

And a rules file (rules.guard):

```

Create a variable named 'awsec2volume_resources' that selects all resources of type "AWS::EC2::Volume"

in the input resource template

let awsec2volume_resources = Resources.*[ Type == 'AWS::EC2::Volume' ]

Create a rule named awstemplateparameters for validation in the "Parameters" section of the template

rule awstemplateparameters { Parameters.InstanceName == "TestInstance" }

Create a rule named awsec2volume that filters on "AWS::EC2::Volume" type being present in the template

rule awsec2volume when %awsec2volumeresources !empty { %awsec2volumeresources.Properties.Encrypted == true %awsec2volumeresources.Properties.Size IN [50, 500] %awsec2volumeresources.Properties.AvailabilityZone IN ["us-west-2c", "us-west-2b"] } ```

You can check the compliance of template.json with rules.guard:

bash $ ./cfn-guard validate --data template.json --rules rules.guard _Summary Report_ Overall File Status = FAIL PASS/SKIP rules FAILED rules aws_template_parameters FAIL aws_ec2_volume FAIL

We designed cfn-guard to be plugged into your build processes.

If CloudFormation Guard validates the templates successfully, it gives you an exit status ($? in bash) of 0. If CloudFormation Guard identifies a rule violation, it gives you a status report of the rules that failed. Use the verbose flag -v to see the detailed evaluation tree that shows how CloudFormation Guard evaluated each rule.

Modes of Operation

cfn-guard has five modes of operation:

Validate

validate (like the example above) validates data against rules.

```bash cfn-guard-validate Evaluates rules against the data files to determine success or failure. You can point rules flag to a rules directory and point data flag to a data directory. When pointed to a directory it will read all rules in the directory file and evaluate them against the data files found in the directory. The command can also point to a single file and it would work as well. Note - When pointing the command to a directory, the directory may not contain a mix of rules and data files. The directory being pointed to must contain only data files, or rules files.

USAGE: cfn-guard validate [FLAGS] [OPTIONS] --rules

FLAGS: -a, --alphabetical Validate files in a directory ordered alphabetically -h, --help Prints help information -m, --last-modified Validate files in a directory ordered by last modified times -p, --print-json Print output in json format -s, --show-clause-failures Show clause failure along with summary -V, --version Prints version information -v, --verbose Verbose logging

OPTIONS: -d, --data Provide a file or dir for data files in JSON or YAML -r, --rules Provide a rules file or a directory of rules files

```

Rulegen

rulegen takes a JSON- or YAML-formatted CloudFormation template file and autogenerates a set of cfn-guard rules that match the properties of its resources. This is a useful way to get started with rule-writing or just create ready-to-use rules from known-good templates.

```bash cfn-guard-rulegen Autogenerate rules from an existing JSON- or YAML- formatted data. (Currently works with only CloudFormation templates)

USAGE: cfn-guard rulegen [OPTIONS] --template