IaC 보안: Checkov, Trivy 및 OPA Policy-as-Code
Terraform 루프에 보안 스캐닝 통합: 검사를 위한 Checkov 1000개 이상의 정책에 대한 통계, tfsec의 후속 제품인 Trivy 및 OPA/conftest 사전 적용 게이트에서 조직의 맞춤 정책을 확인하세요.
IaC 보안이 중요한 이유
2023년 Palo Alto Networks는 클라우드 침해의 65%가 IaC 잘못된 구성으로 인해 발생: 퍼블릭 S3 버킷, 보안 그룹도 마찬가지 허용됨, 로깅 비활성화됨, 암호화가 구성되지 않음. 특징 이러한 오류 중 가장 치명적인 것은 그렇습니다. 그들은 확장: Terraform 모듈 50개 환경에서 사용되는 안전하지 않은 경우 동시에 50개의 취약점이 생성됩니다.
해결책은 바로 이것이다 왼쪽으로 이동 보안: 컨트롤 이동 잘못된 구성이 발생하기 전에 작업 흐름에서 가능한 한 빨리 보안을 유지합니다. 클라우드에 도달하세요. 이 문서에서는 세 가지 보완 도구를 통합합니다. 광범위한 적용 범위를 위한 Checkov, 취약점 발견을 위한 Trivy, OPA 맞춤 조직 정책의 경우.
세 가지 도구와 그 역할
- 체크코프: AWS/Azure/GCP/K8s에 대한 1000개 이상의 기본 제공 정책. IaC에 특화되어 있습니다. Bridgecrew(Palo Alto에 인수됨)가 관리합니다.
- 퀴즈: tfsec(Aqua Security)의 후속 제품입니다. 통합 스캐너: IaC, 컨테이너, 종속성, 비밀. tfsec → Trivy 마이그레이션이 2024년 완료되었습니다.
- OPA + 콘테스트 테스트: 일반 정책 엔진. 사용자 정의 조직 규칙(명명 규칙, 필수 태그, 허용 지역)에 대한 정책을 Rego에 작성합니다.
Checkov: 1000개 이상의 정책을 사용한 보안 검색
Checkov는 init 또는 plan을 실행하지 않고 Terraform(.tf) 파일을 정적으로 구문 분석합니다. 암호화되지 않은 저장소, 의도하지 않은 공개 액세스, 로깅이 비활성화되었습니다. IAM이 너무 허용적입니다.
# Installazione
pip install checkov
# Oppure con Docker (raccomandato per CI)
docker pull bridgecrew/checkov:latest
# Scansione base di una directory Terraform
checkov -d ./environments/production --framework terraform
# Solo errori HIGH e CRITICAL (ignora LOW e MEDIUM)
checkov -d . --check HIGH,CRITICAL
# Output SARIF per integrare con GitHub Code Scanning
checkov -d . --output sarif --output-file checkov.sarif
# Skip di check specifici (con motivazione documentata)
checkov -d . --skip-check CKV_AWS_20,CKV_AWS_57
# CKV_AWS_20: bucket S3 public read - skippiamo solo se il bucket è intenzionalmente pubblico
# Esempio: codice Terraform con vulnerabilità e relativo fix
# VULNERABILE - Checkov alert: CKV_AWS_18, CKV_AWS_52, CKV_AWS_144
resource "aws_s3_bucket" "logs" {
bucket = "my-app-logs"
# MANCA: server_side_encryption_configuration
# MANCA: versioning
# MANCA: replication_configuration per disaster recovery
}
# SICURO - Tutti i check Checkov superati
resource "aws_s3_bucket" "logs" {
bucket = "my-app-logs"
}
resource "aws_s3_bucket_server_side_encryption_configuration" "logs" {
bucket = aws_s3_bucket.logs.id
rule {
apply_server_side_encryption_by_default {
sse_algorithm = "aws:kms" # CKV_AWS_19: usa KMS, non AES256
}
bucket_key_enabled = true
}
}
resource "aws_s3_bucket_versioning" "logs" {
bucket = aws_s3_bucket.logs.id
versioning_configuration {
status = "Enabled" # CKV_AWS_21
}
}
resource "aws_s3_bucket_public_access_block" "logs" {
bucket = aws_s3_bucket.logs.id
block_public_acls = true # CKV_AWS_53
block_public_policy = true # CKV_AWS_54
ignore_public_acls = true # CKV_AWS_55
restrict_public_buckets = true # CKV_AWS_56
}
resource "aws_s3_bucket_logging" "logs" {
bucket = aws_s3_bucket.logs.id
target_bucket = aws_s3_bucket.access_logs.id # CKV_AWS_18
target_prefix = "s3-access-logs/"
}
# checkov.yaml - Configurazione progetto (in root del repo)
# Skippa check non applicabili con motivazione documentata
skip-check:
- CKV_AWS_144 # S3 cross-region replication: non richiesto per log bucket interni
# Controlla solo risorse dei moduli custom (escludi moduli registry)
directory:
- modules/
# Severity minima da riportare
soft-fail-on: LOW,MEDIUM # Non fallisce la pipeline per LOW/MEDIUM
# Abilita output colorato
compact: false
퀴즈: 통합 IaC 스캐너
Trivy는 tfsec의 후속 버전입니다(2024년 마이그레이션 완료). Checkov에 비해 장점은 Trivy가 컨테이너 이미지도 스캔한다는 것입니다. 애플리케이션 종속성과 비밀을 동일한 파이프라인에 통합하여 도구 수를 줄입니다.
# Installazione
brew install trivy # macOS
# oppure:
curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/main/contrib/install.sh | sh
# Scansione Terraform
trivy config ./environments/production
# Con severity filter
trivy config --severity HIGH,CRITICAL ./
# Output JSON per parsing
trivy config --format json --output trivy-results.json ./
# Template Terraform specifico con maggiore dettaglio
trivy config --tf-vars ./environments/production/terraform.tfvars ./environments/production
# Scansione tutto il repo: IaC + dipendenze + segreti
trivy fs ./
# Esempio output Trivy (semplificato)
# trivy config ./environments/production
2024-01-15T10:30:00Z INFO Misconfiguration Types: terraform
environments/production/main.tf (terraform)
HIGH: Resource 'aws_security_group.app' has a wide open egress rule
------------------------------------------
Via: environments/production/main.tf:45
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"] # VULN: egress completamente aperto
}
Fix: Limita l'egress solo alle porte e destinazioni necessarie.
MEDIUM: Resource 'aws_db_instance.main' has no deletion protection
Via: environments/production/main.tf:78
deletion_protection = false # VULN: in production deve essere true
# .trivyignore - Ignora check specifici con motivazione
# Formato: CHECK_ID # Commento obbligatorio con motivazione
AVD-AWS-0025 # S3: CORS permissivo necessario per CDN pubblica
AVD-AWS-0168 # CloudFront: TLS 1.0 permesso per client legacy pre-2022
OPA 및 컨테스트: Rego를 통한 맞춤형 정책
OPA(개방형 정책 에이전트) 다음에서 사용하는 일반 정책 엔진입니다. Kubernetes, Istio 및 Terraform. 콘테스트 적용되는 것은 CLI입니다 구성 파일에 대한 OPA 정책(Terraform 계획 JSON 포함) OPA를 사용하면 다음을 수행할 수 있습니다. Checkov 또는 Trivy에 존재하지 않는 조직 정책을 구현합니다. 명명 규칙, 필수 태그, 허용 지역, 비용 제한.
# Installazione conftest
brew install conftest
# oppure:
curl -L https://github.com/open-policy-agent/conftest/releases/download/v0.49.0/conftest_0.49.0_linux_amd64.tar.gz | tar xz
# policy/terraform/naming.rego
# Policy: tutte le risorse AWS devono seguire la naming convention aziendale
package main
import future.keywords.in
# Regex per naming convention: {team}-{environment}-{name}
naming_pattern := `^[a-z]+-(?:dev|staging|production)-[a-z0-9-]+
06 - IaC 보안: Checkov, Trivy 및 OPA Policy-as-Code | Federico Calò
06 - IaC 보안: Checkov, Trivy 및 OPA Policy-as-Code | Federico Calò
Salta al contenuto principale안녕하세요!
Federico Calò
Sviluppatore Software | Divulgatore Tecnico
Creo applicazioni web moderne e strumenti digitali personalizzati per aiutare le attività a crescere attraverso l'innovazione tecnologica. La mia passione è unire informatica ed economia per generare valore reale.
소개
La mia passione per l'informatica è nata tra i banchi dell'Istituto Tecnico Commerciale di Maglie, dove ho scoperto il potere della programmazione e il fascino di creare soluzioni digitali. Fin da subito, ho capito che l'informatica non era solo codice, ma uno strumento straordinario per trasformare idee in realtà.
Durante gli studi superiori in Sistemi Informativi Aziendali, ho iniziato a intrecciare informatica ed economia, comprendendo come la tecnologia possa essere il motore della crescita per qualsiasi attività. Questa visione mi ha accompagnato all'Università degli Studi di Bari, dove ho conseguito la Laurea in Informatica, approfondendo le mie competenze tecniche e la mia passione per lo sviluppo software.
Oggi metto questa esperienza al servizio di imprese, professionisti e startup, creando soluzioni digitali su misura che automatizzano processi, ottimizzano risorse e aprono nuove opportunità di business. Perché la vera innovazione inizia quando la tecnologia incontra le esigenze reali delle persone.
역량
Analisi Dati & Modelli Previsionali
Trasformo i dati in insights strategici con analisi approfondite e modelli predittivi per decisioni informate
프로세스 자동화
Creo strumenti personalizzati che automatizzano operazioni ripetitive e liberano tempo per attività a valore aggiunto
맞춤 시스템
Sviluppo sistemi software su misura, dalle integrazioni tra piattaforme alle dashboard personalizzate
const federico = {
nome: "Federico Calò",
ruolo: "Sviluppatore Software",
città: "Bari, Italia",
missione: "Aiutare attraverso l'informatica",
passioni: [
"Codice Pulito",
"Innovazione",
"Crescita Continua"
]
};
미션
Credo fermamente che l'informatica sia lo strumento più potente per trasformare le idee in realtà e migliorare la vita delle persone.
기술의 민주화
La mia missione è rendere l'informatica accessibile a tutti: dalle piccole imprese locali alle startup innovative, fino ai professionisti che vogliono digitalizzare la propria attività. Ogni realtà merita di sfruttare le potenzialità del digitale.
IT와 비즈니스 통합
Non è solo questione di scrivere codice: è capire come la tecnologia possa generare valore reale. Intrecciando competenze informatiche e visione economica, aiuto le attività a crescere, ottimizzare processi e raggiungere nuovi traguardi di efficienza e redditività.
맞춤 솔루션
Ogni attività è unica, e così devono esserlo le soluzioni. Sviluppo strumenti personalizzati che rispondono alle esigenze specifiche di ciascun cliente, automatizzando processi ripetitivi e liberando tempo per ciò che conta davvero: far crescere il business.
기술로 비즈니스를 혁신하세요
Che tu gestisca un negozio, uno studio professionale o un'azienda, posso aiutarti a sfruttare le potenzialità dell'informatica per lavorare meglio, più velocemente e in modo più intelligente.
상담하기 →Unisciti alla Community
Entra nella community di sviluppatori dove discutiamo di software, AI, architettura e DevOps. Condividi idee, fai domande e cresci insieme a noi.
CanaleFC Dev Blog
Ricevi notifiche su nuovi articoli, serie complete, tips settimanali e tool in evidenza. Contenuti bilingui IT/EN direttamente nel tuo Telegram.
Nuovi articoli appena pubblicati Tips e code snippets settimanali Sondaggi sugli argomenti futuri
Iscriviti al CanaleGruppoFC Dev Community
Una community bilingue IT/EN per sviluppatori. Discussioni, Q&A, aiuto reciproco e networking con altri professionisti del settore.
Discussioni su articoli e tecnologie Help coding e code review Opportunità di lavoro e collaborazione
Unisciti al GruppoTopic di Discussione
#general #articles #help-coding #ai-ml #devops-cloud #architecture #tools #jobs-opportunitiesFormazione & Competenze
Il mio percorso accademico e le tecnologie che padroneggio
Certificazioni Professionali
8 certificazioni conseguite
Linguaggi & Tecnologie
Java Python JavaScript Angular React TypeScript SQL PHP CSS/SCSS Node.js Docker Git연락하기
프로젝트가 있으신가요? 아래 양식을 작성해 주시면 빠르게 답변드리겠습니다.
* Campi obbligatori. I tuoi dati saranno utilizzati solo per rispondere alla tua richiesta.
# Risorse che richiedono naming convention
resources_requiring_naming := {
"aws_s3_bucket",
"aws_rds_instance",
"aws_elasticache_cluster",
"aws_eks_cluster",
}
# Deny se il nome non segue la convention
deny[msg] {
resource := input.resource[resource_type][resource_name]
resource_type in resources_requiring_naming
name := resource.config.bucket[0].constant_value # per S3
not regex.match(naming_pattern, name)
msg := sprintf(
"POLICY VIOLATION: %s '%s' ha nome '%s' che non rispetta la naming convention '%s'",
[resource_type, resource_name, name, naming_pattern]
)
}
# policy/terraform/tags.rego
# Policy: tag obbligatori su tutte le risorse AWS
package main
# Tag obbligatori per compliance e cost allocation
required_tags := {
"Team",
"Environment",
"CostCenter",
"ManagedBy",
}
# Risorse che devono avere tag
taggable_resources := {
"aws_instance",
"aws_s3_bucket",
"aws_rds_instance",
"aws_eks_cluster",
"aws_lambda_function",
}
deny[msg] {
resource := input.resource[resource_type][resource_name]
resource_type in taggable_resources
# Ottieni i tag dalla configurazione Terraform (formato piano JSON)
tags := resource.config.tags[0].constant_value
# Verifica che ogni tag obbligatorio sia presente
required_tag := required_tags[_]
not tags[required_tag]
msg := sprintf(
"POLICY VIOLATION: %s '%s' manca il tag obbligatorio '%s'",
[resource_type, resource_name, required_tag]
)
}
# Policy: il tag 'Environment' deve avere un valore valido
deny[msg] {
resource := input.resource[resource_type][resource_name]
resource_type in taggable_resources
tags := resource.config.tags[0].constant_value
env := tags.Environment
not env in {"dev", "staging", "production"}
msg := sprintf(
"POLICY VIOLATION: %s '%s' tag Environment='%s' non valido. Deve essere dev|staging|production",
[resource_type, resource_name, env]
)
}
# policy/terraform/regions.rego
# Policy: deploy permesso solo nelle regioni EU (GDPR compliance)
package main
allowed_regions := {"eu-west-1", "eu-west-2", "eu-central-1", "eu-south-1"}
deny[msg] {
resource := input.resource[resource_type][resource_name]
region := resource.config.region[0].constant_value
not region in allowed_regions
msg := sprintf(
"POLICY VIOLATION: %s '%s' usa la regione '%s' non permessa per compliance GDPR. Regioni ammesse: %v",
[resource_type, resource_name, region, allowed_regions]
)
}
# Uso di conftest con piano Terraform in JSON
# 1. Genera il piano Terraform in formato JSON
terraform init
terraform plan -out=tfplan
terraform show -json tfplan > tfplan.json
# 2. Esegui conftest con le policy
conftest test tfplan.json --policy policy/terraform/
# Output esempio:
# FAIL - tfplan.json - main - POLICY VIOLATION: aws_s3_bucket 'logs' manca il tag obbligatorio 'CostCenter'
# FAIL - tfplan.json - main - POLICY VIOLATION: aws_s3_bucket 'data' usa la regione 'us-east-1' non permessa per compliance GDPR
# 2 tests, 2 failures
# Test con output strutturato JSON
conftest test tfplan.json --policy policy/ --output json
# Test con namespace specifico
conftest test tfplan.json --policy policy/ --namespace main
모든 도구와 통합된 CI 파이프라인
# .github/workflows/security-scan.yml
name: IaC Security Scan
on:
pull_request:
paths:
- '**.tf'
- '**.tfvars'
jobs:
checkov:
name: Checkov Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Checkov
uses: bridgecrewio/checkov-action@v12
with:
directory: .
framework: terraform
output_format: sarif
output_file_path: reports/checkov.sarif
soft_fail: true # Non blocca la pipeline su LOW/MEDIUM
- name: Upload SARIF to GitHub Code Scanning
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: reports/checkov.sarif
trivy:
name: Trivy Scan
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run Trivy
uses: aquasecurity/trivy-action@master
with:
scan-type: 'config'
scan-ref: '.'
format: 'sarif'
output: 'trivy.sarif'
severity: 'HIGH,CRITICAL'
exit-code: '1' # Blocca la pipeline su HIGH/CRITICAL
- name: Upload Trivy SARIF
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: trivy.sarif
opa-policy:
name: OPA Policy Check
runs-on: ubuntu-latest
needs: [checkov, trivy]
steps:
- uses: actions/checkout@v4
- name: Setup Terraform
uses: hashicorp/setup-terraform@v3
with:
terraform_version: '1.7.5'
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ secrets.TERRAFORM_PLAN_ROLE }}
aws-region: eu-west-1
- name: Generate Terraform Plan JSON
run: |
cd environments/production
terraform init -no-color
terraform plan -out=tfplan -no-color
terraform show -json tfplan > ../../tfplan.json
- name: Install conftest
run: |
curl -L https://github.com/open-policy-agent/conftest/releases/download/v0.49.0/conftest_0.49.0_linux_amd64.tar.gz | tar xz
sudo mv conftest /usr/local/bin/
- name: Run OPA Policies
run: |
conftest test tfplan.json --policy policy/terraform/ --output json | tee opa-results.json
# Fallisce se ci sono violation
jq -e '.[] | select(.failures | length > 0)' opa-results.json && exit 1 || exit 0
적용 범위 매트릭스: 위험에 맞는 도구
| 위험 | 체코프 | 퀴즈 | 오파 |
|---|---|---|---|
| S3 퍼블릭 액세스 | 예(CKV_AWS_20) | Si | 관습 |
| 미사용 암호화 누락 | 예(많은 확인) | Si | No |
| 보안 그룹이 너무 관대함 | Si | Si | No |
| 필수 태그가 누락되었습니다. | 부분 | No | 예(맞춤형 Rego) |
| 명명 규칙 | No | No | 예(맞춤형 Rego) |
| 허용되지 않는 지역(GDPR) | No | No | 예(맞춤형 Rego) |
| 코드의 비밀 | 부분 | 예(비밀 검색) | No |
| 컨테이너 취약점 | No | Si | No |
| 취약한 중독 | No | Si | No |
결론 및 다음 단계
Checkov(광범위 내장), Trivy(통합 스캐너)의 조합 OPA(맞춤형 조직 정책)는 대부분을 포괄하는 계층화된 방어를 형성합니다. IaC의 보안 위험 중 일부입니다. 핵심 원칙은 이러한 도구는 PR 병합을 차단해야 하며 무시할 수 있는 경고가 아니어야 합니다.
시리즈의 다음 기사
- 제7조: Terraform 다중 클라우드 — AWS + Azure + GCP 공유 모듈: 여러 공급자를 관리하기 위한 추상화 계층 구축 통합된 인터페이스로.
- 제8조: Terraform용 GitOps — Flux TF 컨트롤러 e 드리프트 감지: 지속적인 조정을 통해 Terraform을 GitOps 패러다임으로 가져옵니다.







