**************
CloudFormation
**************
`AWS CloudFormation `_ enables you to safely and predictably create, change, and improve infrastructure.
The ``easy_infra`` project includes and secures CloudFormation as a component due to its popularity and versitility in provisioning and updating
environments as Infrastructure as Code (IaC).
``easy_infra`` uses security tools, such as `Checkov `_, to transparently assess the provided IaC against the defined security policy.
Use Cases
---------
If you use Software Version Control (such as ``git``) to manage your CloudFormation IaC, consider executing ``aws cloudformation validate-template`` with
easy_infra as a pipeline action on commit or pull request::
docker run -v .:/iac seiso/easy_infra:latest-cloudformation aws cloudformation validate-template --template-body file://./example.yml
You can also use easy_infra to deploy your infrastructure using ``aws cloudformation deploy``::
docker run -v .:/iac seiso/easy_infra:latest-cloudformation aws cloudformation deploy --template-file file://./example.yml --stack-name example
.. note::
In order to run ``aws cloudformation validate-template``, AWS requires that you have an active session with AWS
Customizing Checkov
^^^^^^^^^^^^^^^^^^^
Many of the ``checkov`` command line parameters can be customized or configured at runtime by setting the below environment variables. By setting these
environment variables starting with ``CHECKOV_``, ``easy_infra`` will dynamically add the related arguments to the ``checkov`` security scanning command, and
pass the value of the environment variable to the argument.
For more details regarding how these parameters work, see `the checkov documentation `_.
+--------------------------------------------+--------------------------------------+
| Environment Variable | CLI Argument |
+============================================+======================================+
| ``CHECKOV_BASELINE`` | ``--baseline`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_BC_API_KEY`` | ``--bc-api-key`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_BLOCK_LIST_SECRET_SCAN`` | ``--block-list-secret-scan`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_CA_CERTIFICATE`` | ``--ca-certificate`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_CHECK`` | ``--check`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_CREATE_CONFIG`` | ``--create-config`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_DOWNLOAD_EXTERNAL_MODULES`` | ``--download-external-modules`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_EVALUATE_VARIABLES`` | ``--evaluate-variables`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_EXTERNAL_CHECKS_DIR`` | ``--external-checks-dir`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_EXTERNAL_CHECKS_GIT`` | ``--external-checks-git`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_EXTERNAL_MODULES_DOWNLOAD_PATH`` | ``--external-modules-download-path`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_HARD_FAIL_ON`` | ``--hard-fail-on`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_OPENAI_API_KEY`` | ``--openai-api-key`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_POLICY_METADATA_FILTER`` | ``--policy-metadata-filter`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_PRISMA_API_URL`` | ``--prisma-api-url`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_REPO_ID`` | ``--repo-id`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_REPO_ROOT_FOR_PLAN_ENRICHMENT`` | ``--repo-root-for-plan-enrichment`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_SECRETS_HISTORY_TIMEOUT`` | ``--secrets-history-timeout`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_SECRETS_SCAN_FILE_TYPE`` | ``--secrets-scan-file-type`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_SKIP_CHECK`` | ``--skip-check`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_SKIP_CVE_PACKAGE`` | ``--skip-cve-package`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_SOFT_FAIL_ON`` | ``--soft-fail-on`` |
+--------------------------------------------+--------------------------------------+
| ``CHECKOV_VAR_FILE`` | ``--var-file`` |
+--------------------------------------------+--------------------------------------+
For instance::
CHECKOV_BASELINE=/iac/.checkov.baseline
CHECKOV_EXTERNAL_CHECKS_DIR=/iac/checkov_rules/
CHECKOV_SKIP_CHECK=CKV_AWS_46
docker run --env-file <(env | grep ^CHECKOV_) -v .:/iac easy_infra:latest-cloudformation aws cloudformation validate-template --template-body file://./example.yml
In addition, you can customize some ``checkov``-specific environment variables at runtime for different effects. By setting these environment variables, you are
customizing the ``checkov`` environment **only** while it is running.
+-----------------------+---------------------+
| Environment Variable | Checkov Environment |
+=======================+=====================+
| ``CHECKOV_LOG_LEVEL`` | ``LOG_LEVEL`` |
+-----------------------+---------------------+
For instance, the following command will run with ``checkov`` in debug mode (which is separate from running ``easy_infra`` in debug mode)::
CHECKOV_LOG_LEVEL=DEBUG
docker run --env CHECKOV_LOG_LEVEL -v .:/iac easy_infra:latest-cloudformation aws cloudformation validate-template --template-body file:///./example.yml
Disabling Security
^^^^^^^^^^^^^^^^^^
The injected security tooling can be disabled entirely or individually, using ``easy_infra``-specific command line arguments or environment variables.
+----------------------+-----------+--------------------------------------------------------------------------------------+
| Environment variable | Default | Result |
+======================+===========+======================================================================================+
| ``DISABLE_SECURITY`` | ``false`` | Disables all security tooling (Not just CloudFormation-related) when set to ``true`` |
+----------------------+-----------+--------------------------------------------------------------------------------------+
| ``SKIP_CHECKOV`` | ``false`` | Disables Checkov when set to ``true`` |
+----------------------+-----------+--------------------------------------------------------------------------------------+
+------------------------+------------------------------+--------------------------------------------------------------------------------------------------+
| Parameter | Result | Example |
+========================+==============================+==================================================================================================+
| ``--disable-security`` | Disable all security tooling | ``aws cloudformation validate-template --disable-security --template-body file://./example.yml`` |
+------------------------+------------------------------+--------------------------------------------------------------------------------------------------+
| ``--skip-checkov`` | Disable Checkov | ``aws cloudformation --skip-checkov validate-template --template-body file://./example.yml`` |
+------------------------+------------------------------+--------------------------------------------------------------------------------------------------+
.. note::
All command-line arguments in the above table are processed by easy_infra and removed prior to passing parameters to aws cloudformation commands.
Resources
---------
Checkov allow numerous methods for creating custom policies, such as by writing them in Python or using the Checkov-specific DSL in yml files. These
options are described in more detail `here `_