오픈 소스로 클라우드 구성 오류 찾기 및 수정

Checkov이라고 하는 IaC 스캐너는 모든 사람을 위한 정책을 코드로 활용하여 야생에 출시되기 전에 구성이 잘못 구성되고 안전하지 않은 구성을 방지하는 데 도움이 됩니다.

도전, 당신이 찾고 있는 것
  • 기본값, 설정, 구성
  • 제거되었거나 비활성화된 로깅
  • RDS 데이터베이스, S3 버킷 또는 EC2 볼륨 등이 포함될 수 있는 암호화되지 않은 데이터.
  • 예를 들어 http 또는 ftp와 같은 안전하지 않은 프로토콜 사용.
  • 취약한 네이티브 또는 기타 타사 서비스
  • 취약한 컨테이너 또는 기타 마이크로서비스.

  • 설치

    pip3 install checkov
    



    brew install checkov
    


    용법

    checkov -d .
    


    VSCode 플러그인

    Visual Studio Code를 사용하는 사용자를 위해 멋진 플러그인을 사용할 수 있습니다. VSCode를 bridgecrew과 통합하면 VSCode 내에서 전체 수정 라이브러리를 사용할 수 있습니다. 이것은 매우 강력합니다. 실패한 검사 및 결과를 검토할 때 수정 라이브러리는 해결해야 하는 다양한 항목을 빠른 수정과 함께 보다 간결하고 쉽게 소모할 수 있는 보기로 표시하고 표시하는 데 도움이 됩니다.

    데모-예제 Terraform 스캔 결과

    합격



    실패한

    Check: CKV_AWS_21: "Ensure all data stored in the S3 bucket have versioning enabled"
        FAILED for resource: aws_s3_bucket.bucket
        File: /terraform-aws-s3-bucket-master/main.tf:36-146
        Guide: https://docs.bridgecrew.io/docs/s3_16-enable-versioning
    
            36  | resource "aws_s3_bucket" "bucket" {
            37  |   count = var.module_enabled ? 1 : 0
            38  | 
            39  |   bucket              = var.bucket
            40  |   bucket_prefix       = var.bucket_prefix
            41  |   acl                 = var.acl
            42  |   tags                = local.bucket_tags
            43  |   force_destroy       = var.force_destroy
            44  |   acceleration_status = var.acceleration_status
            45  |   request_payer       = var.request_payer
            46  | 
            47  |   dynamic "cors_rule" {
            48  |     for_each = local.cors
            49  | 
            50  |     content {
            51  |       allowed_headers = lookup(cors_rule.value, "allowed_headers", null)
            52  |       allowed_methods = cors_rule.value.allowed_methods
            53  |       allowed_origins = cors_rule.value.allowed_origins
            54  |       expose_headers  = lookup(cors_rule.value, "expose_headers", null)
            55  |       max_age_seconds = lookup(cors_rule.value, "max_age_seconds", null)
            56  |     }
            57  |   }
            58  | 
            59  |   dynamic "versioning" {
            60  |     for_each = local.versioning
            61  | 
            62  |     content {
            63  |       enabled    = lookup(versioning.value, "enabled", null)
            64  |       mfa_delete = lookup(versioning.value, "mfa_delete", false)
            65  |     }
            66  |   }
            67  | 
            68  |   dynamic "logging" {
            69  |     for_each = local.logging
            70  | 
            71  |     content {
            72  |       target_bucket = logging.value.target_bucket
            73  |       target_prefix = lookup(logging.value, "target_prefix", null)
            74  |     }
            75  |   }
            76  | 
            77  |   dynamic "server_side_encryption_configuration" {
            78  |     for_each = local.encryption
            79  |     iterator = sse
            80  | 
            81  |     content {
            82  |       rule {
            83  |         apply_server_side_encryption_by_default {
            84  |           kms_master_key_id = lookup(sse.value, "kms_master_key_id", null)
            85  |           sse_algorithm = lookup(sse.value, "sse_algorithm",
            86  |             lookup(sse.value, "kms_master_key_id", null) == null ? "AES256" : "aws:kms"
            87  |           )
            88  |         }
            89  |       }
            90  |     }
            91  |   }
            92  | 
            93  |   dynamic "lifecycle_rule" {
            94  |     for_each = var.lifecycle_rules
            95  |     iterator = rule
            96  | 
            97  |     content {
            98  |       id                                     = lookup(rule.value, "id", null)
            99  |       prefix                                 = lookup(rule.value, "prefix", null)
            100 |       tags                                   = lookup(rule.value, "tags", null)
            101 |       abort_incomplete_multipart_upload_days = lookup(rule.value, "abort_incomplete_multipart_upload_days", null)
            102 |       enabled                                = rule.value.enabled
            103 | 
            104 |       dynamic "expiration" {
            105 |         for_each = length(keys(lookup(rule.value, "expiration", {}))) == 0 ? [] : [rule.value.expiration]
            106 | 
            107 |         content {
            108 |           date                         = lookup(expiration.value, "date", null)
            109 |           days                         = lookup(expiration.value, "days", null)
            110 |           expired_object_delete_marker = lookup(expiration.value, "expired_object_delete_marker", null)
            111 |         }
            112 |       }
            113 | 
            114 |       dynamic "transition" {
            115 |         for_each = lookup(rule.value, "transition", [])
            116 | 
            117 |         content {
            118 |           date          = lookup(transition.value, "date", null)
            119 |           days          = lookup(transition.value, "days", null)
            120 |           storage_class = transition.value.storage_class
            121 |         }
            122 |       }
            123 | 
            124 |       dynamic "noncurrent_version_expiration" {
            125 |         for_each = length(keys(lookup(rule.value, "noncurrent_version_expiration", {}))) == 0 ? [] : [rule.value.noncurrent_version_expiration]
            126 |         iterator = expiration
            127 | 
            128 |         content {
            129 |           days = lookup(expiration.value, "days", null)
            130 |         }
            131 |       }
            132 | 
            133 |       dynamic "noncurrent_version_transition" {
            134 |         for_each = lookup(rule.value, "noncurrent_version_transition", [])
            135 |         iterator = transition
            136 | 
            137 |         content {
            138 |           days          = lookup(transition.value, "days", null)
            139 |           storage_class = transition.value.storage_class
            140 |         }
            141 |       }
            142 |     }
            143 |   }
            144 | 
            145 |   depends_on = [var.module_depends_on]
            146 | }
    
    


    다음을 포함한 주요 클라우드 공급자 및 프레임워크 지원:

    -AWS
    -CloudFormation
    -AWS CDK
    -테라포밍
    -서버리스

    통합, CI/CD 워크플로 지원:
  • 젠킨스
  • Github
  • 비트버킷

  • 코드로서의 정책 기능:
  • 속성 기반 정책: 클라우드 리소스를 스캔하고 잘못된 구성을 찾고 간단한 Python 프레임워크를 사용합니다.
  • 그래프 기반 정책: checkov의 정책에 대해 클라우드 리소스를 평가합니다.
  • 확장 가능한 정책 관리: 예를 들어 사용자 지정 정책을 사용할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기