Checkov — это инструмент статического анализа кода для инфраструктуры как кода (IaC), а также инструмент анализа состава программного обеспечения (SCA) для изображений и пакетов с открытым исходным кодом.
Он сканирует облачную инфраструктуру, предоставленную с использованием Terraform, Terraform plan, Cloudformation, AWS SAM, Kubernetes, Helmcharts, Kustomize, Dockerfile, Serverless, Bicep, OpenAPI, шаблонов ARM или OpenTofu, и обнаруживает неправильные настройки безопасности и соответствия требованиям с помощью графического сканирования.
Он выполняет сканирование программного обеспечения (SCA), которое представляет собой сканирование пакетов и образов с открытым исходным кодом на наличие распространенных уязвимостей и воздействий (CVE).
Checkov также поддерживает Prisma Cloud Application Security , платформу для разработчиков, которая систематизирует и оптимизирует облачную безопасность на протяжении всего жизненного цикла разработки. Prisma Cloud выявляет, исправляет и предотвращает неправильные настройки облачных ресурсов и файлов инфраструктуры как кода.
Результаты сканирования в CLI
Результат запланированного сканирования в Дженкинсе
Чтобы установить pip, следуйте официальной документации.
pip3 install checkov
или с Homebrew (macOS или Linux)
brew install checkov
source <( register-python-argcomplete checkov )
если вы установили checkov с помощью pip3
pip3 install -U checkov
или с доморощенным
brew upgrade checkov
checkov --directory /user/path/to/iac/code
Или конкретный файл или файлы
checkov --file /user/tf/example.tf
Или
checkov -f /user/cloudformation/example1.yml -f /user/cloudformation/example2.yml
Или файл плана терраформирования в формате json.
terraform init
terraform plan -out tf.plan
terraform show -json tf.plan > tf.json
checkov -f tf.json
Примечание. Выходной файл terraform show
tf.json
будет состоять из одной строки. По этой причине все результаты будут сообщены Checkov в строке номер 0.
check: CKV_AWS_21: " Ensure all data stored in the S3 bucket have versioning enabled "
FAILED for resource: aws_s3_bucket.customer
File: /tf/tf.json:0-0
Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/s3-policies/s3-16-enable-versioning
Если вы установили jq
вы можете преобразовать файл json в несколько строк с помощью следующей команды:
terraform show -json tf.plan | jq ' . ' > tf.json
Результат сканирования будет очень удобным для пользователя.
checkov -f tf.json
Check: CKV_AWS_21: " Ensure all data stored in the S3 bucket have versioning enabled "
FAILED for resource: aws_s3_bucket.customer
File: /tf/tf1.json:224-268
Guide: https://docs.prismacloud.io/en/enterprise-edition/policy-reference/aws-policies/s3-policies/s3-16-enable-versioning
225 | " values " : {
226 | " acceleration_status " : " " ,
227 | " acl " : " private " ,
228 | " arn " : " arn:aws:s3:::mybucket " ,
Альтернативно, укажите корень репозитория файлов hcl, используемых для создания файла плана, используя флаг --repo-root-for-plan-enrichment
, чтобы обогатить выходные данные соответствующим путем к файлу, номерами строк и кодовым блоком ресурса. (с). Дополнительным преимуществом является то, что подавление проверок будет обрабатываться соответствующим образом.
checkov -f tf.json --repo-root-for-plan-enrichment /user/path/to/iac/code
Passed Checks: 1, Failed Checks: 1, Suppressed Checks: 0
Check: " Ensure all data stored in the S3 bucket is securely encrypted at rest "
/main.tf:
Passed for resource: aws_s3_bucket.template_bucket
Check: " Ensure all data stored in the S3 bucket is securely encrypted at rest "
/../regionStack/main.tf:
Failed for resource: aws_s3_bucket.sls_deployment_bucket_name
Начните использовать Checkov, прочитав страницу «Начало работы».
docker pull bridgecrew/checkov
docker run --tty --rm --volume /user/tf:/tf --workdir /tf bridgecrew/checkov --directory /tf
Примечание. Если вы используете Python 3.6 (версия по умолчанию в Ubuntu 18.04), проверка не будет работать и завершится с ошибкой ModuleNotFoundError: No module named 'dataclasses'
. В этом случае вы можете использовать версию Docker.
Обратите внимание, что в некоторых случаях перенаправление вывода docker run --tty
в файл (например, если вы хотите сохранить вывод Checkov JUnit в файл) приведет к печати дополнительных управляющих символов. Это может нарушить анализ файла. Если вы столкнулись с этим, удалите флаг --tty
.
Флаг --workdir /tf
является необязательным для изменения рабочего каталога на смонтированный том. Если вы используете вывод SARIF -o sarif
файл results.sarif будет выведен на смонтированный том ( /user/tf
в приведенном выше примере). Если вы не включите этот флаг, рабочим каталогом будет «/».
Используя флаги командной строки, вы можете указать запуск только именованных проверок (список разрешений) или запуск всех проверок, кроме перечисленных (список запретов). Если вы используете интеграцию платформы через ключ API, вы также можете указать порог серьезности, который нужно пропустить и/или включить. Более того, поскольку файлы json не могут содержать комментарии, можно передать шаблон регулярного выражения, чтобы пропустить секретное сканирование файла json.
См. документацию для получения более подробной информации о том, как эти флаги работают вместе.
Разрешить выполнение только двух указанных проверок:
checkov --directory . --check CKV_AWS_20,CKV_AWS_57
Запустите все проверки, кроме указанной:
checkov -d . --skip-check CKV_AWS_20
Запустите все проверки, кроме проверок с указанными шаблонами:
checkov -d . --skip-check CKV_AWS *
Запустите все проверки со СРЕДНЕЙ степенью серьезности или выше (требуется ключ API):
checkov -d . --check MEDIUM --bc-api-key ...
Запустите все проверки со СРЕДНЕЙ серьезностью или выше, а также проверьте CKV_123 (предположим, это проверка НИЗКОЙ серьезности):
checkov -d . --check MEDIUM,CKV_123 --bc-api-key ...
Пропустить все проверки со СРЕДНЕЙ серьезностью или ниже:
checkov -d . --skip-check MEDIUM --bc-api-key ...
Пропустите все проверки со средней степенью серьезности или ниже, а также проверьте CKV_789 (предположим, это проверка высокой степени серьезности):
checkov -d . --skip-check MEDIUM,CKV_789 --bc-api-key ...
Запустите все проверки со средней или более высокой степенью серьезности, но пропустите проверку CKV_123 (предположим, это проверка со средней или более высокой степенью серьезности):
checkov -d . --check MEDIUM --skip-check CKV_123 --bc-api-key ...
Запустите проверку CKV_789, но пропустите ее, если она средней степени серьезности (логика --check всегда применяется перед --skip-check).
checkov -d . --skip-check MEDIUM --check CKV_789 --bc-api-key ...
Для рабочих нагрузок Kubernetes вы также можете использовать пространства имен разрешения/запрета. Например, не сообщайте никаких результатов для пространства имен kube-system:
checkov -d . --skip-check kube-system
Запустите сканирование образа контейнера. Сначала извлеките или создайте образ, а затем обратитесь к нему по хешу, идентификатору или имени:тегу:
checkov --framework sca_image --docker-image sha256:1234example --dockerfile-path /Users/path/to/Dockerfile --repo-id ... --bc-api-key ...
checkov --docker-image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Вы также можете использовать флаг --image для сканирования образа контейнера вместо --docker-image для сокращения:
checkov --image < image-name > :tag --dockerfile-path /User/path/to/Dockerfile --repo-id ... --bc-api-key ...
Запустите SCA-сканирование пакетов в репозитории:
checkov -d . --framework sca_package --bc-api-key ... --repo-id < repo_id(arbitrary) >
Запустите сканирование каталога с переменными среды, удалив буферизацию и добавив журналы уровня отладки:
PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG checkov -d .
ИЛИ включите переменные среды для нескольких запусков
export PYTHONUNBUFFERED=1 LOG_LEVEL=DEBUG
checkov -d .
Запустите сканирование секретов для всех файлов в MyDirectory. Пропустить проверку CKV_SECRET_6 в файлах json на наличие суффикса DontScan.
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * DontScan.json$
Запустите сканирование секретов для всех файлов в MyDirectory. Пропустить проверку CKV_SECRET_6 для файлов json, в пути которых содержится «skip_test».
checkov -d /MyDirectory --framework secrets --repo-id ... --bc-api-key ... --skip-check CKV_SECRET_6:. * skip_test. * json$
Можно замаскировать значения из результатов сканирования, предоставив файл конфигурации (используя флаг --config-file) с записью маски. Маскирование может применяться к ресурсу и значению (или нескольким значениям, разделенным запятой). Примеры:
mask:
- aws_instance:user_data
- azurerm_key_vault_secret:admin_password,user_passwords
В приведенном выше примере будут замаскированы следующие значения:
Как и любой инструмент статического анализа, он ограничен областью анализа. Например, если ресурс управляется вручную или с помощью последующего инструмента управления конфигурацией, подавление можно вставить как простую аннотацию кода.
Чтобы пропустить проверку определенного блока определения Terraform или ресурса CloudFormation, примените следующий шаблон комментария внутри его области действия:
checkov:skip=<check_id>:<suppression_comment>
<check_id>
— один из [доступных сканеров чеков] (docs/5.Policy Index/all.md)<suppression_comment>
— необязательная причина подавления, которая должна быть включена в выходные данные. Следующий комментарий пропускает проверку CKV_AWS_20
ресурса, определенного foo-bucket
, где сканирование проверяет, является ли корзина AWS S3 частной. В этом примере корзина настроена с общедоступным доступом для чтения; Добавление комментария подавления приведет к пропуску соответствующей проверки вместо проверки на неудачу.
resource "aws_s3_bucket" "foo-bucket" {
region = var.region
#checkov:skip=CKV_AWS_20:The bucket is a public static content host
bucket = local.bucket_name
force_destroy = true
acl = "public-read"
}
Вывод теперь будет содержать запись о результате проверки SKIPPED
:
...
...
Check: " S3 Bucket has an ACL defined which allows public access. "
SKIPPED for resource: aws_s3_bucket.foo-bucket
Suppress comment: The bucket is a public static content host
File: /example_skip_acl.tf:1-25
...
Чтобы пропустить несколько проверок, добавьте каждую в виде новой строки.
#checkov:skip=CKV2_AWS_6
#checkov:skip=CKV_AWS_20:The bucket is a public static content host
Для подавления проверок в манифестах Kubernetes используются аннотации следующего формата: checkov.io/skip#: <check_id>=<suppression_comment>
Например:
apiVersion: v1
kind: Pod
metadata:
name: mypod
annotations:
checkov.io/skip1: CKV_K8S_20=I don ' t care about Privilege Escalation :-O
checkov.io/skip2: CKV_K8S_14
checkov.io/skip3: CKV_K8S_11=I have not set CPU limits as I want BestEffort QoS
spec:
containers:
...
Для подробного ведения журнала на стандартный вывод установите для переменной среды LOG_LEVEL
значение DEBUG
.
По умолчанию — LOG_LEVEL=WARNING
.
Чтобы пропустить файлы или каталоги, используйте аргумент --skip-path
, который можно указывать несколько раз. Этот аргумент принимает регулярные выражения для путей относительно текущего рабочего каталога. Вы можете использовать его для пропуска целых каталогов и/или отдельных файлов.
По умолчанию все каталоги с именами node_modules
, .terraform
и .serverless
будут пропущены, а также любые файлы и каталоги, начинающиеся с .
. Чтобы отменить пропуск каталогов, начинающихся с .
переопределить переменную среды CKV_IGNORE_HIDDEN_DIRECTORIES
export CKV_IGNORE_HIDDEN_DIRECTORIES=false
Вы можете переопределить набор каталогов по умолчанию для пропуска, установив переменную среды CKV_IGNORED_DIRECTORIES
. Обратите внимание: если вы хотите сохранить этот список и дополнить его, вам необходимо включить эти значения. Например, CKV_IGNORED_DIRECTORIES=mynewdir
пропустит только этот каталог, но не остальные, упомянутые выше. Эта переменная является устаревшей функциональностью; мы рекомендуем использовать флаг --skip-file
.
По умолчанию вывод консоли является цветным. Чтобы переключиться на монохромный вывод, установите переменную среды: ANSI_COLORS_DISABLED
Если вы хотите использовать Checkov в VS Code, попробуйте расширение Prisma Cloud.
Checkov можно настроить с помощью файла конфигурации YAML. По умолчанию checkov ищет файл .checkov.yaml
или .checkov.yml
в следующих местах в порядке приоритета:
--directory
)Внимание : рекомендуется загружать файл конфигурации checkov из надежного источника, состоящего из проверенного удостоверения, чтобы отсканированные файлы, идентификаторы проверок и загруженные пользовательские проверки соответствовали желанию.
Пользователи также могут указать путь к файлу конфигурации через командную строку. В этом случае другие файлы конфигурации будут игнорироваться. Например:
checkov --config-file path/to/config.yaml
Пользователи также могут создать файл конфигурации с помощью команды --create-config
, которая принимает текущие аргументы командной строки и записывает их по заданному пути. Например:
checkov --compact --directory test-dir --docker-image sample-image --dockerfile-path Dockerfile --download-external-modules True --external-checks-dir sample-dir --quiet --repo-id prisma-cloud/sample-repo --skip-check CKV_DOCKER_3,CKV_DOCKER_2 --skip-framework dockerfile secrets --soft-fail --branch develop --check CKV_DOCKER_1 --create-config /Users/sample/config.yml
Создаст файл config.yaml
, который выглядит следующим образом:
branch : develop
check :
- CKV_DOCKER_1
compact : true
directory :
- test-dir
docker-image : sample-image
dockerfile-path : Dockerfile
download-external-modules : true
evaluate-variables : true
external-checks-dir :
- sample-dir
external-modules-download-path : .external_modules
framework :
- all
output : cli
quiet : true
repo-id : prisma-cloud/sample-repo
skip-check :
- CKV_DOCKER_3
- CKV_DOCKER_2
skip-framework :
- dockerfile
- secrets
soft-fail : true
Пользователи также могут использовать флаг --show-config
для просмотра всех аргументов и настроек, а также их происхождения, например, из командной строки, файла конфигурации, переменной среды или по умолчанию. Например:
checkov --show-config
Будет отображаться:
Command Line Args: --show-config
Environment Variables:
BC_API_KEY: your-api-key
Config File (/Users/sample/.checkov.yml):
soft-fail: False
branch: master
skip-check: [ ' CKV_DOCKER_3 ' , ' CKV_DOCKER_2 ' ]
Defaults:
--output: cli
--framework: [ ' all ' ]
--download-external-modules:False
--external-modules-download-path:.external_modules
--evaluate-variables:True
Вклад приветствуется!
Начните с ознакомления с правилами внесения взносов. После этого взгляните на хороший первый выпуск.
Вы даже можете запустить это одним щелчком мыши в своем браузере через Gitpod по следующей ссылке:
Хотите внести новые чеки? Узнайте, как выписать новый чек (полис AKA) здесь.
checkov
не сохраняет, не публикует и не передает кому-либо какую-либо идентифицирующую информацию о клиентах.
Никакая идентифицируемая информация о клиентах не используется для запроса общедоступных руководств Prisma Cloud. checkov
использует API Prisma Cloud для обогащения результатов ссылками на руководства по исправлению. Чтобы пропустить этот вызов API, используйте флаг --skip-download
.
Prisma Cloud создает и поддерживает Checkov, чтобы сделать политику как код простой и доступной.
Начните с нашей документации, где вы найдете краткие руководства и примеры.
Мы следуем официальному циклу поддержки Python и используем автоматизированные тесты для поддерживаемых версий Python. Это означает, что в настоящее время мы поддерживаем Python 3.9–3.12 включительно. Обратите внимание, что окончание срока действия Python 3.8 запланировано на октябрь 2024 г., а завершение срока действия Python 3.9 — на октябрь 2025 г. Мы изучаем возможность поддержки версии 3.13. Если у вас возникнут какие-либо проблемы с какой-либо версией Python, отличной от EOL, откройте проблему.