Triraform - Itriy Trivyを用いたIACスキャン



TRIVY脆弱性スキャナTrivy コンテナのイメージ、ファイルシステム、およびgitリポジトリの脆弱性のためのシンプルで包括的なスキャナだけでなく、IACの構成問題.Trivy OSパッケージ(アルパイン、RHEL、CentOSなど)と言語固有のパッケージ(バンドル、作曲家、NPM、糸など)の脆弱性を検出します.加えてTrivy 攻撃のリスクにあなたの展開を公開する潜在的な構成問題を検出するために、TraraForm、Dockerfile、Kubernetesなどのコード(IAC)ファイルとしてインフラストラクチャをスキャンします.
あなたは簡単にあなたのテラフォーム(IAC)の構成を展開する前に、すべてのあなたの設定と信頼性を与えるあなたの地形形式のアーティファクトをスキャンすることができます.これは、フリー/オープンソースのツールです.詳細についてはTrivy github page
今日、我々はあなたが利用できる方法を見ますTrivy セキュリティリスクのためにあなたのterform(IAC)コードをスキャンすることによってあなたのDEVOPS CI/CDプロセスの一部として、潜在的にセキュリティリスクを開く可能性がある脆弱性やミスコンフィグレーションがないように設定を実際に展開する前に.

IACをスキャンする方法
このチュートリアルは次のとおりですAzure DevOps Repository BluePrint(それは、terraform IAC構成ファイルを使用しているAzure仮想ネットワークを展開するためにCI/CD YAMLパイプラインを使用するでしょう).
経路の下には地形形式のファイルがあります/Terraform/networking . YAMLパイプラインもありますnetwork.yml/pipelines/ これは、terraformコードを展開するために使用されます.パイプラインが起動するbuild.yml 本質的に私たちの地形のアーチファクトを作成し、成功するとパイプラインがトリガされますdeploy.yml 私たちの地形形状アーティファクトを適用するテンプレート.パイプラインテンプレートはパスの下に保持されます/task_groups/ .
我々は利用するTrivy 我々の構築段階の間、そうするので、見てくださいbuild.yml ファイル
#// code/task_groups/build.yml#L16-L89

jobs:
  - job: build
    pool:
      vmImage: ${{ parameters.pool }}
    workspace:
      clean: all
    steps:
      - checkout: self
        path: src

      - task: TerraformInstaller@0
        inputs:
          terraformVersion: ${{ parameters.terraformVersion }}

      - task: CmdLine@2
        displayName: 'Download and Install Trivy vulnerability scanner'
        inputs:
          script: |
            sudo apt-get install rpm
            wget https://github.com/aquasecurity/trivy/releases/download/v${{ parameters.trivyVersion }}/trivy_${{ parameters.trivyVersion }}_Linux-64bit.deb
            sudo dpkg -i trivy_${{ parameters.trivyVersion }}_Linux-64bit.deb
            trivy -v

      - task: TerraformTaskV2@2
        displayName: Terraform Init
        inputs:
          provider: 'azurerm'
          command: 'init'
          workingDirectory: '$(Agent.BuildDirectory)/src/${{ parameters.root_directory }}'
          backendServiceArm: ${{ parameters.backend_service_connection_name }}
          backendAzureRmResourceGroupName: ${{ parameters.backend_resource_group }}
          backendAzureRmStorageAccountName: ${{ parameters.backend_storage_accountname }}
          backendAzureRmContainerName: ${{ parameters.container_name }}
          backendAzureRmKey: ${{ parameters.container_key }}

      - task: CmdLine@2
        displayName: 'LOW/MED - Trivy vulnerability scanner in IaC mode'
        inputs:
          script: |
            trivy config --severity LOW,MEDIUM --exit-code 0 $(Agent.BuildDirectory)/src/${{ parameters.root_directory }}

      - task: CmdLine@2
        displayName: 'HIGH/CRIT - Trivy vulnerability scanner in IaC mode'
        inputs:
          script: |
            trivy config --severity HIGH,CRITICAL --exit-code 1 $(Agent.BuildDirectory)/src/${{ parameters.root_directory }}

      - task: TerraformTaskV2@2
        displayName: Terraform Plan
        inputs:
          provider: 'azurerm'
          command: 'plan'
          workingDirectory: '$(Agent.BuildDirectory)/src/${{ parameters.root_directory }}'
          commandOptions: '--var-file=$(Agent.BuildDirectory)/src/${{ parameters.root_directory }}${{ parameters.tfvarFile }} --out=$(Agent.BuildDirectory)/src/${{ parameters.root_directory }}plan.tfplan'
          environmentServiceNameAzureRM: ${{ parameters.deployment_service_connection_name }}

      - task: CopyFiles@2
        displayName: 'Copy Files to Staging'
        inputs:
          SourceFolder: '$(Agent.BuildDirectory)/src'
          Contents: 'Terraform/**'
          TargetFolder: '$(Build.ArtifactStagingDirectory)'

      - task: ArchiveFiles@2
        inputs:
          rootFolderOrFile: '$(Build.ArtifactStagingDirectory)'
          archiveFile: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
          replaceExistingArchive: true
          includeRootFolder: false
        displayName: Archive Terraform Artifact

      - publish: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip'
        artifact: '$(Build.BuildId)-trivy'
        displayName: Publish Pipeline Artifact
あなたが見ることができるようにbuild 上記のプロセスは次の手順を実行します.
  • Terraformをダウンロードしてインストールします.
  • ダウンロードしてインストールTrivy 脆弱性スキャナ
  • terraform initをterrformネットワーク構成で実行します.
  • ランTrivy (低/中)リスクのためのIACモードにおける脆弱性スキャナ
  • ランTrivy (高/臨界)リスクのためのIACモードの脆弱性スキャナ.
  • 地形計画を実行する.
  • テラフォーム展開ファイルをステージング領域にコピーします.
  • ステージング領域から地形展開アーチファクト(ZIP)を作成します.
  • 後で使用するためにパイプラインに作成された地形展開アーティファクトを発行します.
  • 注意:Trivy 原因はbuild パイプラインのプロセスが失敗する(低/中)のリスクが、(高い/重要な)問題が検出された場合、失敗を引き起こすでしょう.これは--exist-code (1)(0) 引数
    #// code/task_groups/build.yml#L51-L61
    
    - task: CmdLine@2
    displayName: "LOW/MED - Trivy vulnerability scanner in IaC mode"
    inputs:
        script: |
            trivy config --severity LOW,MEDIUM --exit-code 0 $(Agent.BuildDirectory)/src/${{ parameters.root_directory }}
    
    - task: CmdLine@2
    displayName: "HIGH/CRIT - Trivy vulnerability scanner in IaC mode"
    inputs:
        script: |
            trivy config --severity HIGH,CRITICAL --exit-code 1 $(Agent.BuildDirectory)/src/${{ parameters.root_directory }}
    
    それは、構成と統合の限りですTrivy あなたのCI/CDプロセスに、ビルドを完了する前に、どんなセキュリティやミスコンフィグレーション問題に対しても地形形式展開を確認してください.例を見てみましょう.


    注意:この例では、ソースコントロールにコミットされている秘密を保護しません.あなたがコミットされた後、ソースコードまたは地形形態で秘密を見つけるならば、削除して、できるだけ早く彼らを回転させてください.
    あなたのterraform構成で見ることができるようにmain.tf . 私はエイリアスを使用して第2のプロバイダを構成しました、しかし、私はclient_secret プレーンテキストの値
    # Terraform/networking/main.tf#L18-L25
    
    provider "azurerm" {
      features {}
      alias           = "core_network"
      subscription_id = "00000000-0000-0000-0000-000000000000"
      client_id       = "00000000-0000-0000-0000-000000000000"
      client_secret   = "S3cR3t20!"
      tenant_id       = "00000000-0000-0000-0000-000000000000"
    }
    
    Trivy 私のterraform構成に対する走査を走らせるbuild プロセスは、それが特定した重大なセキュリティリスクのため失敗します.


    何をチェックしますか.Trivy チェック柄フォームiacTFSEC . すべてのチェックを見ることができますTrivy の下で実行するincluded checks ドキュメント.上の前の例でTrivy と呼ばれるリスクを検出しました.Potentially sensitive data stored in block attribute , それは我々のコードが機密情報を潜在的に暴露していることを私たちに知らせました.
    あなたがこのポストを楽しんで、新しい何かを学んだことを願っています.また、このブログ記事で使用されているコードサンプルを見つけることができますGithub ページ.❤️

    著者
    閉じるこの動画はお気に入りから削除されています🐙 GitHub | 🐧 | 👾
    ・・・アクションボタン
    背景色:1 .重要
    色:千円!重要
    ボーダーカラー:くぼんだ0 cbb 58!重要


    Marcel.L フォロー
    Cloud Solutions & DevOps Architect.